commit d55d8bc32d4267ebf6af35cb997a51650bfbd59d Author: R0GGER Date: Sat Nov 7 12:19:45 2026 +0100 stable diff --git a/.cursor/plans/emoji_stempel-tool_8dbf6487.plan.md b/.cursor/plans/emoji_stempel-tool_8dbf6487.plan.md new file mode 100644 index 0000000..9a5d7cd --- /dev/null +++ b/.cursor/plans/emoji_stempel-tool_8dbf6487.plan.md @@ -0,0 +1,109 @@ +--- +name: Emoji stempel-tool +overview: "Voeg een Emoji-gereedschap toe aan de werkbalk van de editor. Je plaatst er een Twemoji-stempel mee op het knipsel. De kiezer werkt zoals emoji-mart: alle emoji, categorie-tabs, zoeken in het Nederlands en Engels, huidskleur en \"recent gebruikt\"." +todos: + - id: assets + content: Script tools/fetch-emoji.ps1 en Assets/Emoji (emoji.json, twemoji-64.png, cldr-nl.json) toevoegen als Resource in csproj + status: completed + - id: catalog + content: "EmojiCatalog: json/CLDR parsen, sheet croppen met cache, categorieën, zoeken, huidskleurvarianten" + status: completed + - id: model + content: ToolKind.Emoji, SkinTone, StyleSet.Emoji/SkinTone, StyleProps.Emoji, DefaultFor/PropsFor + status: completed + - id: annotation + content: EmojiAnnotation (Center, Bounds, Render met DrawImage en schaduw, Move) + status: completed + - id: picker + content: "EmojiPickerButton UserControl: zoeken, categorie-tabs, gevirtualiseerd raster, preview, huidskleur, recent" + status: completed + - id: editor + content: "EditorWindow: toolbarknop, EmojiGroup in PropsPanel, CreateAnnotation, stempel-case, sneltoets J, hint, stijl toepassen op selectie" + status: completed + - id: settings + content: AppSettings.RecentEmoji en controle van ToolbarPanel-volgorde voor het nieuwe item + status: completed + - id: verify + content: "Builden en testen: plaatsen, wisselen, huidskleur, zoeken NL/EN, export/kopiëren, undo" + status: completed +isProject: false +--- + +# Emoji-gereedschap met Twemoji-kiezer + +## Aanpak + +WPF tekent Segoe UI Emoji alleen zwart-wit. Daarom leveren we de **Twemoji-set van emoji-datasource** mee. Dat is dezelfde bron die emoji-mart gebruikt voor zijn "twitter"-set: + +- `emoji.json`: namen, categorieën, sorteervolgorde, huidskleurvarianten en de positie van elke emoji in het sheet. +- `sheet_twitter_64.png`: één spritesheet waarin elke emoji 64 px groot is, met 1 px opvulling. +- CLDR `annotations/nl.json`: Nederlandse namen en trefwoorden, zodat je ook in het Nederlands kunt zoeken. + +Een emoji wordt een stempel-annotatie, net als `StepAnnotation` en `CursorAnnotation`. Je klikt om hem te plaatsen, en daarna kun je hem verplaatsen, ongedaan maken en exporteren via de bestaande renderpijplijn. + +```mermaid +flowchart LR + Assets["Assets/Emoji: json + sheet + nl"] --> Catalog[EmojiCatalog] + Catalog --> Picker[EmojiPickerButton] + Catalog --> Anno[EmojiAnnotation] + Picker -->|"gekozen emoji + huidskleur"| Style[StyleSet.Emoji] + Style --> Anno + Anno --> Surface[AnnotationSurface en ImageExporter] +``` + +## Bestanden + +**Assets (nieuw):** `src/Kniip/Assets/Emoji/` met `emoji.json`, `twemoji-64.png` en `cldr-nl.json`. Deze komen in [src/Kniip/Kniip.csproj](src/Kniip/Kniip.csproj) als ``. De bestanden worden eenmalig gedownload met een klein script, `tools/fetch-emoji.ps1`, dat vaste versies van emoji-datasource-twitter (15.x) en cldr-json binnenhaalt. De bestanden zelf worden ingecheckt, zodat de build offline blijft werken. + +**`src/Kniip/Editor/Emoji/EmojiCatalog.cs` (nieuw)** +- Leest bij het eerste gebruik de json en het sheet (lazy, statisch). Emoji die niet in de Twitter-set zitten (`has_img_twitter`) en verouderde varianten (`obsoleted_by`) worden overgeslagen. +- Het model is `EmojiInfo` met deze velden: `Unified`, `Char`, `Name`, `ShortNames`, `Category`, `SortOrder`, `Keywords` (Engels plus Nederlands) en `SkinVariations` (een dictionary van toon naar sheetpositie). +- `ImageSource Get(string unified, SkinTone tone)`: een `CroppedBitmap` uit het sheet, in een cache en frozen. +- `IEnumerable Search(string query)` zoekt in namen, shortcodes en trefwoorden, zonder op hoofdletters te letten. +- Categorieën in de volgorde van emoji-mart, met Nederlandse labels: Recent, Smileys en emotie, Mensen, Dieren en natuur, Eten en drinken, Activiteiten, Reizen en plaatsen, Objecten, Symbolen, Vlaggen. + +**`src/Kniip/Editor/Annotations/EmojiAnnotation.cs` (nieuw)** +- Een stempel zoals `CursorAnnotation`: `Center` als `Point`, de grootte komt uit `Style.Size`, en `Bounds` is een vierkant rond `Center`. +- `Render` gebruikt `dc.DrawImage(EmojiCatalog.Get(Style.Emoji, Style.SkinTone), Bounds)`. Bij `Style.Shadow` komt er een schaduw onder, op dezelfde manier als in `RenderHelpers.DrawWithShadow`, maar dan voor een afbeelding (met een `DrawingGroup` en een `DropShadowEffect`-equivalent, of een offset-kopie met lage opaciteit). +- Er gebruikt `RenderOptions.SetBitmapScalingMode(HighQuality)` voor nette schaling. + +**[src/Kniip/Editor/StyleSet.cs](src/Kniip/Editor/StyleSet.cs)** +- `ToolKind.Emoji` komt achter `Cursor`. +- Nieuwe enum `SkinTone { Default, Light, MediumLight, Medium, MediumDark, Dark }`. +- `StyleSet` krijgt `string Emoji = "1f44d"` (duim omhoog) en `SkinTone SkinTone`. +- Nieuwe `StyleProps.Emoji = 8192`. +- `DefaultFor`: `ToolKind.Emoji => new StyleSet { Size = 48, Shadow = false }`. +- `PropsFor`: `ToolKind.Emoji => StyleProps.Emoji | StyleProps.Size | StyleProps.Shadow`. + +**`src/Kniip/Editor/EmojiPickerButton.xaml(.cs)` (nieuw)** + +Dit volgt hetzelfde patroon als [ColorPickerButton](src/Kniip/Editor/ColorPickerButton.xaml.cs): een `ToggleButton` met een `Popup`, en het event `EmojiChanged`. De popup is ongeveer 350x420 en bevat: +- Een zoekveld bovenaan, dat focus krijgt zodra de popup opent. +- Een rij met categorie-tabs. Een klik scrollt naar de bijbehorende sectie. +- Een gevirtualiseerd raster: `ItemsControl` met `VirtualizingStackPanel` en per categorie een rij van negen emoji van 32 px. +- Onderaan een preview met de naam en `:shortcode:` van de emoji waar je met de muis boven hangt, plus een huidskleurkiezer met zes bolletjes. +- Na een keuze sluit de popup. + +**[src/Kniip/Settings/AppSettings.cs](src/Kniip/Settings/AppSettings.cs)** +- Nieuwe instelling `List RecentEmoji`, met maximaal 18 items en de laatst gekozen emoji vooraan. Deze lijst vult de tab "Recent". + +**[src/Kniip/Editor/EditorWindow.xaml](src/Kniip/Editor/EditorWindow.xaml)** +- Een nieuwe `RadioButton Tag="Emoji"` achter `Cursor`, met `ItemId="Emoji"` en `Title="Emoji"`, tooltip "Emoji plaatsen (J)" en als icoon het Segoe Fluent-glyph `` (Emoji2). +- In `PropsPanel` komt een `EmojiGroup` met `EmojiPickerButton`. `SizeGroup` en `ShadowGroup` worden hergebruikt. + +**[src/Kniip/Editor/EditorWindow.xaml.cs](src/Kniip/Editor/EditorWindow.xaml.cs)** +- `CreateAnnotation`: `ToolKind.Emoji => new EmojiAnnotation { Center = p, Style = style }`. +- De stempel-case in `Surface_MouseLeftButtonDown` (rond regel 490) krijgt er `case ToolKind.Emoji:` bij. +- `CursorForTool`: `Emoji` gebruikt `Cursors.Hand`. +- Sneltoets `Key.J`: `SelectTool(ToolKind.Emoji)`. +- Hinttekst: "Klik om de gekozen emoji te plaatsen; kies een andere emoji in de balk eronder." +- `UpdatePropsPanel` en het toepassen van stijl op een geselecteerd object krijgen `StyleProps.Emoji` erbij. Zo kun je de emoji van een geplaatste stempel wisselen. +- De grootte-opties voor Emoji: 24, 32, 48, 64, 96 en 128. Boven 64 wordt het bitmap opgeschaald; dat is acceptabel. + +**[src/Kniip/Editor/ToolbarPanel.cs](src/Kniip/Editor/ToolbarPanel.cs)** +- Controleren of een opgeslagen `ToolbarOrder` zonder "Emoji" het nieuwe item gewoon op de standaardplek toont. Is dat niet zo, dan wordt dat ingebouwd. + +## Aandachtspunten +- De app wordt ongeveer 3 tot 8 MB groter door het sheet en de json. Het sheet wordt pas geladen als je het Emoji-gereedschap voor het eerst gebruikt. +- Twemoji valt onder CC-BY 4.0. De naamsvermelding komt in de README of het Over-scherm. +- Bestaande stijlen in de instellingen blijven compatibel, omdat de nieuwe velden standaardwaarden hebben. \ No newline at end of file diff --git a/.cursor/plans/knip_companion_editor_49629a11.plan.md b/.cursor/plans/knip_companion_editor_49629a11.plan.md new file mode 100644 index 0000000..b5e1c6c --- /dev/null +++ b/.cursor/plans/knip_companion_editor_49629a11.plan.md @@ -0,0 +1,75 @@ +--- +name: Knip companion editor +overview: Een C# .NET 8 WPF-app die naast het Windows Knipprogramma draait, nieuwe knipsels oppikt (klembord, Screenshots-map, 'Openen met') en ze opent in een eigen editor met blur/pixelate, tekstkaders, stappen, cursor, highlight en vormen. +todos: + - id: skeleton + content: Solution + WPF .NET 8 project, tray-icoon, single-instance, editor die een afbeelding laadt + status: completed + - id: capture + content: ClipboardWatcher en FolderWatcher (Screenshots) met dedupe en instellingen + status: completed + - id: tools-shapes + content: "Annotatiemodel + tools: rechthoek/ellips met randen/kleuren, tekstkader, stappen, cursor, highlight" + status: completed + - id: blur + content: Blur- en pixelate-tool, undo/redo, selecteren/verplaatsen/resizen + status: completed + - id: export + content: Export naar klembord/bestand, 'Openen met'-registratie, autostart, installer + status: completed +isProject: false +--- + +# Knip Companion - WPF annotatie-editor naast het Knipprogramma + +## Architectuur + +```mermaid +flowchart LR + SnipTool["Knipprogramma (onaangetast)"] -->|kopieert| Clipboard + SnipTool -->|slaat op| ScreenshotsFolder["Afbeeldingen/Schermafbeeldingen"] + SnipTool -->|"Openen met"| CmdArgs["App gestart met bestandspad"] + Clipboard --> Watcher[CaptureWatcher] + ScreenshotsFolder --> Watcher + CmdArgs --> Editor + Watcher -->|toast/tray-melding of direct| Editor[EditorWindow] + Editor -->|Ctrl+C / Opslaan| Output["Klembord / PNG-bestand"] +``` + +- De app draait in de achtergrond met een tray-icoon (`NotifyIcon` via `H.NotifyIcon.Wpf`) en is single-instance (Mutex + named pipe om bestandspaden door te geven). +- Bij een nieuw knipsel opent de editor direct of na een melding (instelbaar). + +## Projectstructuur +- [KnipPlus.sln](KnipPlus.sln) +- [src/KnipPlus/App.xaml.cs](src/KnipPlus/App.xaml.cs): opstarten, single-instance, tray, verwerking van commandline-argumenten +- [src/KnipPlus/Capture/ClipboardWatcher.cs](src/KnipPlus/Capture/ClipboardWatcher.cs): `AddClipboardFormatListener` + `WM_CLIPBOARDUPDATE`, controleert of het klembord een afbeelding bevat +- [src/KnipPlus/Capture/FolderWatcher.cs](src/KnipPlus/Capture/FolderWatcher.cs): `FileSystemWatcher` op `KnownFolder Screenshots`, met dedupe tegen het klembord (hash) +- [src/KnipPlus/Editor/EditorWindow.xaml](src/KnipPlus/Editor/EditorWindow.xaml): werkbalk (stijl zoals het Knipprogramma), canvas, eigenschappenpaneel (kleur, randdikte, stijl) +- [src/KnipPlus/Editor/Annotations/](src/KnipPlus/Editor/Annotations/): één klasse per tool, met een gemeenschappelijke basis `Annotation` (Render, HitTest, Move/Resize-handles) +- [src/KnipPlus/Editor/UndoStack.cs](src/KnipPlus/Editor/UndoStack.cs): undo/redo met commando's +- [src/KnipPlus/Settings/](src/KnipPlus/Settings/): JSON-instellingen in `%AppData%\KnipPlus` + +## Tools (annotaties als bewerkbare objecten, pas plat bij export) +- **Rechthoek/ellips**: randkleur, vulkleur (optioneel/transparant), dikte, stijl (doorgetrokken/gestreept/gestippeld), afgeronde hoeken, schaduw +- **Tekst in kader**: tekst met achtergrondkader, padding, lettertype/-grootte, kleur +- **Stappen**: genummerde badges die automatisch ophogen; reeks kiezen: 1,2,3 / a,b,c / A,B,C / I,II,III +- **Cursor**: stempel van een pijl- of handcursor (meegeleverde vectoriconen) +- **Highlight**: semi-transparante markeerstift; met Shift een recht horizontale streep (standaard rechtgetrokken, instelbaar) +- **Blur / pixelate**: rechthoekig gebied; effect berekend op de onderliggende bitmap (Gaussian blur of pixelblokken, sterkte instelbaar) +- Extra: pijl, lijn, bijsnijden, selecteren/verplaatsen/verwijderen + +## Export +- Ctrl+C: gerenderde PNG naar het klembord (gemarkeerd zodat de eigen watcher het niet opnieuw oppikt) +- Ctrl+S / Opslaan als: PNG/JPG +- Rendering via `RenderTargetBitmap` op de originele resolutie (rekening houden met DPI) + +## Integratie met "Openen met" +- Registratie per gebruiker in `HKCU\Software\Classes\Applications\KnipPlus.exe` + `OpenWithProgids` voor `.png/.jpg`, zodat de app in het menu "Openen met" van het Knipprogramma staat (geen beheerdersrechten nodig) +- Optioneel: automatisch starten met Windows (`HKCU\...\Run`) + +## Fasering +1. Skelet: solution, tray-app, single-instance, editor die een afbeelding toont +2. Capture: klembord- en mapwatcher, instellingen +3. Tools: vormen, tekstkader, stappen, highlight, cursor +4. Blur/pixelate, undo/redo, selecteren/aanpassen +5. Export, "Openen met"-registratie, autostart, installer (MSIX of Inno Setup) diff --git a/.cursor/plans/print_screen_sneltoets_27245656.plan.md b/.cursor/plans/print_screen_sneltoets_27245656.plan.md new file mode 100644 index 0000000..898068f --- /dev/null +++ b/.cursor/plans/print_screen_sneltoets_27245656.plan.md @@ -0,0 +1,85 @@ +--- +name: Print Screen sneltoets +overview: Knip+ krijgt een instelbare sneltoets waarbij Print Screen gewoon gekozen kan worden. Die toets opent een eigen rechthoekselectie over het scherm; na loslaten gaat het knipsel naar de bestaande editor. +todos: + - id: hotkey-model + content: HotkeyGesture op AppSettings, standaard Print Screen, JSON blijft werken + status: completed + - id: global-hook + content: WH_KEYBOARD_LL-haak die Print Screen ziet, inslikt en de actie op de UI-thread start + status: completed + - id: settings-ui + content: Instellingenkaart om de toets te kiezen, inclusief Print Screen, Esc en wissen + status: completed + - id: region-overlay + content: Per-monitor rechthoekselectie en CopyFromScreen naar de editor + status: completed + - id: wire-up + content: StartNewSnip, systeemvak en opslaan van instellingen op de haak aansluiten + status: completed +isProject: false +--- + +# Print Screen als sneltoets voor eigen knipsel + +Knip+ start nu het Windows Knipprogramma via `ms-screenclip:` ([App.xaml.cs](src/KnipPlus/App.xaml.cs) `StartNewSnip`). Er is geen sneltoets, en een gewone WPF-`KeyDown` ziet Print Screen niet: Windows eet die toets op voordat het venster hem krijgt. Daarom komt er een globale low-level toetsaanslaghaak, plus een selectievenster. + +De schermafbeelding (opname, actief venster, GIF) is alleen het voorbeeld van de toets. Alleen rechthoekselectie komt erbij; `ScreenRecorderLib` blijft ongebruikt. + +## Sneltoets vastleggen + +Nieuw type `HotkeyGesture` (Ctrl, Alt, Shift, Win + virtuele toets) op [AppSettings](src/KnipPlus/Settings/AppSettings.cs), opgeslagen via de bestaande JSON-store. Standaard: **Print Screen** zonder modifiers (`VK_SNAPSHOT` = `0x2C`). Ontbreekt het veld in een bestaand `settings.json`, dan geldt diezelfde standaard. + +In [SettingsWindow.xaml](src/KnipPlus/Settings/SettingsWindow.xaml) een kaart **Sneltoets**: + +- Knop met de huidige combinatie, bijvoorbeeld `Print Screen` of `Ctrl + Shift + P`. +- Klikken zet de knop in luisterstand: de volgende toets (geen losse Ctrl/Alt/Shift/Win) wordt de sneltoets. +- Print Screen komt binnen via dezelfde haak, niet via WPF, zodat de knop hem echt kan tonen. +- Esc annuleert het kiezen. Delete of Backspace maakt de sneltoets leeg. +- Korte toelichting: als Print Screen is gekozen, vangt Knip+ die toets af. Het Windows-knipprogramma opent dan niet óók. + +## Globale haak + +Nieuwe `GlobalHotkeyHook` in `src/KnipPlus/Infrastructure/`, P/Invoke in [NativeMethods.cs](src/KnipPlus/Interop/NativeMethods.cs): + +- `SetWindowsHookEx(WH_KEYBOARD_LL)` op de UI-thread, delegate vastgehouden tegen GC, `UnhookWindowsHookEx` bij afsluiten. +- Alleen key-down (`WM_KEYDOWN` / `WM_SYSKEYDOWN`), geen key-up. +- Modifiers via `GetAsyncKeyState` (inclusief linker en rechter Windows-toets). +- Bij een match: toets inslikken (niet doorgeven) en de actie met `BeginInvoke` starten, zodat de haak niet blokkeert. +- Tijdens het kiezen van een sneltoets slikt de haak die toets ook in, maar start geen knipsel. + +`RegisterHotKey` is hier niet genoeg: Windows heeft Print Screen vaak al geregistreerd, en dan faalt de registratie stil. + +## Rechthoekselectie + +Nieuw overlayvenster per monitor (`src/KnipPlus/Capture/RegionCaptureWindow.xaml`). De app is al PerMonitorV2 ([app.manifest](src/KnipPlus/app.manifest)). + +- Randloos, altijd bovenop, niet in de taakbalk, donkere laag over `Screen.Bounds`. +- Positie en grootte in fysieke pixels via `SetWindowPos`, daarna de WPF-grootte uit de DPI van dát scherm, zodat een scherm op 150% niet verschuift. +- Slepen tekent de rechthoek (uitsparing in de dimlaag plus maatlabel). Loslaten met een minimale grootte (ongeveer 3×3 px) maakt het knipsel. +- Esc of rechtermuisknop annuleert. +- Pixels via `Graphics.CopyFromScreen` op de fysieke rechthoek, omzetten naar een bevroren `BitmapSource` (96 DPI, Bgra32) met het bestaande patroon in [PixelUtil](src/KnipPlus/Infrastructure/PixelUtil.cs). Het klembord blijft onaangeroerd, zodat de klembordbewaking het knipsel niet nog eens aanbiedt. + +Daarna direct `OpenEditor`. Geen toast: de gebruiker heeft zelf geknipt. + +## Aansluiting + +In [App.xaml.cs](src/KnipPlus/App.xaml.cs): + +- Haak starten na het laden van de instellingen, en opnieuw zetten bij Opslaan. +- `StartNewSnip` opent de rechthoekselectie in plaats van `ms-screenclip:`. Daarmee gebruiken de knop **Nieuw** en Ctrl+N in de editor dezelfde selectie. +- Zolang de selectie open is, negeert de haak een tweede druk. + +In [TrayIcon.cs](src/KnipPlus/Infrastructure/TrayIcon.cs) een menu-item **Rechthoek knippen**, zodat het ook zonder toets kan. + +```mermaid +flowchart LR + Hook[GlobalHotkeyHook] + Settings[Instellingen] + Overlay[RegionCaptureWindow] + Editor[EditorWindow] + Settings -->|opslaan| Hook + Hook -->|"Print Screen of gekozen toets"| Overlay + Tray[Systeemvak en Nieuw] --> Overlay + Overlay -->|BitmapSource| Editor +``` diff --git a/.cursor/plans/screencasts_mp4_gif_68933a82.plan.md b/.cursor/plans/screencasts_mp4_gif_68933a82.plan.md new file mode 100644 index 0000000..e505ed3 --- /dev/null +++ b/.cursor/plans/screencasts_mp4_gif_68933a82.plan.md @@ -0,0 +1,73 @@ +--- +name: Screencasts MP4 GIF +overview: "Knip+ krijgt een eigen schermopname: gebied kiezen via tray of sneltoets, opnemen met geluid, muisaanwijzer en klikmarkering, daarna begin en einde inkorten en opslaan als MP4 of GIF." +todos: + - id: spike + content: ScreenRecorderLib toevoegen, TFM naar windows10.0.19041.0, en controleren dat single-file publish met opname werkt + status: completed + - id: hotkey-tray + content: GlobalHotkey + tray-item + StartRecording/StopRecording in App + status: completed + - id: selector + content: RegionSelectorWindow (slepen, venster, heel scherm) en RegionFrameWindow + status: completed + - id: toolbar-session + content: RecordingToolbar en RecordingSession (audio, cursor, klikken, pauze, aftellen) + status: completed + - id: screencast-window + content: ScreencastWindow met preview en bereikschuif voor inkorten + status: completed + - id: export + content: VideoExporter (MP4 trim) en GifEncoder (frames via GetThumbnailsAsync, quantisatie, delta-frames) + status: completed + - id: settings + content: AppSettings-velden en sectie Screencasts in SettingsWindow + status: completed + - id: build + content: build.ps1/installer bijwerken en eind-tot-eind testen + status: completed +isProject: false +--- + +# Screencasts (MP4 en GIF) in Knip+ + +## Aanpak + +Er komt één opnamepad: Knip+ neemt altijd eerst op als MP4 in een tijdelijk bestand (met geluid als dat aan staat). Pas na het stoppen kies je in een nabewerkingsvenster het bereik en het formaat. Zo hoef je vooraf niets te beslissen, en GIF en MP4 delen dezelfde opname en dezelfde inkortfunctie. + +```mermaid +flowchart LR + trigger["Tray of sneltoets"] --> selector[RegionSelectorWindow] + selector --> toolbar["RecordingToolbar: start, pauze, stop"] + toolbar --> session["RecordingSession: tijdelijke MP4"] + session --> editor["ScreencastWindow: voorbeeld en inkorten"] + editor --> mp4["VideoExporter: MP4"] + editor --> gif["GifEncoder: GIF"] +``` + +## Techniek + +- **Opnemen**: NuGet-pakket `ScreenRecorderLib` (MIT, gebruikt Windows Media Foundation, H.264/AAC). Dat regelt in één keer het gekozen gebied, de muisaanwijzer, de klikmarkering en het mixen van systeemgeluid en microfoon. Er is dan geen ffmpeg nodig. +- **Inkorten naar MP4**: `Windows.Media.Editing.MediaComposition` met `TrimTimeFromStart` en `TrimTimeFromEnd`, en daarna `RenderToFileAsync`. Daarvoor gaat het target framework in [src/KnipPlus/KnipPlus.csproj](src/KnipPlus/KnipPlus.csproj) van `net8.0-windows` naar `net8.0-windows10.0.19041.0`. +- **GIF**: frames uit de MP4 halen met `MediaComposition.GetThumbnailsAsync`, met een instelbare fps (standaard 10) en maximale breedte. Daarna codeert een eigen `GifEncoder` ze: per frame een palet van 256 kleuren (octree-quantisatie), framevertraging, oneindig herhalen (NETSCAPE-extensie) en ongewijzigde pixels transparant maken, zodat het bestand klein blijft. De ingebouwde `GifBitmapEncoder` van WPF kent geen framevertraging of herhalen en is daarom niet bruikbaar. +- **Risico bij single-file publish**: `ScreenRecorderLib` is een C++/CLI-assembly en die kan niet vanuit de bundel geladen worden. Daarom komt `-p:IncludeAllContentForSelfExtract=true` in [build.ps1](build.ps1) (of als fallback publiceren als map via de installer). Dit test ik direct als eerste stap. + +## Nieuwe bestanden (`src/KnipPlus/Recording/`) + +- `RegionSelectorWindow.xaml(.cs)`: een transparante overlay over alle schermen. Je sleept een rechthoek, klikt op een venster om dat te kiezen, of drukt op Enter voor het hele scherm. De selectie houdt rekening met DPI per monitor. +- `RegionFrameWindow.cs`: een rand rond het opnamegebied die klikken doorlaat en buiten het gebied valt, zodat hij niet in de opname komt. +- `RecordingToolbar.xaml(.cs)`: een kleine knoppenbalk die altijd bovenop blijft, naast het gebied. Daarop staan schakelaars voor systeemgeluid en microfoon, en knoppen voor start (met 3 seconden aftellen), pauze en stop, plus de verstreken tijd. +- `RecordingSession.cs`: een wrapper om `ScreenRecorderLib.Recorder` (opties, status, fouten) die een tijdelijk MP4-pad oplevert in `%TEMP%\KnipPlus`. +- `ScreencastWindow.xaml(.cs)`: voorbeeld van de opname via `MediaElement`, een bereikschuif met begin- en eindgreep en afspelen binnen het bereik. Verder knoppen "Opslaan als MP4", "Opslaan als GIF" (met fps en breedte) en "Kopiëren" (het bestand als FileDropList op het klembord). Bij het sluiten wordt het tijdelijke bestand opgeruimd. +- `VideoExporter.cs`: MP4 inkorten en renderen. +- `GifEncoder.cs`: GIF-encoder met quantisatie en het overslaan van ongewijzigde pixels per frame. + +## Wijzigingen in bestaande bestanden + +- [src/KnipPlus/Infrastructure/TrayIcon.cs](src/KnipPlus/Infrastructure/TrayIcon.cs): menu-item "Screencast opnemen..." en een event `RecordRequested`. Tijdens een opname wordt dit "Opname stoppen". +- `src/KnipPlus/Infrastructure/GlobalHotkey.cs` (nieuw): `RegisterHotKey` via een verborgen `HwndSource`. Dezelfde sneltoets start of stopt de opname (standaard Ctrl + Shift + R). Als de sneltoets al bezet is, verschijnt er een ballonmelding. +- [src/KnipPlus/Interop/NativeMethods.cs](src/KnipPlus/Interop/NativeMethods.cs): `RegisterHotKey`, `UnregisterHotKey` en `WindowFromPoint` (voor het kiezen van een venster). +- [src/KnipPlus/App.xaml.cs](src/KnipPlus/App.xaml.cs): `StartRecording()` en `StopRecording()`. Er draait maximaal één opname tegelijk. Tijdens de opname staat `Capture.Paused` aan, zodat er geen knipsels opgepikt worden. +- [src/KnipPlus/Settings/AppSettings.cs](src/KnipPlus/Settings/AppSettings.cs): `RecordHotkey`, `RecordSystemAudio`, `RecordMicrophone`, `RecordShowCursor`, `RecordHighlightClicks`, `RecordFps` (30), `GifFps` (10), `GifMaxWidth` (800) en `LastVideoFolder` (standaard `Video's\Knip+`). +- [src/KnipPlus/Settings/SettingsWindow.xaml](src/KnipPlus/Settings/SettingsWindow.xaml) en de bijbehorende `.cs`: een sectie "Screencasts" met de sneltoets, standaardinstellingen voor geluid, muisaanwijzer en klikken, en GIF-instellingen. +- [installer/KnipPlus.iss](installer/KnipPlus.iss): alleen aanpassen als de fallback (publiceren als map) nodig blijkt. \ No newline at end of file diff --git a/.cursor/plans/zipline_upload_df938514.plan.md b/.cursor/plans/zipline_upload_df938514.plan.md new file mode 100644 index 0000000..b6bc3eb --- /dev/null +++ b/.cursor/plans/zipline_upload_df938514.plan.md @@ -0,0 +1,97 @@ +--- +name: Zipline upload +overview: Een Zipline 4-uploadbestemming toevoegen die je configureert door het ShareX-bestand (.sxcu) of het Shell Script-bestand (.sh) uit Zipline te importeren. Kniip uploadt daarna zelf via HttpClient, met een aparte knop Uploaden in de editor en in het screencastvenster. De link komt op het klembord. +todos: + - id: config + content: UploaderConfig + UploaderImporter (sxcu- en curl/sh-parser) in src/Kniip/Upload + status: completed + - id: client + content: ZiplineUploader met HttpClient multipart, foutafhandeling en JSON-padlezer + status: completed + - id: settings + content: AppSettings.Uploader, DPAPI-versleuteling token in SettingsStore, tabblad Uploaden (importeren/testen/verwijderen) + status: completed + - id: clipboard + content: ClipboardWriter.SetText toevoegen + status: completed + - id: editor + content: Uploadknop + Ctrl+U in EditorWindow, zichtbaar alleen met config; ToolbarPanel-volgorde controleren + status: completed + - id: screencast + content: "Uploadknop in ScreencastWindow: export naar temp, upload met voortgang/annuleren, link naar klembord" + status: completed + - id: build + content: Bouwen en testen met een echte .sxcu en .sh uit Zipline 4 + status: completed +isProject: false +--- + +# Upload naar Zipline 4 + +## Hoe het werkt + +```mermaid +flowchart LR + sxcu["ShareX .sxcu"] --> importer[UploaderImporter] + sh["Shell script .sh"] --> importer + importer --> config["UploaderConfig in AppSettings"] + editorBtn["Editor: Uploaden"] --> client[ZiplineUploader] + castBtn["Screencast: Uploaden"] --> client + config --> client + client -->|"POST multipart"| server["Zipline /api/upload"] + server -->|"JSON files[0].url"| client + client --> clip["URL naar klembord + melding"] +``` + +Zipline 4 gebruikt een vast patroon: `POST https://host/api/upload` met de header `authorization: `, extra headers zoals `x-zipline-format`, een multipart-veld `file`, en als antwoord `{"files":[{"url": ...}]}`. Beide exportbestanden bevatten precies die gegevens. Kniip leest ze daarom alleen in en voert niets uit. + +## Nieuwe bestanden in `src/Kniip/Upload/` + +- `UploaderConfig.cs` bevat de velden `Name`, `RequestUrl`, `Headers` (een dictionary), `FileFormName` (standaard `"file"`) en `UrlPath` (standaard `"files[0].url"`). Daarnaast staat er een eigenschap `IsConfigured`. +- `UploaderImporter.cs`: + - `FromSxcu(string json)`: leest met `System.Text.Json` de velden `RequestURL`, `Headers`, `FileFormName` en `URL` uit. Van `URL` wordt `{json:files[0].url}` omgezet naar het pad `files[0].url`. Een `.sxcu` met `Body` anders dan `MultipartFormData` wordt geweigerd. + - `FromShellScript(string text)`: zoekt de `curl`-regel. Daaruit haalt hij de `http(s)://`-URL, elke `-H "naam: waarde"` als header (behalve `content-type`), en de veldnaam uit `-F naam=@...`. Het antwoordpad komt uit `jq -r ` als dat er staat, anders de standaardwaarde. Regelvervolgingen (`\` aan het einde van een regel) en aanhalingstekens worden gewoon afgehandeld. + - Kan het bestand niet worden gelezen, dan geeft de importer een duidelijke Nederlandse foutmelding. +- `ZiplineUploader.cs`: één statische `HttpClient` en de methode `Task UploadAsync(UploaderConfig, Stream, string fileName, string contentType, IProgress?, CancellationToken)`. Die bouwt de `MultipartFormDataContent`, voegt de headers toe en geeft bij een HTTP-fout de statuscode en de `error`-tekst van Zipline terug. Daarna leest hij de URL via een eenvoudige padlezer (`a.b[0].c`) uit het JSON-antwoord. + +## Instellingen + +- In [`src/Kniip/Settings/AppSettings.cs`](src/Kniip/Settings/AppSettings.cs) komt `public UploaderConfig? Uploader { get; set; }` bij. +- De `authorization`-header is een geheime token. Die wordt in de settings-JSON met DPAPI versleuteld voor de huidige gebruiker, via `ProtectedData.Protect` en het NuGet-pakket `System.Security.Cryptography.ProtectedData`. Dat gebeurt in [`src/Kniip/Settings/SettingsStore.cs`](src/Kniip/Settings/SettingsStore.cs) bij het opslaan en laden. +- In [`src/Kniip/Settings/SettingsWindow.xaml`](src/Kniip/Settings/SettingsWindow.xaml) komt een nieuw tabblad **Uploaden** met: + - Een knop "Importeren..." met een `OpenFileDialog` en het filter `ShareX-uploader (*.sxcu)|*.sxcu|Shell script (*.sh)|*.sh`. + - Een regel die de huidige bestemming toont: de servernaam uit de URL, zonder token. + - De knoppen "Testen" (uploadt een klein PNG'tje en toont de link) en "Verwijderen". + - Een hinttekst: "Maak het bestand in Zipline via Instellingen > Generate Uploaders (ShareX of Shell Script)." +- De afhandeling komt in [`src/Kniip/Settings/SettingsWindow.xaml.cs`](src/Kniip/Settings/SettingsWindow.xaml.cs). De nieuwe configuratie wordt pas bij Opslaan vastgelegd, net als bij de andere instellingen. + +## Editor + +- In [`src/Kniip/Editor/EditorWindow.xaml`](src/Kniip/Editor/EditorWindow.xaml) komt een nieuwe toolbarknop `ItemId="Upload"` (icoon ``, titel "Uploaden"), tussen Opslaan en Kopiëren. +- In [`src/Kniip/Editor/EditorWindow.xaml.cs`](src/Kniip/Editor/EditorWindow.xaml.cs) komt `Upload_Click` plus de sneltoets Ctrl+U: + - `CommitTextEdit()`, daarna `DocumentRenderer.Export(_doc)` en vervolgens `ImageExporter.EncodePng`. + - `UploadAsync` met de bestandsnaam `Knipsel yyyy-MM-dd HHmmss.png`. + - Het resultaat gaat naar `ClipboardWriter.SetText(url)` en `ShowTemporaryHint("Geüpload, link gekopieerd: ...")`. + - Tijdens het uploaden is de knop uitgeschakeld. +- De knop is ingeklapt zolang `Uploader` niet is ingesteld. Dat wordt opnieuw gecontroleerd in `OnActivated`, net zoals `ApplySaveButton` dat doet. +- Ik controleer in `ToolbarPanel` dat een nieuw `ItemId` ook verschijnt als er al een `ToolbarOrder` is opgeslagen. Zo niet, dan komen onbekende items achteraan. + +## Screencast + +- In [`src/Kniip/Recording/ScreencastWindow.xaml`](src/Kniip/Recording/ScreencastWindow.xaml) komt een knop `UploadButton` naast Kopiëren. +- In [`src/Kniip/Recording/ScreencastWindow.xaml.cs`](src/Kniip/Recording/ScreencastWindow.xaml.cs) komt `Upload_Click`. Dat volgt hetzelfde patroon als `Copy_Click`: + - Eerst `ExportAsync` naar een tijdelijke map. + - Daarna `UploadAsync` met `video/mp4` of `image/gif`. De voortgang loopt via dezelfde `Progress`-balk en annuleren gaat via `_export`. + - Daarna gaat de URL naar het klembord en toont `SavedText` de link. + - `SetBusy` schakelt ook `UploadButton` uit. + +## Hulpfunctie + +- In [`src/Kniip/Editor/ImageExporter.cs`](src/Kniip/Editor/ImageExporter.cs) krijgt `ClipboardWriter` de methode `SetText(string)`, met dezelfde aanpak voor een bezet klembord als `SetFile`. + +## Buiten de scope + +- Automatisch uploaden bij een nieuw knipsel. +- Een "opslaan en uploaden"-keuze voor de knop Opslaan. +- Het echt uitvoeren van het shellscript. +- Andere uploaders dan Zipline. De importer werkt in principe ook voor andere ShareX-configuraties met multipart, maar dat wordt niet getest. \ No newline at end of file diff --git a/.cursor/workspace/Project - Kniip.code-workspace b/.cursor/workspace/Project - Kniip.code-workspace new file mode 100644 index 0000000..407c760 --- /dev/null +++ b/.cursor/workspace/Project - Kniip.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "../.." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/.fiiles/kniip_logo.afdesign b/.fiiles/kniip_logo.afdesign new file mode 100644 index 0000000..abb2013 Binary files /dev/null and b/.fiiles/kniip_logo.afdesign differ diff --git a/.fiiles/kniip_logo.svg b/.fiiles/kniip_logo.svg new file mode 100644 index 0000000..8804b30 --- /dev/null +++ b/.fiiles/kniip_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e30837b --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +bin/ +obj/ +artifacts/ +.vs/ +*.user diff --git a/Kniip.sln b/Kniip.sln new file mode 100644 index 0000000..e25688a --- /dev/null +++ b/Kniip.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kniip", "src\Kniip\Kniip.csproj", "{6B1F3C2A-8E4D-4C1B-9A57-2F3D9E7C4A10}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6B1F3C2A-8E4D-4C1B-9A57-2F3D9E7C4A10}.Debug|x64.ActiveCfg = Debug|x64 + {6B1F3C2A-8E4D-4C1B-9A57-2F3D9E7C4A10}.Debug|x64.Build.0 = Debug|x64 + {6B1F3C2A-8E4D-4C1B-9A57-2F3D9E7C4A10}.Release|x64.ActiveCfg = Release|x64 + {6B1F3C2A-8E4D-4C1B-9A57-2F3D9E7C4A10}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..a614996 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,52 @@ +# Publiceert kniip als zelfstandige single-file exe (geen .NET-installatie nodig op de doel-pc) +# en bouwt de installer als Inno Setup 6 aanwezig is. +# ScreenRecorderLib (screencasts) is een C++/CLI-assembly die niet uit de bundel geladen kan worden; +# IncludeAllContentForSelfExtract pakt daarom bij de eerste start alles uit naar %TEMP%\.net. +# +# .\build.ps1 -> artifacts\publish\Kniip.exe (+ installer indien mogelijk) +# .\build.ps1 -Version 1.2.0 + +param( + [string]$Version = "1.0.0", + [string]$Runtime = "win-x64" +) + +$ErrorActionPreference = "Stop" +$root = $PSScriptRoot +$publishDir = Join-Path $root "artifacts\publish" + +# Gebruik een SDK in het gebruikersprofiel als er geen systeembrede SDK is. +$localDotnet = Join-Path $env:LOCALAPPDATA "Microsoft\dotnet" +if (-not (dotnet --list-sdks 2>$null) -and (Test-Path (Join-Path $localDotnet "dotnet.exe"))) { + $env:DOTNET_ROOT = $localDotnet + $env:PATH = "$localDotnet;$env:PATH" +} + +if (Test-Path $publishDir) { Remove-Item $publishDir -Recurse -Force } + +dotnet publish (Join-Path $root "src\Kniip\Kniip.csproj") ` + -c Release -r $Runtime --self-contained true ` + -p:PublishSingleFile=true ` + -p:IncludeNativeLibrariesForSelfExtract=true ` + -p:IncludeAllContentForSelfExtract=true ` + -p:EnableCompressionInSingleFile=true ` + -p:DebugType=none ` + -p:Version=$Version ` + -o $publishDir +if ($LASTEXITCODE -ne 0) { throw "dotnet publish is mislukt." } + +Write-Host "Gepubliceerd: $publishDir\Kniip.exe" -ForegroundColor Green + +$iscc = @( + "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe", + "$env:ProgramFiles\Inno Setup 6\ISCC.exe", + "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" +) | Where-Object { Test-Path $_ } | Select-Object -First 1 + +if ($iscc) { + & $iscc "/DAppVersion=$Version" "/DPublishDir=$publishDir" (Join-Path $root "installer\Kniip.iss") + if ($LASTEXITCODE -ne 0) { throw "Installer bouwen is mislukt." } + Write-Host "Installer: $root\artifacts\Kniip-Setup-$Version.exe" -ForegroundColor Green +} else { + Write-Host "Inno Setup 6 niet gevonden; installer overgeslagen (winget install JRSoftware.InnoSetup)." -ForegroundColor Yellow +} diff --git a/installer/Kniip.iss b/installer/Kniip.iss new file mode 100644 index 0000000..59df15f --- /dev/null +++ b/installer/Kniip.iss @@ -0,0 +1,82 @@ +; Inno Setup-script voor kniip (per-gebruiker installatie, geen beheerdersrechten nodig). +; Bouwen: eerst .\build.ps1 (publiceert naar artifacts\publish), daarna compileert build.ps1 dit script +; automatisch als Inno Setup 6 (https://jrsoftware.org/isinfo.php) is geïnstalleerd. + +#define AppName "kniip" +#define AppExe "Kniip.exe" +#ifndef AppVersion + #define AppVersion "1.0.0" +#endif +#ifndef PublishDir + #define PublishDir "..\artifacts\publish" +#endif + +[Setup] +AppId={{6B1F3C2A-8E4D-4C1B-9A57-2F3D9E7C4A10} +AppName={#AppName} +AppVersion={#AppVersion} +AppPublisher=kniip +DefaultDirName={localappdata}\Programs\Kniip +DefaultGroupName={#AppName} +DisableProgramGroupPage=yes +PrivilegesRequired=lowest +OutputDir=..\artifacts +OutputBaseFilename=Kniip-Setup-{#AppVersion} +SetupIconFile=..\src\Kniip\AppIcon.ico +UninstallDisplayIcon={app}\{#AppExe} +Compression=lzma2 +SolidCompression=yes +WizardStyle=modern +ArchitecturesAllowed=x64compatible +ArchitecturesInstallIn64BitMode=x64compatible +CloseApplications=yes + +[Languages] +Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" + +[Tasks] +Name: "autostart"; Description: "kniip starten met Windows (aanbevolen)"; GroupDescription: "Integratie:" +Name: "openwith"; Description: "kniip tonen in 'Openen met' voor afbeeldingen (ook in het Knipprogramma)"; GroupDescription: "Integratie:" +Name: "desktopicon"; Description: "Snelkoppeling op het bureaublad"; GroupDescription: "Snelkoppelingen:"; Flags: unchecked + +[InstallDelete] +; Overblijfselen van voor de hernoeming van Knip+ naar kniip; de registersleutels ruimt de app zelf op. +Type: files; Name: "{app}\KnipPlus.exe" +Type: files; Name: "{autoprograms}\Knip+.lnk" +Type: files; Name: "{autodesktop}\Knip+.lnk" + +[Files] +Source: "{#PublishDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs + +[Icons] +Name: "{autoprograms}\{#AppName}"; Filename: "{app}\{#AppExe}" +Name: "{autodesktop}\{#AppName}"; Filename: "{app}\{#AppExe}"; Tasks: desktopicon + +[Registry] +; Autostart +Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "Kniip"; ValueData: """{app}\{#AppExe}"" --tray"; Tasks: autostart; Flags: uninsdeletevalue + +; "Openen met" +Root: HKCU; Subkey: "Software\Classes\Kniip.Image"; ValueType: string; ValueName: ""; ValueData: "kniip afbeelding"; Tasks: openwith; Flags: uninsdeletekey +Root: HKCU; Subkey: "Software\Classes\Kniip.Image\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"",0"; Tasks: openwith +Root: HKCU; Subkey: "Software\Classes\Kniip.Image\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"" ""%1"""; Tasks: openwith +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExe}"; ValueType: string; ValueName: "FriendlyAppName"; ValueData: "kniip editor"; Tasks: openwith; Flags: uninsdeletekey +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExe}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#AppExe}"" ""%1"""; Tasks: openwith +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExe}\SupportedTypes"; ValueType: string; ValueName: ".png"; ValueData: ""; Tasks: openwith +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExe}\SupportedTypes"; ValueType: string; ValueName: ".jpg"; ValueData: ""; Tasks: openwith +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExe}\SupportedTypes"; ValueType: string; ValueName: ".jpeg"; ValueData: ""; Tasks: openwith +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExe}\SupportedTypes"; ValueType: string; ValueName: ".bmp"; ValueData: ""; Tasks: openwith +Root: HKCU; Subkey: "Software\Classes\Applications\{#AppExe}\SupportedTypes"; ValueType: string; ValueName: ".gif"; ValueData: ""; Tasks: openwith +Root: HKCU; Subkey: "Software\Classes\.png\OpenWithProgids"; ValueType: none; ValueName: "Kniip.Image"; Tasks: openwith; Flags: uninsdeletevalue +Root: HKCU; Subkey: "Software\Classes\.jpg\OpenWithProgids"; ValueType: none; ValueName: "Kniip.Image"; Tasks: openwith; Flags: uninsdeletevalue +Root: HKCU; Subkey: "Software\Classes\.jpeg\OpenWithProgids"; ValueType: none; ValueName: "Kniip.Image"; Tasks: openwith; Flags: uninsdeletevalue +Root: HKCU; Subkey: "Software\Classes\.bmp\OpenWithProgids"; ValueType: none; ValueName: "Kniip.Image"; Tasks: openwith; Flags: uninsdeletevalue +Root: HKCU; Subkey: "Software\Classes\.gif\OpenWithProgids"; ValueType: none; ValueName: "Kniip.Image"; Tasks: openwith; Flags: uninsdeletevalue + +[Run] +Filename: "{app}\{#AppExe}"; Description: "kniip nu starten"; Flags: nowait postinstall skipifsilent + +[UninstallRun] +Filename: "{cmd}"; Parameters: "/C taskkill /IM {#AppExe} /F"; Flags: runhidden; RunOnceId: "StopKniip" +; Autostart en "Openen met" kunnen ook via de instellingen van kniip zelf aangezet zijn. +Filename: "{app}\{#AppExe}"; Parameters: "--unregister"; Flags: runhidden waituntilterminated; RunOnceId: "UnregisterKniip" diff --git a/nuget.config b/nuget.config new file mode 100644 index 0000000..6873eb9 --- /dev/null +++ b/nuget.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/Kniip/App.xaml b/src/Kniip/App.xaml new file mode 100644 index 0000000..92dcb6f --- /dev/null +++ b/src/Kniip/App.xaml @@ -0,0 +1,303 @@ + + + + + + + + + + + + + + Segoe Fluent Icons, Segoe MDL2 Assets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Kniip/App.xaml.cs b/src/Kniip/App.xaml.cs new file mode 100644 index 0000000..5d3d381 --- /dev/null +++ b/src/Kniip/App.xaml.cs @@ -0,0 +1,494 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Windows; +using System.Windows.Media.Imaging; +using System.Windows.Threading; +using Kniip.Capture; +using Kniip.Editor; +using Kniip.Infrastructure; +using Kniip.Interop; +using Kniip.Notifications; +using Kniip.Recording; +using Kniip.Settings; +using Microsoft.Win32; +using Screen = System.Windows.Forms.Screen; + +namespace Kniip; + +public partial class App : Application +{ + private SingleInstance? _singleInstance; + private TrayIcon? _tray; + private SettingsWindow? _settingsWindow; + private readonly List _snipWindows = new(); + private uint? _ignoredClipboardSequence; + + public static App Instance => (App)Current; + + public AppSettings Settings { get; private set; } = new(); + + internal CaptureCoordinator Capture { get; private set; } = null!; + + internal RecordingController Recorder { get; private set; } = null!; + + /// Toetsenbordhaak voor alle sneltoetsen (knipsels en screencasts). + internal GlobalHotkeyHook? HotkeyHook { get; private set; } + + protected override void OnStartup(StartupEventArgs e) + { + base.OnStartup(e); + DispatcherUnhandledException += OnUnhandledException; + + string[] args = e.Args; + if (HandleMaintenanceArguments(args)) + { + Shutdown(); + return; + } + + _singleInstance = new SingleInstance(); + if (!_singleInstance.TryAcquire()) + { + SingleInstance.SendToPrimary(args); + _singleInstance.Dispose(); + _singleInstance = null; + Shutdown(); + return; + } + + System.Windows.Forms.Application.EnableVisualStyles(); + try + { + ShellIntegration.MigrateLegacyRegistration(); + } + catch (Exception) + { + // Een mislukte opruimactie in het register mag het starten niet blokkeren. + } + + Settings = SettingsStore.Load(); + + Capture = new CaptureCoordinator(Dispatcher); + Capture.ApplySettings(Settings); + Capture.CaptureReceived += OnCaptureReceived; + + RecordingSession.CleanupTempFolder(); + Recorder = new RecordingController(Settings, Dispatcher); + Recorder.StageChanged += OnRecordingStageChanged; + Recorder.RecordingFinished += OpenScreencast; + Recorder.Notify += (title, text) => _tray?.ShowBalloon(title, text); + + _tray = new TrayIcon(); + _tray.OpenFromClipboardRequested += OpenFromClipboard; + _tray.OpenFileRequested += OpenFileWithDialog; + _tray.SnipRequested += BeginRegionSnip; + _tray.WindowSnipRequested += BeginWindowSnip; + _tray.RecordRequested += () => + { + if (Recorder.Stage == RecordingStage.Idle) + { + Recorder.Toggle(ScreencastFormat.Mp4); + } + else + { + Recorder.TrayAction(); + } + }; + _tray.GifRequested += () => Recorder.Toggle(ScreencastFormat.Gif); + _tray.SettingsRequested += ShowSettings; + _tray.ExitRequested += ExitApplication; + _tray.PauseChanged += _ => UpdateCapturePaused(); + + HotkeyHook = new GlobalHotkeyHook(Dispatcher); + ApplyHotkeys(); + + _singleInstance.StartServer(received => Dispatcher.BeginInvoke(() => HandleArguments(received, false))); + HandleArguments(args, true); + } + + private static bool HandleMaintenanceArguments(string[] args) + { + if (args.Contains("--register-openwith", StringComparer.OrdinalIgnoreCase)) + { + ShellIntegration.RegisterOpenWith(); + return true; + } + + if (args.Contains("--unregister", StringComparer.OrdinalIgnoreCase)) + { + ShellIntegration.UnregisterOpenWith(); + ShellIntegration.SetAutostart(false); + return true; + } + + return false; + } + + private void HandleArguments(string[] args, bool isFirstStart) + { + string[] files = args.Where(a => !a.StartsWith("--", StringComparison.Ordinal)).ToArray(); + foreach (string file in files) + { + OpenFile(file); + } + + if (files.Length > 0 || args.Contains("--tray", StringComparer.OrdinalIgnoreCase)) + { + return; + } + + if (isFirstStart) + { + string? hotkey = HotkeyDisplay(Settings.SnipHotkey); + _tray?.ShowBalloon("kniip is actief", hotkey == null + ? "Maak een knipsel met Win + Shift + S. kniip biedt het daarna aan om te bewerken." + : $"Druk op {hotkey} en sleep een rechthoek om te knippen en te bewerken."); + } + + OpenBlankEditor(); + } + + private void OnCaptureReceived(BitmapSource image) + { + switch (Settings.Action) + { + case CaptureAction.OpenEditor: + OpenEditor(image); + break; + case CaptureAction.Notify: + SnipToast.ShowFor(image, () => OpenEditor(image)); + break; + } + } + + public void OpenEditor(BitmapSource image) + { + var editor = new EditorWindow(image, Settings); + editor.Show(); + BringToFront(editor); + } + + /// Nieuw rechthoekknipsel na het sluiten van de editor. + public void StartNewSnip() + { + // Even wachten zodat het gesloten editorvenster niet op het nieuwe knipsel staat. + var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(300) }; + timer.Tick += (_, _) => + { + timer.Stop(); + BeginRegionSnip(); + }; + timer.Start(); + } + + /// Bevriest alle schermen en laat een rechthoek slepen; het resultaat opent in de editor. + public void BeginRegionSnip() => BeginSnip(pickWindow: false); + + /// Bevriest alle schermen en laat een venster aanklikken; het resultaat opent in de editor. + public void BeginWindowSnip() => BeginSnip(pickWindow: true); + + private void BeginSnip(bool pickWindow) + { + if (_snipWindows.Count > 0 || Recorder.Stage == RecordingStage.Selecting) + { + return; + } + + NativeMethods.GetCursorPos(out NativeMethods.POINT cursor); + var cursorPoint = new System.Drawing.Point(cursor.X, cursor.Y); + + // Eerst alle schermen vastleggen, dan pas vensters tonen, anders staat de overlay in het beeld. + List? windows = pickWindow ? PhysicalWindow.SnapshotWindows(includeOwn: true) : null; + var frozen = Screen.AllScreens.Select(screen => (screen, ScreenGrabber.Capture(screen.Bounds))).ToList(); + foreach ((Screen screen, BitmapSource image) in frozen) + { + var window = new RegionCaptureWindow(screen, image, windows); + window.Finished += OnRegionSnipFinished; + _snipWindows.Add(window); + window.Show(); + } + + RegionCaptureWindow? active = _snipWindows.FirstOrDefault(w => w.ContainsCursor(cursorPoint)) ?? _snipWindows.FirstOrDefault(); + active?.Activate(); + active?.Focus(); + + // Na een sneltoets in een ander programma krijgt de overlay vaak geen toetsenbordfocus; + // Esc en Enter lopen daarom via de haak. + if (HotkeyHook is { IsActive: true } hook) + { + hook.Capture = OnRegionSnipKey; + } + } + + private void OnRegionSnipKey(HotkeyGesture pressed) + { + NativeMethods.GetCursorPos(out NativeMethods.POINT cursor); + var cursorPoint = new System.Drawing.Point(cursor.X, cursor.Y); + RegionCaptureWindow? target = _snipWindows.FirstOrDefault(w => w.ContainsCursor(cursorPoint)) ?? _snipWindows.FirstOrDefault(); + if (target == null || pressed.Modifiers != System.Windows.Input.ModifierKeys.None) + { + return; + } + + if (pressed.Key == System.Windows.Input.Key.Escape) + { + target.Cancel(); + } + else if (pressed.Key == System.Windows.Input.Key.Enter) + { + target.SelectWholeScreen(); + } + } + + private void OnRegionSnipFinished(BitmapSource? image) + { + if (HotkeyHook != null) + { + HotkeyHook.Capture = null; + } + + foreach (RegionCaptureWindow window in _snipWindows) + { + window.Finished -= OnRegionSnipFinished; + window.Close(); + } + + _snipWindows.Clear(); + if (image != null) + { + OpenEditor(image); + } + } + + private string? HotkeyDisplay(string? hotkey) => + HotkeyHook is { IsActive: true } && HotkeyGesture.TryParse(hotkey, out HotkeyGesture gesture) + ? gesture.DisplayText + : null; + + private void ApplyHotkeys() + { + if (HotkeyHook != null) + { + var bindings = new Dictionary(); + void Bind(string? hotkey, Action action) + { + if (HotkeyGesture.TryParse(hotkey, out HotkeyGesture gesture)) + { + bindings.TryAdd(gesture, action); + } + } + + Bind(Settings.SnipHotkey, BeginRegionSnip); + Bind(Settings.WindowHotkey, BeginWindowSnip); + Bind(Settings.RecordHotkey, () => Recorder.Toggle(ScreencastFormat.Mp4)); + Bind(Settings.GifHotkey, () => Recorder.Toggle(ScreencastFormat.Gif)); + HotkeyHook.Bindings = bindings; + } + + _tray?.SetHotkeys(HotkeyDisplay(Settings.SnipHotkey), HotkeyDisplay(Settings.WindowHotkey), + HotkeyDisplay(Settings.RecordHotkey), HotkeyDisplay(Settings.GifHotkey)); + } + + /// Start een screencast: eerst het gebied kiezen, daarna de knoppenbalk. + public void StartRecording() + { + if (Recorder.Stage == RecordingStage.Idle) + { + Recorder.Toggle(); + } + } + + public void StopRecording() + { + if (Recorder.Stage is RecordingStage.Recording or RecordingStage.Paused) + { + Recorder.Toggle(); + } + } + + private void OnRecordingStageChanged(RecordingStage stage) + { + string? text = stage switch + { + RecordingStage.Idle => null, + RecordingStage.Recording or RecordingStage.Paused => "Opname stoppen", + RecordingStage.Finishing => "Opname afronden...", + _ => "Opname annuleren" + }; + _tray?.SetRecordItem(text, stage is RecordingStage.Recording or RecordingStage.Paused); + UpdateCapturePaused(); + } + + /// Tijdens een screencast geen knipsels oppikken. + private void UpdateCapturePaused() => + Capture.Paused = (_tray?.IsPaused ?? false) || Recorder.Stage != RecordingStage.Idle; + + private void OpenScreencast(string path, ScreencastFormat? format) + { + var window = new ScreencastWindow(path, Settings, format); + window.Show(); + BringToFront(window); + } + + /// Het knipsel op het klembord is weggegooid; pas na een nieuwe kopie weer openen. + public void IgnoreCurrentClipboard() => _ignoredClipboardSequence = NativeMethods.GetClipboardSequenceNumber(); + + public void OpenFromClipboard() + { + BitmapSource? image = _ignoredClipboardSequence == NativeMethods.GetClipboardSequenceNumber() + ? null + : ClipboardImageReader.TryRead(includeFiles: true); + if (image == null) + { + OpenBlankEditor(); + return; + } + + OpenEditor(image); + } + + /// Editor met een leeg wit canvas, voor als er (nog) geen knipsel is. + public void OpenBlankEditor(Window? placeLike = null) + { + const int width = 1280, height = 720; + byte[] pixels = Enumerable.Repeat((byte)255, width * height * 4).ToArray(); + BitmapSource blank = BitmapSource.Create(width, height, 96, 96, System.Windows.Media.PixelFormats.Bgra32, null, pixels, width * 4); + var editor = new EditorWindow(blank, Settings, isBlank: true); + if (placeLike != null) + { + Rect bounds = placeLike.WindowState == WindowState.Normal + ? new Rect(placeLike.Left, placeLike.Top, placeLike.Width, placeLike.Height) + : placeLike.RestoreBounds; + editor.WindowStartupLocation = WindowStartupLocation.Manual; + editor.Left = bounds.Left; + editor.Top = bounds.Top; + editor.Width = bounds.Width; + editor.Height = bounds.Height; + editor.WindowState = placeLike.WindowState == WindowState.Maximized ? WindowState.Maximized : WindowState.Normal; + } + + editor.Show(); + BringToFront(editor); + } + + public void OpenFile(string path) + { + try + { + OpenEditor(PixelUtil.LoadFile(path)); + } + catch (Exception ex) + { + MessageBox.Show($"Kan '{Path.GetFileName(path)}' niet openen.\n\n{ex.Message}", "kniip", + MessageBoxButton.OK, MessageBoxImage.Warning); + } + } + + private void OpenFileWithDialog() + { + if (PickImageFile(null) is { } path) + { + OpenFile(path); + } + } + + public string? PickImageFile(Window? owner) + { + var dialog = new OpenFileDialog + { + Title = "Afbeelding openen in kniip", + Filter = "Afbeeldingen|*.png;*.jpg;*.jpeg;*.bmp;*.gif|Alle bestanden|*.*", + InitialDirectory = CaptureCoordinator.ScreenshotsFolder ?? Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + }; + bool? ok = owner == null ? dialog.ShowDialog() : dialog.ShowDialog(owner); + return ok == true ? dialog.FileName : null; + } + + public void ShowSettings() + { + if (_settingsWindow == null) + { + _settingsWindow = new SettingsWindow(Settings); + _settingsWindow.Closed += (_, _) => _settingsWindow = null; + _settingsWindow.Show(); + } + + BringToFront(_settingsWindow); + } + + public void ShowBalloon(string title, string text) => _tray?.ShowBalloon(title, text); + + public void SaveSettings() + { + SettingsStore.Save(Settings); + Capture.ApplySettings(Settings); + ApplyHotkeys(); + } + + private static void BringToFront(Window window) + { + if (window.WindowState == WindowState.Minimized) + { + window.WindowState = WindowState.Normal; + } + + window.Topmost = true; + window.Activate(); + window.Topmost = false; + window.Focus(); + } + + private void ExitApplication() + { + if (Recorder.Stage != RecordingStage.Idle) + { + MessageBox.Show("Er loopt nog een screencast. Stop of annuleer die eerst.", "kniip", + MessageBoxButton.OK, MessageBoxImage.Information); + return; + } + + foreach (Window window in Windows.Cast().ToList()) + { + window.Close(); + } + + if (Windows.OfType().Any()) + { + return; + } + + Shutdown(); + } + + protected override void OnExit(ExitEventArgs e) + { + if (_singleInstance != null) + { + SettingsStore.Save(Settings); + } + + Capture?.Dispose(); + HotkeyHook?.Dispose(); + _tray?.Dispose(); + _singleInstance?.Dispose(); + base.OnExit(e); + } + + private void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) + { + try + { + Directory.CreateDirectory(SettingsStore.Folder); + File.AppendAllText(Path.Combine(SettingsStore.Folder, "error.log"), $"{DateTime.Now:O}\n{e.Exception}\n\n"); + } + catch (Exception) + { + // Loggen is best effort. + } + + MessageBox.Show($"Er ging iets mis:\n\n{e.Exception.Message}", "kniip", MessageBoxButton.OK, MessageBoxImage.Error); + e.Handled = true; + } +} diff --git a/src/Kniip/AppIcon.ico b/src/Kniip/AppIcon.ico new file mode 100644 index 0000000..9e7516d Binary files /dev/null and b/src/Kniip/AppIcon.ico differ diff --git a/src/Kniip/AppIcon.ico.bak b/src/Kniip/AppIcon.ico.bak new file mode 100644 index 0000000..16018f6 Binary files /dev/null and b/src/Kniip/AppIcon.ico.bak differ diff --git a/src/Kniip/Assets/Emoji/NOTICE.txt b/src/Kniip/Assets/Emoji/NOTICE.txt new file mode 100644 index 0000000..ffc527e --- /dev/null +++ b/src/Kniip/Assets/Emoji/NOTICE.txt @@ -0,0 +1,12 @@ +Emoji in kniip + +twemoji-64.png + Twemoji, Copyright 2019 Twitter, Inc and other contributors (https://github.com/jdecked/twemoji) + Graphics licensed under CC-BY 4.0: https://creativecommons.org/licenses/by/4.0/ + Spritesheet uit emoji-datasource-twitter 15.1.2 (https://github.com/iamcal/emoji-data, MIT). + +emoji.json + Afgeleid van emoji-datasource 15.1.2 (MIT, Copyright (c) 2013 Cal Henderson) + en de Unicode CLDR 46 annotaties voor nl en en (Unicode License v3, https://www.unicode.org/license.txt). + +Opnieuw genereren: tools/fetch-emoji.ps1 diff --git a/src/Kniip/Assets/Emoji/emoji.json b/src/Kniip/Assets/Emoji/emoji.json new file mode 100644 index 0000000..c45bc85 --- /dev/null +++ b/src/Kniip/Assets/Emoji/emoji.json @@ -0,0 +1 @@ +[{"u":"1f600","c":"Smileys \u0026 Emotion","o":1,"x":32,"y":46,"s":"grinning","n":"grijnzend gezicht","k":"grinning|grinning face|grijnzend gezicht|gezicht|grappig|grijns|lachen|lachend gezicht met open ogen|leuk|smiley|cheerful|cheery|face|grin|happy|laugh|nice|smile|smiling|teeth"},{"u":"1f603","c":"Smileys \u0026 Emotion","o":2,"x":32,"y":49,"s":"smiley","n":"grijnzend gezicht met grote ogen","k":"smiley|smiling face with open mouth|grijnzend gezicht met grote ogen|gaaf|gezicht|grappig|haha|lach|lachen|lachend gezicht met open mond|leuk|mond|open|grinning face with big eyes|awesome|big|eyes|face|grin|grinning|happy|mouth|smile|smiling|teeth|yay"},{"u":"1f604","c":"Smileys \u0026 Emotion","o":3,"x":32,"y":50,"s":"smile","n":"grijnzend gezicht met lachende ogen","k":"smile|smiling face with open mouth and smiling eyes|grijnzend gezicht met lachende ogen|gelukkig|gezicht|grijns|grijnzen|lach|lachen|lol|mond|ogen|oog|open|grinning face with smiling eyes|eye|eyes|face|grin|grinning|happy|laugh|mouth|smiling"},{"u":"1f601","c":"Smileys \u0026 Emotion","o":4,"x":32,"y":47,"s":"grin","n":"stralend gezicht met lachende ogen","k":"grin|grinning face with smiling eyes|stralend gezicht met lachende ogen|gezicht|glimlach|grappig|grijns|grijnzend|grijnzend gezicht met lachende ogen|lach|lachen|lachende ogen|leuk|oog|smiley|beaming face with smiling eyes|beaming|eye|eyes|face|grinning|happy|nice|smile|smiling|teeth"},{"u":"1f606","c":"Smileys \u0026 Emotion","o":5,"x":32,"y":52,"s":"laughing","n":"grijnzend gezicht met stijf dichtgeknepen ogen","k":"laughing|satisfied|smiling face with open mouth and tightly-closed eyes|grijnzend gezicht met stijf dichtgeknepen ogen|dichtgeknepen ogen|gelukkig|gesloten|gezicht|glimlach|glimlachend|grijnzen|haha|hahaha|lachen|lol|mond|ogen|open|rofl|grinning squinting face|closed|eyes|face|grinning|happy|laugh|mouth|smile|smiling|squinting"},{"u":"1f605","c":"Smileys \u0026 Emotion","o":6,"x":32,"y":51,"s":"sweat_smile","n":"grijnzend gezicht met zweetdruppels","k":"sweat smile|smiling face with open mouth and cold sweat|grijnzend gezicht met zweetdruppels|gestrest|gezicht|grijnzen|koud|lach|lachen|mond|neerslachtig|nerveus|open|opgewonden|stress|zweet|grinning face with sweat|cold|dejected|excited|face|grinning|mouth|nervous|smile|smiling|stressed|sweat"},{"u":"1f923","c":"Smileys \u0026 Emotion","o":7,"x":40,"y":54,"s":"rolling_on_the_floor_laughing","n":"gezicht dat op de grond rolt van het lachen","k":"rolling on the floor laughing|gezicht dat op de grond rolt van het lachen|gelukkig|gezicht|grappig|haha|hehe|hilarisch|huilen|lachen|lmao|lol|rofl|roflmao|rollen|traan|vloer|vreugde|crying|face|floor|funny|happy|hilarious|joy|laugh|rolling|tear"},{"u":"1f602","c":"Smileys \u0026 Emotion","o":8,"x":32,"y":48,"s":"joy","n":"gezicht met tranen van vreugde","k":"joy|face with tears of joy|gezicht met tranen van vreugde|gelukkig|gevoelens|gezicht|grappig|haha|hehe|hilarisch|huilen|lachen|lmao|lol|rofl|roflmao|traan|vreugde|crying|face|feels|funny|happy|hilarious|laugh|tear"},{"u":"1f642","c":"Smileys \u0026 Emotion","o":9,"x":33,"y":55,"s":"slightly_smiling_face","n":"enigszins lachend gezicht","k":"slightly smiling face|enigszins lachend gezicht|gezicht|glimlach|lach|smiley|tevreden|face|happy|slightly|smile|smiling"},{"u":"1f643","c":"Smileys \u0026 Emotion","o":10,"x":33,"y":56,"s":"upside_down_face","n":"omgekeerd gezicht","k":"upside down face|upside-down face|omgekeerd gezicht|gezicht|glimlach|hehe|omgekeerd|face|smile|upside-down"},{"u":"1fae0","c":"Smileys \u0026 Emotion","o":11,"x":56,"y":30,"s":"melting_face","n":"smeltend gezicht","k":"melting face|smeltend gezicht|heet|oplossen|smelten|smiley|verdwijnen|vloeibaar|warm|disappear|dissolve|embarrassed|face|haha|heat|hot|liquid|lol|melt|melting|sarcasm|sarcastic"},{"u":"1f609","c":"Smileys \u0026 Emotion","o":12,"x":32,"y":55,"s":"wink","n":"knipogend gezicht","k":"wink|winking face|knipogend gezicht|flirten|gezicht|knipoog|sexy|smiley|zwoel|face|flirt|heartbreaker|slide|tease|winking|winks"},{"u":"1f60a","c":"Smileys \u0026 Emotion","o":13,"x":32,"y":56,"s":"blush","n":"lachend gezicht met lachende ogen","k":"blush|smiling face with smiling eyes|lachend gezicht met lachende ogen|blosjes|blozen|gezicht|glimlach|lach|lachen|oog|rode wangen|smiley|eye|eyes|face|glad|satisfied|smile|smiling"},{"u":"1f607","c":"Smileys \u0026 Emotion","o":14,"x":32,"y":53,"s":"innocent","n":"lachend gezicht met halo","k":"innocent|smiling face with halo|lachend gezicht met halo|aureool|engel|fantasie|gezegend|gezicht|glimlach|halo|heilig|lach|lach met halo|onschuldig|smiley|stralenkrans|angel|angelic|angels|blessed|face|fairy|fairytale|fantasy|happy|peaceful|smile|smiling|spirit|tale"},{"u":"1f970","c":"Smileys \u0026 Emotion","o":15,"x":44,"y":32,"s":"smiling_face_with_3_hearts","n":"lachend gezicht met hartjes","k":"smiling face with 3 hearts|smiling face with smiling eyes and three hearts|lachend gezicht met hartjes|crush|dol|gezicht|hart|hartjes|jou|lach|lachen|liefde|romantiek|smiling face with hearts|3|adore|face|heart|hearts|ily|love|romance|smile|smiling|you"},{"u":"1f60d","c":"Smileys \u0026 Emotion","o":16,"x":32,"y":59,"s":"heart_eyes","n":"lachend gezicht met hartvormige ogen","k":"heart eyes|smiling face with heart-shaped eyes|lachend gezicht met hartvormige ogen|gevoelens|gezicht|hartjes|hartjesogen|kussen|lach|liefde|oog|romantiek|schatje|smiling face with heart-eyes|143|bae|eye|face|feels|heart-eyes|hearts|ily|kisses|love|romance|romantic|smile|xoxo"},{"u":"1f929","c":"Smileys \u0026 Emotion","o":17,"x":41,"y":15,"s":"star-struck","n":"sterren in de ogen","k":"star-struck|grinning face with star eyes|sterren in de ogen|gezicht|grijnzend|lach|ogen|opgewonden|ster|sterren als ogen|wauw|excited|eyes|face|grinning|smile|star|starry-eyed|wow"},{"u":"1f618","c":"Smileys \u0026 Emotion","o":18,"x":33,"y":8,"s":"kissing_heart","n":"gezicht dat kus toeblaast","k":"kissing heart|face throwing a kiss|gezicht dat kus toeblaast|flirten|gezicht|hartje|kus|kusje blazen|kussen|romantiek|smiley|xoxo|zoen|face blowing a kiss|adorbs|bae|blowing|face|flirt|heart|ily|kiss|love|lover|miss|muah|romantic|smooch|you"},{"u":"1f617","c":"Smileys \u0026 Emotion","o":19,"x":33,"y":7,"s":"kissing","n":"kussend gezicht","k":"kissing|kissing face|kussend gezicht|afspraakje|date|gezicht|hou van jou|hvj|kus|kussen|smiley|xoxo|zoen|143|dating|face|flirt|ily|kiss|love|smooch|smooches|you"},{"u":"263a-fe0f","c":"Smileys \u0026 Emotion","o":20,"x":58,"y":33,"s":"relaxed","n":"lachend gezicht","k":"relaxed|white smiling face|lachend gezicht|blij|gezicht|lach|lachen|omtrek|ontspannen|smiling face|face|happy|outlined|smile|smiling"},{"u":"1f61a","c":"Smileys \u0026 Emotion","o":21,"x":33,"y":10,"s":"kissing_closed_eyes","n":"kussend gezicht met gesloten ogen","k":"kissing closed eyes|kissing face with closed eyes|kussend gezicht met gesloten ogen|blosjes|blozen|gesloten|gesloten ogen|gezicht|kus|kussend gezicht met ogen dicht|oog|rode wangen|smiley|zoen|143|bae|blush|closed|date|dating|eye|eyes|face|flirt|ily|kisses|kissing|smooches|xoxo"},{"u":"1f619","c":"Smileys \u0026 Emotion","o":22,"x":33,"y":9,"s":"kissing_smiling_eyes","n":"kussend gezicht met lachende ogen","k":"kissing smiling eyes|kissing face with smiling eyes|kussend gezicht met lachende ogen|gezicht|glimlach|glimlachen|hou van jou|hvj|kus|kus en lach|lachende ogen|oog|smiley|143|closed|date|dating|eye|eyes|face|flirt|ily|kiss|kisses|kissing|love|night|smile|smiling"},{"u":"1f972","c":"Smileys \u0026 Emotion","o":23,"x":44,"y":34,"s":"smiling_face_with_tear","n":"lachend gezicht met traan","k":"smiling face with tear|lachend gezicht met traan|aangedaan|blij|dankbaar|enigszins lachend|gelukkig|opgelucht|smiley|traan|trots|face|glad|grateful|happy|joy|pain|proud|relieved|smile|smiling|tear|touched"},{"u":"1f60b","c":"Smileys \u0026 Emotion","o":24,"x":32,"y":57,"s":"yum","n":"lachend gezicht dat lippen likt","k":"yum|face savouring delicious food|lachend gezicht dat lippen likt|genieten|gezicht|glimlach|jammie|lachend gezicht|lekker|mmm|smiley|smullen|face savoring food|delicious|eat|face|food|full|hungry|savor|smile|smiling|tasty|um|yummy"},{"u":"1f61b","c":"Smileys \u0026 Emotion","o":25,"x":33,"y":11,"s":"stuck_out_tongue","n":"gezicht met uitgestoken tong","k":"stuck out tongue|face with stuck-out tongue|gezicht met uitgestoken tong|gezicht|gezicht met uitgestoken tong en open ogen|grapje|grappig|ontdeugend|smiley|tong|tong uitsteken|uitgesteken tong|face with tongue|awesome|cool|face|nice|party|stuck-out|sweet|tongue"},{"u":"1f61c","c":"Smileys \u0026 Emotion","o":26,"x":33,"y":12,"s":"stuck_out_tongue_winking_eye","n":"knipoog met uitgestoken tong","k":"stuck out tongue winking eye|face with stuck-out tongue and winking eye|knipoog met uitgestoken tong|gezicht|gezicht met uitgestoken tong en knipoog|grap|grapjas|knipoog|oog|plagen|smiley|tong|winking face with tongue|crazy|epic|eye|face|funny|joke|loopy|nutty|party|stuck-out|tongue|wacky|weirdo|wink|winking|yolo"},{"u":"1f92a","c":"Smileys \u0026 Emotion","o":27,"x":41,"y":16,"s":"zany_face","n":"gek gezicht","k":"zany face|grinning face with one large and one small eye|gek gezicht|gekke blik|gestoord|groot|klein|oog|smiley|crazy|eye|eyes|face|goofy|large|small|zany"},{"u":"1f61d","c":"Smileys \u0026 Emotion","o":28,"x":33,"y":13,"s":"stuck_out_tongue_closed_eyes","n":"gezicht met uitgestoken tong en dichtgeknepen ogen","k":"stuck out tongue closed eyes|face with stuck-out tongue and tightly-closed eyes|gezicht met uitgestoken tong en dichtgeknepen ogen|bah|dichte ogen|gezicht|oog|smaak|smerig|smiley|tong|uitgestoken tong|vies|vreselijk|squinting face with tongue|closed|eye|eyes|face|gross|horrible|omg|squinting|stuck-out|taste|tongue|whatever|yolo"},{"u":"1f911","c":"Smileys \u0026 Emotion","o":29,"x":39,"y":38,"s":"money_mouth_face","n":"gezicht met geld in de mond","k":"money mouth face|money-mouth face|gezicht met geld in de mond|betaald|geld|geldmond|gezicht|mond|face|money|money-mouth|mouth|paid"},{"u":"1f917","c":"Smileys \u0026 Emotion","o":30,"x":39,"y":44,"s":"hugging_face","n":"blij gezicht met uitgestoken handen","k":"hugging face|blij gezicht met uitgestoken handen|blij|gezicht|handen|knuffel|knuffelen|uitgestoken|smiling face with open hands|face|hands|hug|hugging|open|smiling"},{"u":"1f92d","c":"Smileys \u0026 Emotion","o":31,"x":41,"y":19,"s":"face_with_hand_over_mouth","n":"gezicht met hand over de mond","k":"face with hand over mouth|smiling face with smiling eyes and hand covering mouth|gezicht met hand over de mond|geheim|geschrokken|gezicht met hand over mond|giechelen|oeps|smiley|verrast|face|giggle|giggling|hand|mouth|oops|realization|secret|shock|sudden|surprise|whoops"},{"u":"1fae2","c":"Smileys \u0026 Emotion","o":32,"x":56,"y":32,"s":"face_with_open_eyes_and_hand_over_mouth","n":"gezicht met open ogen en hand voor mond","k":"face with open eyes and hand over mouth|gezicht met open ogen en hand voor mond|bang|geschokt|gezicht met open ogen en hand over de mond|ongeloof|ontzag|schaamte|smiley|verbazing|verrassing|amazement|awe|disbelief|embarrass|eyes|face|gasp|hand|mouth|omg|open|over|quiet|scared|shock|surprise"},{"u":"1fae3","c":"Smileys \u0026 Emotion","o":33,"x":56,"y":33,"s":"face_with_peeking_eye","n":"gezicht met glurend oog","k":"face with peeking eye|gezicht met glurend oog|geboeid|gluren|smiley|spieken|staren|stiekem|stiekem kijken|captivated|embarrass|eye|face|hide|hiding|peek|peeking|peep|scared|shy|stare"},{"u":"1f92b","c":"Smileys \u0026 Emotion","o":34,"x":41,"y":17,"s":"shushing_face","n":"gezicht dat tot stilte maant","k":"shushing face|face with finger covering closed lips|gezicht dat tot stilte maant|gezicht|manen|sst|stil|stilte|face|quiet|shh|shush|shushing"},{"u":"1f914","c":"Smileys \u0026 Emotion","o":35,"x":39,"y":41,"s":"thinking_face","n":"nadenkend gezicht","k":"thinking face|nadenkend gezicht|afvragen|denken|gezicht|hmm|kin|nadenken|nadenkend|overwegen|chin|consider|face|ponder|pondering|thinking|wondering"},{"u":"1fae1","c":"Smileys \u0026 Emotion","o":36,"x":56,"y":31,"s":"saluting_face","n":"saluerend gezicht","k":"saluting face|saluerend gezicht|bevel|ja|oké|saluut|smiley|troepen|zonnig|face|good|luck|ma’am|ok|respect|salute|saluting|sir|troops|yes"},{"u":"1f910","c":"Smileys \u0026 Emotion","o":37,"x":39,"y":37,"s":"zipper_mouth_face","n":"gezicht met een rits als mond","k":"zipper mouth face|zipper-mouth face|gezicht met een rits als mond|dicht|geheim|gezicht|houden|mond|rits|rits als mond|stil|zwijg|face|keep|mouth|quiet|secret|shut|zip|zipper|zipper-mouth"},{"u":"1f928","c":"Smileys \u0026 Emotion","o":38,"x":41,"y":14,"s":"face_with_raised_eyebrow","n":"gezicht met opgeheven wenkbrauw","k":"face with raised eyebrow|face with one eyebrow raised|gezicht met opgeheven wenkbrauw|afkeurend|frons|gezicht met opgetrokken wenkbrauw|hmm|ongeloof|sceptisch|skeptisch|smiley|verrassing|wantrouwen|wantrouwend|wat|disapproval|disbelief|distrust|emoji|eyebrow|face|mild|raised|skeptic|skeptical|skepticism|surprise|what"},{"u":"1f610","c":"Smileys \u0026 Emotion","o":39,"x":33,"y":0,"s":"neutral_face","n":"neutraal gezicht","k":"neutral face|neutraal gezicht|geen commentaar|gezicht|jaloers|neutraal|niet leuk|ongemakkelijk|pokerface|pokergezicht|uitdrukkingsloos|uitgestreken|awkward|blank|deadpan|expressionless|face|fine|jealous|meh|neutral|oh|shade|straight|unamused|unhappy|unimpressed|whatever"},{"u":"1f611","c":"Smileys \u0026 Emotion","o":40,"x":33,"y":1,"s":"expressionless","n":"uitdrukkingsloos gezicht","k":"expressionless|expressionless face|uitdrukkingsloos gezicht|dichtgeknepen|geen commentaar|geen uitdrukking|gezicht|jaloers|lame|omg|ontevreden|smiley|tegenzin|ugh|uitdrukkingsloos|vooruit|wtf|awkward|dead|face|fine|inexpressive|jealous|meh|not|oh|straight|uh|unhappy|unimpressed|whatever"},{"u":"1f636","c":"Smileys \u0026 Emotion","o":41,"x":33,"y":41,"s":"no_mouth","n":"gezicht zonder mond","k":"no mouth|face without mouth|gezicht zonder mond|geen mond|geheim|gezicht|mond|niets zeggen|persoon|rustig|smiley|sprakeloos|stil|zwijgen|awkward|blank|expressionless|face|mouth|mouthless|mute|quiet|secret|silence|silent|speechless"},{"u":"1fae5","c":"Smileys \u0026 Emotion","o":42,"x":56,"y":35,"s":"dotted_line_face","n":"gezicht in stippellijn","k":"dotted line face|gezicht in stippellijn|depressief|depri|gedeprimeerd|introvert|onzichtbaar|smiley|verbergen|verdwijnen|depressed|disappear|dotted|face|hidden|hide|invisible|line|meh|whatever|wtv"},{"u":"1f636-200d-1f32b-fe0f","c":"Smileys \u0026 Emotion","o":43,"x":33,"y":40,"s":"face_in_clouds","n":"gezicht in de wolken","k":"face in clouds|gezicht in de wolken|afwezig|gezicht in de mist|hoofd in de wolken|absentminded|clouds|face|fog|head"},{"u":"1f60f","c":"Smileys \u0026 Emotion","o":44,"x":32,"y":61,"s":"smirk","n":"gniffelend gezicht","k":"smirk|smirking face|gniffelend gezicht|arrogant|flirten|gezicht|gezicht met grote grijns|gladjes|gniffelen|grijnzen|schuin|smiley|swag|vol van zichzelf|wenkbrauwen|boss|dapper|face|flirt|homie|kidding|leer|shade|slick|sly|smug|snicker|suave|suspicious"},{"u":"1f612","c":"Smileys \u0026 Emotion","o":45,"x":33,"y":2,"s":"unamused","n":"chagrijnig gezicht","k":"unamused|unamused face|chagrijnig gezicht|boos|ehm|gezicht|jaloers|niet blij|niet leuk|ongelukkig|smiley|ugh|uhh|verveeld|whatever|...|bored|face|fine|jealous|jel|jelly|pissed|smh|unhappy|weird"},{"u":"1f644","c":"Smileys \u0026 Emotion","o":46,"x":33,"y":57,"s":"face_with_rolling_eyes","n":"gezicht met rollende ogen","k":"face with rolling eyes|gezicht met rollende ogen|gezicht|ogen|rollen|rollen met de ogen|schaduw|ugh|wat dan ook|eyeroll|eyes|face|rolling|shade|whatever"},{"u":"1f62c","c":"Smileys \u0026 Emotion","o":47,"x":33,"y":28,"s":"grimacing","n":"gezicht met grimas","k":"grimacing|grimacing face|gezicht met grimas|gezicht|grimas|grimasgezicht|grinniken|niks|oeps|ongemakkelijk|smiley|tanden op elkaar|awk|awkward|dentist|face|grimace|grinning|smile|smiling"},{"u":"1f62e-200d-1f4a8","c":"Smileys \u0026 Emotion","o":48,"x":33,"y":30,"s":"face_exhaling","n":"gezicht dat uitademt","k":"face exhaling|gezicht dat uitademt|blazen|fluisteren|fluiten|kreunen|naar adem snakken|opgelucht|roken|rook|smiley|uitademen|uitgeput|blow|blowing|exhale|exhaling|exhausted|face|gasp|groan|relief|sigh|smoke|whisper|whistle"},{"u":"1f925","c":"Smileys \u0026 Emotion","o":49,"x":40,"y":56,"s":"lying_face","n":"liegend gezicht","k":"lying face|liegend gezicht|gezicht|leugen|leugenaar|liegen|pinokkio|face|liar|lie|lying|pinocchio"},{"u":"1fae8","c":"Smileys \u0026 Emotion","o":50,"x":56,"y":38,"s":"shaking_face","n":"schuddend gezicht","k":"shaking face|schuddend gezicht|aardbeving|gek|gezicht|omg|paniek|schok|schudden|trillen|verbijstering|verrassing|wauw|wow|crazy|daze|earthquake|face|panic|shaking|shock|surprise|vibrate|whoa"},{"u":"1f60c","c":"Smileys \u0026 Emotion","o":53,"x":32,"y":58,"s":"relieved","n":"opgelucht gezicht","k":"relieved|relieved face|opgelucht gezicht|gezicht|kalmte|opgelucht|opluchting|vrede|zen|calm|face|peace|relief"},{"u":"1f614","c":"Smileys \u0026 Emotion","o":54,"x":33,"y":4,"s":"pensive","n":"peinzend gezicht","k":"pensive|pensive face|peinzend gezicht|afgewezen|balen|gezicht|moedeloos|peinzend|smiley|teleurgesteld|terneergeslagen|triest|verdrietig|verloren|awful|bored|dejected|died|disappointed|face|losing|lost|sad|sucks"},{"u":"1f62a","c":"Smileys \u0026 Emotion","o":55,"x":33,"y":26,"s":"sleepy","n":"slaperig gezicht","k":"sleepy|sleepy face|slaperig gezicht|gezicht|huilen|slaap|smiley|traan|crying|face|good|night|sad|sleep|sleeping|tired"},{"u":"1f924","c":"Smileys \u0026 Emotion","o":56,"x":40,"y":55,"s":"drooling_face","n":"kwijlend gezicht","k":"drooling face|kwijlend gezicht|gezicht|kwijlend|drooling|face"},{"u":"1f634","c":"Smileys \u0026 Emotion","o":57,"x":33,"y":37,"s":"sleeping","n":"slapend gezicht","k":"sleeping|sleeping face|slapend gezicht|bedtijd|dutje|gapen|gezicht|moe|slaap|slaap lekker|slapen|smiley|vermoeid|welterusten|zzz|bed|bedtime|face|good|goodnight|nap|night|sleep|tired|whatever|yawn"},{"u":"1f637","c":"Smileys \u0026 Emotion","o":58,"x":33,"y":42,"s":"mask","n":"gezicht met doktersmasker","k":"mask|face with medical mask|gezicht met doktersmasker|besmet|dokter|doktersmasker|gezicht|gezicht met masker|koud|masker|medicijn|medisch masker|smiley|virus|ziek|cold|dentist|dermatologist|doctor|dr|face|germs|medical|medicine|sick"},{"u":"1f912","c":"Smileys \u0026 Emotion","o":59,"x":39,"y":39,"s":"face_with_thermometer","n":"gezicht met thermometer","k":"face with thermometer|gezicht met thermometer|gezicht|niet lekker|thermometer|ziek|face|ill|sick"},{"u":"1f915","c":"Smileys \u0026 Emotion","o":60,"x":39,"y":42,"s":"face_with_head_bandage","n":"gezicht met een verband om het hoofd","k":"face with head bandage|face with head-bandage|gezicht met een verband om het hoofd|gewond|gezicht|gezicht met hoofdverband|pijn|verband|verwonding|bandage|face|head-bandage|hurt|injury|ouch"},{"u":"1f922","c":"Smileys \u0026 Emotion","o":61,"x":40,"y":53,"s":"nauseated_face","n":"misselijk gezicht","k":"nauseated face|misselijk gezicht|gadver|gezicht|misselijk|overgeven|vies|ziek|face|gross|nasty|nauseated|sick|vomit"},{"u":"1f92e","c":"Smileys \u0026 Emotion","o":62,"x":41,"y":20,"s":"face_vomiting","n":"brakend gezicht","k":"face vomiting|face with open mouth vomiting|brakend gezicht|braaksel|braken|misselijk|overgeven|spuwen|walgelijk|ziek|barf|ew|face|gross|puke|sick|spew|throw|up|vomit|vomiting"},{"u":"1f927","c":"Smileys \u0026 Emotion","o":63,"x":41,"y":13,"s":"sneezing_face","n":"niezend gezicht","k":"sneezing face|niezend gezicht|gezicht|gezondheid|griep|koorts|niezen|niezend|ziek|face|fever|flu|gesundheit|sick|sneeze|sneezing"},{"u":"1f975","c":"Smileys \u0026 Emotion","o":64,"x":44,"y":37,"s":"hot_face","n":"heet gezicht","k":"hot face|overheated face|heet gezicht|beroerte|gezicht|heet|hijgen|hitte|koortsig|rood gezicht|sterven|tong|zweten|dying|face|feverish|heat|hot|panting|red-faced|stroke|sweating|tongue"},{"u":"1f976","c":"Smileys \u0026 Emotion","o":65,"x":44,"y":38,"s":"cold_face","n":"koud gezicht","k":"cold face|freezing face|koud gezicht|bevriezen|bevriezing|blauw|gezicht|ijspegels|koud|onder nul|tanden|blue|blue-faced|cold|face|freezing|frostbite|icicles|subzero|teeth"},{"u":"1f974","c":"Smileys \u0026 Emotion","o":66,"x":44,"y":36,"s":"woozy_face","n":"wazig gezicht","k":"woozy face|face with uneven eyes and wavy mouth|wazig gezicht|aangeschoten|beneveld|beschonken|dronken|duizelig|gezicht|mond|ogen|scheel|wazig|dizzy|drunk|eyes|face|intoxicated|mouth|tipsy|uneven|wavy|woozy"},{"u":"1f635","c":"Smileys \u0026 Emotion","o":67,"x":33,"y":39,"s":"dizzy_face","n":"duizelig gezicht","k":"dizzy face|duizelig gezicht|dood|duizelig|gezicht|gezicht met mond open en kruisjes als ogen|smiley|ziek|face with crossed-out eyes|crossed-out|dead|dizzy|eyes|face|feels|knocked|out|sick|tired"},{"u":"1f635-200d-1f4ab","c":"Smileys \u0026 Emotion","o":68,"x":33,"y":38,"s":"face_with_spiral_eyes","n":"gezicht met spiraalvormige ogen","k":"face with spiral eyes|gezicht met spiraalvormige ogen|dronken|duizelig|gehypnotiseerd|probleem|smiley|spiraalvormig|stoned|verward|wow|confused|dizzy|eyes|face|hypnotized|omg|spiral|trouble|whoa|woah|woozy"},{"u":"1f92f","c":"Smileys \u0026 Emotion","o":69,"x":41,"y":21,"s":"exploding_head","n":"ontploffend hoofd","k":"exploding head|shocked face with exploding head|ontploffend hoofd|exploderen|geschokt|ondersteboven|onmogelijk|smiley|verbaasd|verbijsterd|verrast|wow|blown|explode|exploding|head|mind|mindblown|no|shocked|way"},{"u":"1f920","c":"Smileys \u0026 Emotion","o":70,"x":40,"y":51,"s":"face_with_cowboy_hat","n":"gezicht met cowboyhoed","k":"face with cowboy hat|gezicht met cowboyhoed|cowboy|cowgirl|gezicht|hoed|cowboy hat face|face|hat"},{"u":"1f973","c":"Smileys \u0026 Emotion","o":71,"x":44,"y":35,"s":"partying_face","n":"feestend gezicht","k":"partying face|face with party horn and party hat|feestend gezicht|feest|feesten|fuif|gelukkig|gezicht|hoed|hoera|opgewonden|roltong|verjaardag|vieren|viering|bday|birthday|celebrate|celebration|excited|face|happy|hat|hooray|horn|party|partying"},{"u":"1f978","c":"Smileys \u0026 Emotion","o":72,"x":44,"y":45,"s":"disguised_face","n":"vermomd gezicht","k":"disguised face|vermomd gezicht|bril|gezicht|incognito|neus|smiley|snor|vermomming|wenkbrauwen|disguise|eyebrow|face|glasses|moustache|mustache|nose|person|spy|tache|tash"},{"u":"1f60e","c":"Smileys \u0026 Emotion","o":73,"x":32,"y":60,"s":"sunglasses","n":"lachend gezicht met zonnebril","k":"sunglasses|smiling face with sunglasses|lachend gezicht met zonnebril|bril|chillen|cool|gaaf|geweldig|gezicht|glimlach|ontspannen|stijl|stoer|strand|zonnebril|awesome|beach|bright|bro|chilling|face|rad|relaxed|shades|slay|smile|style|swag|win"},{"u":"1f913","c":"Smileys \u0026 Emotion","o":74,"x":39,"y":40,"s":"nerd_face","n":"nerdgezicht","k":"nerd face|nerdgezicht|geek|gezicht|gezicht met bril en tanden|nerd|nerderig|smiley|brainy|clever|expert|face|gifted|glasses|intelligent|smart"},{"u":"1f9d0","c":"Smileys \u0026 Emotion","o":75,"x":47,"y":61,"s":"face_with_monocle","n":"gezicht met monocle","k":"face with monocle|gezicht met monocle|chic|gezicht|klasse|monocle|rijk|saai|classy|face|fancy|rich|stuffy|wealthy"},{"u":"1f615","c":"Smileys \u0026 Emotion","o":76,"x":33,"y":5,"s":"confused","n":"verward gezicht","k":"confused|confused face|verward gezicht|gezicht|hmm|ik weet het niet|in de war|ontevreden|peinzend|smiley|teleurgesteld|uhm|verward|befuddled|confusing|dunno|face|frown|hm|meh|not|sad|sorry|sure"},{"u":"1fae4","c":"Smileys \u0026 Emotion","o":77,"x":56,"y":34,"s":"face_with_diagonal_mouth","n":"gezicht met schuine mond","k":"face with diagonal mouth|gezicht met schuine mond|gefrustreerd|het zal wel|meh|onzeker|sceptisch|smiley|teleurgesteld|confused|confusion|diagonal|disappointed|doubt|doubtful|face|frustrated|frustration|mouth|skeptical|unsure|whatever|wtv"},{"u":"1f61f","c":"Smileys \u0026 Emotion","o":78,"x":33,"y":15,"s":"worried","n":"bezorgd gezicht","k":"worried|worried face|bezorgd gezicht|bedroefd|bezorgd|gestresst|gezicht|nerveus|smiley|stress|triest|zenuwen|zorgen|anxious|butterflies|face|nerves|nervous|sad|stressed|surprised|worry"},{"u":"1f641","c":"Smileys \u0026 Emotion","o":79,"x":33,"y":52,"s":"slightly_frowning_face","n":"licht fronsend gezicht","k":"slightly frowning face|licht fronsend gezicht|fronsen|fronsend|gezicht|licht|verdrietig|face|frown|frowning|sad|slightly"},{"u":"2639-fe0f","c":"Smileys \u0026 Emotion","o":80,"x":58,"y":32,"s":"white_frowning_face","n":"fronsend gezicht","k":"white frowning face|frowning face|fronsend gezicht|fronsen|fronsend|gezicht|verdrietig|face|frown|frowning|sad"},{"u":"1f62e","c":"Smileys \u0026 Emotion","o":81,"x":33,"y":31,"s":"open_mouth","n":"gezicht met open mond","k":"open mouth|face with open mouth|gezicht met open mond|geschokt|geschrokken|gezicht|mond|oeps|omg|ongelofelijk|ongelooflijk|open|smiley|sympathie|vergeten|wauw|believe|face|forgot|mouth|shocked|surprised|sympathy|unbelievable|unreal|whoa|wow|you"},{"u":"1f62f","c":"Smileys \u0026 Emotion","o":82,"x":33,"y":32,"s":"hushed","n":"verstomd gezicht","k":"hushed|hushed face|verstomd gezicht|geschokt|gezicht|omg|smiley|verbaasd|verrast|verstomd|wauw|wow|epic|face|stunned|surprised|whoa|woah"},{"u":"1f632","c":"Smileys \u0026 Emotion","o":83,"x":33,"y":35,"s":"astonished","n":"verbaasd gezicht","k":"astonished|astonished face|verbaasd gezicht|geschokt|gezicht|kosten|nee|omg|totaal|verbaasd|cost|face|no|shocked|totally|way"},{"u":"1f633","c":"Smileys \u0026 Emotion","o":84,"x":33,"y":36,"s":"flushed","n":"blozend gezicht","k":"flushed|flushed face|blozend gezicht|beschaamd|blozend|dood|gek|gezicht|heet|hitte|jeetje|onder de indruk|ongeloof|ongemakkelijk|sjonge|verbaasd|verbijsterd|wat|wauw|amazed|awkward|crazy|dazed|dead|disbelief|embarrassed|face|geez|heat|hot|impressed|jeez|what|wow"},{"u":"1f97a","c":"Smileys \u0026 Emotion","o":85,"x":44,"y":47,"s":"pleading_face","n":"smekend gezicht","k":"pleading face|face with pleading eyes|smekend gezicht|alsjeblieft|genade|gezicht|grote ogen|smeken|smekende blik|smiley|verdrietig|waarom niet|zielig gezicht|begging|big|eyes|face|mercy|not|pleading|please|pretty|puppy|sad|why"},{"u":"1f979","c":"Smileys \u0026 Emotion","o":86,"x":44,"y":46,"s":"face_holding_back_tears","n":"gezicht dat tranen tegenhoudt","k":"face holding back tears|gezicht dat tranen tegenhoudt|alsjeblieft|aww|beschaamd|bewondering|dankbaar|dankbaarheid|gevoelens|gezicht|houden|huilen|tegen|tranen|trots|verdrietig|vreugde|weerstaan|admiration|back|cry|embarrassed|face|feelings|grateful|gratitude|holding|joy|please|proud|resist|sad|tears"},{"u":"1f626","c":"Smileys \u0026 Emotion","o":87,"x":33,"y":22,"s":"frowning","n":"fronsend gezicht met open mond","k":"frowning|frowning face with open mouth|fronsend gezicht met open mond|bang|betrapt|eng|frons|fronsen|gezicht|hoede|mond|open|verrassing|wat|wauw|caught|face|frown|guard|mouth|scared|scary|surprise|what|wow"},{"u":"1f627","c":"Smileys \u0026 Emotion","o":88,"x":33,"y":23,"s":"anguished","n":"gekweld gezicht","k":"anguished|anguished face|gekweld gezicht|bang|gezicht|lijden|lijdend|ontevreden|smiley|stress|verrast|face|forgot|scared|scary|stressed|surprise|unhappy|what|wow"},{"u":"1f628","c":"Smileys \u0026 Emotion","o":89,"x":33,"y":24,"s":"fearful","n":"bang gezicht","k":"fearful|fearful face|bang gezicht|angst|angstig|bang|bezorgd|gezicht|schuld|afraid|anxious|blame|face|fear|scared|worried"},{"u":"1f630","c":"Smileys \u0026 Emotion","o":90,"x":33,"y":33,"s":"cold_sweat","n":"angstig gezicht met zweetdruppel","k":"cold sweat|face with open mouth and cold sweat|angstig gezicht met zweetdruppel|angstig|angstzweet|blauw|blauw gezicht met angstzweet|gehaast|gezicht|gezicht met open mond en zweetdruppel|koud|nerveus|smiley|zweet|zweetdruppel|anxious face with sweat|anxious|blue|cold|eek|face|mouth|nervous|open|rushed|scared|sweat|yikes"},{"u":"1f625","c":"Smileys \u0026 Emotion","o":91,"x":33,"y":21,"s":"disappointed_relieved","n":"teleurgesteld maar opgelucht gezicht","k":"disappointed relieved|disappointed but relieved face|teleurgesteld maar opgelucht gezicht|bijna|gezicht|ingewikkeld|oef|opgelucht|smiley|teleurgesteld|zweetdruppel|zweten|sad but relieved face|anxious|call|close|complicated|disappointed|face|not|relieved|sad|sweat|time|whew"},{"u":"1f622","c":"Smileys \u0026 Emotion","o":92,"x":33,"y":18,"s":"cry","n":"huilend gezicht","k":"cry|crying face|huilend gezicht|bedroefd|gevoelens|gezicht|huilen|smiley|traan|triest|awful|crying|face|feels|miss|sad|tear|triste|unhappy"},{"u":"1f62d","c":"Smileys \u0026 Emotion","o":93,"x":33,"y":29,"s":"sob","n":"hard huilend gezicht","k":"sob|loudly crying face|hard huilend gezicht|bedroefd|gezicht|hard huilen|huilen|ontroostbaar|smiley|snikken|traan|tranen|tranen met tuiten|bawling|cry|crying|face|loudly|sad|tear|tears|unhappy"},{"u":"1f631","c":"Smileys \u0026 Emotion","o":94,"x":33,"y":34,"s":"scream","n":"angstig schreeuwend gezicht","k":"scream|face screaming in fear|angstig schreeuwend gezicht|angst|angstig|bang|doodsbang|geschrokken|gezicht|gezicht dat schreeuwt van angst|munch|schreeuw|schreeuwend van angst|smiley|epic|face|fear|fearful|scared|screamer|screaming|shocked|surprised|woah"},{"u":"1f616","c":"Smileys \u0026 Emotion","o":95,"x":33,"y":6,"s":"confounded","n":"onthutst gezicht","k":"confounded|confounded face|onthutst gezicht|bah|boos|gefrustreerd|geïrriteerd|gezicht|onthutst|smiley|verdrietig|verwarring|annoyed|confused|cringe|distraught|face|feels|frustrated|mad|sad"},{"u":"1f623","c":"Smileys \u0026 Emotion","o":96,"x":33,"y":19,"s":"persevere","n":"volhardend gezicht","k":"persevere|persevering face|volhardend gezicht|concentratie|concentreren|focus|gezicht|hoofdpijn|volharden|volharding|concentrate|concentration|face|headache|persevering"},{"u":"1f61e","c":"Smileys \u0026 Emotion","o":97,"x":33,"y":14,"s":"disappointed","n":"teleurgesteld gezicht","k":"disappointed|disappointed face|teleurgesteld gezicht|afgewezen|afwijzing|bedroefd|gezicht|niet blij|schuldig|smiley|teleurstelling|terneergeslagen|triest|verloren|awful|blame|dejected|face|fail|losing|sad|unhappy"},{"u":"1f613","c":"Smileys \u0026 Emotion","o":98,"x":33,"y":3,"s":"sweat","n":"neerslachtig gezicht met zweetdruppel","k":"sweat|face with cold sweat|neerslachtig gezicht met zweetdruppel|angstzweet|bang|dichtgeknepen ogen|gezicht|gezicht met angstzweet|koud|nerveus|smiley|zweet|downcast face with sweat|close|cold|downcast|face|feels|headache|nervous|sad|scared|yikes"},{"u":"1f629","c":"Smileys \u0026 Emotion","o":99,"x":33,"y":25,"s":"weary","n":"moe gezicht","k":"weary|weary face|moe gezicht|aanstellen|gezicht|honger|moe|nee|ontevreden|smiley|tegenzin|vermoeid|zeuren|crying|face|fail|feels|hungry|mad|nooo|sad|sleepy|tired|unhappy"},{"u":"1f62b","c":"Smileys \u0026 Emotion","o":100,"x":33,"y":27,"s":"tired_face","n":"vermoeid gezicht","k":"tired face|vermoeid gezicht|bah|gezicht|jakkes|moe|niesen|niezen|smiley|vermoeid|vies|cost|face|feels|nap|sad|sneeze|tired"},{"u":"1f971","c":"Smileys \u0026 Emotion","o":101,"x":44,"y":33,"s":"yawning_face","n":"gapend gezicht","k":"yawning face|gapend gezicht|bed|dutje|gaap|gapen|geeuwen|moe|rusten|saai|slaap lekker|slaperig|smiley|vermoeid|verveeld|bedtime|bored|face|goodnight|nap|night|sleep|sleepy|tired|whatever|yawn|yawning|zzz"},{"u":"1f624","c":"Smileys \u0026 Emotion","o":102,"x":33,"y":20,"s":"triumph","n":"gezicht blazend van woede","k":"triumph|face with look of triumph|gezicht blazend van woede|boos|gewonnen|gezicht|gezicht met stoom uit neus|kokend van woede|ontevreden|triomf|witheet|woedend|ziedend|face with steam from nose|anger|angry|face|feels|fume|fuming|furious|fury|mad|nose|steam|unhappy|won"},{"u":"1f621","c":"Smileys \u0026 Emotion","o":103,"x":33,"y":17,"s":"rage","n":"pruilend gezicht","k":"rage|pouting face|pruilend gezicht|boos|gezicht|kwaad|pruilend|rood|smiley|woede|woedend|enraged face|anger|angry|enraged|face|feels|mad|maddening|pouting|red|shade|unhappy|upset"},{"u":"1f620","c":"Smileys \u0026 Emotion","o":104,"x":33,"y":16,"s":"angry","n":"boos gezicht","k":"angry|angry face|boos gezicht|boos|fronsen|gefrustreerd|gezicht|kwaad|smiley|woedend|anger|blame|face|feels|frustrated|mad|maddening|rage|shade|unhappy|upset"},{"u":"1f92c","c":"Smileys \u0026 Emotion","o":105,"x":41,"y":18,"s":"face_with_symbols_on_mouth","n":"gezicht met symbolen op mond","k":"face with symbols on mouth|serious face with symbols covering mouth|gezicht met symbolen op mond|boos|censuur|gezicht met tekens over mond|kwaad|schelden|smiley|vloeken|censor|cursing|cussing|face|mad|mouth|pissed|swearing|symbols"},{"u":"1f608","c":"Smileys \u0026 Emotion","o":106,"x":32,"y":54,"s":"smiling_imp","n":"lachend gezicht met hoorns","k":"smiling imp|smiling face with horns|lachend gezicht met hoorns|duivels|fantasie|gezicht|glimlach|hoorns|lach|lachend paars gezicht met hoorns|ondeugend|smiley|sprookje|demon|devil|evil|face|fairy|fairytale|fantasy|horns|purple|shade|smile|smiling|tale"},{"u":"1f47f","c":"Smileys \u0026 Emotion","o":107,"x":25,"y":41,"s":"imp","n":"boos gezicht met hoorns","k":"imp|boos gezicht met hoorns|boos duiveltje|demon|duivel|duivels|fantasie|gezicht|hoorns|kleine duivel|paars duivelsgezicht|smiley|sprookje|angry face with horns|angry|devil|evil|face|fairy|fairytale|fantasy|horns|mischievous|purple|shade|tale"},{"u":"1f480","c":"Smileys \u0026 Emotion","o":108,"x":25,"y":42,"s":"skull","n":"schedel","k":"skull|schedel|dood|doodshoofd|gezicht|monster|skelet|sprookje|body|dead|death|face|fairy|fairytale|i’m|lmao|tale|yolo"},{"u":"2620-fe0f","c":"Smileys \u0026 Emotion","o":109,"x":58,"y":24,"s":"skull_and_crossbones","n":"doodshoofd met gekruiste beenderen","k":"skull and crossbones|doodshoofd met gekruiste beenderen|bot|dood|doodshoofd|gekruiste botten|gezicht|monster|schedel|bone|crossbones|dead|death|face|skull"},{"u":"1f4a9","c":"Smileys \u0026 Emotion","o":110,"x":28,"y":25,"s":"hankey","n":"drol","k":"hankey|poop|shit|pile of poo|drol|grappig|monster|poep|poep met gezichtje|smiley|stinkt|bs|comic|doo|dung|face|fml|pile|poo|smelly|smh|stink|stinks|stinky|turd"},{"u":"1f921","c":"Smileys \u0026 Emotion","o":111,"x":40,"y":52,"s":"clown_face","n":"clownsgezicht","k":"clown face|clownsgezicht|clown|gezicht|face"},{"u":"1f479","c":"Smileys \u0026 Emotion","o":112,"x":25,"y":30,"s":"japanese_ogre","n":"boeman","k":"japanese ogre|boeman|duivel|eng|fantasie|gezicht|masker|monster|oger|sprookje|verhaal|wezen|ogre|creature|devil|face|fairy|fairytale|fantasy|mask|scary|tale"},{"u":"1f47a","c":"Smileys \u0026 Emotion","o":113,"x":25,"y":31,"s":"japanese_goblin","n":"kobold","k":"japanese goblin|kobold|fabel|fantasie|gezicht|japans|masker|monster|mythologie|smiley|sprookje|tengu|wezen|goblin|angry|creature|face|fairy|fairytale|fantasy|mask|mean|tale"},{"u":"1f47b","c":"Smileys \u0026 Emotion","o":114,"x":25,"y":32,"s":"ghost","n":"spook","k":"ghost|spook|boe|fantasie|geest|gezicht|halloween|monster|spook met tong uit mond|sprookje|uitgestoken tong|wezen|boo|creature|excited|face|fairy|fairytale|fantasy|haunting|scary|silly|tale"},{"u":"1f47d","c":"Smileys \u0026 Emotion","o":115,"x":25,"y":39,"s":"alien","n":"buitenaards wezen","k":"alien|extraterrestrial alien|buitenaards wezen|buitenaards|fantasie|gezicht|monster|ruimte|sprookje|ufo|wezen|creature|extraterrestrial|face|fairy|fairytale|fantasy|space|tale"},{"u":"1f47e","c":"Smileys \u0026 Emotion","o":116,"x":25,"y":40,"s":"space_invader","n":"buitenaards monster","k":"space invader|alien monster|buitenaards monster|alien|buitenaards|game|gezicht|monster|pixels|ruimte|spel|ufo|videogame|wezen|creature|extraterrestrial|face|fairy|fairytale|fantasy|gamer|games|pixelated|space|tale"},{"u":"1f916","c":"Smileys \u0026 Emotion","o":117,"x":39,"y":43,"s":"robot_face","n":"robot","k":"robot face|robot|gezicht|monster|face"},{"u":"1f63a","c":"Smileys \u0026 Emotion","o":118,"x":33,"y":45,"s":"smiley_cat","n":"grijnzende kat","k":"smiley cat|smiling cat face with open mouth|grijnzende kat|dier|gezicht|grijnzen|kat|lach|lachen|mond|open|grinning cat|animal|cat|face|grinning|mouth|smile|smiling"},{"u":"1f638","c":"Smileys \u0026 Emotion","o":119,"x":33,"y":43,"s":"smile_cat","n":"grijnzende kat met lachende ogen","k":"smile cat|grinning cat face with smiling eyes|grijnzende kat met lachende ogen|dier|gezicht|grijns|grijnzend kattengezicht met lachende ogen|kat|lach|oog|vrolijk|grinning cat with smiling eyes|animal|cat|eye|eyes|face|grin|grinning|smile|smiling"},{"u":"1f639","c":"Smileys \u0026 Emotion","o":120,"x":33,"y":44,"s":"joy_cat","n":"kat met tranen van vreugde","k":"joy cat|cat face with tears of joy|kat met tranen van vreugde|dier|gelukstranen|gezicht|grappig|hilarisch|kat|kattengezicht met tranen van geluk|lachen|smiley|traan|tranen|vreugde|vreugdetranen|cat with tears of joy|animal|cat|face|joy|laugh|laughing|lol|tear|tears"},{"u":"1f63b","c":"Smileys \u0026 Emotion","o":121,"x":33,"y":46,"s":"heart_eyes_cat","n":"lachende kat met hartvormige ogen","k":"heart eyes cat|smiling cat face with heart-shaped eyes|lachende kat met hartvormige ogen|dier|gezicht|hart|hartjesogen|kat|lach|lachen|liefde|oog|smiling cat with heart-eyes|animal|cat|eye|face|heart|heart-eyes|love|smile|smiling"},{"u":"1f63c","c":"Smileys \u0026 Emotion","o":122,"x":33,"y":47,"s":"smirk_cat","n":"gniffelende kat","k":"smirk cat|cat face with wry smile|gniffelende kat|gezicht|grimas|ironisch|ironische lach|kat|kattenkwaad|lach|ondeugend kattengezicht|smiley|spottend|cat with wry smile|animal|cat|face|ironic|smile|wry"},{"u":"1f63d","c":"Smileys \u0026 Emotion","o":123,"x":33,"y":48,"s":"kissing_cat","n":"kussende kat","k":"kissing cat|kissing cat face with closed eyes|kussende kat|dier|gezicht|kat|kus|kussend kattengezicht met gesloten ogen|oog|smiley|animal|cat|closed|eye|eyes|face|kiss|kissing"},{"u":"1f640","c":"Smileys \u0026 Emotion","o":124,"x":33,"y":51,"s":"scream_cat","n":"vermoeide kat","k":"scream cat|weary cat face|vermoeide kat|dier|geschokt|geschrokken kat|gezicht|kat|oh nee|smiley|verbazing|vermoeid|verrast|weary cat|animal|cat|face|oh|surprised|weary"},{"u":"1f63f","c":"Smileys \u0026 Emotion","o":125,"x":33,"y":50,"s":"crying_cat_face","n":"huilende kat","k":"crying cat face|huilende kat|dier|gezicht|huilen|huilend|kat|traan|verdrietig|crying cat|animal|cat|cry|crying|face|sad|tear"},{"u":"1f63e","c":"Smileys \u0026 Emotion","o":126,"x":33,"y":49,"s":"pouting_cat","n":"pruilende kat","k":"pouting cat|pouting cat face|pruilende kat|boos|boos kattengezicht|dier|gezicht|kat|mokken|pruilen|smiley|animal|cat|face|pouting"},{"u":"1f648","c":"Smileys \u0026 Emotion","o":127,"x":34,"y":50,"s":"see_no_evil","n":"geen kwaad zien","k":"see no evil|see-no-evil monkey|geen kwaad zien|aap|beschaamd|dier|gebaar|geen|gezicht|kwaad|niet|niet kijken|schaamte|uit den boze|verboden|verlegen|wil niet zien|zie|zien|embarrassed|evil|face|forbidden|forgot|gesture|hide|monkey|no|omg|prohibited|scared|secret|smh|watch"},{"u":"1f649","c":"Smileys \u0026 Emotion","o":128,"x":34,"y":51,"s":"hear_no_evil","n":"geen kwaad horen","k":"hear no evil|hear-no-evil monkey|geen kwaad horen|aap|dier|gebaar|geen|geheim|gezicht|horen|kwaad|luisteren|niet|uit den boze|verboden|wil niet horen|animal|ears|evil|face|forbidden|gesture|hear|listen|monkey|no|not|prohibited|secret|shh|tmi"},{"u":"1f64a","c":"Smileys \u0026 Emotion","o":129,"x":34,"y":52,"s":"speak_no_evil","n":"geen kwaad spreken","k":"speak no evil|speak-no-evil monkey|geen kwaad spreken|aap|gebaar|geen|geheim|gezicht|kwaad|niet|oeps|spreken|stiekem|uit den boze|verboden|animal|evil|face|forbidden|gesture|monkey|no|not|oops|prohibited|quiet|secret|speak|stealth"},{"u":"1f48c","c":"Smileys \u0026 Emotion","o":130,"x":27,"y":8,"s":"love_letter","n":"liefdesbrief","k":"love letter|liefdesbrief|brief|brief met hart|hart|liefde|post|romantiek|valentijn|heart|letter|love|mail|romance|valentine"},{"u":"1f498","c":"Smileys \u0026 Emotion","o":131,"x":28,"y":8,"s":"cupid","n":"hart met pijl","k":"cupid|heart with arrow|hart met pijl|afspraakje|cupido|date|hart|hou van jou|hvj|liefde|pijl|pijl door hart|romantiek|valentijn|143|adorbs|arrow|emotion|heart|ily|love|romance|valentine"},{"u":"1f49d","c":"Smileys \u0026 Emotion","o":132,"x":28,"y":13,"s":"gift_heart","n":"hart met strik","k":"gift heart|heart with ribbon|hart met strik|emotie|hart|hou van jou|hvj|liefde|strik|valentijn|xoxo|143|anniversary|emotion|heart|ily|kisses|ribbon|valentine"},{"u":"1f496","c":"Smileys \u0026 Emotion","o":133,"x":28,"y":6,"s":"sparkling_heart","n":"fonkelend hart","k":"sparkling heart|fonkelend hart|fonkelend|glinsterend|hart|hou van jou|hvj|spannend|sprankelend|xoxo|143|emotion|excited|good|heart|ily|kisses|morning|night|sparkle|sparkling"},{"u":"1f497","c":"Smileys \u0026 Emotion","o":134,"x":28,"y":7,"s":"heartpulse","n":"groeiend hart","k":"heartpulse|growing heart|groeiend hart|emotie|groeiend|hart|hartslag|hou van jou|hvj|kloppend hart|nerveus|spannend|xoxo|143|emotion|excited|growing|heart|ily|kisses|muah|nervous|pulse"},{"u":"1f493","c":"Smileys \u0026 Emotion","o":135,"x":28,"y":3,"s":"heartbeat","n":"kloppend hart","k":"heartbeat|beating heart|kloppend hart|cardio|hart|hartslag|hou van jou|hvj|kloppen|slaan|143|beating|emotion|heart|ily|love|pulsating|pulse"},{"u":"1f49e","c":"Smileys \u0026 Emotion","o":136,"x":28,"y":14,"s":"revolving_hearts","n":"ronddraaiende harten","k":"revolving hearts|ronddraaiende harten|draaien|draaiende harten|emotie|hart|harten|jubileum|143|adorbs|anniversary|emotion|heart|hearts|revolving"},{"u":"1f495","c":"Smileys \u0026 Emotion","o":137,"x":28,"y":5,"s":"two_hearts","n":"twee harten","k":"two hearts|twee harten|hart|hou van jou|hvj|jubileum|liefde|xoxo|143|anniversary|date|dating|emotion|heart|hearts|ily|kisses|love|loving|two"},{"u":"1f49f","c":"Smileys \u0026 Emotion","o":138,"x":28,"y":15,"s":"heart_decoration","n":"decoratief hart","k":"heart decoration|decoratief hart|emotie|hart|hartdecoratie|paars hart|wit hart|143|decoration|emotion|heart|hearth|purple|white"},{"u":"2763-fe0f","c":"Smileys \u0026 Emotion","o":139,"x":60,"y":35,"s":"heavy_heart_exclamation_mark_ornament","n":"hart als uitroepteken","k":"heavy heart exclamation mark ornament|heart exclamation|hart als uitroepteken|hart|hart met druppel eronder|interpunctie|leesteken|punctuatie|teken|uitroep|uitroepteken|uitroepteken met hart|exclamation|heart|heavy|mark|punctuation"},{"u":"1f494","c":"Smileys \u0026 Emotion","o":140,"x":28,"y":4,"s":"broken_heart","n":"gebroken hart","k":"broken heart|gebroken hart|alleen|breken|droevig|eenzaam|emotie|gebroken|liefdesverdriet|verdrietig|break|broken|crushed|emotion|heart|heartbroken|lonely|sad"},{"u":"2764-fe0f-200d-1f525","c":"Smileys \u0026 Emotion","o":141,"x":60,"y":36,"s":"heart_on_fire","n":"hart in vuur en vlam","k":"heart on fire|hart in vuur en vlam|branden|hart|heilig hart|liefde|lust|burn|fire|heart|love|sacred"},{"u":"2764-fe0f-200d-1fa79","c":"Smileys \u0026 Emotion","o":142,"x":60,"y":37,"s":"mending_heart","n":"helend hart","k":"mending heart|helend hart|gezond|gezonder|helend|herstellen|herstellend|verbeterend|healthier|heart|improving|mending|recovering|recuperating|well"},{"u":"2764-fe0f","c":"Smileys \u0026 Emotion","o":143,"x":60,"y":38,"s":"heart","n":"rood hart","k":"heart|heavy black heart|rood hart|emotie|hart|liefde|red heart|emotion|love|red"},{"u":"1fa77","c":"Smileys \u0026 Emotion","o":144,"x":54,"y":57,"s":"pink_heart","n":"roze hart","k":"pink heart|roze hart|hart|leuk|liefde|roze|schattig|143|adorable|cute|emotion|heart|ily|like|love|pink|special|sweet"},{"u":"1f9e1","c":"Smileys \u0026 Emotion","o":145,"x":54,"y":19,"s":"orange_heart","n":"oranje hart","k":"orange heart|oranje hart|oranje|143|heart|orange"},{"u":"1f49b","c":"Smileys \u0026 Emotion","o":146,"x":28,"y":11,"s":"yellow_heart","n":"geel hart","k":"yellow heart|geel hart|emotie|geel|hart|hou van jou|hvj|liefde|143|cardiac|emotion|heart|ily|love|yellow"},{"u":"1f49a","c":"Smileys \u0026 Emotion","o":147,"x":28,"y":10,"s":"green_heart","n":"groen hart","k":"green heart|groen hart|groen|hart|hou van jou|hvj|romantisch|xoxo|143|emotion|green|heart|ily|love|romantic"},{"u":"1f499","c":"Smileys \u0026 Emotion","o":148,"x":28,"y":9,"s":"blue_heart","n":"blauw hart","k":"blue heart|blauw hart|blauw|emotie|hart|hou van jou|hvj|liefde|romantiek|143|blue|emotion|heart|ily|love|romance"},{"u":"1fa75","c":"Smileys \u0026 Emotion","o":149,"x":54,"y":55,"s":"light_blue_heart","n":"lichtblauw hart","k":"light blue heart|lichtblauw hart|blauwgroen|groenblauw|hart|lichtblauw|143|blue|cute|cyan|emotion|heart|ily|light|like|love|sky|special|teal"},{"u":"1f49c","c":"Smileys \u0026 Emotion","o":150,"x":28,"y":12,"s":"purple_heart","n":"paars hart","k":"purple heart|paars hart|emotie|hart|hou van jou|hvj|paars|143|bestest|emotion|heart|ily|love|purple"},{"u":"1f90e","c":"Smileys \u0026 Emotion","o":151,"x":39,"y":30,"s":"brown_heart","n":"bruin hart","k":"brown heart|bruin hart|bruin|hart|liefde|symbool|143|brown|heart"},{"u":"1f5a4","c":"Smileys \u0026 Emotion","o":152,"x":32,"y":20,"s":"black_heart","n":"zwart hart","k":"black heart|zwart hart|hart|kwaad|slecht|verdorven|zwart|black|evil|heart|wicked"},{"u":"1fa76","c":"Smileys \u0026 Emotion","o":153,"x":54,"y":56,"s":"grey_heart","n":"grijs hart","k":"grey heart|grijs hart|grijs|hart|leigrijs|zilver|143|emotion|gray|grey|heart|ily|love|silver|slate|special"},{"u":"1f90d","c":"Smileys \u0026 Emotion","o":154,"x":39,"y":29,"s":"white_heart","n":"wit hart","k":"white heart|wit hart|hart|liefde|symbool|wit|143|heart|white"},{"u":"1f48b","c":"Smileys \u0026 Emotion","o":155,"x":27,"y":7,"s":"kiss","n":"lipafdruk","k":"kiss|kiss mark|lipafdruk|afdruk|daten|emotie|kus|kusafdruk|liefde|lippen|romantiek|sexy|zoen|dating|emotion|heart|kissing|lips|mark|romance"},{"u":"1f4af","c":"Smileys \u0026 Emotion","o":156,"x":28,"y":36,"s":"100","n":"maximumscore","k":"100|hundred points symbol|maximumscore|100 punten|beste|cijfer|fantastisch|foutloos|getal|geweldig|score|top|zeker|hundred points|a+|agree|clearly|definitely|faithful|fleek|full|hundred|keep|perfect|point|true|truth|yup"},{"u":"1f4a2","c":"Smileys \u0026 Emotion","o":157,"x":28,"y":18,"s":"anger","n":"woedesymbool","k":"anger|anger symbol|woedesymbool|boos|cartoonesk|kwaad|ontdaan|strip|symbool|teken|woede|angry|comic|mad|symbol|upset"},{"u":"1f4a5","c":"Smileys \u0026 Emotion","o":158,"x":28,"y":21,"s":"boom","n":"botsing","k":"boom|collision|collision symbol|botsing|boem|bom|botsen|ontploffen|strip|bomb|collide|comic|explode"},{"u":"1f4ab","c":"Smileys \u0026 Emotion","o":159,"x":28,"y":32,"s":"dizzy","n":"duizelig","k":"dizzy|dizzy symbol|duizelig|cartoonesk|ster|strip|vallende ster|comic|shining|shooting|star|stars"},{"u":"1f4a6","c":"Smileys \u0026 Emotion","o":160,"x":28,"y":22,"s":"sweat_drops","n":"zweetdruppels","k":"sweat drops|splashing sweat symbol|zweetdruppels|druppels|spetteren|sporten|strip|water|work-out|zweet|sweat droplets|comic|drip|droplet|droplets|drops|splashing|squirt|sweat|wet|work|workout"},{"u":"1f4a8","c":"Smileys \u0026 Emotion","o":161,"x":28,"y":24,"s":"dash","n":"wegrennen","k":"dash|dash symbol|wegrennen|cartoonesk|moet gaan|rennen|rook|scheet|strip|vertrokken|weg|wind|dashing away|away|cloud|comic|dashing|fart|fast|go|gone|gotta|running|smoke"},{"u":"1f573-fe0f","c":"Smileys \u0026 Emotion","o":162,"x":31,"y":24,"s":"hole","n":"gat","k":"hole|gat"},{"u":"1f4ac","c":"Smileys \u0026 Emotion","o":163,"x":28,"y":33,"s":"speech_balloon","n":"spraakballon","k":"speech balloon|spraakballon|aan het typen|ballon|cartoonesk|dialoog|spraak|strip|tekstballon|tekstballon met puntjes|balloon|bubble|comic|dialog|message|sms|speech|talk|text|typing"},{"u":"1f441-fe0f-200d-1f5e8-fe0f","c":"Smileys \u0026 Emotion","o":164,"x":12,"y":2,"s":"eye-in-speech-bubble","n":"spraakballon met oog","k":"eye-in-speech-bubble|eye in speech bubble|spraakballon met oog|ballon|bubbel|getuige|oog|spraak|balloon|bubble|eye|speech|witness"},{"u":"1f5e8-fe0f","c":"Smileys \u0026 Emotion","o":165,"x":32,"y":37,"s":"left_speech_bubble","n":"spraakballon naar links","k":"left speech bubble|spraakballon naar links|dialoog|spraak|zwarte spraakballon|balloon|bubble|dialog|left|speech"},{"u":"1f5ef-fe0f","c":"Smileys \u0026 Emotion","o":166,"x":32,"y":38,"s":"right_anger_bubble","n":"boze spraakballon naar rechts","k":"right anger bubble|boze spraakballon naar rechts|ballon|kwaad|tekstballon boos|woede|woedeballon|woedeballon naar rechts|anger|angry|balloon|bubble|mad|right"},{"u":"1f4ad","c":"Smileys \u0026 Emotion","o":167,"x":28,"y":34,"s":"thought_balloon","n":"gedachteballon","k":"thought balloon|gedachteballon|ballon|besef|cartoonesk|dagdromen|denkballon|denkwolkje|gedachten|gedachtenballon|strip|uitvinden|uitvinding|balloon|bubble|cartoon|cloud|comic|daydream|decisions|dream|idea|invent|invention|realize|think|thoughts|wonder"},{"u":"1f4a4","c":"Smileys \u0026 Emotion","o":168,"x":28,"y":20,"s":"zzz","n":"slaapsymbool","k":"zzz|sleeping symbol|slaapsymbool|cartoonesk|goedenacht|moe|rust|saai|slaap|slaapwel|slapen|slaperig|strip|vermoeid|comic|good|goodnight|night|sleep|sleeping|sleepy|tired"},{"u":"1f44b","c":"People \u0026 Body","o":169,"x":12,"y":48,"s":"wave","n":"zwaaiende hand","k":"wave|waving hand sign|zwaaiende hand|ben je er|doei|groet|groeten|hallo|hand|is daar iemand|moet gaan|spreek je later|tot later|tot ziens|ttyl|zwaai|zwaaien|waving hand|bye|cya|g2g|greetings|gtg|hello|hey|hi|later|outtie|ttfn|yo|you","t":{"1":["1f44b-1f3fb",12,49],"2":["1f44b-1f3fc",12,50],"3":["1f44b-1f3fd",12,51],"4":["1f44b-1f3fe",12,52],"5":["1f44b-1f3ff",12,53]}},{"u":"1f91a","c":"People \u0026 Body","o":170,"x":39,"y":57,"s":"raised_back_of_hand","n":"achterkant van opgeheven hand","k":"raised back of hand|achterkant van opgeheven hand|achterzijde opgestoken hand|hand|hand omhoog|handrug|opgestoken|rug van hand|vijf vingers|back|backhand|raised","t":{"1":["1f91a-1f3fb",39,58],"2":["1f91a-1f3fc",39,59],"3":["1f91a-1f3fd",39,60],"4":["1f91a-1f3fe",39,61],"5":["1f91a-1f3ff",40,0]}},{"u":"1f590-fe0f","c":"People \u0026 Body","o":171,"x":32,"y":2,"s":"raised_hand_with_fingers_splayed","n":"opgeheven hand met uitgestoken vingers","k":"raised hand with fingers splayed|hand with fingers splayed|opgeheven hand met uitgestoken vingers|hand|opgeheven|stop|uitgestoken|vinger|vingers|finger|fingers|raised|splayed","t":{"1":["1f590-1f3fb",32,3],"2":["1f590-1f3fc",32,4],"3":["1f590-1f3fd",32,5],"4":["1f590-1f3fe",32,6],"5":["1f590-1f3ff",32,7]}},{"u":"270b","c":"People \u0026 Body","o":172,"x":60,"y":0,"s":"hand","n":"opgeheven hand","k":"hand|raised hand|opgeheven hand|5|hoog|opgeheven|stop|vijf|five|high|raised","t":{"1":["270b-1f3fb",60,1],"2":["270b-1f3fc",60,2],"3":["270b-1f3fd",60,3],"4":["270b-1f3fe",60,4],"5":["270b-1f3ff",60,5]}},{"u":"1f596","c":"People \u0026 Body","o":173,"x":32,"y":14,"s":"spock-hand","n":"Vulcaanse groet","k":"spock-hand|raised hand with part between middle and ring fingers|vulcaanse groet|hand|leef lang en voorspoedig|spock|star trek|vinger|vulcan|vulcangroet|vulcan salute|finger|hands|salute","t":{"1":["1f596-1f3fb",32,15],"2":["1f596-1f3fc",32,16],"3":["1f596-1f3fd",32,17],"4":["1f596-1f3fe",32,18],"5":["1f596-1f3ff",32,19]}},{"u":"1faf1","c":"People \u0026 Body","o":174,"x":56,"y":45,"s":"rightwards_hand","n":"hand naar rechts","k":"rightwards hand|hand naar rechts|hand|handdruk|naar rechts|rechts|reiken|schudden|vasthouden|handshake|hold|reach|right|rightward|rightwards|shake","t":{"1":["1faf1-1f3fb",56,46],"2":["1faf1-1f3fc",56,47],"3":["1faf1-1f3fd",56,48],"4":["1faf1-1f3fe",56,49],"5":["1faf1-1f3ff",56,50]}},{"u":"1faf2","c":"People \u0026 Body","o":175,"x":56,"y":51,"s":"leftwards_hand","n":"hand naar links","k":"leftwards hand|hand naar links|eens|hand|handdruk|links|naar links|uitgestoken hand|handshake|hold|left|leftward|leftwards|reach|shake","t":{"1":["1faf2-1f3fb",56,52],"2":["1faf2-1f3fc",56,53],"3":["1faf2-1f3fd",56,54],"4":["1faf2-1f3fe",56,55],"5":["1faf2-1f3ff",56,56]}},{"u":"1faf3","c":"People \u0026 Body","o":176,"x":56,"y":57,"s":"palm_down_hand","n":"handpalm omlaag","k":"palm down hand|handpalm omlaag|hand|laten vallen|oprapen|wegjagen|wegsturen|dismiss|down|drop|dropped|palm|pick|shoo|up","t":{"1":["1faf3-1f3fb",56,58],"2":["1faf3-1f3fc",56,59],"3":["1faf3-1f3fd",56,60],"4":["1faf3-1f3fe",56,61],"5":["1faf3-1f3ff",57,0]}},{"u":"1faf4","c":"People \u0026 Body","o":177,"x":57,"y":1,"s":"palm_up_hand","n":"handpalm omhoog","k":"palm up hand|handpalm omhoog|aanbieden|hand|kom|vangen|wenken|beckon|catch|come|hold|know|lift|me|offer|palm|tell","t":{"1":["1faf4-1f3fb",57,2],"2":["1faf4-1f3fc",57,3],"3":["1faf4-1f3fd",57,4],"4":["1faf4-1f3fe",57,5],"5":["1faf4-1f3ff",57,6]}},{"u":"1faf7","c":"People \u0026 Body","o":178,"x":57,"y":19,"s":"leftwards_pushing_hand","n":"hand die naar links duwt","k":"leftwards pushing hand|hand die naar links duwt|duwen|high five|naar links|stoppen|wachten|weigeren|block|five|halt|hand|high|hold|leftward|leftwards|pause|push|pushing|refuse|slap|stop|wait","t":{"1":["1faf7-1f3fb",57,20],"2":["1faf7-1f3fc",57,21],"3":["1faf7-1f3fd",57,22],"4":["1faf7-1f3fe",57,23],"5":["1faf7-1f3ff",57,24]}},{"u":"1faf8","c":"People \u0026 Body","o":179,"x":57,"y":25,"s":"rightwards_pushing_hand","n":"hand die naar rechts duwt","k":"rightwards pushing hand|hand die naar rechts duwt|duwen|high five|naar rechts|stoppen|wachten|weigeren|block|five|halt|hand|high|hold|pause|push|pushing|refuse|rightward|rightwards|slap|stop|wait","t":{"1":["1faf8-1f3fb",57,26],"2":["1faf8-1f3fc",57,27],"3":["1faf8-1f3fd",57,28],"4":["1faf8-1f3fe",57,29],"5":["1faf8-1f3ff",57,30]}},{"u":"1f44c","c":"People \u0026 Body","o":180,"x":12,"y":54,"s":"ok_hand","n":"OK-handgebaar","k":"ok hand|ok hand sign|ok-handgebaar|fantastisch|geweldig|goed|hand|oké|prima|top|vingers|awesome|bet|dope|fleek|fosho|got|gotcha|legit|ok|okay|pinch|rad|sure|sweet|three","t":{"1":["1f44c-1f3fb",12,55],"2":["1f44c-1f3fc",12,56],"3":["1f44c-1f3fd",12,57],"4":["1f44c-1f3fe",12,58],"5":["1f44c-1f3ff",12,59]}},{"u":"1f90c","c":"People \u0026 Body","o":181,"x":39,"y":23,"s":"pinched_fingers","n":"samengeknepen vingers","k":"pinched fingers|samengeknepen vingers|gebaar|hand|handgebaar|italiaans|maffia|ondervraging|samengeknepen|sarcastisch|vingers|fingers|gesture|hold|huh|interrogation|patience|pinched|relax|sarcastic|ugh|what|zip","t":{"1":["1f90c-1f3fb",39,24],"2":["1f90c-1f3fc",39,25],"3":["1f90c-1f3fd",39,26],"4":["1f90c-1f3fe",39,27],"5":["1f90c-1f3ff",39,28]}},{"u":"1f90f","c":"People \u0026 Body","o":182,"x":39,"y":31,"s":"pinching_hand","n":"hand met samengeknepen vingers","k":"pinching hand|hand met samengeknepen vingers|beetje|gebaar voor kleine hoeveelheid|hand|klein|kleine hoeveelheid|vingers|weinig|amount|bit|fingers|little|pinching|small|sort","t":{"1":["1f90f-1f3fb",39,32],"2":["1f90f-1f3fc",39,33],"3":["1f90f-1f3fd",39,34],"4":["1f90f-1f3fe",39,35],"5":["1f90f-1f3ff",39,36]}},{"u":"270c-fe0f","c":"People \u0026 Body","o":183,"x":60,"y":6,"s":"v","n":"winnende hand","k":"v|victory hand|winnende hand|hand|peace|twee vingers|vredesteken|victory","t":{"1":["270c-1f3fb",60,7],"2":["270c-1f3fc",60,8],"3":["270c-1f3fd",60,9],"4":["270c-1f3fe",60,10],"5":["270c-1f3ff",60,11]}},{"u":"1f91e","c":"People \u0026 Body","o":184,"x":40,"y":39,"s":"crossed_fingers","n":"gekruiste vingers","k":"crossed fingers|hand with index and middle fingers crossed|gekruiste vingers|gekruist|geluk|hand|kruisen|vinger|vingers|cross|crossed|finger|fingers|luck","t":{"1":["1f91e-1f3fb",40,40],"2":["1f91e-1f3fc",40,41],"3":["1f91e-1f3fd",40,42],"4":["1f91e-1f3fe",40,43],"5":["1f91e-1f3ff",40,44]}},{"u":"1faf0","c":"People \u0026 Body","o":185,"x":56,"y":39,"s":"hand_with_index_finger_and_thumb_crossed","n":"hand met wijsvinger en duim gekruist","k":"hand with index finger and thumb crossed|hand met wijsvinger en duim gekruist|duur|geld|hand|hart|liefde|vingerknip|vingers|\u003c3|crossed|expensive|finger|heart|index|love|money|snap|thumb","t":{"1":["1faf0-1f3fb",56,40],"2":["1faf0-1f3fc",56,41],"3":["1faf0-1f3fd",56,42],"4":["1faf0-1f3fe",56,43],"5":["1faf0-1f3ff",56,44]}},{"u":"1f91f","c":"People \u0026 Body","o":186,"x":40,"y":45,"s":"i_love_you_hand_sign","n":"ik-hou-van-je-gebaar","k":"i love you hand sign|ik-hou-van-je-gebaar|gebarentaal|hand|hvj|ik hou van jou-gebaar|ily|love-you gesture|fingers|gesture|love|love-you|three|you","t":{"1":["1f91f-1f3fb",40,46],"2":["1f91f-1f3fc",40,47],"3":["1f91f-1f3fd",40,48],"4":["1f91f-1f3fe",40,49],"5":["1f91f-1f3ff",40,50]}},{"u":"1f918","c":"People \u0026 Body","o":187,"x":39,"y":45,"s":"the_horns","n":"duivelshorens","k":"the horns|sign of the horns|duivelshorens|hand|hoorns|rock on|teken|vinger|finger|horns|rock-on|sign","t":{"1":["1f918-1f3fb",39,46],"2":["1f918-1f3fc",39,47],"3":["1f918-1f3fd",39,48],"4":["1f918-1f3fe",39,49],"5":["1f918-1f3ff",39,50]}},{"u":"1f919","c":"People \u0026 Body","o":188,"x":39,"y":51,"s":"call_me_hand","n":"bel me-gebaar","k":"call me hand|bel me-gebaar|bel mij-gebaar|bellen|hand|handgebaar voor bellen|call|hang|loose|me|shaka","t":{"1":["1f919-1f3fb",39,52],"2":["1f919-1f3fc",39,53],"3":["1f919-1f3fd",39,54],"4":["1f919-1f3fe",39,55],"5":["1f919-1f3ff",39,56]}},{"u":"1f448","c":"People \u0026 Body","o":189,"x":12,"y":30,"s":"point_left","n":"achterkant van hand met naar links wijzende wijsvinger","k":"point left|white left pointing backhand index|achterkant van hand met naar links wijzende wijsvinger|achterkant|hand|links|vinger|wijs|wijsvinger|wijzen|backhand index pointing left|backhand|finger|index|left|point|pointing","t":{"1":["1f448-1f3fb",12,31],"2":["1f448-1f3fc",12,32],"3":["1f448-1f3fd",12,33],"4":["1f448-1f3fe",12,34],"5":["1f448-1f3ff",12,35]}},{"u":"1f449","c":"People \u0026 Body","o":190,"x":12,"y":36,"s":"point_right","n":"achterkant van hand met naar rechts wijzende wijsvinger","k":"point right|white right pointing backhand index|achterkant van hand met naar rechts wijzende wijsvinger|achterkant|hand|rechts|vinger|wijs|wijsvinger|wijzen|backhand index pointing right|backhand|finger|index|point|pointing|right","t":{"1":["1f449-1f3fb",12,37],"2":["1f449-1f3fc",12,38],"3":["1f449-1f3fd",12,39],"4":["1f449-1f3fe",12,40],"5":["1f449-1f3ff",12,41]}},{"u":"1f446","c":"People \u0026 Body","o":191,"x":12,"y":18,"s":"point_up_2","n":"achterkant van hand met omhoog wijzende wijsvinger","k":"point up 2|white up pointing backhand index|achterkant van hand met omhoog wijzende wijsvinger|achterkant|hand|omhoog|vinger|wijs|wijsvinger|wijzen|backhand index pointing up|backhand|finger|index|point|pointing|up","t":{"1":["1f446-1f3fb",12,19],"2":["1f446-1f3fc",12,20],"3":["1f446-1f3fd",12,21],"4":["1f446-1f3fe",12,22],"5":["1f446-1f3ff",12,23]}},{"u":"1f595","c":"People \u0026 Body","o":192,"x":32,"y":8,"s":"middle_finger","n":"middelvinger","k":"middle finger|reversed hand with middle finger extended|middelvinger|hand|midden|vinger|finger|middle","t":{"1":["1f595-1f3fb",32,9],"2":["1f595-1f3fc",32,10],"3":["1f595-1f3fd",32,11],"4":["1f595-1f3fe",32,12],"5":["1f595-1f3ff",32,13]}},{"u":"1f447","c":"People \u0026 Body","o":193,"x":12,"y":24,"s":"point_down","n":"achterkant van hand met omlaag wijzende wijsvinger","k":"point down|white down pointing backhand index|achterkant van hand met omlaag wijzende wijsvinger|achterkant|hand|omlaag|vinger|wijs|wijsvinger|wijzen|backhand index pointing down|backhand|down|finger|index|point|pointing","t":{"1":["1f447-1f3fb",12,25],"2":["1f447-1f3fc",12,26],"3":["1f447-1f3fd",12,27],"4":["1f447-1f3fe",12,28],"5":["1f447-1f3ff",12,29]}},{"u":"261d-fe0f","c":"People \u0026 Body","o":194,"x":58,"y":18,"s":"point_up","n":"omhoog wijzende wijsvinger","k":"point up|white up pointing index|omhoog wijzende wijsvinger|dit|hand|omhoog|vinger|wijs|wijsvinger|wijzen|index pointing up|finger|index|point|pointing|this|up","t":{"1":["261d-1f3fb",58,19],"2":["261d-1f3fc",58,20],"3":["261d-1f3fd",58,21],"4":["261d-1f3fe",58,22],"5":["261d-1f3ff",58,23]}},{"u":"1faf5","c":"People \u0026 Body","o":195,"x":57,"y":7,"s":"index_pointing_at_the_viewer","n":"wijsvinger die naar de kijker wijst","k":"index pointing at the viewer|wijsvinger die naar de kijker wijst|aanwijzen|hand|jij|vinger|wijzen|at|finger|index|pointing|poke|viewer|you","t":{"1":["1faf5-1f3fb",57,8],"2":["1faf5-1f3fc",57,9],"3":["1faf5-1f3fd",57,10],"4":["1faf5-1f3fe",57,11],"5":["1faf5-1f3ff",57,12]}},{"u":"1f44d","c":"People \u0026 Body","o":196,"x":12,"y":60,"s":"+1","n":"duim omhoog","k":"+1|thumbsup|thumbs up sign|duim omhoog|duim|goed|hand|ja|leuk|omhoog|thumbs up|good|like|thumb|up|yes","t":{"1":["1f44d-1f3fb",12,61],"2":["1f44d-1f3fc",13,0],"3":["1f44d-1f3fd",13,1],"4":["1f44d-1f3fe",13,2],"5":["1f44d-1f3ff",13,3]}},{"u":"1f44e","c":"People \u0026 Body","o":197,"x":13,"y":4,"s":"-1","n":"duim omlaag","k":"-1|thumbsdown|thumbs down sign|duim omlaag|duim|fout|hand|lichaam|niet goed|niet leuk|omlaag|slecht|stom|thumbs down|bad|dislike|down|good|no|nope|thumb|thumbs","t":{"1":["1f44e-1f3fb",13,5],"2":["1f44e-1f3fc",13,6],"3":["1f44e-1f3fd",13,7],"4":["1f44e-1f3fe",13,8],"5":["1f44e-1f3ff",13,9]}},{"u":"270a","c":"People \u0026 Body","o":198,"x":59,"y":56,"s":"fist","n":"opgeheven vuist","k":"fist|raised fist|opgeheven vuist|gebald|hand|opgeheven|solidariteit|stoot|vuist|clenched|punch|raised|solidarity","t":{"1":["270a-1f3fb",59,57],"2":["270a-1f3fc",59,58],"3":["270a-1f3fd",59,59],"4":["270a-1f3fe",59,60],"5":["270a-1f3ff",59,61]}},{"u":"1f44a","c":"People \u0026 Body","o":199,"x":12,"y":42,"s":"facepunch","n":"stotende vuist","k":"facepunch|punch|fisted hand sign|stotende vuist|boks|gebald|gebalde vuist|groet|hand|mee eens|stoot|vuist|oncoming fist|absolutely|agree|boom|bro|bruh|bump|clenched|correct|fist|knuckle|oncoming|pound|rock|ttyl","t":{"1":["1f44a-1f3fb",12,43],"2":["1f44a-1f3fc",12,44],"3":["1f44a-1f3fd",12,45],"4":["1f44a-1f3fe",12,46],"5":["1f44a-1f3ff",12,47]}},{"u":"1f91b","c":"People \u0026 Body","o":200,"x":40,"y":1,"s":"left-facing_fist","n":"naar links gerichte vuist","k":"left-facing fist|naar links gerichte vuist|linksom|naar links|vuist|fist|left-facing|leftwards","t":{"1":["1f91b-1f3fb",40,2],"2":["1f91b-1f3fc",40,3],"3":["1f91b-1f3fd",40,4],"4":["1f91b-1f3fe",40,5],"5":["1f91b-1f3ff",40,6]}},{"u":"1f91c","c":"People \u0026 Body","o":201,"x":40,"y":7,"s":"right-facing_fist","n":"naar rechts gerichte vuist","k":"right-facing fist|naar rechts gerichte vuist|naar rechts|rechtsom|vuist|fist|right-facing|rightwards","t":{"1":["1f91c-1f3fb",40,8],"2":["1f91c-1f3fc",40,9],"3":["1f91c-1f3fd",40,10],"4":["1f91c-1f3fe",40,11],"5":["1f91c-1f3ff",40,12]}},{"u":"1f44f","c":"People \u0026 Body","o":202,"x":13,"y":10,"s":"clap","n":"klappende handen","k":"clap|clapping hands sign|klappende handen|applaudiseren|applaus|bidden|dankjewel|gefeliciteerd|goed gedaan|goedkeuring|hand|hoera|klappen|clapping hands|applause|approval|awesome|congrats|congratulations|excited|good|great|homie|job|nice|prayed|well|yay","t":{"1":["1f44f-1f3fb",13,11],"2":["1f44f-1f3fc",13,12],"3":["1f44f-1f3fd",13,13],"4":["1f44f-1f3fe",13,14],"5":["1f44f-1f3ff",13,15]}},{"u":"1f64c","c":"People \u0026 Body","o":203,"x":35,"y":9,"s":"raised_hands","n":"juichend omhooggestoken handen","k":"raised hands|person raising both hands in celebration|juichend omhooggestoken handen|feest|gebaar|hand|handen|hoera|lof|omhoog|omhooggestoken|raising hands|celebration|gesture|hands|hooray|praise|raised|raising","t":{"1":["1f64c-1f3fb",35,10],"2":["1f64c-1f3fc",35,11],"3":["1f64c-1f3fd",35,12],"4":["1f64c-1f3fe",35,13],"5":["1f64c-1f3ff",35,14]}},{"u":"1faf6","c":"People \u0026 Body","o":204,"x":57,"y":13,"s":"heart_hands","n":"handen in de vorm van een hart","k":"heart hands|handen in de vorm van een hart|\u003c3|handen|hart|hou|jou|hands|heart|love|you","t":{"1":["1faf6-1f3fb",57,14],"2":["1faf6-1f3fc",57,15],"3":["1faf6-1f3fd",57,16],"4":["1faf6-1f3fe",57,17],"5":["1faf6-1f3ff",57,18]}},{"u":"1f450","c":"People \u0026 Body","o":205,"x":13,"y":16,"s":"open_hands","n":"open handen","k":"open hands|open hands sign|open handen|hand|handen|jazz hands|open|hands|hug|jazz|swerve","t":{"1":["1f450-1f3fb",13,17],"2":["1f450-1f3fc",13,18],"3":["1f450-1f3fd",13,19],"4":["1f450-1f3fe",13,20],"5":["1f450-1f3ff",13,21]}},{"u":"1f932","c":"People \u0026 Body","o":206,"x":41,"y":34,"s":"palms_up_together","n":"beide handpalmen omhoog","k":"palms up together|beide handpalmen omhoog|bidden|gebed|hand|kommetje maken met handen|palmen bij elkaar|cupped|dua|hands|palms|pray|prayer|together|up|wish","t":{"1":["1f932-1f3fb",41,35],"2":["1f932-1f3fc",41,36],"3":["1f932-1f3fd",41,37],"4":["1f932-1f3fe",41,38],"5":["1f932-1f3ff",41,39]}},{"u":"1f91d","c":"People \u0026 Body","o":207,"x":40,"y":13,"s":"handshake","n":"handdruk","k":"handshake|handdruk|deal|hand|overeenkomst|schudden|vergadering|agreement|meeting|shake","t":{"1":["1f91d-1f3fb",40,14],"2":["1f91d-1f3fc",40,15],"3":["1f91d-1f3fd",40,16],"4":["1f91d-1f3fe",40,17],"5":["1f91d-1f3ff",40,18]}},{"u":"1f64f","c":"People \u0026 Body","o":208,"x":35,"y":51,"s":"pray","n":"gevouwen handen","k":"pray|person with folded hands|gevouwen handen|alsjeblieft|bedankt|bidden|buigen|dank|gebaar|gebed|geef me de vijf|gevouwen|gezegend|hand|handen tegen elkaar|high five|smeken|vragen|folded hands|appreciate|ask|beg|blessed|bow|cmon|five|folded|gesture|high|please|thanks|thx","t":{"1":["1f64f-1f3fb",35,52],"2":["1f64f-1f3fc",35,53],"3":["1f64f-1f3fd",35,54],"4":["1f64f-1f3fe",35,55],"5":["1f64f-1f3ff",35,56]}},{"u":"270d-fe0f","c":"People \u0026 Body","o":209,"x":60,"y":12,"s":"writing_hand","n":"schrijvende hand","k":"writing hand|schrijvende hand|hand|schrijf|schrijven|write|writing","t":{"1":["270d-1f3fb",60,13],"2":["270d-1f3fc",60,14],"3":["270d-1f3fd",60,15],"4":["270d-1f3fe",60,16],"5":["270d-1f3ff",60,17]}},{"u":"1f485","c":"People \u0026 Body","o":210,"x":26,"y":24,"s":"nail_care","n":"nagellak","k":"nail care|nail polish|nagellak|beauty|cosmetica|hand|lak|manicure|nagel|nagels lakken|verzorging|bored|care|cosmetics|done|makeup|nail|polish|whatever","t":{"1":["1f485-1f3fb",26,25],"2":["1f485-1f3fc",26,26],"3":["1f485-1f3fd",26,27],"4":["1f485-1f3fe",26,28],"5":["1f485-1f3ff",26,29]}},{"u":"1f933","c":"People \u0026 Body","o":211,"x":41,"y":40,"s":"selfie","n":"selfie","k":"selfie|camera|telefoon|phone","t":{"1":["1f933-1f3fb",41,41],"2":["1f933-1f3fc",41,42],"3":["1f933-1f3fd",41,43],"4":["1f933-1f3fe",41,44],"5":["1f933-1f3ff",41,45]}},{"u":"1f4aa","c":"People \u0026 Body","o":212,"x":28,"y":26,"s":"muscle","n":"spierballen","k":"muscle|flexed biceps|spierballen|aanspannen|arm|biceps|bodybuilder|flex|gewichtheffen|spannen|spier|spierbal|sportschool|sterk|strip|beast|bench|bro|curls|gains|gym|jacked|press|ripped|strong|weightlift","t":{"1":["1f4aa-1f3fb",28,27],"2":["1f4aa-1f3fc",28,28],"3":["1f4aa-1f3fd",28,29],"4":["1f4aa-1f3fe",28,30],"5":["1f4aa-1f3ff",28,31]}},{"u":"1f9be","c":"People \u0026 Body","o":213,"x":46,"y":36,"s":"mechanical_arm","n":"armprothese","k":"mechanical arm|armprothese|bionische arm|kunstarm|mechanische arm|prothese|toegankelijkheid|accessibility|arm|mechanical|prosthetic"},{"u":"1f9bf","c":"People \u0026 Body","o":214,"x":46,"y":37,"s":"mechanical_leg","n":"beenprothese","k":"mechanical leg|beenprothese|bionisch been|kunstbeen|mechanisch been|prothese|toegankelijkheid|accessibility|leg|mechanical|prosthetic"},{"u":"1f9b5","c":"People \u0026 Body","o":215,"x":45,"y":40,"s":"leg","n":"been","k":"leg|been|gebogen|knie|ledemaat|schop|voet|bent|foot|kick|knee|limb","t":{"1":["1f9b5-1f3fb",45,41],"2":["1f9b5-1f3fc",45,42],"3":["1f9b5-1f3fd",45,43],"4":["1f9b5-1f3fe",45,44],"5":["1f9b5-1f3ff",45,45]}},{"u":"1f9b6","c":"People \u0026 Body","o":216,"x":45,"y":46,"s":"foot","n":"voet","k":"foot|voet|enkel|schop|schoppen|stampen|trap|ankle|feet|kick|stomp","t":{"1":["1f9b6-1f3fb",45,47],"2":["1f9b6-1f3fc",45,48],"3":["1f9b6-1f3fd",45,49],"4":["1f9b6-1f3fe",45,50],"5":["1f9b6-1f3ff",45,51]}},{"u":"1f442","c":"People \u0026 Body","o":217,"x":12,"y":4,"s":"ear","n":"oor","k":"ear|oor|geluid|horen|lichaam|luisteren|body|ears|hear|hearing|listen|listening|sound","t":{"1":["1f442-1f3fb",12,5],"2":["1f442-1f3fc",12,6],"3":["1f442-1f3fd",12,7],"4":["1f442-1f3fe",12,8],"5":["1f442-1f3ff",12,9]}},{"u":"1f9bb","c":"People \u0026 Body","o":218,"x":46,"y":28,"s":"ear_with_hearing_aid","n":"oor met gehoorapparaat","k":"ear with hearing aid|oor met gehoorapparaat|doof|gehoorapparaat|oor met oorapparaat|oorapparaat|slechthorend|toegankelijkheid|accessibility|aid|ear|hard|hearing","t":{"1":["1f9bb-1f3fb",46,29],"2":["1f9bb-1f3fc",46,30],"3":["1f9bb-1f3fd",46,31],"4":["1f9bb-1f3fe",46,32],"5":["1f9bb-1f3ff",46,33]}},{"u":"1f443","c":"People \u0026 Body","o":219,"x":12,"y":10,"s":"nose","n":"neus","k":"nose|neus|geur|lichaam|ruiken|stinkt|body|noses|nosey|odor|smell|smells","t":{"1":["1f443-1f3fb",12,11],"2":["1f443-1f3fc",12,12],"3":["1f443-1f3fd",12,13],"4":["1f443-1f3fe",12,14],"5":["1f443-1f3ff",12,15]}},{"u":"1f9e0","c":"People \u0026 Body","o":220,"x":54,"y":18,"s":"brain","n":"brein","k":"brain|brein|hersenen|intelligent|slim|smart"},{"u":"1fac0","c":"People \u0026 Body","o":221,"x":55,"y":57,"s":"anatomical_heart","n":"hart","k":"anatomical heart|hart|anatomisch|cardiologie|echt|hartslag|orgaan|polsslag|rood|anatomical|beat|cardiology|heart|heartbeat|organ|pulse|real|red"},{"u":"1fac1","c":"People \u0026 Body","o":222,"x":55,"y":58,"s":"lungs","n":"longen","k":"lungs|longen|adem|ademhaling|inademen|lichaam|lucht|orgaan|uitademen|zuurstof|breath|breathe|exhalation|inhalation|lung|organ|respiration"},{"u":"1f9b7","c":"People \u0026 Body","o":223,"x":45,"y":52,"s":"tooth","n":"tand","k":"tooth|tand|parelmoer|tandarts|tanden|wit|dentist|pearly|teeth|white"},{"u":"1f9b4","c":"People \u0026 Body","o":224,"x":45,"y":39,"s":"bone","n":"bot","k":"bone|bot|botten|hond|skelet|vorkbeen|bones|dog|skeleton|wishbone"},{"u":"1f440","c":"People \u0026 Body","o":225,"x":12,"y":1,"s":"eyes","n":"ogen","k":"eyes|ogen|gezicht|kijken|omg|ondeugend|oog|staren|body|eye|face|googly|look|looking|peep|see|seeing"},{"u":"1f441-fe0f","c":"People \u0026 Body","o":226,"x":12,"y":3,"s":"eye","n":"oog","k":"eye|oog|één oog|lichaam|pupil|1|body|one"},{"u":"1f445","c":"People \u0026 Body","o":227,"x":12,"y":17,"s":"tongue","n":"tong","k":"tongue|tong|lichaam|lik|slurp|body|lick"},{"u":"1f444","c":"People \u0026 Body","o":228,"x":12,"y":16,"s":"lips","n":"mond","k":"lips|mouth|mond|kus|lippen|open mond|roze lippen|zoen|beauty|body|kiss|kissing|lipstick"},{"u":"1fae6","c":"People \u0026 Body","o":229,"x":56,"y":36,"s":"biting_lip","n":"mond die op lip bijt","k":"biting lip|mond die op lip bijt|angst|bezorgd|flirten|lippen|nerveus|ongemakkelijk|ongerust|sexy|anxious|bite|biting|fear|flirt|flirting|kiss|lip|lipstick|nervous|uncomfortable|worried|worry"},{"u":"1f476","c":"People \u0026 Body","o":230,"x":25,"y":0,"s":"baby","n":"baby","k":"baby|jong|kindje|pasgeboren|persoon|babies|children|goo|infant|newborn|pregnant|young","t":{"1":["1f476-1f3fb",25,1],"2":["1f476-1f3fc",25,2],"3":["1f476-1f3fd",25,3],"4":["1f476-1f3fe",25,4],"5":["1f476-1f3ff",25,5]}},{"u":"1f9d2","c":"People \u0026 Body","o":231,"x":51,"y":18,"s":"child","n":"kind","k":"child|kind|heldere ogen|jong|jonger|kleinkind|bright-eyed|grandchild|kid|young|younger","t":{"1":["1f9d2-1f3fb",51,19],"2":["1f9d2-1f3fc",51,20],"3":["1f9d2-1f3fd",51,21],"4":["1f9d2-1f3fe",51,22],"5":["1f9d2-1f3ff",51,23]}},{"u":"1f466","c":"People \u0026 Body","o":232,"x":13,"y":43,"s":"boy","n":"jongen","k":"boy|jongen|jong|kind|persoon|bright-eyed|child|grandson|kid|son|young|younger","t":{"1":["1f466-1f3fb",13,44],"2":["1f466-1f3fc",13,45],"3":["1f466-1f3fd",13,46],"4":["1f466-1f3fe",13,47],"5":["1f466-1f3ff",13,48]}},{"u":"1f467","c":"People \u0026 Body","o":233,"x":13,"y":49,"s":"girl","n":"meisje","k":"girl|meisje|dochter|enthousiast|jong|maagd|persoon|staartjes|sterrenbeeld|bright-eyed|child|daughter|granddaughter|kid|virgo|young|younger|zodiac","t":{"1":["1f467-1f3fb",13,50],"2":["1f467-1f3fc",13,51],"3":["1f467-1f3fd",13,52],"4":["1f467-1f3fe",13,53],"5":["1f467-1f3ff",13,54]}},{"u":"1f9d1","c":"People \u0026 Body","o":234,"x":51,"y":12,"s":"adult","n":"volwassene","k":"adult|volwassene|persoon|person","t":{"1":["1f9d1-1f3fb",51,13],"2":["1f9d1-1f3fc",51,14],"3":["1f9d1-1f3fd",51,15],"4":["1f9d1-1f3fe",51,16],"5":["1f9d1-1f3ff",51,17]}},{"u":"1f468","c":"People \u0026 Body","o":236,"x":17,"y":36,"s":"man","n":"man","k":"man|volwassen|vriend|adult|bro","t":{"1":["1f468-1f3fb",17,37],"2":["1f468-1f3fc",17,38],"3":["1f468-1f3fd",17,39],"4":["1f468-1f3fe",17,40],"5":["1f468-1f3ff",17,41]}},{"u":"1f9d4","c":"People \u0026 Body","o":237,"x":51,"y":42,"s":"bearded_person","n":"persoon: baard","k":"bearded person|persoon: baard|baard|bebaard|persoon|persoon met baard|person: beard|beard|bearded|person|whiskers","t":{"1":["1f9d4-1f3fb",51,43],"2":["1f9d4-1f3fc",51,44],"3":["1f9d4-1f3fd",51,45],"4":["1f9d4-1f3fe",51,46],"5":["1f9d4-1f3ff",51,47]}},{"u":"1f9d4-200d-2642-fe0f","c":"People \u0026 Body","o":238,"x":51,"y":36,"s":"man_with_beard","n":"man: baard","k":"man with beard|man: beard|man: baard|baard|man|beard|bearded|whiskers","t":{"1":["1f9d4-1f3fb-200d-2642-fe0f",51,37],"2":["1f9d4-1f3fc-200d-2642-fe0f",51,38],"3":["1f9d4-1f3fd-200d-2642-fe0f",51,39],"4":["1f9d4-1f3fe-200d-2642-fe0f",51,40],"5":["1f9d4-1f3ff-200d-2642-fe0f",51,41]}},{"u":"1f9d4-200d-2640-fe0f","c":"People \u0026 Body","o":239,"x":51,"y":30,"s":"woman_with_beard","n":"vrouw: baard","k":"woman with beard|woman: beard|vrouw: baard|baard|vrouw|beard|bearded|whiskers|woman","t":{"1":["1f9d4-1f3fb-200d-2640-fe0f",51,31],"2":["1f9d4-1f3fc-200d-2640-fe0f",51,32],"3":["1f9d4-1f3fd-200d-2640-fe0f",51,33],"4":["1f9d4-1f3fe-200d-2640-fe0f",51,34],"5":["1f9d4-1f3ff-200d-2640-fe0f",51,35]}},{"u":"1f468-200d-1f9b0","c":"People \u0026 Body","o":240,"x":15,"y":42,"s":"red_haired_man","n":"man: rood haar","k":"red haired man|man: red hair|man: rood haar|man|rood haar|volwassen|vriend|adult|bro|red hair","t":{"1":["1f468-1f3fb-200d-1f9b0",15,43],"2":["1f468-1f3fc-200d-1f9b0",15,44],"3":["1f468-1f3fd-200d-1f9b0",15,45],"4":["1f468-1f3fe-200d-1f9b0",15,46],"5":["1f468-1f3ff-200d-1f9b0",15,47]}},{"u":"1f468-200d-1f9b1","c":"People \u0026 Body","o":241,"x":15,"y":48,"s":"curly_haired_man","n":"man: krullend haar","k":"curly haired man|man: curly hair|man: krullend haar|krullend haar|man|volwassen|vriend|adult|bro|curly hair","t":{"1":["1f468-1f3fb-200d-1f9b1",15,49],"2":["1f468-1f3fc-200d-1f9b1",15,50],"3":["1f468-1f3fd-200d-1f9b1",15,51],"4":["1f468-1f3fe-200d-1f9b1",15,52],"5":["1f468-1f3ff-200d-1f9b1",15,53]}},{"u":"1f468-200d-1f9b3","c":"People \u0026 Body","o":242,"x":15,"y":60,"s":"white_haired_man","n":"man: wit haar","k":"white haired man|man: white hair|man: wit haar|man|volwassen|vriend|wit haar|adult|bro|white hair","t":{"1":["1f468-1f3fb-200d-1f9b3",15,61],"2":["1f468-1f3fc-200d-1f9b3",16,0],"3":["1f468-1f3fd-200d-1f9b3",16,1],"4":["1f468-1f3fe-200d-1f9b3",16,2],"5":["1f468-1f3ff-200d-1f9b3",16,3]}},{"u":"1f468-200d-1f9b2","c":"People \u0026 Body","o":243,"x":15,"y":54,"s":"bald_man","n":"man: kaal","k":"bald man|man: bald|man: kaal|kaal|man|volwassen|vriend|adult|bald|bro","t":{"1":["1f468-1f3fb-200d-1f9b2",15,55],"2":["1f468-1f3fc-200d-1f9b2",15,56],"3":["1f468-1f3fd-200d-1f9b2",15,57],"4":["1f468-1f3fe-200d-1f9b2",15,58],"5":["1f468-1f3ff-200d-1f9b2",15,59]}},{"u":"1f469","c":"People \u0026 Body","o":244,"x":22,"y":8,"s":"woman","n":"vrouw","k":"woman|vrouw|dame|volwassene|adult|lady","t":{"1":["1f469-1f3fb",22,9],"2":["1f469-1f3fc",22,10],"3":["1f469-1f3fd",22,11],"4":["1f469-1f3fe",22,12],"5":["1f469-1f3ff",22,13]}},{"u":"1f469-200d-1f9b0","c":"People \u0026 Body","o":245,"x":19,"y":24,"s":"red_haired_woman","n":"vrouw: rood haar","k":"red haired woman|woman: red hair|vrouw: rood haar|dame|rood haar|volwassene|vrouw|adult|lady|red hair|woman","t":{"1":["1f469-1f3fb-200d-1f9b0",19,25],"2":["1f469-1f3fc-200d-1f9b0",19,26],"3":["1f469-1f3fd-200d-1f9b0",19,27],"4":["1f469-1f3fe-200d-1f9b0",19,28],"5":["1f469-1f3ff-200d-1f9b0",19,29]}},{"u":"1f9d1-200d-1f9b0","c":"People \u0026 Body","o":246,"x":50,"y":4,"s":"red_haired_person","n":"volwassene: rood haar","k":"red haired person|person: red hair|volwassene: rood haar|persoon|rood haar|volwassene|adult|person|red hair","t":{"1":["1f9d1-1f3fb-200d-1f9b0",50,5],"2":["1f9d1-1f3fc-200d-1f9b0",50,6],"3":["1f9d1-1f3fd-200d-1f9b0",50,7],"4":["1f9d1-1f3fe-200d-1f9b0",50,8],"5":["1f9d1-1f3ff-200d-1f9b0",50,9]}},{"u":"1f469-200d-1f9b1","c":"People \u0026 Body","o":247,"x":19,"y":30,"s":"curly_haired_woman","n":"vrouw: krullend haar","k":"curly haired woman|woman: curly hair|vrouw: krullend haar|dame|krullend haar|volwassene|vrouw|adult|curly hair|lady|woman","t":{"1":["1f469-1f3fb-200d-1f9b1",19,31],"2":["1f469-1f3fc-200d-1f9b1",19,32],"3":["1f469-1f3fd-200d-1f9b1",19,33],"4":["1f469-1f3fe-200d-1f9b1",19,34],"5":["1f469-1f3ff-200d-1f9b1",19,35]}},{"u":"1f9d1-200d-1f9b1","c":"People \u0026 Body","o":248,"x":50,"y":10,"s":"curly_haired_person","n":"volwassene: krullend haar","k":"curly haired person|person: curly hair|volwassene: krullend haar|krullend haar|persoon|volwassene|adult|curly hair|person","t":{"1":["1f9d1-1f3fb-200d-1f9b1",50,11],"2":["1f9d1-1f3fc-200d-1f9b1",50,12],"3":["1f9d1-1f3fd-200d-1f9b1",50,13],"4":["1f9d1-1f3fe-200d-1f9b1",50,14],"5":["1f9d1-1f3ff-200d-1f9b1",50,15]}},{"u":"1f469-200d-1f9b3","c":"People \u0026 Body","o":249,"x":19,"y":42,"s":"white_haired_woman","n":"vrouw: wit haar","k":"white haired woman|woman: white hair|vrouw: wit haar|dame|volwassene|vrouw|wit haar|adult|lady|white hair|woman","t":{"1":["1f469-1f3fb-200d-1f9b3",19,43],"2":["1f469-1f3fc-200d-1f9b3",19,44],"3":["1f469-1f3fd-200d-1f9b3",19,45],"4":["1f469-1f3fe-200d-1f9b3",19,46],"5":["1f469-1f3ff-200d-1f9b3",19,47]}},{"u":"1f9d1-200d-1f9b3","c":"People \u0026 Body","o":250,"x":50,"y":22,"s":"white_haired_person","n":"volwassene: wit haar","k":"white haired person|person: white hair|volwassene: wit haar|persoon|volwassene|wit haar|adult|person|white hair","t":{"1":["1f9d1-1f3fb-200d-1f9b3",50,23],"2":["1f9d1-1f3fc-200d-1f9b3",50,24],"3":["1f9d1-1f3fd-200d-1f9b3",50,25],"4":["1f9d1-1f3fe-200d-1f9b3",50,26],"5":["1f9d1-1f3ff-200d-1f9b3",50,27]}},{"u":"1f469-200d-1f9b2","c":"People \u0026 Body","o":251,"x":19,"y":36,"s":"bald_woman","n":"vrouw: kaal","k":"bald woman|woman: bald|vrouw: kaal|dame|kaal|volwassene|vrouw|adult|bald|lady|woman","t":{"1":["1f469-1f3fb-200d-1f9b2",19,37],"2":["1f469-1f3fc-200d-1f9b2",19,38],"3":["1f469-1f3fd-200d-1f9b2",19,39],"4":["1f469-1f3fe-200d-1f9b2",19,40],"5":["1f469-1f3ff-200d-1f9b2",19,41]}},{"u":"1f9d1-200d-1f9b2","c":"People \u0026 Body","o":252,"x":50,"y":16,"s":"bald_person","n":"volwassene: kaal","k":"bald person|person: bald|volwassene: kaal|kaal|persoon|volwassene|adult|bald|person","t":{"1":["1f9d1-1f3fb-200d-1f9b2",50,17],"2":["1f9d1-1f3fc-200d-1f9b2",50,18],"3":["1f9d1-1f3fd-200d-1f9b2",50,19],"4":["1f9d1-1f3fe-200d-1f9b2",50,20],"5":["1f9d1-1f3ff-200d-1f9b2",50,21]}},{"u":"1f471-200d-2640-fe0f","c":"People \u0026 Body","o":253,"x":24,"y":8,"s":"blond-haired-woman","n":"vrouw met blond haar","k":"blond-haired-woman|woman: blond hair|vrouw met blond haar|blond|blondine|haar|vrouw|blond-haired|blonde|hair|woman","t":{"1":["1f471-1f3fb-200d-2640-fe0f",24,9],"2":["1f471-1f3fc-200d-2640-fe0f",24,10],"3":["1f471-1f3fd-200d-2640-fe0f",24,11],"4":["1f471-1f3fe-200d-2640-fe0f",24,12],"5":["1f471-1f3ff-200d-2640-fe0f",24,13]}},{"u":"1f471-200d-2642-fe0f","c":"People \u0026 Body","o":254,"x":24,"y":14,"s":"blond-haired-man","n":"man met blond haar","k":"blond-haired-man|man: blond hair|man met blond haar|blond|haar|man|blond-haired|hair","t":{"1":["1f471-1f3fb-200d-2642-fe0f",24,15],"2":["1f471-1f3fc-200d-2642-fe0f",24,16],"3":["1f471-1f3fd-200d-2642-fe0f",24,17],"4":["1f471-1f3fe-200d-2642-fe0f",24,18],"5":["1f471-1f3ff-200d-2642-fe0f",24,19]}},{"u":"1f9d3","c":"People \u0026 Body","o":255,"x":51,"y":24,"s":"older_adult","n":"oudere persoon","k":"older adult|oudere persoon|bejaard|genderneutraal|niet nader omschreven geslacht|oud|ouder persoon|oudere volwassene|persoon|volwassene|older person|adult|elderly|grandparent|old|person|wise","t":{"1":["1f9d3-1f3fb",51,25],"2":["1f9d3-1f3fc",51,26],"3":["1f9d3-1f3fd",51,27],"4":["1f9d3-1f3fe",51,28],"5":["1f9d3-1f3ff",51,29]}},{"u":"1f474","c":"People \u0026 Body","o":256,"x":24,"y":50,"s":"older_man","n":"oude man","k":"older man|oude man|grootvader|kaal|man|opa|oud|ouder|volwassen|wijs|old man|adult|bald|elderly|gramps|grandfather|grandpa|old|wise","t":{"1":["1f474-1f3fb",24,51],"2":["1f474-1f3fc",24,52],"3":["1f474-1f3fd",24,53],"4":["1f474-1f3fe",24,54],"5":["1f474-1f3ff",24,55]}},{"u":"1f475","c":"People \u0026 Body","o":257,"x":24,"y":56,"s":"older_woman","n":"oude vrouw","k":"older woman|oude vrouw|dame|grootmoeder|oma|oud|ouder|volwassene|vrouw|wijs|old woman|adult|elderly|grandma|grandmother|granny|lady|old|wise|woman","t":{"1":["1f475-1f3fb",24,57],"2":["1f475-1f3fc",24,58],"3":["1f475-1f3fd",24,59],"4":["1f475-1f3fe",24,60],"5":["1f475-1f3ff",24,61]}},{"u":"1f64d-200d-2642-fe0f","c":"People \u0026 Body","o":259,"x":35,"y":21,"s":"man-frowning","n":"fronsende man","k":"man-frowning|man frowning|fronsende man|frons|man|ontevreden|persoon|sip|uitdrukking|verdrietig|annoyed|disappointed|disgruntled|disturbed|frown|frowning|frustrated|gesture|irritated|upset","t":{"1":["1f64d-1f3fb-200d-2642-fe0f",35,22],"2":["1f64d-1f3fc-200d-2642-fe0f",35,23],"3":["1f64d-1f3fd-200d-2642-fe0f",35,24],"4":["1f64d-1f3fe-200d-2642-fe0f",35,25],"5":["1f64d-1f3ff-200d-2642-fe0f",35,26]}},{"u":"1f64d-200d-2640-fe0f","c":"People \u0026 Body","o":260,"x":35,"y":15,"s":"woman-frowning","n":"fronsende vrouw","k":"woman-frowning|woman frowning|fronsende vrouw|frons|uitdrukking|vrouw|annoyed|disappointed|disgruntled|disturbed|frown|frowning|frustrated|gesture|irritated|upset|woman","t":{"1":["1f64d-1f3fb-200d-2640-fe0f",35,16],"2":["1f64d-1f3fc-200d-2640-fe0f",35,17],"3":["1f64d-1f3fd-200d-2640-fe0f",35,18],"4":["1f64d-1f3fe-200d-2640-fe0f",35,19],"5":["1f64d-1f3ff-200d-2640-fe0f",35,20]}},{"u":"1f64e-200d-2642-fe0f","c":"People \u0026 Body","o":262,"x":35,"y":39,"s":"man-pouting","n":"pruilende man","k":"man-pouting|man pouting|pruilende man|man|persoon|pruilen|sip|uitdrukking|verdrietig|disappointed|downtrodden|frown|grimace|pouting|scowl|sulk|upset|whine","t":{"1":["1f64e-1f3fb-200d-2642-fe0f",35,40],"2":["1f64e-1f3fc-200d-2642-fe0f",35,41],"3":["1f64e-1f3fd-200d-2642-fe0f",35,42],"4":["1f64e-1f3fe-200d-2642-fe0f",35,43],"5":["1f64e-1f3ff-200d-2642-fe0f",35,44]}},{"u":"1f64e-200d-2640-fe0f","c":"People \u0026 Body","o":263,"x":35,"y":33,"s":"woman-pouting","n":"pruilende vrouw","k":"woman-pouting|woman pouting|pruilende vrouw|pruilen|uitdrukking|vrouw|disappointed|downtrodden|frown|grimace|pouting|scowl|sulk|upset|whine|woman","t":{"1":["1f64e-1f3fb-200d-2640-fe0f",35,34],"2":["1f64e-1f3fc-200d-2640-fe0f",35,35],"3":["1f64e-1f3fd-200d-2640-fe0f",35,36],"4":["1f64e-1f3fe-200d-2640-fe0f",35,37],"5":["1f64e-1f3ff-200d-2640-fe0f",35,38]}},{"u":"1f645-200d-2642-fe0f","c":"People \u0026 Body","o":265,"x":34,"y":2,"s":"man-gesturing-no","n":"man die nee-gebaar maakt","k":"man-gesturing-no|man gesturing no|man die nee-gebaar maakt|gebaar|hand|illegaal|man|nee|niet|verboden|forbidden|gesture|no|not|prohibit","t":{"1":["1f645-1f3fb-200d-2642-fe0f",34,3],"2":["1f645-1f3fc-200d-2642-fe0f",34,4],"3":["1f645-1f3fd-200d-2642-fe0f",34,5],"4":["1f645-1f3fe-200d-2642-fe0f",34,6],"5":["1f645-1f3ff-200d-2642-fe0f",34,7]}},{"u":"1f645-200d-2640-fe0f","c":"People \u0026 Body","o":266,"x":33,"y":58,"s":"woman-gesturing-no","n":"vrouw die nee-gebaar maakt","k":"woman-gesturing-no|woman gesturing no|vrouw die nee-gebaar maakt|gebaar|hand|illegaal|verboden|vrouw|forbidden|gesture|no|not|prohibit|woman","t":{"1":["1f645-1f3fb-200d-2640-fe0f",33,59],"2":["1f645-1f3fc-200d-2640-fe0f",33,60],"3":["1f645-1f3fd-200d-2640-fe0f",33,61],"4":["1f645-1f3fe-200d-2640-fe0f",34,0],"5":["1f645-1f3ff-200d-2640-fe0f",34,1]}},{"u":"1f646-200d-2642-fe0f","c":"People \u0026 Body","o":268,"x":34,"y":20,"s":"man-gesturing-ok","n":"man die OK-gebaar maakt","k":"man-gesturing-ok|man gesturing ok|man die ok-gebaar maakt|gebaar|gebaren|hand|man|oefening|ok|omg|exercise|gesture|gesturing","t":{"1":["1f646-1f3fb-200d-2642-fe0f",34,21],"2":["1f646-1f3fc-200d-2642-fe0f",34,22],"3":["1f646-1f3fd-200d-2642-fe0f",34,23],"4":["1f646-1f3fe-200d-2642-fe0f",34,24],"5":["1f646-1f3ff-200d-2642-fe0f",34,25]}},{"u":"1f646-200d-2640-fe0f","c":"People \u0026 Body","o":269,"x":34,"y":14,"s":"woman-gesturing-ok","n":"vrouw die OK-gebaar maakt","k":"woman-gesturing-ok|woman gesturing ok|vrouw die ok-gebaar maakt|gebaar|hand|ok|vrouw|exercise|gesture|gesturing|omg|woman","t":{"1":["1f646-1f3fb-200d-2640-fe0f",34,15],"2":["1f646-1f3fc-200d-2640-fe0f",34,16],"3":["1f646-1f3fd-200d-2640-fe0f",34,17],"4":["1f646-1f3fe-200d-2640-fe0f",34,18],"5":["1f646-1f3ff-200d-2640-fe0f",34,19]}},{"u":"1f481-200d-2642-fe0f","c":"People \u0026 Body","o":271,"x":25,"y":49,"s":"man-tipping-hand","n":"man achter informatiebalie","k":"man-tipping-hand|man tipping hand|man achter informatiebalie|brutaal|hand|hooghartig|man|man knikt pols|persoon|pols knikken|polsgebaar|sarcasme|sarcastisch|uitdagend|fetch|flick|flip|gossip|sarcasm|sarcastic|sassy|seriously|tipping|whatever","t":{"1":["1f481-1f3fb-200d-2642-fe0f",25,50],"2":["1f481-1f3fc-200d-2642-fe0f",25,51],"3":["1f481-1f3fd-200d-2642-fe0f",25,52],"4":["1f481-1f3fe-200d-2642-fe0f",25,53],"5":["1f481-1f3ff-200d-2642-fe0f",25,54]}},{"u":"1f481-200d-2640-fe0f","c":"People \u0026 Body","o":272,"x":25,"y":43,"s":"woman-tipping-hand","n":"vrouw achter informatiebalie","k":"woman-tipping-hand|woman tipping hand|vrouw achter informatiebalie|brutaal|pols knikken|vrouw|fetch|flick|flip|gossip|hand|sarcasm|sarcastic|sassy|seriously|tipping|whatever|woman","t":{"1":["1f481-1f3fb-200d-2640-fe0f",25,44],"2":["1f481-1f3fc-200d-2640-fe0f",25,45],"3":["1f481-1f3fd-200d-2640-fe0f",25,46],"4":["1f481-1f3fe-200d-2640-fe0f",25,47],"5":["1f481-1f3ff-200d-2640-fe0f",25,48]}},{"u":"1f64b-200d-2642-fe0f","c":"People \u0026 Body","o":274,"x":34,"y":59,"s":"man-raising-hand","n":"man met opgeheven hand","k":"man-raising-hand|man raising hand|man met opgeheven hand|gebaar|hand in de lucht|hand omhoog|hand opsteken|ik weet het|man|man met opgestoken hand|persoon|vraag|gesture|hand|here|know|me|pick|question|raise|raising","t":{"1":["1f64b-1f3fb-200d-2642-fe0f",34,60],"2":["1f64b-1f3fc-200d-2642-fe0f",34,61],"3":["1f64b-1f3fd-200d-2642-fe0f",35,0],"4":["1f64b-1f3fe-200d-2642-fe0f",35,1],"5":["1f64b-1f3ff-200d-2642-fe0f",35,2]}},{"u":"1f64b-200d-2640-fe0f","c":"People \u0026 Body","o":275,"x":34,"y":53,"s":"woman-raising-hand","n":"vrouw met opgeheven hand","k":"woman-raising-hand|woman raising hand|vrouw met opgeheven hand|gebaar|hand opsteken|vrouw|gesture|hand|here|know|me|pick|question|raise|raising|woman","t":{"1":["1f64b-1f3fb-200d-2640-fe0f",34,54],"2":["1f64b-1f3fc-200d-2640-fe0f",34,55],"3":["1f64b-1f3fd-200d-2640-fe0f",34,56],"4":["1f64b-1f3fe-200d-2640-fe0f",34,57],"5":["1f64b-1f3ff-200d-2640-fe0f",34,58]}},{"u":"1f9cf","c":"People \u0026 Body","o":276,"x":47,"y":55,"s":"deaf_person","n":"doof persoon","k":"deaf person|doof persoon|doof|horen|oor|slechthorend|toegankelijkheid|accessibility|deaf|ear|gesture|hear|person","t":{"1":["1f9cf-1f3fb",47,56],"2":["1f9cf-1f3fc",47,57],"3":["1f9cf-1f3fd",47,58],"4":["1f9cf-1f3fe",47,59],"5":["1f9cf-1f3ff",47,60]}},{"u":"1f9cf-200d-2642-fe0f","c":"People \u0026 Body","o":277,"x":47,"y":49,"s":"deaf_man","n":"dove man","k":"deaf man|dove man|doof|man|accessibility|deaf|ear|gesture|hear","t":{"1":["1f9cf-1f3fb-200d-2642-fe0f",47,50],"2":["1f9cf-1f3fc-200d-2642-fe0f",47,51],"3":["1f9cf-1f3fd-200d-2642-fe0f",47,52],"4":["1f9cf-1f3fe-200d-2642-fe0f",47,53],"5":["1f9cf-1f3ff-200d-2642-fe0f",47,54]}},{"u":"1f9cf-200d-2640-fe0f","c":"People \u0026 Body","o":278,"x":47,"y":43,"s":"deaf_woman","n":"dove vrouw","k":"deaf woman|dove vrouw|doof|vrouw|accessibility|deaf|ear|gesture|hear|woman","t":{"1":["1f9cf-1f3fb-200d-2640-fe0f",47,44],"2":["1f9cf-1f3fc-200d-2640-fe0f",47,45],"3":["1f9cf-1f3fd-200d-2640-fe0f",47,46],"4":["1f9cf-1f3fe-200d-2640-fe0f",47,47],"5":["1f9cf-1f3ff-200d-2640-fe0f",47,48]}},{"u":"1f647","c":"People \u0026 Body","o":279,"x":34,"y":44,"s":"bow","n":"buigende persoon","k":"bow|person bowing deeply|buigende persoon|buigende man|buiging|diepe buiging|excuses|gebaar|persoon|persoon die buiging maakt|sorry|spijt|verontschuldiging|person bowing|apology|ask|beg|bowing|favor|forgive|gesture|meditate|meditation|person|pity|regret","t":{"1":["1f647-1f3fb",34,45],"2":["1f647-1f3fc",34,46],"3":["1f647-1f3fd",34,47],"4":["1f647-1f3fe",34,48],"5":["1f647-1f3ff",34,49]}},{"u":"1f647-200d-2642-fe0f","c":"People \u0026 Body","o":280,"x":34,"y":38,"s":"man-bowing","n":"buigende man","k":"man-bowing|man bowing|buigende man|buigen|excuses|gebaar|gunst|man|sorry|apology|ask|beg|bow|bowing|favor|forgive|gesture|meditate|meditation|pity|regret","t":{"1":["1f647-1f3fb-200d-2642-fe0f",34,39],"2":["1f647-1f3fc-200d-2642-fe0f",34,40],"3":["1f647-1f3fd-200d-2642-fe0f",34,41],"4":["1f647-1f3fe-200d-2642-fe0f",34,42],"5":["1f647-1f3ff-200d-2642-fe0f",34,43]}},{"u":"1f647-200d-2640-fe0f","c":"People \u0026 Body","o":281,"x":34,"y":32,"s":"woman-bowing","n":"buigende vrouw","k":"woman-bowing|woman bowing|buigende vrouw|buigen|buiging|excuses|gebaar|gunst|persoon|schaamte|schuld|sorry|verontschuldigen|vrouw|vrouw die buigt|apology|ask|beg|bow|bowing|favor|forgive|gesture|meditate|meditation|pity|regret|woman","t":{"1":["1f647-1f3fb-200d-2640-fe0f",34,33],"2":["1f647-1f3fc-200d-2640-fe0f",34,34],"3":["1f647-1f3fd-200d-2640-fe0f",34,35],"4":["1f647-1f3fe-200d-2640-fe0f",34,36],"5":["1f647-1f3ff-200d-2640-fe0f",34,37]}},{"u":"1f926","c":"People \u0026 Body","o":282,"x":41,"y":7,"s":"face_palm","n":"persoon die het gezicht met de hand bedekt","k":"face palm|persoon die het gezicht met de hand bedekt|ergernis|gebaar|gezicht|hand voor gezicht|niet opnieuw|ongeloof|ongelooflijk|palm|persoon|schaamte|zucht|person facepalming|again|bewilder|disbelief|exasperation|facepalm|no|not|oh|omg|person|shock|smh","t":{"1":["1f926-1f3fb",41,8],"2":["1f926-1f3fc",41,9],"3":["1f926-1f3fd",41,10],"4":["1f926-1f3fe",41,11],"5":["1f926-1f3ff",41,12]}},{"u":"1f926-200d-2642-fe0f","c":"People \u0026 Body","o":283,"x":41,"y":1,"s":"man-facepalming","n":"man die het gezicht met de hand bedekt","k":"man-facepalming|man facepalming|man die het gezicht met de hand bedekt|ergernis|facepalm|gebaar|gezicht bedekken|man|omg|ongeloof|ongelooflijk|persoon|schaamte|again|bewilder|disbelief|exasperation|no|not|oh|shock|smh","t":{"1":["1f926-1f3fb-200d-2642-fe0f",41,2],"2":["1f926-1f3fc-200d-2642-fe0f",41,3],"3":["1f926-1f3fd-200d-2642-fe0f",41,4],"4":["1f926-1f3fe-200d-2642-fe0f",41,5],"5":["1f926-1f3ff-200d-2642-fe0f",41,6]}},{"u":"1f926-200d-2640-fe0f","c":"People \u0026 Body","o":284,"x":40,"y":57,"s":"woman-facepalming","n":"vrouw die het gezicht met de hand bedekt","k":"woman-facepalming|woman facepalming|vrouw die het gezicht met de hand bedekt|ergernis|facepalm|gebaar|gezicht bedekken|omg|ongeloof|ongelooflijk|persoon|schaamte|vrouw|again|bewilder|disbelief|exasperation|no|not|oh|shock|smh|woman","t":{"1":["1f926-1f3fb-200d-2640-fe0f",40,58],"2":["1f926-1f3fc-200d-2640-fe0f",40,59],"3":["1f926-1f3fd-200d-2640-fe0f",40,60],"4":["1f926-1f3fe-200d-2640-fe0f",40,61],"5":["1f926-1f3ff-200d-2640-fe0f",41,0]}},{"u":"1f937","c":"People \u0026 Body","o":285,"x":42,"y":26,"s":"shrug","n":"persoon die schouders ophaalt","k":"shrug|persoon die schouders ophaalt|gebaar|idk|ik weet het niet|misschien|onverschilligheid|onwetend|onwetendheid|schouderophalen|twijfel|person shrugging|doubt|dunno|guess|ignorance|indifference|knows|maybe|person|shrugging|whatever|who","t":{"1":["1f937-1f3fb",42,27],"2":["1f937-1f3fc",42,28],"3":["1f937-1f3fd",42,29],"4":["1f937-1f3fe",42,30],"5":["1f937-1f3ff",42,31]}},{"u":"1f937-200d-2642-fe0f","c":"People \u0026 Body","o":286,"x":42,"y":20,"s":"man-shrugging","n":"man die schouders ophaalt","k":"man-shrugging|man shrugging|man die schouders ophaalt|gebaar|geen idee|man|man haalt schouders op|onverschillig|onverschilligheid|onwetendheid|persoon|schouderophalen|twijfel|doubt|dunno|guess|idk|ignorance|indifference|knows|maybe|shrug|shrugging|whatever|who","t":{"1":["1f937-1f3fb-200d-2642-fe0f",42,21],"2":["1f937-1f3fc-200d-2642-fe0f",42,22],"3":["1f937-1f3fd-200d-2642-fe0f",42,23],"4":["1f937-1f3fe-200d-2642-fe0f",42,24],"5":["1f937-1f3ff-200d-2642-fe0f",42,25]}},{"u":"1f937-200d-2640-fe0f","c":"People \u0026 Body","o":287,"x":42,"y":14,"s":"woman-shrugging","n":"vrouw die schouders ophaalt","k":"woman-shrugging|woman shrugging|vrouw die schouders ophaalt|gebaar|geen idee|onverschillig|onverschilligheid|onwetendheid|persoon|schouderophalen|twijfel|vrouw|weet niet|doubt|dunno|guess|idk|ignorance|indifference|knows|maybe|shrug|shrugging|whatever|who|woman","t":{"1":["1f937-1f3fb-200d-2640-fe0f",42,15],"2":["1f937-1f3fc-200d-2640-fe0f",42,16],"3":["1f937-1f3fd-200d-2640-fe0f",42,17],"4":["1f937-1f3fe-200d-2640-fe0f",42,18],"5":["1f937-1f3ff-200d-2640-fe0f",42,19]}},{"u":"1f9d1-200d-2695-fe0f","c":"People \u0026 Body","o":288,"x":50,"y":56,"s":"health_worker","n":"gezondheidsmedewerker","k":"health worker|gezondheidsmedewerker|dokter|gezondheidszorg|therapeut|verpleegster|doctor|health|healthcare|nurse|therapist|worker","t":{"1":["1f9d1-1f3fb-200d-2695-fe0f",50,57],"2":["1f9d1-1f3fc-200d-2695-fe0f",50,58],"3":["1f9d1-1f3fd-200d-2695-fe0f",50,59],"4":["1f9d1-1f3fe-200d-2695-fe0f",50,60],"5":["1f9d1-1f3ff-200d-2695-fe0f",50,61]}},{"u":"1f468-200d-2695-fe0f","c":"People \u0026 Body","o":289,"x":16,"y":28,"s":"male-doctor","n":"mannelijke gezondheidsmedewerker","k":"male-doctor|man health worker|mannelijke gezondheidsmedewerker|arts|gezondheid|gezondheidszorg|man|therapeut|verpleger|werknemer|doctor|health|healthcare|nurse|therapist|worker","t":{"1":["1f468-1f3fb-200d-2695-fe0f",16,29],"2":["1f468-1f3fc-200d-2695-fe0f",16,30],"3":["1f468-1f3fd-200d-2695-fe0f",16,31],"4":["1f468-1f3fe-200d-2695-fe0f",16,32],"5":["1f468-1f3ff-200d-2695-fe0f",16,33]}},{"u":"1f469-200d-2695-fe0f","c":"People \u0026 Body","o":290,"x":20,"y":10,"s":"female-doctor","n":"gezondheidsmedewerkster","k":"female-doctor|woman health worker|gezondheidsmedewerkster|arts|gezondheid|gezondheidszorg|therapeute|verpleegster|vrouw|werknemer|doctor|health|healthcare|nurse|therapist|woman|worker","t":{"1":["1f469-1f3fb-200d-2695-fe0f",20,11],"2":["1f469-1f3fc-200d-2695-fe0f",20,12],"3":["1f469-1f3fd-200d-2695-fe0f",20,13],"4":["1f469-1f3fe-200d-2695-fe0f",20,14],"5":["1f469-1f3ff-200d-2695-fe0f",20,15]}},{"u":"1f9d1-200d-1f393","c":"People \u0026 Body","o":291,"x":48,"y":24,"s":"student","n":"student","k":"student|scholier|graduate","t":{"1":["1f9d1-1f3fb-200d-1f393",48,25],"2":["1f9d1-1f3fc-200d-1f393",48,26],"3":["1f9d1-1f3fd-200d-1f393",48,27],"4":["1f9d1-1f3fe-200d-1f393",48,28],"5":["1f9d1-1f3ff-200d-1f393",48,29]}},{"u":"1f468-200d-1f393","c":"People \u0026 Body","o":292,"x":14,"y":11,"s":"male-student","n":"mannelijke student","k":"male-student|man student|mannelijke student|scholier|student|vrouw|graduate|man","t":{"1":["1f468-1f3fb-200d-1f393",14,12],"2":["1f468-1f3fc-200d-1f393",14,13],"3":["1f468-1f3fd-200d-1f393",14,14],"4":["1f468-1f3fe-200d-1f393",14,15],"5":["1f468-1f3ff-200d-1f393",14,16]}},{"u":"1f469-200d-1f393","c":"People \u0026 Body","o":293,"x":17,"y":60,"s":"female-student","n":"studente","k":"female-student|woman student|studente|scholier|student|vrouw|graduate|woman","t":{"1":["1f469-1f3fb-200d-1f393",17,61],"2":["1f469-1f3fc-200d-1f393",18,0],"3":["1f469-1f3fd-200d-1f393",18,1],"4":["1f469-1f3fe-200d-1f393",18,2],"5":["1f469-1f3ff-200d-1f393",18,3]}},{"u":"1f9d1-200d-1f3eb","c":"People \u0026 Body","o":294,"x":48,"y":42,"s":"teacher","n":"docent","k":"teacher|docent|leraar|professor|instructor|lecturer","t":{"1":["1f9d1-1f3fb-200d-1f3eb",48,43],"2":["1f9d1-1f3fc-200d-1f3eb",48,44],"3":["1f9d1-1f3fd-200d-1f3eb",48,45],"4":["1f9d1-1f3fe-200d-1f3eb",48,46],"5":["1f9d1-1f3ff-200d-1f3eb",48,47]}},{"u":"1f468-200d-1f3eb","c":"People \u0026 Body","o":295,"x":14,"y":29,"s":"male-teacher","n":"mannelijke docent","k":"male-teacher|man teacher|mannelijke docent|docent|instructeur|leraar|man|professor|instructor|lecturer|teacher","t":{"1":["1f468-1f3fb-200d-1f3eb",14,30],"2":["1f468-1f3fc-200d-1f3eb",14,31],"3":["1f468-1f3fd-200d-1f3eb",14,32],"4":["1f468-1f3fe-200d-1f3eb",14,33],"5":["1f468-1f3ff-200d-1f3eb",14,34]}},{"u":"1f469-200d-1f3eb","c":"People \u0026 Body","o":296,"x":18,"y":16,"s":"female-teacher","n":"docente","k":"female-teacher|woman teacher|docente|instructrice|lerares|professor|vrouw|instructor|lecturer|teacher|woman","t":{"1":["1f469-1f3fb-200d-1f3eb",18,17],"2":["1f469-1f3fc-200d-1f3eb",18,18],"3":["1f469-1f3fd-200d-1f3eb",18,19],"4":["1f469-1f3fe-200d-1f3eb",18,20],"5":["1f469-1f3ff-200d-1f3eb",18,21]}},{"u":"1f9d1-200d-2696-fe0f","c":"People \u0026 Body","o":297,"x":51,"y":0,"s":"judge","n":"rechter","k":"judge|rechter|recht|weegschaal|justice|law|scales","t":{"1":["1f9d1-1f3fb-200d-2696-fe0f",51,1],"2":["1f9d1-1f3fc-200d-2696-fe0f",51,2],"3":["1f9d1-1f3fd-200d-2696-fe0f",51,3],"4":["1f9d1-1f3fe-200d-2696-fe0f",51,4],"5":["1f9d1-1f3ff-200d-2696-fe0f",51,5]}},{"u":"1f468-200d-2696-fe0f","c":"People \u0026 Body","o":298,"x":16,"y":34,"s":"male-judge","n":"mannelijke rechter","k":"male-judge|man judge|mannelijke rechter|gerechtigheid|man|recht|rechter|weegschaal|judge|justice|law|scales","t":{"1":["1f468-1f3fb-200d-2696-fe0f",16,35],"2":["1f468-1f3fc-200d-2696-fe0f",16,36],"3":["1f468-1f3fd-200d-2696-fe0f",16,37],"4":["1f468-1f3fe-200d-2696-fe0f",16,38],"5":["1f468-1f3ff-200d-2696-fe0f",16,39]}},{"u":"1f469-200d-2696-fe0f","c":"People \u0026 Body","o":299,"x":20,"y":16,"s":"female-judge","n":"vrouwelijke rechter","k":"female-judge|woman judge|vrouwelijke rechter|gerechtigheid|recht|rechter|vrouw|weegschaal|judge|justice|law|scales|woman","t":{"1":["1f469-1f3fb-200d-2696-fe0f",20,17],"2":["1f469-1f3fc-200d-2696-fe0f",20,18],"3":["1f469-1f3fd-200d-2696-fe0f",20,19],"4":["1f469-1f3fe-200d-2696-fe0f",20,20],"5":["1f469-1f3ff-200d-2696-fe0f",20,21]}},{"u":"1f9d1-200d-1f33e","c":"People \u0026 Body","o":300,"x":48,"y":0,"s":"farmer","n":"boer","k":"farmer|boer|tuinder|veehouder|gardener|rancher","t":{"1":["1f9d1-1f3fb-200d-1f33e",48,1],"2":["1f9d1-1f3fc-200d-1f33e",48,2],"3":["1f9d1-1f3fd-200d-1f33e",48,3],"4":["1f9d1-1f3fe-200d-1f33e",48,4],"5":["1f9d1-1f3ff-200d-1f33e",48,5]}},{"u":"1f468-200d-1f33e","c":"People \u0026 Body","o":301,"x":13,"y":55,"s":"male-farmer","n":"mannelijke boer","k":"male-farmer|man farmer|mannelijke boer|boer|man|tuinder|veehouder|farmer|gardener|rancher","t":{"1":["1f468-1f3fb-200d-1f33e",13,56],"2":["1f468-1f3fc-200d-1f33e",13,57],"3":["1f468-1f3fd-200d-1f33e",13,58],"4":["1f468-1f3fe-200d-1f33e",13,59],"5":["1f468-1f3ff-200d-1f33e",13,60]}},{"u":"1f469-200d-1f33e","c":"People \u0026 Body","o":302,"x":17,"y":42,"s":"female-farmer","n":"boerin","k":"female-farmer|woman farmer|boerin|boer|tuinder|veehouder|vrouw|farmer|gardener|rancher|woman","t":{"1":["1f469-1f3fb-200d-1f33e",17,43],"2":["1f469-1f3fc-200d-1f33e",17,44],"3":["1f469-1f3fd-200d-1f33e",17,45],"4":["1f469-1f3fe-200d-1f33e",17,46],"5":["1f469-1f3ff-200d-1f33e",17,47]}},{"u":"1f9d1-200d-1f373","c":"People \u0026 Body","o":303,"x":48,"y":6,"s":"cook","n":"kok","k":"cook|kok|chef-kok|chef","t":{"1":["1f9d1-1f3fb-200d-1f373",48,7],"2":["1f9d1-1f3fc-200d-1f373",48,8],"3":["1f9d1-1f3fd-200d-1f373",48,9],"4":["1f9d1-1f3fe-200d-1f373",48,10],"5":["1f9d1-1f3ff-200d-1f373",48,11]}},{"u":"1f468-200d-1f373","c":"People \u0026 Body","o":304,"x":13,"y":61,"s":"male-cook","n":"mannelijke kok","k":"male-cook|man cook|mannelijke kok|chef-kok|kok|man|chef|cook","t":{"1":["1f468-1f3fb-200d-1f373",14,0],"2":["1f468-1f3fc-200d-1f373",14,1],"3":["1f468-1f3fd-200d-1f373",14,2],"4":["1f468-1f3fe-200d-1f373",14,3],"5":["1f468-1f3ff-200d-1f373",14,4]}},{"u":"1f469-200d-1f373","c":"People \u0026 Body","o":305,"x":17,"y":48,"s":"female-cook","n":"kokkin","k":"female-cook|woman cook|kokkin|chef-kok|kok|vrouw|chef|cook|woman","t":{"1":["1f469-1f3fb-200d-1f373",17,49],"2":["1f469-1f3fc-200d-1f373",17,50],"3":["1f469-1f3fd-200d-1f373",17,51],"4":["1f469-1f3fe-200d-1f373",17,52],"5":["1f469-1f3ff-200d-1f373",17,53]}},{"u":"1f9d1-200d-1f527","c":"People \u0026 Body","o":306,"x":49,"y":4,"s":"mechanic","n":"monteur","k":"mechanic|monteur|elektricien|handelsman|loodgieter|electrician|plumber|tradesperson","t":{"1":["1f9d1-1f3fb-200d-1f527",49,5],"2":["1f9d1-1f3fc-200d-1f527",49,6],"3":["1f9d1-1f3fd-200d-1f527",49,7],"4":["1f9d1-1f3fe-200d-1f527",49,8],"5":["1f9d1-1f3ff-200d-1f527",49,9]}},{"u":"1f468-200d-1f527","c":"People \u0026 Body","o":307,"x":15,"y":6,"s":"male-mechanic","n":"mannelijke monteur","k":"male-mechanic|man mechanic|mannelijke monteur|elektricien|handelsman|loodgieter|man|monteur|electrician|mechanic|plumber|tradesperson","t":{"1":["1f468-1f3fb-200d-1f527",15,7],"2":["1f468-1f3fc-200d-1f527",15,8],"3":["1f468-1f3fd-200d-1f527",15,9],"4":["1f468-1f3fe-200d-1f527",15,10],"5":["1f468-1f3ff-200d-1f527",15,11]}},{"u":"1f469-200d-1f527","c":"People \u0026 Body","o":308,"x":18,"y":50,"s":"female-mechanic","n":"monteuse","k":"female-mechanic|woman mechanic|monteuse|elektricien|handelsman|loodgieter|monteur|vrouw|electrician|mechanic|plumber|tradesperson|woman","t":{"1":["1f469-1f3fb-200d-1f527",18,51],"2":["1f469-1f3fc-200d-1f527",18,52],"3":["1f469-1f3fd-200d-1f527",18,53],"4":["1f469-1f3fe-200d-1f527",18,54],"5":["1f469-1f3ff-200d-1f527",18,55]}},{"u":"1f9d1-200d-1f3ed","c":"People \u0026 Body","o":309,"x":48,"y":48,"s":"factory_worker","n":"fabrieksarbeider","k":"factory worker|fabrieksarbeider|arbeider|fabriek|industrieel|lopende band|assembly|factory|industrial|worker","t":{"1":["1f9d1-1f3fb-200d-1f3ed",48,49],"2":["1f9d1-1f3fc-200d-1f3ed",48,50],"3":["1f9d1-1f3fd-200d-1f3ed",48,51],"4":["1f9d1-1f3fe-200d-1f3ed",48,52],"5":["1f9d1-1f3ff-200d-1f3ed",48,53]}},{"u":"1f468-200d-1f3ed","c":"People \u0026 Body","o":310,"x":14,"y":35,"s":"male-factory-worker","n":"mannelijke fabrieksarbeider","k":"male-factory-worker|man factory worker|mannelijke fabrieksarbeider|arbeider|fabriek|industrieel|lopende band|man|assembly|factory|industrial|worker","t":{"1":["1f468-1f3fb-200d-1f3ed",14,36],"2":["1f468-1f3fc-200d-1f3ed",14,37],"3":["1f468-1f3fd-200d-1f3ed",14,38],"4":["1f468-1f3fe-200d-1f3ed",14,39],"5":["1f468-1f3ff-200d-1f3ed",14,40]}},{"u":"1f469-200d-1f3ed","c":"People \u0026 Body","o":311,"x":18,"y":22,"s":"female-factory-worker","n":"fabrieksarbeidster","k":"female-factory-worker|woman factory worker|fabrieksarbeidster|arbeider|fabriek|industrieel|lopende band|vrouw|assembly|factory|industrial|woman|worker","t":{"1":["1f469-1f3fb-200d-1f3ed",18,23],"2":["1f469-1f3fc-200d-1f3ed",18,24],"3":["1f469-1f3fd-200d-1f3ed",18,25],"4":["1f469-1f3fe-200d-1f3ed",18,26],"5":["1f469-1f3ff-200d-1f3ed",18,27]}},{"u":"1f9d1-200d-1f4bc","c":"People \u0026 Body","o":312,"x":48,"y":60,"s":"office_worker","n":"kantoormedewerker","k":"office worker|kantoormedewerker|architect|bedrijf|manager|business|office|white-collar|worker","t":{"1":["1f9d1-1f3fb-200d-1f4bc",48,61],"2":["1f9d1-1f3fc-200d-1f4bc",49,0],"3":["1f9d1-1f3fd-200d-1f4bc",49,1],"4":["1f9d1-1f3fe-200d-1f4bc",49,2],"5":["1f9d1-1f3ff-200d-1f4bc",49,3]}},{"u":"1f468-200d-1f4bc","c":"People \u0026 Body","o":313,"x":15,"y":0,"s":"male-office-worker","n":"mannelijke kantoormedewerker","k":"male-office-worker|man office worker|mannelijke kantoormedewerker|ambtenaar|architect|bedrijf|kantoor|man|manager|werknemer|business|office|white-collar|worker","t":{"1":["1f468-1f3fb-200d-1f4bc",15,1],"2":["1f468-1f3fc-200d-1f4bc",15,2],"3":["1f468-1f3fd-200d-1f4bc",15,3],"4":["1f468-1f3fe-200d-1f4bc",15,4],"5":["1f468-1f3ff-200d-1f4bc",15,5]}},{"u":"1f469-200d-1f4bc","c":"People \u0026 Body","o":314,"x":18,"y":44,"s":"female-office-worker","n":"kantoormedewerkster","k":"female-office-worker|woman office worker|kantoormedewerkster|ambtenaar|architect|bedrijf|kantoor|manager|vrouw|werknemer|business|office|white-collar|woman|worker","t":{"1":["1f469-1f3fb-200d-1f4bc",18,45],"2":["1f469-1f3fc-200d-1f4bc",18,46],"3":["1f469-1f3fd-200d-1f4bc",18,47],"4":["1f469-1f3fe-200d-1f4bc",18,48],"5":["1f469-1f3ff-200d-1f4bc",18,49]}},{"u":"1f9d1-200d-1f52c","c":"People \u0026 Body","o":315,"x":49,"y":10,"s":"scientist","n":"wetenschapper","k":"scientist|wetenschapper|bioloog|ingenieur|natuurkundige|scheikundige|biologist|chemist|engineer|mathematician|physicist","t":{"1":["1f9d1-1f3fb-200d-1f52c",49,11],"2":["1f9d1-1f3fc-200d-1f52c",49,12],"3":["1f9d1-1f3fd-200d-1f52c",49,13],"4":["1f9d1-1f3fe-200d-1f52c",49,14],"5":["1f9d1-1f3ff-200d-1f52c",49,15]}},{"u":"1f468-200d-1f52c","c":"People \u0026 Body","o":316,"x":15,"y":12,"s":"male-scientist","n":"mannelijke wetenschapper","k":"male-scientist|man scientist|mannelijke wetenschapper|bioloog|ingenieur|man|natuurkundige|scheikundige|wetenschapper|wiskundige|biologist|chemist|engineer|mathematician|physicist|scientist","t":{"1":["1f468-1f3fb-200d-1f52c",15,13],"2":["1f468-1f3fc-200d-1f52c",15,14],"3":["1f468-1f3fd-200d-1f52c",15,15],"4":["1f468-1f3fe-200d-1f52c",15,16],"5":["1f468-1f3ff-200d-1f52c",15,17]}},{"u":"1f469-200d-1f52c","c":"People \u0026 Body","o":317,"x":18,"y":56,"s":"female-scientist","n":"wetenschapster","k":"female-scientist|woman scientist|wetenschapster|biologe|ingenieur|natuurkundige|scheikundige|vrouw|wiskundige|biologist|chemist|engineer|mathematician|physicist|scientist|woman","t":{"1":["1f469-1f3fb-200d-1f52c",18,57],"2":["1f469-1f3fc-200d-1f52c",18,58],"3":["1f469-1f3fd-200d-1f52c",18,59],"4":["1f469-1f3fe-200d-1f52c",18,60],"5":["1f469-1f3ff-200d-1f52c",18,61]}},{"u":"1f9d1-200d-1f4bb","c":"People \u0026 Body","o":318,"x":48,"y":54,"s":"technologist","n":"technoloog","k":"technologist|technoloog|ontwikkelaar|programmeur|techneut|uitvinder|coder|computer|developer|inventor|software","t":{"1":["1f9d1-1f3fb-200d-1f4bb",48,55],"2":["1f9d1-1f3fc-200d-1f4bb",48,56],"3":["1f9d1-1f3fd-200d-1f4bb",48,57],"4":["1f9d1-1f3fe-200d-1f4bb",48,58],"5":["1f9d1-1f3ff-200d-1f4bb",48,59]}},{"u":"1f468-200d-1f4bb","c":"People \u0026 Body","o":319,"x":14,"y":56,"s":"male-technologist","n":"mannelijke technoloog","k":"male-technologist|man technologist|mannelijke technoloog|computer|man|ontwikkelaar|programmeur|software|technoloog|uitvinder|coder|developer|inventor|technologist","t":{"1":["1f468-1f3fb-200d-1f4bb",14,57],"2":["1f468-1f3fc-200d-1f4bb",14,58],"3":["1f468-1f3fd-200d-1f4bb",14,59],"4":["1f468-1f3fe-200d-1f4bb",14,60],"5":["1f468-1f3ff-200d-1f4bb",14,61]}},{"u":"1f469-200d-1f4bb","c":"People \u0026 Body","o":320,"x":18,"y":38,"s":"female-technologist","n":"technologe","k":"female-technologist|woman technologist|technologe|computer|ontwikkelaar|programmeur|software|uitvindster|vrouw|coder|developer|inventor|technologist|woman","t":{"1":["1f469-1f3fb-200d-1f4bb",18,39],"2":["1f469-1f3fc-200d-1f4bb",18,40],"3":["1f469-1f3fd-200d-1f4bb",18,41],"4":["1f469-1f3fe-200d-1f4bb",18,42],"5":["1f469-1f3ff-200d-1f4bb",18,43]}},{"u":"1f9d1-200d-1f3a4","c":"People \u0026 Body","o":321,"x":48,"y":30,"s":"singer","n":"zanger","k":"singer|zanger|acteur|entertainer|rock|ster|actor|rockstar|star","t":{"1":["1f9d1-1f3fb-200d-1f3a4",48,31],"2":["1f9d1-1f3fc-200d-1f3a4",48,32],"3":["1f9d1-1f3fd-200d-1f3a4",48,33],"4":["1f9d1-1f3fe-200d-1f3a4",48,34],"5":["1f9d1-1f3ff-200d-1f3a4",48,35]}},{"u":"1f468-200d-1f3a4","c":"People \u0026 Body","o":322,"x":14,"y":17,"s":"male-singer","n":"mannelijke zanger","k":"male-singer|man singer|mannelijke zanger|acteur|entertainer|man|rock|rockster|ster|zanger|actor|rockstar|singer|star","t":{"1":["1f468-1f3fb-200d-1f3a4",14,18],"2":["1f468-1f3fc-200d-1f3a4",14,19],"3":["1f468-1f3fd-200d-1f3a4",14,20],"4":["1f468-1f3fe-200d-1f3a4",14,21],"5":["1f468-1f3ff-200d-1f3a4",14,22]}},{"u":"1f469-200d-1f3a4","c":"People \u0026 Body","o":323,"x":18,"y":4,"s":"female-singer","n":"zangeres","k":"female-singer|woman singer|zangeres|actrice|entertainer|rock|rockster|ster|vrouw|actor|rockstar|singer|star|woman","t":{"1":["1f469-1f3fb-200d-1f3a4",18,5],"2":["1f469-1f3fc-200d-1f3a4",18,6],"3":["1f469-1f3fd-200d-1f3a4",18,7],"4":["1f469-1f3fe-200d-1f3a4",18,8],"5":["1f469-1f3ff-200d-1f3a4",18,9]}},{"u":"1f9d1-200d-1f3a8","c":"People \u0026 Body","o":324,"x":48,"y":36,"s":"artist","n":"kunstenaar","k":"artist|kunstenaar|palet|palette","t":{"1":["1f9d1-1f3fb-200d-1f3a8",48,37],"2":["1f9d1-1f3fc-200d-1f3a8",48,38],"3":["1f9d1-1f3fd-200d-1f3a8",48,39],"4":["1f9d1-1f3fe-200d-1f3a8",48,40],"5":["1f9d1-1f3ff-200d-1f3a8",48,41]}},{"u":"1f468-200d-1f3a8","c":"People \u0026 Body","o":325,"x":14,"y":23,"s":"male-artist","n":"mannelijke kunstenaar","k":"male-artist|man artist|mannelijke kunstenaar|kunstenaar|man|palet|artist|palette","t":{"1":["1f468-1f3fb-200d-1f3a8",14,24],"2":["1f468-1f3fc-200d-1f3a8",14,25],"3":["1f468-1f3fd-200d-1f3a8",14,26],"4":["1f468-1f3fe-200d-1f3a8",14,27],"5":["1f468-1f3ff-200d-1f3a8",14,28]}},{"u":"1f469-200d-1f3a8","c":"People \u0026 Body","o":326,"x":18,"y":10,"s":"female-artist","n":"kunstenares","k":"female-artist|woman artist|kunstenares|palet|vrouw|artist|palette|woman","t":{"1":["1f469-1f3fb-200d-1f3a8",18,11],"2":["1f469-1f3fc-200d-1f3a8",18,12],"3":["1f469-1f3fd-200d-1f3a8",18,13],"4":["1f469-1f3fe-200d-1f3a8",18,14],"5":["1f469-1f3ff-200d-1f3a8",18,15]}},{"u":"1f9d1-200d-2708-fe0f","c":"People \u0026 Body","o":327,"x":51,"y":6,"s":"pilot","n":"piloot","k":"pilot|piloot|vliegtuig|plane","t":{"1":["1f9d1-1f3fb-200d-2708-fe0f",51,7],"2":["1f9d1-1f3fc-200d-2708-fe0f",51,8],"3":["1f9d1-1f3fd-200d-2708-fe0f",51,9],"4":["1f9d1-1f3fe-200d-2708-fe0f",51,10],"5":["1f9d1-1f3ff-200d-2708-fe0f",51,11]}},{"u":"1f468-200d-2708-fe0f","c":"People \u0026 Body","o":328,"x":16,"y":40,"s":"male-pilot","n":"mannelijke piloot","k":"male-pilot|man pilot|mannelijke piloot|man|piloot|vliegtuig|pilot|plane","t":{"1":["1f468-1f3fb-200d-2708-fe0f",16,41],"2":["1f468-1f3fc-200d-2708-fe0f",16,42],"3":["1f468-1f3fd-200d-2708-fe0f",16,43],"4":["1f468-1f3fe-200d-2708-fe0f",16,44],"5":["1f468-1f3ff-200d-2708-fe0f",16,45]}},{"u":"1f469-200d-2708-fe0f","c":"People \u0026 Body","o":329,"x":20,"y":22,"s":"female-pilot","n":"pilote","k":"female-pilot|woman pilot|pilote|piloot|vliegtuig|vrouw|pilot|plane|woman","t":{"1":["1f469-1f3fb-200d-2708-fe0f",20,23],"2":["1f469-1f3fc-200d-2708-fe0f",20,24],"3":["1f469-1f3fd-200d-2708-fe0f",20,25],"4":["1f469-1f3fe-200d-2708-fe0f",20,26],"5":["1f469-1f3ff-200d-2708-fe0f",20,27]}},{"u":"1f9d1-200d-1f680","c":"People \u0026 Body","o":330,"x":49,"y":16,"s":"astronaut","n":"astronaut","k":"astronaut|raket|rocket|space","t":{"1":["1f9d1-1f3fb-200d-1f680",49,17],"2":["1f9d1-1f3fc-200d-1f680",49,18],"3":["1f9d1-1f3fd-200d-1f680",49,19],"4":["1f9d1-1f3fe-200d-1f680",49,20],"5":["1f9d1-1f3ff-200d-1f680",49,21]}},{"u":"1f468-200d-1f680","c":"People \u0026 Body","o":331,"x":15,"y":18,"s":"male-astronaut","n":"mannelijke astronaut","k":"male-astronaut|man astronaut|mannelijke astronaut|astronaut|man|raket|ruimte|rocket|space","t":{"1":["1f468-1f3fb-200d-1f680",15,19],"2":["1f468-1f3fc-200d-1f680",15,20],"3":["1f468-1f3fd-200d-1f680",15,21],"4":["1f468-1f3fe-200d-1f680",15,22],"5":["1f468-1f3ff-200d-1f680",15,23]}},{"u":"1f469-200d-1f680","c":"People \u0026 Body","o":332,"x":19,"y":0,"s":"female-astronaut","n":"astronaute","k":"female-astronaut|woman astronaut|astronaute|astronaut|raket|ruimte|vrouw|rocket|space|woman","t":{"1":["1f469-1f3fb-200d-1f680",19,1],"2":["1f469-1f3fc-200d-1f680",19,2],"3":["1f469-1f3fd-200d-1f680",19,3],"4":["1f469-1f3fe-200d-1f680",19,4],"5":["1f469-1f3ff-200d-1f680",19,5]}},{"u":"1f9d1-200d-1f692","c":"People \u0026 Body","o":333,"x":49,"y":22,"s":"firefighter","n":"brandweerman","k":"firefighter|brandweerman|brandweerwagen|fire|firetruck","t":{"1":["1f9d1-1f3fb-200d-1f692",49,23],"2":["1f9d1-1f3fc-200d-1f692",49,24],"3":["1f9d1-1f3fd-200d-1f692",49,25],"4":["1f9d1-1f3fe-200d-1f692",49,26],"5":["1f9d1-1f3ff-200d-1f692",49,27]}},{"u":"1f468-200d-1f692","c":"People \u0026 Body","o":334,"x":15,"y":24,"s":"male-firefighter","n":"mannelijke brandweerman","k":"male-firefighter|man firefighter|mannelijke brandweerman|brandweer|brandweerman|brandweerwagen|man|fire|firefighter|firetruck","t":{"1":["1f468-1f3fb-200d-1f692",15,25],"2":["1f468-1f3fc-200d-1f692",15,26],"3":["1f468-1f3fd-200d-1f692",15,27],"4":["1f468-1f3fe-200d-1f692",15,28],"5":["1f468-1f3ff-200d-1f692",15,29]}},{"u":"1f469-200d-1f692","c":"People \u0026 Body","o":335,"x":19,"y":6,"s":"female-firefighter","n":"brandweervrouw","k":"female-firefighter|woman firefighter|brandweervrouw|brandweer|brandweerwagen|vrouw|fire|firefighter|firetruck|woman","t":{"1":["1f469-1f3fb-200d-1f692",19,7],"2":["1f469-1f3fc-200d-1f692",19,8],"3":["1f469-1f3fd-200d-1f692",19,9],"4":["1f469-1f3fe-200d-1f692",19,10],"5":["1f469-1f3ff-200d-1f692",19,11]}},{"u":"1f46e-200d-2642-fe0f","c":"People \u0026 Body","o":337,"x":23,"y":37,"s":"male-police-officer","n":"politieman","k":"male-police-officer|man police officer|politieman|agent|man|politie|apprehend|arrest|citation|cop|law|officer|over|police|pulled|undercover","t":{"1":["1f46e-1f3fb-200d-2642-fe0f",23,38],"2":["1f46e-1f3fc-200d-2642-fe0f",23,39],"3":["1f46e-1f3fd-200d-2642-fe0f",23,40],"4":["1f46e-1f3fe-200d-2642-fe0f",23,41],"5":["1f46e-1f3ff-200d-2642-fe0f",23,42]}},{"u":"1f46e-200d-2640-fe0f","c":"People \u0026 Body","o":338,"x":23,"y":31,"s":"female-police-officer","n":"politievrouw","k":"female-police-officer|woman police officer|politievrouw|agent|arresteren|beroep|boete|misdaad|persoon|politie|politieagente|vrouw|vrouwelijke politieagent|apprehend|arrest|citation|cop|law|officer|over|police|pulled|undercover|woman","t":{"1":["1f46e-1f3fb-200d-2640-fe0f",23,32],"2":["1f46e-1f3fc-200d-2640-fe0f",23,33],"3":["1f46e-1f3fd-200d-2640-fe0f",23,34],"4":["1f46e-1f3fe-200d-2640-fe0f",23,35],"5":["1f46e-1f3ff-200d-2640-fe0f",23,36]}},{"u":"1f575-fe0f-200d-2642-fe0f","c":"People \u0026 Body","o":340,"x":31,"y":37,"s":"male-detective","n":"mannelijke detective","k":"male-detective|man detective|mannelijke detective|detective|man|speurder|spion|sleuth|spy","t":{"1":["1f575-1f3fb-200d-2642-fe0f",31,38],"2":["1f575-1f3fc-200d-2642-fe0f",31,39],"3":["1f575-1f3fd-200d-2642-fe0f",31,40],"4":["1f575-1f3fe-200d-2642-fe0f",31,41],"5":["1f575-1f3ff-200d-2642-fe0f",31,42]}},{"u":"1f575-fe0f-200d-2640-fe0f","c":"People \u0026 Body","o":341,"x":31,"y":31,"s":"female-detective","n":"vrouwelijke detective","k":"female-detective|woman detective|vrouwelijke detective|detective|speurder|spionne|vrouw|sleuth|spy|woman","t":{"1":["1f575-1f3fb-200d-2640-fe0f",31,32],"2":["1f575-1f3fc-200d-2640-fe0f",31,33],"3":["1f575-1f3fd-200d-2640-fe0f",31,34],"4":["1f575-1f3fe-200d-2640-fe0f",31,35],"5":["1f575-1f3ff-200d-2640-fe0f",31,36]}},{"u":"1f482-200d-2642-fe0f","c":"People \u0026 Body","o":343,"x":26,"y":5,"s":"male-guard","n":"mannelijke wachter","k":"male-guard|man guard|mannelijke wachter|man|wachter|buckingham|guard|helmet|london|palace","t":{"1":["1f482-1f3fb-200d-2642-fe0f",26,6],"2":["1f482-1f3fc-200d-2642-fe0f",26,7],"3":["1f482-1f3fd-200d-2642-fe0f",26,8],"4":["1f482-1f3fe-200d-2642-fe0f",26,9],"5":["1f482-1f3ff-200d-2642-fe0f",26,10]}},{"u":"1f482-200d-2640-fe0f","c":"People \u0026 Body","o":344,"x":25,"y":61,"s":"female-guard","n":"vrouwelijke wachter","k":"female-guard|woman guard|vrouwelijke wachter|buckingham palace|londen|persoon|vrouw|wachter|buckingham|guard|helmet|london|palace|woman","t":{"1":["1f482-1f3fb-200d-2640-fe0f",26,0],"2":["1f482-1f3fc-200d-2640-fe0f",26,1],"3":["1f482-1f3fd-200d-2640-fe0f",26,2],"4":["1f482-1f3fe-200d-2640-fe0f",26,3],"5":["1f482-1f3ff-200d-2640-fe0f",26,4]}},{"u":"1f977","c":"People \u0026 Body","o":345,"x":44,"y":39,"s":"ninja","n":"ninja","k":"ninja|geheim|japan|krijger|persoon|samurai|sluipmoordenaar|vechten|verborgen|zwaard|assassin|fight|fighter|hidden|person|secret|skills|sly|soldier|stealth|war","t":{"1":["1f977-1f3fb",44,40],"2":["1f977-1f3fc",44,41],"3":["1f977-1f3fd",44,42],"4":["1f977-1f3fe",44,43],"5":["1f977-1f3ff",44,44]}},{"u":"1f477-200d-2642-fe0f","c":"People \u0026 Body","o":347,"x":25,"y":12,"s":"male-construction-worker","n":"mannelijke bouwvakker","k":"male-construction-worker|man construction worker|mannelijke bouwvakker|bouw|bouwvakker|man|build|construction|fix|hardhat|hat|rebuild|remodel|repair|work|worker","t":{"1":["1f477-1f3fb-200d-2642-fe0f",25,13],"2":["1f477-1f3fc-200d-2642-fe0f",25,14],"3":["1f477-1f3fd-200d-2642-fe0f",25,15],"4":["1f477-1f3fe-200d-2642-fe0f",25,16],"5":["1f477-1f3ff-200d-2642-fe0f",25,17]}},{"u":"1f477-200d-2640-fe0f","c":"People \u0026 Body","o":348,"x":25,"y":6,"s":"female-construction-worker","n":"vrouwelijke bouwvakker","k":"female-construction-worker|woman construction worker|vrouwelijke bouwvakker|baan|beroep|bouw|bouwvakker|helm|persoon|vrouw|werk|build|construction|fix|hardhat|hat|man|rebuild|remodel|repair|woman|work|worker","t":{"1":["1f477-1f3fb-200d-2640-fe0f",25,7],"2":["1f477-1f3fc-200d-2640-fe0f",25,8],"3":["1f477-1f3fd-200d-2640-fe0f",25,9],"4":["1f477-1f3fe-200d-2640-fe0f",25,10],"5":["1f477-1f3ff-200d-2640-fe0f",25,11]}},{"u":"1fac5","c":"People \u0026 Body","o":349,"x":56,"y":10,"s":"person_with_crown","n":"persoon met kroon","k":"person with crown|persoon met kroon|edele|heerser|iemand van koninklijken bloede|keizer|koning|koninklijk|persoon|regaal|crown|monarch|noble|person|regal|royal|royalty","t":{"1":["1fac5-1f3fb",56,11],"2":["1fac5-1f3fc",56,12],"3":["1fac5-1f3fd",56,13],"4":["1fac5-1f3fe",56,14],"5":["1fac5-1f3ff",56,15]}},{"u":"1f934","c":"People \u0026 Body","o":350,"x":41,"y":46,"s":"prince","n":"prins","k":"prince|prins|fantasie|koning|koninklijk|kroon|royalty|sprookje|crown|fairy|fairytale|fantasy|king|royal|tale","t":{"1":["1f934-1f3fb",41,47],"2":["1f934-1f3fc",41,48],"3":["1f934-1f3fd",41,49],"4":["1f934-1f3fe",41,50],"5":["1f934-1f3ff",41,51]}},{"u":"1f478","c":"People \u0026 Body","o":351,"x":25,"y":24,"s":"princess","n":"prinses","k":"princess|prinses|fantasie|koningin|kroon|persoon|sprookje|vrouw met kroon|crown|fairy|fairytale|fantasy|queen|royal|royalty|tale","t":{"1":["1f478-1f3fb",25,25],"2":["1f478-1f3fc",25,26],"3":["1f478-1f3fd",25,27],"4":["1f478-1f3fe",25,28],"5":["1f478-1f3ff",25,29]}},{"u":"1f473-200d-2642-fe0f","c":"People \u0026 Body","o":353,"x":24,"y":38,"s":"man-wearing-turban","n":"man met tulband","k":"man-wearing-turban|man wearing turban|man met tulband|man|tulband|turban|wearing","t":{"1":["1f473-1f3fb-200d-2642-fe0f",24,39],"2":["1f473-1f3fc-200d-2642-fe0f",24,40],"3":["1f473-1f3fd-200d-2642-fe0f",24,41],"4":["1f473-1f3fe-200d-2642-fe0f",24,42],"5":["1f473-1f3ff-200d-2642-fe0f",24,43]}},{"u":"1f473-200d-2640-fe0f","c":"People \u0026 Body","o":354,"x":24,"y":32,"s":"woman-wearing-turban","n":"vrouw met tulband","k":"woman-wearing-turban|woman wearing turban|vrouw met tulband|dragen|tulband|vrouw|turban|wearing|woman","t":{"1":["1f473-1f3fb-200d-2640-fe0f",24,33],"2":["1f473-1f3fc-200d-2640-fe0f",24,34],"3":["1f473-1f3fd-200d-2640-fe0f",24,35],"4":["1f473-1f3fe-200d-2640-fe0f",24,36],"5":["1f473-1f3ff-200d-2640-fe0f",24,37]}},{"u":"1f472","c":"People \u0026 Body","o":355,"x":24,"y":26,"s":"man_with_gua_pi_mao","n":"man met Chinees petje","k":"man with gua pi mao|man met chinees petje|gua pi mao|hoed|man|man met chinese hoed|persoon|petje|person with skullcap|cap|chinese|gua|guapi|hat|mao|person|pi|skullcap","t":{"1":["1f472-1f3fb",24,27],"2":["1f472-1f3fc",24,28],"3":["1f472-1f3fd",24,29],"4":["1f472-1f3fe",24,30],"5":["1f472-1f3ff",24,31]}},{"u":"1f9d5","c":"People \u0026 Body","o":356,"x":51,"y":48,"s":"person_with_headscarf","n":"vrouw met hoofddoek","k":"person with headscarf|vrouw met hoofddoek|hidjab|hijab|hoofddoek|mantilla|persoon|sluier|woman with headscarf|bandana|head|headscarf|kerchief|tichel|woman","t":{"1":["1f9d5-1f3fb",51,49],"2":["1f9d5-1f3fc",51,50],"3":["1f9d5-1f3fd",51,51],"4":["1f9d5-1f3fe",51,52],"5":["1f9d5-1f3ff",51,53]}},{"u":"1f935","c":"People \u0026 Body","o":357,"x":42,"y":2,"s":"person_in_tuxedo","n":"persoon in smoking","k":"person in tuxedo|man in tuxedo|persoon in smoking|bruiloft|formeel|persoon|smoking|formal|person|tuxedo|wedding","t":{"1":["1f935-1f3fb",42,3],"2":["1f935-1f3fc",42,4],"3":["1f935-1f3fd",42,5],"4":["1f935-1f3fe",42,6],"5":["1f935-1f3ff",42,7]}},{"u":"1f935-200d-2642-fe0f","c":"People \u0026 Body","o":358,"x":41,"y":58,"s":"man_in_tuxedo","n":"man in smoking","k":"man in tuxedo|man in smoking|man|smoking|formal|groom|tuxedo|wedding","t":{"1":["1f935-1f3fb-200d-2642-fe0f",41,59],"2":["1f935-1f3fc-200d-2642-fe0f",41,60],"3":["1f935-1f3fd-200d-2642-fe0f",41,61],"4":["1f935-1f3fe-200d-2642-fe0f",42,0],"5":["1f935-1f3ff-200d-2642-fe0f",42,1]}},{"u":"1f935-200d-2640-fe0f","c":"People \u0026 Body","o":359,"x":41,"y":52,"s":"woman_in_tuxedo","n":"vrouw in smoking","k":"woman in tuxedo|vrouw in smoking|smoking|vrouw|formal|tuxedo|wedding|woman","t":{"1":["1f935-1f3fb-200d-2640-fe0f",41,53],"2":["1f935-1f3fc-200d-2640-fe0f",41,54],"3":["1f935-1f3fd-200d-2640-fe0f",41,55],"4":["1f935-1f3fe-200d-2640-fe0f",41,56],"5":["1f935-1f3ff-200d-2640-fe0f",41,57]}},{"u":"1f470","c":"People \u0026 Body","o":360,"x":24,"y":2,"s":"bride_with_veil","n":"persoon met sluier","k":"bride with veil|persoon met sluier|bruiloft|persoon|sluier|person with veil|person|veil|wedding","t":{"1":["1f470-1f3fb",24,3],"2":["1f470-1f3fc",24,4],"3":["1f470-1f3fd",24,5],"4":["1f470-1f3fe",24,6],"5":["1f470-1f3ff",24,7]}},{"u":"1f470-200d-2642-fe0f","c":"People \u0026 Body","o":361,"x":23,"y":58,"s":"man_with_veil","n":"man met sluier","k":"man with veil|man met sluier|man|sluier|veil|wedding","t":{"1":["1f470-1f3fb-200d-2642-fe0f",23,59],"2":["1f470-1f3fc-200d-2642-fe0f",23,60],"3":["1f470-1f3fd-200d-2642-fe0f",23,61],"4":["1f470-1f3fe-200d-2642-fe0f",24,0],"5":["1f470-1f3ff-200d-2642-fe0f",24,1]}},{"u":"1f470-200d-2640-fe0f","c":"People \u0026 Body","o":362,"x":23,"y":52,"s":"woman_with_veil","n":"vrouw met sluier","k":"woman with veil|vrouw met sluier|sluier|vrouw|bride|veil|wedding|woman","t":{"1":["1f470-1f3fb-200d-2640-fe0f",23,53],"2":["1f470-1f3fc-200d-2640-fe0f",23,54],"3":["1f470-1f3fd-200d-2640-fe0f",23,55],"4":["1f470-1f3fe-200d-2640-fe0f",23,56],"5":["1f470-1f3ff-200d-2640-fe0f",23,57]}},{"u":"1f930","c":"People \u0026 Body","o":363,"x":41,"y":22,"s":"pregnant_woman","n":"zwangere vrouw","k":"pregnant woman|zwangere vrouw|vrouw|zwanger|pregnant|woman","t":{"1":["1f930-1f3fb",41,23],"2":["1f930-1f3fc",41,24],"3":["1f930-1f3fd",41,25],"4":["1f930-1f3fe",41,26],"5":["1f930-1f3ff",41,27]}},{"u":"1fac3","c":"People \u0026 Body","o":364,"x":55,"y":60,"s":"pregnant_man","n":"zwangere man","k":"pregnant man|zwangere man|buik|man|opgeblazen|te veel eten|vol|zwanger|belly|bloated|full|overeat|pregnant","t":{"1":["1fac3-1f3fb",55,61],"2":["1fac3-1f3fc",56,0],"3":["1fac3-1f3fd",56,1],"4":["1fac3-1f3fe",56,2],"5":["1fac3-1f3ff",56,3]}},{"u":"1fac4","c":"People \u0026 Body","o":365,"x":56,"y":4,"s":"pregnant_person","n":"zwanger persoon","k":"pregnant person|zwanger persoon|baby|buik|opgeblazen|persoon|vol|zwanger|belly|bloated|full|overeat|person|pregnant|stuffed","t":{"1":["1fac4-1f3fb",56,5],"2":["1fac4-1f3fc",56,6],"3":["1fac4-1f3fd",56,7],"4":["1fac4-1f3fe",56,8],"5":["1fac4-1f3ff",56,9]}},{"u":"1f931","c":"People \u0026 Body","o":366,"x":41,"y":28,"s":"breast-feeding","n":"borstvoeding","k":"breast-feeding|borstvoeding|baby|borst|de borst geven|persoon|breast|feeding|mom|mother|nursing|woman","t":{"1":["1f931-1f3fb",41,29],"2":["1f931-1f3fc",41,30],"3":["1f931-1f3fd",41,31],"4":["1f931-1f3fe",41,32],"5":["1f931-1f3ff",41,33]}},{"u":"1f469-200d-1f37c","c":"People \u0026 Body","o":367,"x":17,"y":54,"s":"woman_feeding_baby","n":"vrouw die een baby voedt","k":"woman feeding baby|vrouw die een baby voedt|baby|borstvoeding|mama|moeder|oppas|pasgeboren|voeden|voeding|vrouw|feed|feeding|mom|mother|nanny|newborn|nursing|woman","t":{"1":["1f469-1f3fb-200d-1f37c",17,55],"2":["1f469-1f3fc-200d-1f37c",17,56],"3":["1f469-1f3fd-200d-1f37c",17,57],"4":["1f469-1f3fe-200d-1f37c",17,58],"5":["1f469-1f3ff-200d-1f37c",17,59]}},{"u":"1f468-200d-1f37c","c":"People \u0026 Body","o":368,"x":14,"y":5,"s":"man_feeding_baby","n":"man die een baby voedt","k":"man feeding baby|man die een baby voedt|baby|borstvoeding|man|melk|papa|persoon|vader|voeden|voeding|dad|father|feed|feeding|nanny|newborn|nursing","t":{"1":["1f468-1f3fb-200d-1f37c",14,6],"2":["1f468-1f3fc-200d-1f37c",14,7],"3":["1f468-1f3fd-200d-1f37c",14,8],"4":["1f468-1f3fe-200d-1f37c",14,9],"5":["1f468-1f3ff-200d-1f37c",14,10]}},{"u":"1f9d1-200d-1f37c","c":"People \u0026 Body","o":369,"x":48,"y":12,"s":"person_feeding_baby","n":"persoon die een baby voedt","k":"person feeding baby|persoon die een baby voedt|baby|borstvoeding|oppas|ouder|pasgeboren|voeden|voeding|feed|feeding|nanny|newborn|nursing|parent","t":{"1":["1f9d1-1f3fb-200d-1f37c",48,13],"2":["1f9d1-1f3fc-200d-1f37c",48,14],"3":["1f9d1-1f3fd-200d-1f37c",48,15],"4":["1f9d1-1f3fe-200d-1f37c",48,16],"5":["1f9d1-1f3ff-200d-1f37c",48,17]}},{"u":"1f47c","c":"People \u0026 Body","o":370,"x":25,"y":33,"s":"angel","n":"baby-engel","k":"angel|baby angel|baby-engel|baby|engel|fantasie|gezicht|kerk|sprookje|church|face|fairy|fairytale|fantasy|tale","t":{"1":["1f47c-1f3fb",25,34],"2":["1f47c-1f3fc",25,35],"3":["1f47c-1f3fd",25,36],"4":["1f47c-1f3fe",25,37],"5":["1f47c-1f3ff",25,38]}},{"u":"1f385","c":"People \u0026 Body","o":371,"x":7,"y":3,"s":"santa","n":"kerstman","k":"santa|father christmas|kerstman|fantasie|feestdag|kerst|kerstmis|viering|vrolijk|santa claus|celebration|christmas|claus|fairy|fantasy|father|holiday|merry|tale|xmas","t":{"1":["1f385-1f3fb",7,4],"2":["1f385-1f3fc",7,5],"3":["1f385-1f3fd",7,6],"4":["1f385-1f3fe",7,7],"5":["1f385-1f3ff",7,8]}},{"u":"1f936","c":"People \u0026 Body","o":372,"x":42,"y":8,"s":"mrs_claus","n":"kerstvrouw","k":"mrs claus|mother christmas|kerstvrouw|feest|kerst|kerstmis|moedertje kerst|persoon|viering|mrs. claus|celebration|christmas|claus|fairy|fantasy|holiday|merry|mother|mrs|santa|tale|xmas","t":{"1":["1f936-1f3fb",42,9],"2":["1f936-1f3fc",42,10],"3":["1f936-1f3fd",42,11],"4":["1f936-1f3fe",42,12],"5":["1f936-1f3ff",42,13]}},{"u":"1f9d1-200d-1f384","c":"People \u0026 Body","o":373,"x":48,"y":18,"s":"mx_claus","n":"kersttransgender","k":"mx claus|kersttransgender|feestdagen|kerst|kerstdagen|kerstman|kerstmis|kerstmuts|kerstvrouw|persoon|celebration|christmas|claus|fairy|fantasy|holiday|merry|mx|santa|tale|xmas","t":{"1":["1f9d1-1f3fb-200d-1f384",48,19],"2":["1f9d1-1f3fc-200d-1f384",48,20],"3":["1f9d1-1f3fd-200d-1f384",48,21],"4":["1f9d1-1f3fe-200d-1f384",48,22],"5":["1f9d1-1f3ff-200d-1f384",48,23]}},{"u":"1f9b8","c":"People \u0026 Body","o":374,"x":46,"y":3,"s":"superhero","n":"superheld","k":"superhero|superheld|goed|held|superkracht|good|hero|superpower","t":{"1":["1f9b8-1f3fb",46,4],"2":["1f9b8-1f3fc",46,5],"3":["1f9b8-1f3fd",46,6],"4":["1f9b8-1f3fe",46,7],"5":["1f9b8-1f3ff",46,8]}},{"u":"1f9b8-200d-2642-fe0f","c":"People \u0026 Body","o":375,"x":45,"y":59,"s":"male_superhero","n":"mannelijke superheld","k":"male superhero|man superhero|mannelijke superheld|goed|held|man|superkrachten|good|hero|superhero|superpower","t":{"1":["1f9b8-1f3fb-200d-2642-fe0f",45,60],"2":["1f9b8-1f3fc-200d-2642-fe0f",45,61],"3":["1f9b8-1f3fd-200d-2642-fe0f",46,0],"4":["1f9b8-1f3fe-200d-2642-fe0f",46,1],"5":["1f9b8-1f3ff-200d-2642-fe0f",46,2]}},{"u":"1f9b8-200d-2640-fe0f","c":"People \u0026 Body","o":376,"x":45,"y":53,"s":"female_superhero","n":"vrouwelijke superheld","k":"female superhero|woman superhero|vrouwelijke superheld|goed|held|heldin|superkrachten|vrouw|good|hero|heroine|superhero|superpower|woman","t":{"1":["1f9b8-1f3fb-200d-2640-fe0f",45,54],"2":["1f9b8-1f3fc-200d-2640-fe0f",45,55],"3":["1f9b8-1f3fd-200d-2640-fe0f",45,56],"4":["1f9b8-1f3fe-200d-2640-fe0f",45,57],"5":["1f9b8-1f3ff-200d-2640-fe0f",45,58]}},{"u":"1f9b9","c":"People \u0026 Body","o":377,"x":46,"y":21,"s":"supervillain","n":"superschurk","k":"supervillain|superschurk|crimineel|kwaad|schurk|slecht|superkracht|bad|criminal|evil|superpower|villain","t":{"1":["1f9b9-1f3fb",46,22],"2":["1f9b9-1f3fc",46,23],"3":["1f9b9-1f3fd",46,24],"4":["1f9b9-1f3fe",46,25],"5":["1f9b9-1f3ff",46,26]}},{"u":"1f9b9-200d-2642-fe0f","c":"People \u0026 Body","o":378,"x":46,"y":15,"s":"male_supervillain","n":"mannelijke superschurk","k":"male supervillain|man supervillain|mannelijke superschurk|boef|crimineel|man|slecht|superkrachten|bad|criminal|evil|superpower|supervillain|villain","t":{"1":["1f9b9-1f3fb-200d-2642-fe0f",46,16],"2":["1f9b9-1f3fc-200d-2642-fe0f",46,17],"3":["1f9b9-1f3fd-200d-2642-fe0f",46,18],"4":["1f9b9-1f3fe-200d-2642-fe0f",46,19],"5":["1f9b9-1f3ff-200d-2642-fe0f",46,20]}},{"u":"1f9b9-200d-2640-fe0f","c":"People \u0026 Body","o":379,"x":46,"y":9,"s":"female_supervillain","n":"vrouwelijke superschurk","k":"female supervillain|woman supervillain|vrouwelijke superschurk|boef|crimineel|slecht|superkrachten|vrouw|bad|criminal|evil|superpower|supervillain|villain|woman","t":{"1":["1f9b9-1f3fb-200d-2640-fe0f",46,10],"2":["1f9b9-1f3fc-200d-2640-fe0f",46,11],"3":["1f9b9-1f3fd-200d-2640-fe0f",46,12],"4":["1f9b9-1f3fe-200d-2640-fe0f",46,13],"5":["1f9b9-1f3ff-200d-2640-fe0f",46,14]}},{"u":"1f9d9-200d-2642-fe0f","c":"People \u0026 Body","o":381,"x":52,"y":52,"s":"male_mage","n":"mannelijke magiër","k":"male mage|man mage|mannelijke magiër|heksenmeester|tovenaar|fantasy|mage|magic|man|play|sorcerer|sorceress|sorcery|spell|summon|witch|wizard","t":{"1":["1f9d9-1f3fb-200d-2642-fe0f",52,53],"2":["1f9d9-1f3fc-200d-2642-fe0f",52,54],"3":["1f9d9-1f3fd-200d-2642-fe0f",52,55],"4":["1f9d9-1f3fe-200d-2642-fe0f",52,56],"5":["1f9d9-1f3ff-200d-2642-fe0f",52,57]}},{"u":"1f9d9-200d-2640-fe0f","c":"People \u0026 Body","o":382,"x":52,"y":46,"s":"female_mage","n":"vrouwelijke magiër","k":"female mage|woman mage|vrouwelijke magiër|heks|tovenares|fantasy|mage|magic|play|sorcerer|sorceress|sorcery|spell|summon|witch|wizard|woman","t":{"1":["1f9d9-1f3fb-200d-2640-fe0f",52,47],"2":["1f9d9-1f3fc-200d-2640-fe0f",52,48],"3":["1f9d9-1f3fd-200d-2640-fe0f",52,49],"4":["1f9d9-1f3fe-200d-2640-fe0f",52,50],"5":["1f9d9-1f3ff-200d-2640-fe0f",52,51]}},{"u":"1f9da-200d-2642-fe0f","c":"People \u0026 Body","o":384,"x":53,"y":8,"s":"male_fairy","n":"mannelijk elfje","k":"male fairy|man fairy|mannelijk elfje|oberon|puck|fairy|fairytale|fantasy|man|myth|person|pixie|tale|wings","t":{"1":["1f9da-1f3fb-200d-2642-fe0f",53,9],"2":["1f9da-1f3fc-200d-2642-fe0f",53,10],"3":["1f9da-1f3fd-200d-2642-fe0f",53,11],"4":["1f9da-1f3fe-200d-2642-fe0f",53,12],"5":["1f9da-1f3ff-200d-2642-fe0f",53,13]}},{"u":"1f9da-200d-2640-fe0f","c":"People \u0026 Body","o":385,"x":53,"y":2,"s":"female_fairy","n":"vrouwelijk elfje","k":"female fairy|woman fairy|vrouwelijk elfje|titania|fairy|fairytale|fantasy|myth|person|pixie|tale|wings|woman","t":{"1":["1f9da-1f3fb-200d-2640-fe0f",53,3],"2":["1f9da-1f3fc-200d-2640-fe0f",53,4],"3":["1f9da-1f3fd-200d-2640-fe0f",53,5],"4":["1f9da-1f3fe-200d-2640-fe0f",53,6],"5":["1f9da-1f3ff-200d-2640-fe0f",53,7]}},{"u":"1f9db-200d-2642-fe0f","c":"People \u0026 Body","o":387,"x":53,"y":26,"s":"male_vampire","n":"mannelijke vampier","k":"male vampire|man vampire|mannelijke vampier|dracula|ondode|blood|fangs|halloween|man|scary|supernatural|teeth|undead|vampire","t":{"1":["1f9db-1f3fb-200d-2642-fe0f",53,27],"2":["1f9db-1f3fc-200d-2642-fe0f",53,28],"3":["1f9db-1f3fd-200d-2642-fe0f",53,29],"4":["1f9db-1f3fe-200d-2642-fe0f",53,30],"5":["1f9db-1f3ff-200d-2642-fe0f",53,31]}},{"u":"1f9db-200d-2640-fe0f","c":"People \u0026 Body","o":388,"x":53,"y":20,"s":"female_vampire","n":"vrouwelijke vampier","k":"female vampire|woman vampire|vrouwelijke vampier|ondode|blood|fangs|halloween|scary|supernatural|teeth|undead|vampire|woman","t":{"1":["1f9db-1f3fb-200d-2640-fe0f",53,21],"2":["1f9db-1f3fc-200d-2640-fe0f",53,22],"3":["1f9db-1f3fd-200d-2640-fe0f",53,23],"4":["1f9db-1f3fe-200d-2640-fe0f",53,24],"5":["1f9db-1f3ff-200d-2640-fe0f",53,25]}},{"u":"1f9dc-200d-2642-fe0f","c":"People \u0026 Body","o":390,"x":53,"y":44,"s":"merman","n":"zeemeerman","k":"merman|zeemeerman|triton|creature|fairytale|folklore|neptune|ocean|poseidon|sea|siren|trident","t":{"1":["1f9dc-1f3fb-200d-2642-fe0f",53,45],"2":["1f9dc-1f3fc-200d-2642-fe0f",53,46],"3":["1f9dc-1f3fd-200d-2642-fe0f",53,47],"4":["1f9dc-1f3fe-200d-2642-fe0f",53,48],"5":["1f9dc-1f3ff-200d-2642-fe0f",53,49]}},{"u":"1f9dc-200d-2640-fe0f","c":"People \u0026 Body","o":391,"x":53,"y":38,"s":"mermaid","n":"sirene","k":"mermaid|sirene|meermin|creature|fairytale|folklore|merwoman|ocean|sea|siren|trident","t":{"1":["1f9dc-1f3fb-200d-2640-fe0f",53,39],"2":["1f9dc-1f3fc-200d-2640-fe0f",53,40],"3":["1f9dc-1f3fd-200d-2640-fe0f",53,41],"4":["1f9dc-1f3fe-200d-2640-fe0f",53,42],"5":["1f9dc-1f3ff-200d-2640-fe0f",53,43]}},{"u":"1f9dd-200d-2642-fe0f","c":"People \u0026 Body","o":393,"x":54,"y":0,"s":"male_elf","n":"mannelijke elf","k":"male elf|man elf|mannelijke elf|magisch|elf|elves|enchantment|fantasy|folklore|magic|magical|man|myth","t":{"1":["1f9dd-1f3fb-200d-2642-fe0f",54,1],"2":["1f9dd-1f3fc-200d-2642-fe0f",54,2],"3":["1f9dd-1f3fd-200d-2642-fe0f",54,3],"4":["1f9dd-1f3fe-200d-2642-fe0f",54,4],"5":["1f9dd-1f3ff-200d-2642-fe0f",54,5]}},{"u":"1f9dd-200d-2640-fe0f","c":"People \u0026 Body","o":394,"x":53,"y":56,"s":"female_elf","n":"vrouwelijke elf","k":"female elf|woman elf|vrouwelijke elf|magisch|elf|elves|enchantment|fantasy|folklore|magic|magical|myth|woman","t":{"1":["1f9dd-1f3fb-200d-2640-fe0f",53,57],"2":["1f9dd-1f3fc-200d-2640-fe0f",53,58],"3":["1f9dd-1f3fd-200d-2640-fe0f",53,59],"4":["1f9dd-1f3fe-200d-2640-fe0f",53,60],"5":["1f9dd-1f3ff-200d-2640-fe0f",53,61]}},{"u":"1f9de-200d-2642-fe0f","c":"People \u0026 Body","o":396,"x":54,"y":13,"s":"male_genie","n":"mannelijke geest in de fles","k":"male genie|man genie|mannelijke geest in de fles|djinn|fantasy|genie|jinn|lamp|man|myth|rub|wishes"},{"u":"1f9de-200d-2640-fe0f","c":"People \u0026 Body","o":397,"x":54,"y":12,"s":"female_genie","n":"vrouwelijke geest in de fles","k":"female genie|woman genie|vrouwelijke geest in de fles|djinn|fantasy|genie|jinn|lamp|myth|rub|wishes|woman"},{"u":"1f9df-200d-2642-fe0f","c":"People \u0026 Body","o":399,"x":54,"y":16,"s":"male_zombie","n":"mannelijke zombie","k":"male zombie|man zombie|mannelijke zombie|lopende dode|ondode|apocalypse|dead|halloween|horror|man|scary|undead|walking|zombie"},{"u":"1f9df-200d-2640-fe0f","c":"People \u0026 Body","o":400,"x":54,"y":15,"s":"female_zombie","n":"vrouwelijke zombie","k":"female zombie|woman zombie|vrouwelijke zombie|lopende dode|ondode|apocalypse|dead|halloween|horror|scary|undead|walking|woman|zombie"},{"u":"1f9cc","c":"People \u0026 Body","o":401,"x":46,"y":50,"s":"troll","n":"trol","k":"troll|trol|fantasie|monster|trollen|fairy|fantasy|tale|trolling"},{"u":"1f486-200d-2642-fe0f","c":"People \u0026 Body","o":403,"x":26,"y":36,"s":"man-getting-massage","n":"man die hoofdmassage krijgt","k":"man-getting-massage|man getting massage|man die hoofdmassage krijgt|geduld|gezicht|gezichtmassage|man|man krijgt gezichtsmassage|massage|masseren|ontspannen|ontspannend|persoon|relaxen|relaxing|face|getting|headache|relax|salon|soothe|spa|tension|therapy|treatment","t":{"1":["1f486-1f3fb-200d-2642-fe0f",26,37],"2":["1f486-1f3fc-200d-2642-fe0f",26,38],"3":["1f486-1f3fd-200d-2642-fe0f",26,39],"4":["1f486-1f3fe-200d-2642-fe0f",26,40],"5":["1f486-1f3ff-200d-2642-fe0f",26,41]}},{"u":"1f486-200d-2640-fe0f","c":"People \u0026 Body","o":404,"x":26,"y":30,"s":"woman-getting-massage","n":"vrouw die hoofdmassage krijgt","k":"woman-getting-massage|woman getting massage|vrouw die hoofdmassage krijgt|gezicht|massage|vrouw|face|getting|headache|relax|relaxing|salon|soothe|spa|tension|therapy|treatment|woman","t":{"1":["1f486-1f3fb-200d-2640-fe0f",26,31],"2":["1f486-1f3fc-200d-2640-fe0f",26,32],"3":["1f486-1f3fd-200d-2640-fe0f",26,33],"4":["1f486-1f3fe-200d-2640-fe0f",26,34],"5":["1f486-1f3ff-200d-2640-fe0f",26,35]}},{"u":"1f487-200d-2642-fe0f","c":"People \u0026 Body","o":406,"x":26,"y":54,"s":"man-getting-haircut","n":"man die wordt geknipt","k":"man-getting-haircut|man getting haircut|man die wordt geknipt|haar|kapper|kapsel|knippen|man|man wordt geknipt|persoon|verzorging|barber|beauty|chop|cosmetology|cut|groom|hair|haircut|parlor|person|shears|style","t":{"1":["1f487-1f3fb-200d-2642-fe0f",26,55],"2":["1f487-1f3fc-200d-2642-fe0f",26,56],"3":["1f487-1f3fd-200d-2642-fe0f",26,57],"4":["1f487-1f3fe-200d-2642-fe0f",26,58],"5":["1f487-1f3ff-200d-2642-fe0f",26,59]}},{"u":"1f487-200d-2640-fe0f","c":"People \u0026 Body","o":407,"x":26,"y":48,"s":"woman-getting-haircut","n":"vrouw die wordt geknipt","k":"woman-getting-haircut|woman getting haircut|vrouw die wordt geknipt|kapsel|vrouw|barber|beauty|chop|cosmetology|cut|groom|hair|haircut|parlor|person|shears|style|woman","t":{"1":["1f487-1f3fb-200d-2640-fe0f",26,49],"2":["1f487-1f3fc-200d-2640-fe0f",26,50],"3":["1f487-1f3fd-200d-2640-fe0f",26,51],"4":["1f487-1f3fe-200d-2640-fe0f",26,52],"5":["1f487-1f3ff-200d-2640-fe0f",26,53]}},{"u":"1f6b6-200d-2642-fe0f","c":"People \u0026 Body","o":409,"x":37,"y":50,"s":"man-walking","n":"wandelende man","k":"man-walking|man walking|wandelende man|lopen|man|wandelen|amble|gait|hike|pace|pedestrian|stride|stroll|walk|walking","t":{"1":["1f6b6-1f3fb-200d-2642-fe0f",37,51],"2":["1f6b6-1f3fc-200d-2642-fe0f",37,52],"3":["1f6b6-1f3fd-200d-2642-fe0f",37,53],"4":["1f6b6-1f3fe-200d-2642-fe0f",37,54],"5":["1f6b6-1f3ff-200d-2642-fe0f",37,55]}},{"u":"1f6b6-200d-2640-fe0f","c":"People \u0026 Body","o":410,"x":37,"y":38,"s":"woman-walking","n":"wandelende vrouw","k":"woman-walking|woman walking|wandelende vrouw|kuieren|lopen|persoon|slenteren|voetganger|vrouw|wandelaar|wandelen|amble|gait|hike|man|pace|pedestrian|stride|stroll|walk|walking|woman","t":{"1":["1f6b6-1f3fb-200d-2640-fe0f",37,39],"2":["1f6b6-1f3fc-200d-2640-fe0f",37,40],"3":["1f6b6-1f3fd-200d-2640-fe0f",37,41],"4":["1f6b6-1f3fe-200d-2640-fe0f",37,42],"5":["1f6b6-1f3ff-200d-2640-fe0f",37,43]}},{"u":"1f9cd","c":"People \u0026 Body","o":414,"x":47,"y":1,"s":"standing_person","n":"staande persoon","k":"standing person|staande persoon|persoon|staan|staand|person standing|person|stand|standing","t":{"1":["1f9cd-1f3fb",47,2],"2":["1f9cd-1f3fc",47,3],"3":["1f9cd-1f3fd",47,4],"4":["1f9cd-1f3fe",47,5],"5":["1f9cd-1f3ff",47,6]}},{"u":"1f9cd-200d-2642-fe0f","c":"People \u0026 Body","o":415,"x":46,"y":57,"s":"man_standing","n":"staande man","k":"man standing|staande man|man|staand|stand|standing","t":{"1":["1f9cd-1f3fb-200d-2642-fe0f",46,58],"2":["1f9cd-1f3fc-200d-2642-fe0f",46,59],"3":["1f9cd-1f3fd-200d-2642-fe0f",46,60],"4":["1f9cd-1f3fe-200d-2642-fe0f",46,61],"5":["1f9cd-1f3ff-200d-2642-fe0f",47,0]}},{"u":"1f9cd-200d-2640-fe0f","c":"People \u0026 Body","o":416,"x":46,"y":51,"s":"woman_standing","n":"staande vrouw","k":"woman standing|staande vrouw|staand|vrouw|stand|standing|woman","t":{"1":["1f9cd-1f3fb-200d-2640-fe0f",46,52],"2":["1f9cd-1f3fc-200d-2640-fe0f",46,53],"3":["1f9cd-1f3fd-200d-2640-fe0f",46,54],"4":["1f9cd-1f3fe-200d-2640-fe0f",46,55],"5":["1f9cd-1f3ff-200d-2640-fe0f",46,56]}},{"u":"1f9ce","c":"People \u0026 Body","o":417,"x":47,"y":37,"s":"kneeling_person","n":"knielende persoon","k":"kneeling person|knielende persoon|knieën|knielen|knielend|persoon|person kneeling|kneel|kneeling|knees|person","t":{"1":["1f9ce-1f3fb",47,38],"2":["1f9ce-1f3fc",47,39],"3":["1f9ce-1f3fd",47,40],"4":["1f9ce-1f3fe",47,41],"5":["1f9ce-1f3ff",47,42]}},{"u":"1f9ce-200d-2642-fe0f","c":"People \u0026 Body","o":418,"x":47,"y":19,"s":"man_kneeling","n":"knielende man","k":"man kneeling|knielende man|knielend|man|kneel|kneeling|knees","t":{"1":["1f9ce-1f3fb-200d-2642-fe0f",47,20],"2":["1f9ce-1f3fc-200d-2642-fe0f",47,21],"3":["1f9ce-1f3fd-200d-2642-fe0f",47,22],"4":["1f9ce-1f3fe-200d-2642-fe0f",47,23],"5":["1f9ce-1f3ff-200d-2642-fe0f",47,24]}},{"u":"1f9ce-200d-2640-fe0f","c":"People \u0026 Body","o":419,"x":47,"y":7,"s":"woman_kneeling","n":"knielende vrouw","k":"woman kneeling|knielende vrouw|knielend|vrouw|kneel|kneeling|knees|woman","t":{"1":["1f9ce-1f3fb-200d-2640-fe0f",47,8],"2":["1f9ce-1f3fc-200d-2640-fe0f",47,9],"3":["1f9ce-1f3fd-200d-2640-fe0f",47,10],"4":["1f9ce-1f3fe-200d-2640-fe0f",47,11],"5":["1f9ce-1f3ff-200d-2640-fe0f",47,12]}},{"u":"1f9d1-200d-1f9af","c":"People \u0026 Body","o":423,"x":49,"y":60,"s":"person_with_probing_cane","n":"persoon met taststok","k":"person with probing cane|person with white cane|persoon met taststok|blind|toegankelijkheid|accessibility|cane|person|probing|white","t":{"1":["1f9d1-1f3fb-200d-1f9af",49,61],"2":["1f9d1-1f3fc-200d-1f9af",50,0],"3":["1f9d1-1f3fd-200d-1f9af",50,1],"4":["1f9d1-1f3fe-200d-1f9af",50,2],"5":["1f9d1-1f3ff-200d-1f9af",50,3]}},{"u":"1f468-200d-1f9af","c":"People \u0026 Body","o":425,"x":15,"y":36,"s":"man_with_probing_cane","n":"man met taststok","k":"man with probing cane|man with white cane|man met taststok|blind|man|man met blindenstok|toegankelijkheid|accessibility|cane|probing|white","t":{"1":["1f468-1f3fb-200d-1f9af",15,37],"2":["1f468-1f3fc-200d-1f9af",15,38],"3":["1f468-1f3fd-200d-1f9af",15,39],"4":["1f468-1f3fe-200d-1f9af",15,40],"5":["1f468-1f3ff-200d-1f9af",15,41]}},{"u":"1f469-200d-1f9af","c":"People \u0026 Body","o":427,"x":19,"y":18,"s":"woman_with_probing_cane","n":"vrouw met taststok","k":"woman with probing cane|woman with white cane|vrouw met taststok|blind|toegankelijkheid|vrouw|vrouw met blindenstok|accessibility|cane|probing|white|woman","t":{"1":["1f469-1f3fb-200d-1f9af",19,19],"2":["1f469-1f3fc-200d-1f9af",19,20],"3":["1f469-1f3fd-200d-1f9af",19,21],"4":["1f469-1f3fe-200d-1f9af",19,22],"5":["1f469-1f3ff-200d-1f9af",19,23]}},{"u":"1f9d1-200d-1f9bc","c":"People \u0026 Body","o":429,"x":50,"y":34,"s":"person_in_motorized_wheelchair","n":"persoon in elektrische rolstoel","k":"person in motorized wheelchair|persoon in elektrische rolstoel|rolstoel|toegankelijkheid|accessibility|motorized|person|wheelchair","t":{"1":["1f9d1-1f3fb-200d-1f9bc",50,35],"2":["1f9d1-1f3fc-200d-1f9bc",50,36],"3":["1f9d1-1f3fd-200d-1f9bc",50,37],"4":["1f9d1-1f3fe-200d-1f9bc",50,38],"5":["1f9d1-1f3ff-200d-1f9bc",50,39]}},{"u":"1f468-200d-1f9bc","c":"People \u0026 Body","o":431,"x":16,"y":10,"s":"man_in_motorized_wheelchair","n":"man in elektrische rolstoel","k":"man in motorized wheelchair|man in elektrische rolstoel|elektrisch|man|rolstoel|toegankelijkheid|accessibility|motorized|wheelchair","t":{"1":["1f468-1f3fb-200d-1f9bc",16,11],"2":["1f468-1f3fc-200d-1f9bc",16,12],"3":["1f468-1f3fd-200d-1f9bc",16,13],"4":["1f468-1f3fe-200d-1f9bc",16,14],"5":["1f468-1f3ff-200d-1f9bc",16,15]}},{"u":"1f469-200d-1f9bc","c":"People \u0026 Body","o":433,"x":19,"y":54,"s":"woman_in_motorized_wheelchair","n":"vrouw in elektrische rolstoel","k":"woman in motorized wheelchair|vrouw in elektrische rolstoel|elektrisch|rolstoel|toegankelijkheid|vrouw|accessibility|motorized|wheelchair|woman","t":{"1":["1f469-1f3fb-200d-1f9bc",19,55],"2":["1f469-1f3fc-200d-1f9bc",19,56],"3":["1f469-1f3fd-200d-1f9bc",19,57],"4":["1f469-1f3fe-200d-1f9bc",19,58],"5":["1f469-1f3ff-200d-1f9bc",19,59]}},{"u":"1f9d1-200d-1f9bd","c":"People \u0026 Body","o":435,"x":50,"y":46,"s":"person_in_manual_wheelchair","n":"persoon in rolstoel","k":"person in manual wheelchair|persoon in rolstoel|rolstoel|toegankelijkheid|accessibility|manual|person|wheelchair","t":{"1":["1f9d1-1f3fb-200d-1f9bd",50,47],"2":["1f9d1-1f3fc-200d-1f9bd",50,48],"3":["1f9d1-1f3fd-200d-1f9bd",50,49],"4":["1f9d1-1f3fe-200d-1f9bd",50,50],"5":["1f9d1-1f3ff-200d-1f9bd",50,51]}},{"u":"1f468-200d-1f9bd","c":"People \u0026 Body","o":437,"x":16,"y":22,"s":"man_in_manual_wheelchair","n":"man in rolstoel","k":"man in manual wheelchair|man in rolstoel|handmatig|man|rolstoel|toegankelijkheid|accessibility|manual|wheelchair","t":{"1":["1f468-1f3fb-200d-1f9bd",16,23],"2":["1f468-1f3fc-200d-1f9bd",16,24],"3":["1f468-1f3fd-200d-1f9bd",16,25],"4":["1f468-1f3fe-200d-1f9bd",16,26],"5":["1f468-1f3ff-200d-1f9bd",16,27]}},{"u":"1f469-200d-1f9bd","c":"People \u0026 Body","o":439,"x":20,"y":4,"s":"woman_in_manual_wheelchair","n":"vrouw in rolstoel","k":"woman in manual wheelchair|vrouw in rolstoel|handmatig|rolstoel|toegankelijkheid|vrouw|accessibility|manual|wheelchair|woman","t":{"1":["1f469-1f3fb-200d-1f9bd",20,5],"2":["1f469-1f3fc-200d-1f9bd",20,6],"3":["1f469-1f3fd-200d-1f9bd",20,7],"4":["1f469-1f3fe-200d-1f9bd",20,8],"5":["1f469-1f3ff-200d-1f9bd",20,9]}},{"u":"1f3c3-200d-2642-fe0f","c":"People \u0026 Body","o":442,"x":8,"y":20,"s":"man-running","n":"rennende man","k":"man-running|man running|rennende man|hardlopen|man|marathon|rennen|fast|hurry|move|quick|race|racing|run|rush|speed","t":{"1":["1f3c3-1f3fb-200d-2642-fe0f",8,21],"2":["1f3c3-1f3fc-200d-2642-fe0f",8,22],"3":["1f3c3-1f3fd-200d-2642-fe0f",8,23],"4":["1f3c3-1f3fe-200d-2642-fe0f",8,24],"5":["1f3c3-1f3ff-200d-2642-fe0f",8,25]}},{"u":"1f3c3-200d-2640-fe0f","c":"People \u0026 Body","o":443,"x":8,"y":8,"s":"woman-running","n":"rennende vrouw","k":"woman-running|woman running|rennende vrouw|atleet|baan|beroep|haasten|hardlopen|kom eraan|marathon|persoon|rennen|snel|sport|vlug|vrouw|werk|fast|hurry|move|quick|race|racing|run|rush|speed|woman","t":{"1":["1f3c3-1f3fb-200d-2640-fe0f",8,9],"2":["1f3c3-1f3fc-200d-2640-fe0f",8,10],"3":["1f3c3-1f3fd-200d-2640-fe0f",8,11],"4":["1f3c3-1f3fe-200d-2640-fe0f",8,12],"5":["1f3c3-1f3ff-200d-2640-fe0f",8,13]}},{"u":"1f483","c":"People \u0026 Body","o":447,"x":26,"y":17,"s":"dancer","n":"dansende vrouw","k":"dancer|dansende vrouw|dansen|dansende vrouw met rode jurk|danseres|elegant|feest|flamenco|persoon|salsa|tango|vrouw|woman dancing|dance|dancing|festive|flair|groove|let’s|woman","t":{"1":["1f483-1f3fb",26,18],"2":["1f483-1f3fc",26,19],"3":["1f483-1f3fd",26,20],"4":["1f483-1f3fe",26,21],"5":["1f483-1f3ff",26,22]}},{"u":"1f57a","c":"People \u0026 Body","o":448,"x":31,"y":53,"s":"man_dancing","n":"dansende man","k":"man dancing|dansende man|dansen|disco|feest|festival|flamenco|man|persoon|salsa|tango|dance|dancer|dancing|elegant|festive|flair|groove|let’s","t":{"1":["1f57a-1f3fb",31,54],"2":["1f57a-1f3fc",31,55],"3":["1f57a-1f3fd",31,56],"4":["1f57a-1f3fe",31,57],"5":["1f57a-1f3ff",31,58]}},{"u":"1f574-fe0f","c":"People \u0026 Body","o":449,"x":31,"y":25,"s":"man_in_business_suit_levitating","n":"zwevende man in pak","k":"man in business suit levitating|person in suit levitating|zwevende man in pak|pak|persoon|zaken|zwevend|business|levitating|person|suit","t":{"1":["1f574-1f3fb",31,26],"2":["1f574-1f3fc",31,27],"3":["1f574-1f3fd",31,28],"4":["1f574-1f3fe",31,29],"5":["1f574-1f3ff",31,30]}},{"u":"1f46f-200d-2642-fe0f","c":"People \u0026 Body","o":451,"x":23,"y":50,"s":"men-with-bunny-ears-partying","n":"mannen met konijnenoren","k":"men-with-bunny-ears-partying|man-with-bunny-ears-partying|men with bunny ears|mannen met konijnenoren|beste vrienden|bff|dansen|danser|feesten|feestende mannen|konijnenoor|konijnenoren|mannen|twee dansers|bestie|bunny|counterpart|dancer|double|ear|identical|men|pair|party|partying|people|soulmate|twin|twinsies"},{"u":"1f46f-200d-2640-fe0f","c":"People \u0026 Body","o":452,"x":23,"y":49,"s":"women-with-bunny-ears-partying","n":"vrouwen met konijnenoren","k":"women-with-bunny-ears-partying|woman-with-bunny-ears-partying|women with bunny ears|vrouwen met konijnenoren|danseres|feesten|konijnenoor|vrouwen|bestie|bff|bunny|counterpart|dancer|double|ear|identical|pair|party|partying|people|soulmate|twin|twinsies|women"},{"u":"1f9d6-200d-2642-fe0f","c":"People \u0026 Body","o":454,"x":51,"y":60,"s":"man_in_steamy_room","n":"man in ruimte vol stoom","k":"man in steamy room|man in ruimte vol stoom|sauna|stoomruimte|day|luxurious|man|pamper|relax|room|spa|steam|steambath|unwind","t":{"1":["1f9d6-1f3fb-200d-2642-fe0f",51,61],"2":["1f9d6-1f3fc-200d-2642-fe0f",52,0],"3":["1f9d6-1f3fd-200d-2642-fe0f",52,1],"4":["1f9d6-1f3fe-200d-2642-fe0f",52,2],"5":["1f9d6-1f3ff-200d-2642-fe0f",52,3]}},{"u":"1f9d6-200d-2640-fe0f","c":"People \u0026 Body","o":455,"x":51,"y":54,"s":"woman_in_steamy_room","n":"vrouw in ruimte vol stoom","k":"woman in steamy room|vrouw in ruimte vol stoom|sauna|stoomruimte|day|luxurious|pamper|relax|room|spa|steam|steambath|unwind|woman","t":{"1":["1f9d6-1f3fb-200d-2640-fe0f",51,55],"2":["1f9d6-1f3fc-200d-2640-fe0f",51,56],"3":["1f9d6-1f3fd-200d-2640-fe0f",51,57],"4":["1f9d6-1f3fe-200d-2640-fe0f",51,58],"5":["1f9d6-1f3ff-200d-2640-fe0f",51,59]}},{"u":"1f9d7-200d-2642-fe0f","c":"People \u0026 Body","o":457,"x":52,"y":16,"s":"man_climbing","n":"klimmende man","k":"man climbing|klimmende man|klimmer|climb|climber|climbing|man|mountain|rock|scale|up","t":{"1":["1f9d7-1f3fb-200d-2642-fe0f",52,17],"2":["1f9d7-1f3fc-200d-2642-fe0f",52,18],"3":["1f9d7-1f3fd-200d-2642-fe0f",52,19],"4":["1f9d7-1f3fe-200d-2642-fe0f",52,20],"5":["1f9d7-1f3ff-200d-2642-fe0f",52,21]}},{"u":"1f9d7-200d-2640-fe0f","c":"People \u0026 Body","o":458,"x":52,"y":10,"s":"woman_climbing","n":"klimmende vrouw","k":"woman climbing|klimmende vrouw|klimmer|climb|climber|climbing|mountain|rock|scale|up|woman","t":{"1":["1f9d7-1f3fb-200d-2640-fe0f",52,11],"2":["1f9d7-1f3fc-200d-2640-fe0f",52,12],"3":["1f9d7-1f3fd-200d-2640-fe0f",52,13],"4":["1f9d7-1f3fe-200d-2640-fe0f",52,14],"5":["1f9d7-1f3ff-200d-2640-fe0f",52,15]}},{"u":"1f93a","c":"People \u0026 Body","o":459,"x":43,"y":6,"s":"fencer","n":"schermer","k":"fencer|schermer|degen|persoon|schermen|person fencing|fencing|person|sword"},{"u":"1f3c7","c":"People \u0026 Body","o":460,"x":9,"y":2,"s":"horse_racing","n":"jockey op renpaard","k":"horse racing|jockey op renpaard|jockey|paard|paardrijden|racen|renpaard|sport|horse|racehorse|racing|riding","t":{"1":["1f3c7-1f3fb",9,3],"2":["1f3c7-1f3fc",9,4],"3":["1f3c7-1f3fd",9,5],"4":["1f3c7-1f3fe",9,6],"5":["1f3c7-1f3ff",9,7]}},{"u":"26f7-fe0f","c":"People \u0026 Body","o":461,"x":59,"y":30,"s":"skier","n":"skiër","k":"skier|skiër|ski|sneeuw|snow"},{"u":"1f3c2","c":"People \u0026 Body","o":462,"x":8,"y":2,"s":"snowboarder","n":"snowboarder","k":"snowboarder|ski|sneeuw|snowboard|sport|snow","t":{"1":["1f3c2-1f3fb",8,3],"2":["1f3c2-1f3fc",8,4],"3":["1f3c2-1f3fd",8,5],"4":["1f3c2-1f3fe",8,6],"5":["1f3c2-1f3ff",8,7]}},{"u":"1f3cc-fe0f-200d-2642-fe0f","c":"People \u0026 Body","o":464,"x":9,"y":52,"s":"man-golfing","n":"golfende man","k":"man-golfing|man golfing|golfende man|golfen|man|ball|birdie|caddy|driving|golf|golfing|green|pga|putt|range|tee","t":{"1":["1f3cc-1f3fb-200d-2642-fe0f",9,53],"2":["1f3cc-1f3fc-200d-2642-fe0f",9,54],"3":["1f3cc-1f3fd-200d-2642-fe0f",9,55],"4":["1f3cc-1f3fe-200d-2642-fe0f",9,56],"5":["1f3cc-1f3ff-200d-2642-fe0f",9,57]}},{"u":"1f3cc-fe0f-200d-2640-fe0f","c":"People \u0026 Body","o":465,"x":9,"y":46,"s":"woman-golfing","n":"golfende vrouw","k":"woman-golfing|woman golfing|golfende vrouw|bal|drivingrange|golfen|sport|vrouw|ball|birdie|caddy|driving|golf|golfing|green|pga|putt|range|tee|woman","t":{"1":["1f3cc-1f3fb-200d-2640-fe0f",9,47],"2":["1f3cc-1f3fc-200d-2640-fe0f",9,48],"3":["1f3cc-1f3fd-200d-2640-fe0f",9,49],"4":["1f3cc-1f3fe-200d-2640-fe0f",9,50],"5":["1f3cc-1f3ff-200d-2640-fe0f",9,51]}},{"u":"1f3c4-200d-2642-fe0f","c":"People \u0026 Body","o":467,"x":8,"y":50,"s":"man-surfing","n":"mannelijke surfer","k":"man-surfing|man surfing|mannelijke surfer|man|surfen|beach|ocean|sport|surf|surfer|surfing|swell|waves","t":{"1":["1f3c4-1f3fb-200d-2642-fe0f",8,51],"2":["1f3c4-1f3fc-200d-2642-fe0f",8,52],"3":["1f3c4-1f3fd-200d-2642-fe0f",8,53],"4":["1f3c4-1f3fe-200d-2642-fe0f",8,54],"5":["1f3c4-1f3ff-200d-2642-fe0f",8,55]}},{"u":"1f3c4-200d-2640-fe0f","c":"People \u0026 Body","o":468,"x":8,"y":44,"s":"woman-surfing","n":"vrouwelijke surfer","k":"woman-surfing|woman surfing|vrouwelijke surfer|golven|sport|surfen|surfende vrouw|vrouw|beach|ocean|person|surf|surfer|surfing|swell|waves","t":{"1":["1f3c4-1f3fb-200d-2640-fe0f",8,45],"2":["1f3c4-1f3fc-200d-2640-fe0f",8,46],"3":["1f3c4-1f3fd-200d-2640-fe0f",8,47],"4":["1f3c4-1f3fe-200d-2640-fe0f",8,48],"5":["1f3c4-1f3ff-200d-2640-fe0f",8,49]}},{"u":"1f6a3-200d-2642-fe0f","c":"People \u0026 Body","o":470,"x":36,"y":36,"s":"man-rowing-boat","n":"man in roeiboot","k":"man-rowing-boat|man rowing boat|man in roeiboot|boot|man|roeiboot|boat|canoe|cruise|fishing|lake|oar|paddle|raft|river|row|rowboat|rowing","t":{"1":["1f6a3-1f3fb-200d-2642-fe0f",36,37],"2":["1f6a3-1f3fc-200d-2642-fe0f",36,38],"3":["1f6a3-1f3fd-200d-2642-fe0f",36,39],"4":["1f6a3-1f3fe-200d-2642-fe0f",36,40],"5":["1f6a3-1f3ff-200d-2642-fe0f",36,41]}},{"u":"1f6a3-200d-2640-fe0f","c":"People \u0026 Body","o":471,"x":36,"y":30,"s":"woman-rowing-boat","n":"vrouw in roeiboot","k":"woman-rowing-boat|woman rowing boat|vrouw in roeiboot|boot|cruise|kano|meer|peddel|rivier|roeiboot|roeien|roeispaan|vissen|vlot|vrouw|boat|canoe|fishing|lake|oar|paddle|raft|river|row|rowboat|rowing|woman","t":{"1":["1f6a3-1f3fb-200d-2640-fe0f",36,31],"2":["1f6a3-1f3fc-200d-2640-fe0f",36,32],"3":["1f6a3-1f3fd-200d-2640-fe0f",36,33],"4":["1f6a3-1f3fe-200d-2640-fe0f",36,34],"5":["1f6a3-1f3ff-200d-2640-fe0f",36,35]}},{"u":"1f3ca-200d-2642-fe0f","c":"People \u0026 Body","o":473,"x":9,"y":16,"s":"man-swimming","n":"zwemmende man","k":"man-swimming|man swimming|zwemmende man|man|zwemmen|freestyle|sport|swim|swimmer|swimming|triathlon","t":{"1":["1f3ca-1f3fb-200d-2642-fe0f",9,17],"2":["1f3ca-1f3fc-200d-2642-fe0f",9,18],"3":["1f3ca-1f3fd-200d-2642-fe0f",9,19],"4":["1f3ca-1f3fe-200d-2642-fe0f",9,20],"5":["1f3ca-1f3ff-200d-2642-fe0f",9,21]}},{"u":"1f3ca-200d-2640-fe0f","c":"People \u0026 Body","o":474,"x":9,"y":10,"s":"woman-swimming","n":"zwemmende vrouw","k":"woman-swimming|woman swimming|zwemmende vrouw|sport|vrouw|zwemmen|zwemster|freestyle|man|swim|swimmer|swimming|triathlon","t":{"1":["1f3ca-1f3fb-200d-2640-fe0f",9,11],"2":["1f3ca-1f3fc-200d-2640-fe0f",9,12],"3":["1f3ca-1f3fd-200d-2640-fe0f",9,13],"4":["1f3ca-1f3fe-200d-2640-fe0f",9,14],"5":["1f3ca-1f3ff-200d-2640-fe0f",9,15]}},{"u":"26f9-fe0f-200d-2642-fe0f","c":"People \u0026 Body","o":476,"x":59,"y":38,"s":"man-bouncing-ball","n":"basketballer","k":"man-bouncing-ball|man bouncing ball|basketballer|bal|man|athletic|ball|basketball|bouncing|championship|dribble|net|player|throw","t":{"1":["26f9-1f3fb-200d-2642-fe0f",59,39],"2":["26f9-1f3fc-200d-2642-fe0f",59,40],"3":["26f9-1f3fd-200d-2642-fe0f",59,41],"4":["26f9-1f3fe-200d-2642-fe0f",59,42],"5":["26f9-1f3ff-200d-2642-fe0f",59,43]}},{"u":"26f9-fe0f-200d-2640-fe0f","c":"People \u0026 Body","o":477,"x":59,"y":32,"s":"woman-bouncing-ball","n":"basketbalster","k":"woman-bouncing-ball|woman bouncing ball|basketbalster|bal|basketbal|sport|vrouw|vrouw met bal|athletic|ball|basketball|bouncing|championship|dribble|net|player|throw|woman","t":{"1":["26f9-1f3fb-200d-2640-fe0f",59,33],"2":["26f9-1f3fc-200d-2640-fe0f",59,34],"3":["26f9-1f3fd-200d-2640-fe0f",59,35],"4":["26f9-1f3fe-200d-2640-fe0f",59,36],"5":["26f9-1f3ff-200d-2640-fe0f",59,37]}},{"u":"1f3cb-fe0f-200d-2642-fe0f","c":"People \u0026 Body","o":479,"x":9,"y":34,"s":"man-lifting-weights","n":"mannelijke gewichtheffer","k":"man-lifting-weights|man lifting weights|mannelijke gewichtheffer|gewichtheffen|man|barbell|bodybuilder|deadlift|lifter|lifting|powerlifting|weight|weightlifter|weights|workout","t":{"1":["1f3cb-1f3fb-200d-2642-fe0f",9,35],"2":["1f3cb-1f3fc-200d-2642-fe0f",9,36],"3":["1f3cb-1f3fd-200d-2642-fe0f",9,37],"4":["1f3cb-1f3fe-200d-2642-fe0f",9,38],"5":["1f3cb-1f3ff-200d-2642-fe0f",9,39]}},{"u":"1f3cb-fe0f-200d-2640-fe0f","c":"People \u0026 Body","o":480,"x":9,"y":28,"s":"woman-lifting-weights","n":"vrouwelijke gewichtheffer","k":"woman-lifting-weights|woman lifting weights|vrouwelijke gewichtheffer|gewichtheffen|gewichtheffende vrouw|sport|vrouw|barbell|bodybuilder|deadlift|lifter|lifting|powerlifting|weight|weightlifter|weights|woman|workout","t":{"1":["1f3cb-1f3fb-200d-2640-fe0f",9,29],"2":["1f3cb-1f3fc-200d-2640-fe0f",9,30],"3":["1f3cb-1f3fd-200d-2640-fe0f",9,31],"4":["1f3cb-1f3fe-200d-2640-fe0f",9,32],"5":["1f3cb-1f3ff-200d-2640-fe0f",9,33]}},{"u":"1f6b4-200d-2642-fe0f","c":"People \u0026 Body","o":482,"x":37,"y":8,"s":"man-biking","n":"fietsende man","k":"man-biking|man biking|fietsende man|fiets|fietsen|man|wielrenner|bicycle|bicyclist|bike|biking|cycle|cyclist|riding|sport","t":{"1":["1f6b4-1f3fb-200d-2642-fe0f",37,9],"2":["1f6b4-1f3fc-200d-2642-fe0f",37,10],"3":["1f6b4-1f3fd-200d-2642-fe0f",37,11],"4":["1f6b4-1f3fe-200d-2642-fe0f",37,12],"5":["1f6b4-1f3ff-200d-2642-fe0f",37,13]}},{"u":"1f6b4-200d-2640-fe0f","c":"People \u0026 Body","o":483,"x":37,"y":2,"s":"woman-biking","n":"fietsende vrouw","k":"woman-biking|woman biking|fietsende vrouw|fiets|fietsen|fietster|sport|vrouw|wielrennen|bicycle|bicyclist|bike|biking|cycle|cyclist|riding|woman","t":{"1":["1f6b4-1f3fb-200d-2640-fe0f",37,3],"2":["1f6b4-1f3fc-200d-2640-fe0f",37,4],"3":["1f6b4-1f3fd-200d-2640-fe0f",37,5],"4":["1f6b4-1f3fe-200d-2640-fe0f",37,6],"5":["1f6b4-1f3ff-200d-2640-fe0f",37,7]}},{"u":"1f6b5-200d-2642-fe0f","c":"People \u0026 Body","o":485,"x":37,"y":26,"s":"man-mountain-biking","n":"man op mountainbike","k":"man-mountain-biking|man mountain biking|man op mountainbike|berg|fiets|fietsen|fietser|man|bicycle|bicyclist|bike|biking|cycle|cyclist|mountain|riding|sport","t":{"1":["1f6b5-1f3fb-200d-2642-fe0f",37,27],"2":["1f6b5-1f3fc-200d-2642-fe0f",37,28],"3":["1f6b5-1f3fd-200d-2642-fe0f",37,29],"4":["1f6b5-1f3fe-200d-2642-fe0f",37,30],"5":["1f6b5-1f3ff-200d-2642-fe0f",37,31]}},{"u":"1f6b5-200d-2640-fe0f","c":"People \u0026 Body","o":486,"x":37,"y":20,"s":"woman-mountain-biking","n":"vrouw op mountainbike","k":"woman-mountain-biking|woman mountain biking|vrouw op mountainbike|berg|fiets|fietsen|fietster|mountainbiken|sport|vrouw|bicycle|bicyclist|bike|biking|cycle|cyclist|mountain|riding|woman","t":{"1":["1f6b5-1f3fb-200d-2640-fe0f",37,21],"2":["1f6b5-1f3fc-200d-2640-fe0f",37,22],"3":["1f6b5-1f3fd-200d-2640-fe0f",37,23],"4":["1f6b5-1f3fe-200d-2640-fe0f",37,24],"5":["1f6b5-1f3ff-200d-2640-fe0f",37,25]}},{"u":"1f938","c":"People \u0026 Body","o":487,"x":42,"y":44,"s":"person_doing_cartwheel","n":"persoon die een radslag doet","k":"person doing cartwheel|persoon die een radslag doet|blij|buiten|gymnastiek|olympische spelen|persoon|radslag|sport|turnen|person cartwheeling|active|cartwheel|cartwheeling|excited|flip|gymnastics|happy|person|somersault","t":{"1":["1f938-1f3fb",42,45],"2":["1f938-1f3fc",42,46],"3":["1f938-1f3fd",42,47],"4":["1f938-1f3fe",42,48],"5":["1f938-1f3ff",42,49]}},{"u":"1f938-200d-2642-fe0f","c":"People \u0026 Body","o":488,"x":42,"y":38,"s":"man-cartwheeling","n":"man die een radslag doet","k":"man-cartwheeling|man cartwheeling|man die een radslag doet|blij|gymnastiek|lenig|man|man doet radslag|persoon|radslag|sport|turnen|turner|active|cartwheel|cartwheeling|excited|flip|gymnastics|happy|somersault","t":{"1":["1f938-1f3fb-200d-2642-fe0f",42,39],"2":["1f938-1f3fc-200d-2642-fe0f",42,40],"3":["1f938-1f3fd-200d-2642-fe0f",42,41],"4":["1f938-1f3fe-200d-2642-fe0f",42,42],"5":["1f938-1f3ff-200d-2642-fe0f",42,43]}},{"u":"1f938-200d-2640-fe0f","c":"People \u0026 Body","o":489,"x":42,"y":32,"s":"woman-cartwheeling","n":"vrouw die een radslag doet","k":"woman-cartwheeling|woman cartwheeling|vrouw die een radslag doet|blij|gymnastiek|lenig|persoon|radslag|sport|turnen|turnster|vrouw|vrouw doet radslag|active|cartwheel|cartwheeling|excited|flip|gymnastics|happy|somersault|woman","t":{"1":["1f938-1f3fb-200d-2640-fe0f",42,33],"2":["1f938-1f3fc-200d-2640-fe0f",42,34],"3":["1f938-1f3fd-200d-2640-fe0f",42,35],"4":["1f938-1f3fe-200d-2640-fe0f",42,36],"5":["1f938-1f3ff-200d-2640-fe0f",42,37]}},{"u":"1f93c","c":"People \u0026 Body","o":490,"x":43,"y":9,"s":"wrestlers","n":"personen die worstelen","k":"wrestlers|personen die worstelen|duel|olympische spelen|sport|toernooi|worstelaar|worstelen|people wrestling|combat|grapple|people|ring|tournament|wrestle|wrestling"},{"u":"1f93c-200d-2642-fe0f","c":"People \u0026 Body","o":491,"x":43,"y":8,"s":"man-wrestling","n":"worstelende mannen","k":"man-wrestling|men wrestling|worstelende mannen|mannen|persoon|sport|strijd|toernooi|worstelaars|worstelen|combat|duel|grapple|men|ring|tournament|wrestle|wrestling"},{"u":"1f93c-200d-2640-fe0f","c":"People \u0026 Body","o":492,"x":43,"y":7,"s":"woman-wrestling","n":"worstelende vrouwen","k":"woman-wrestling|women wrestling|worstelende vrouwen|olympische spelen|persoon|sport|strijd|toernooi|vechten|vrouwen|worstelen|combat|duel|grapple|ring|tournament|women|wrestle|wrestling"},{"u":"1f93d","c":"People \u0026 Body","o":493,"x":43,"y":22,"s":"water_polo","n":"persoon die waterpolo speelt","k":"water polo|persoon die waterpolo speelt|persoon|polo|spelen|sport|water|waterpolo|zwemmen|person playing water polo|person|playing|swimming","t":{"1":["1f93d-1f3fb",43,23],"2":["1f93d-1f3fc",43,24],"3":["1f93d-1f3fd",43,25],"4":["1f93d-1f3fe",43,26],"5":["1f93d-1f3ff",43,27]}},{"u":"1f93d-200d-2642-fe0f","c":"People \u0026 Body","o":494,"x":43,"y":16,"s":"man-playing-water-polo","n":"man die waterpolo speelt","k":"man-playing-water-polo|man playing water polo|man die waterpolo speelt|man|polo|spelen|sport|water|waterpolo|zwemmen|playing|swimming","t":{"1":["1f93d-1f3fb-200d-2642-fe0f",43,17],"2":["1f93d-1f3fc-200d-2642-fe0f",43,18],"3":["1f93d-1f3fd-200d-2642-fe0f",43,19],"4":["1f93d-1f3fe-200d-2642-fe0f",43,20],"5":["1f93d-1f3ff-200d-2642-fe0f",43,21]}},{"u":"1f93d-200d-2640-fe0f","c":"People \u0026 Body","o":495,"x":43,"y":10,"s":"woman-playing-water-polo","n":"vrouw die waterpolo speelt","k":"woman-playing-water-polo|woman playing water polo|vrouw die waterpolo speelt|polo|spelen|sport|vrouw|water|waterpolo|zwemmen|playing|swimming|woman","t":{"1":["1f93d-1f3fb-200d-2640-fe0f",43,11],"2":["1f93d-1f3fc-200d-2640-fe0f",43,12],"3":["1f93d-1f3fd-200d-2640-fe0f",43,13],"4":["1f93d-1f3fe-200d-2640-fe0f",43,14],"5":["1f93d-1f3ff-200d-2640-fe0f",43,15]}},{"u":"1f93e","c":"People \u0026 Body","o":496,"x":43,"y":40,"s":"handball","n":"persoon die handbal speelt","k":"handball|persoon die handbal speelt|bal|gooien|handbal|sport|springen|worp|person playing handball|athletics|ball|catch|chuck|hurl|lob|person|pitch|playing|throw|toss","t":{"1":["1f93e-1f3fb",43,41],"2":["1f93e-1f3fc",43,42],"3":["1f93e-1f3fd",43,43],"4":["1f93e-1f3fe",43,44],"5":["1f93e-1f3ff",43,45]}},{"u":"1f93e-200d-2642-fe0f","c":"People \u0026 Body","o":497,"x":43,"y":34,"s":"man-playing-handball","n":"man die handbal speelt","k":"man-playing-handball|man playing handball|man die handbal speelt|handballen|handballende man|handballer|man|sport|athletics|ball|catch|chuck|handball|hurl|lob|pitch|playing|throw|toss","t":{"1":["1f93e-1f3fb-200d-2642-fe0f",43,35],"2":["1f93e-1f3fc-200d-2642-fe0f",43,36],"3":["1f93e-1f3fd-200d-2642-fe0f",43,37],"4":["1f93e-1f3fe-200d-2642-fe0f",43,38],"5":["1f93e-1f3ff-200d-2642-fe0f",43,39]}},{"u":"1f93e-200d-2640-fe0f","c":"People \u0026 Body","o":498,"x":43,"y":28,"s":"woman-playing-handball","n":"vrouw die handbal speelt","k":"woman-playing-handball|woman playing handball|vrouw die handbal speelt|bal|gooien|handballen|handballende vrouw|sport|springen|vrouw|worp|athletics|ball|catch|chuck|handball|hurl|lob|pitch|playing|throw|toss|woman","t":{"1":["1f93e-1f3fb-200d-2640-fe0f",43,29],"2":["1f93e-1f3fc-200d-2640-fe0f",43,30],"3":["1f93e-1f3fd-200d-2640-fe0f",43,31],"4":["1f93e-1f3fe-200d-2640-fe0f",43,32],"5":["1f93e-1f3ff-200d-2640-fe0f",43,33]}},{"u":"1f939","c":"People \u0026 Body","o":499,"x":43,"y":0,"s":"juggling","n":"persoon die jongleert","k":"juggling|persoon die jongleert|balanceren|balans|beheren|hanteren|jongleren|multitasken|nummer|persoon|vaardigheid|person juggling|act|balance|balancing|handle|juggle|manage|multitask|person|skill","t":{"1":["1f939-1f3fb",43,1],"2":["1f939-1f3fc",43,2],"3":["1f939-1f3fd",43,3],"4":["1f939-1f3fe",43,4],"5":["1f939-1f3ff",43,5]}},{"u":"1f939-200d-2642-fe0f","c":"People \u0026 Body","o":500,"x":42,"y":56,"s":"man-juggling","n":"man die jongleert","k":"man-juggling|man juggling|man die jongleert|ballen|goochelaar|jongleren|jonglerende man|jongleur|man|multitasken|vaardigheid|act|balance|balancing|handle|juggle|juggling|manage|multitask|skill","t":{"1":["1f939-1f3fb-200d-2642-fe0f",42,57],"2":["1f939-1f3fc-200d-2642-fe0f",42,58],"3":["1f939-1f3fd-200d-2642-fe0f",42,59],"4":["1f939-1f3fe-200d-2642-fe0f",42,60],"5":["1f939-1f3ff-200d-2642-fe0f",42,61]}},{"u":"1f939-200d-2640-fe0f","c":"People \u0026 Body","o":501,"x":42,"y":50,"s":"woman-juggling","n":"vrouw die jongleert","k":"woman-juggling|woman juggling|vrouw die jongleert|jongleren|jonglerende vrouw|multitasken|vrouw|act|balance|balancing|handle|juggle|juggling|manage|multitask|skill|woman","t":{"1":["1f939-1f3fb-200d-2640-fe0f",42,51],"2":["1f939-1f3fc-200d-2640-fe0f",42,52],"3":["1f939-1f3fd-200d-2640-fe0f",42,53],"4":["1f939-1f3fe-200d-2640-fe0f",42,54],"5":["1f939-1f3ff-200d-2640-fe0f",42,55]}},{"u":"1f9d8-200d-2642-fe0f","c":"People \u0026 Body","o":503,"x":52,"y":34,"s":"man_in_lotus_position","n":"man in lotushouding","k":"man in lotus position|man in lotushouding|meditatie|yoga|cross|legged|legs|lotus|man|meditation|peace|position|relax|serenity|yogi|zen","t":{"1":["1f9d8-1f3fb-200d-2642-fe0f",52,35],"2":["1f9d8-1f3fc-200d-2642-fe0f",52,36],"3":["1f9d8-1f3fd-200d-2642-fe0f",52,37],"4":["1f9d8-1f3fe-200d-2642-fe0f",52,38],"5":["1f9d8-1f3ff-200d-2642-fe0f",52,39]}},{"u":"1f9d8-200d-2640-fe0f","c":"People \u0026 Body","o":504,"x":52,"y":28,"s":"woman_in_lotus_position","n":"vrouw in lotushouding","k":"woman in lotus position|vrouw in lotushouding|meditatie|yoga|cross|legged|legs|lotus|meditation|peace|position|relax|serenity|woman|yogi|zen","t":{"1":["1f9d8-1f3fb-200d-2640-fe0f",52,29],"2":["1f9d8-1f3fc-200d-2640-fe0f",52,30],"3":["1f9d8-1f3fd-200d-2640-fe0f",52,31],"4":["1f9d8-1f3fe-200d-2640-fe0f",52,32],"5":["1f9d8-1f3ff-200d-2640-fe0f",52,33]}},{"u":"1f6c0","c":"People \u0026 Body","o":505,"x":38,"y":21,"s":"bath","n":"persoon in badkuip","k":"bath|persoon in badkuip|bad|badkuip|badkuip met douche|persoon in bad|person taking bath|bathtub|person|taking|tub","t":{"1":["1f6c0-1f3fb",38,22],"2":["1f6c0-1f3fc",38,23],"3":["1f6c0-1f3fd",38,24],"4":["1f6c0-1f3fe",38,25],"5":["1f6c0-1f3ff",38,26]}},{"u":"1f6cc","c":"People \u0026 Body","o":506,"x":38,"y":33,"s":"sleeping_accommodation","n":"persoon in bed","k":"sleeping accommodation|persoon in bed|bed|deken|dutje|goedenacht|hotel|moe|slaap|slaapwel|slapen|vermoeid|welterusten|zzz|person in bed|bedtime|good|goodnight|nap|night|person|sleep|tired","t":{"1":["1f6cc-1f3fb",38,34],"2":["1f6cc-1f3fc",38,35],"3":["1f6cc-1f3fd",38,36],"4":["1f6cc-1f3fe",38,37],"5":["1f6cc-1f3ff",38,38]}},{"u":"1f9d1-200d-1f91d-200d-1f9d1","c":"People \u0026 Body","o":507,"x":49,"y":28,"s":"people_holding_hands","n":"personen hand in hand","k":"people holding hands|personen hand in hand|hand|hand in hand|handen vasthouden|koppeltje|paar|persoon|samen|stel|vasthouden|bae|bestie|bff|couple|dating|flirt|friends|hold|people|twins","t":{"1":["1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb",49,29],"2":["1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc",49,35],"3":["1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd",49,41],"4":["1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe",49,47],"5":["1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff",49,53]}},{"u":"1f46d","c":"People \u0026 Body","o":508,"x":23,"y":5,"s":"two_women_holding_hands","n":"vrouwen hand in hand","k":"two women holding hands|women holding hands|vrouwen hand in hand|beste vrienden|bff|daten|flirten|hand|meisjes|paar|schatje|tweeling|vasthouden|vrienden|vrouwen|zussen|bae|bestie|couple|dating|flirt|friends|girls|hold|sisters|twins|women","t":{"1":["1f46d-1f3fb",23,6],"2":["1f46d-1f3fc",23,7],"3":["1f46d-1f3fd",23,8],"4":["1f46d-1f3fe",23,9],"5":["1f46d-1f3ff",23,10]}},{"u":"1f46b","c":"People \u0026 Body","o":509,"x":22,"y":15,"s":"man_and_woman_holding_hands","n":"man en vrouw hand in hand","k":"man and woman holding hands|woman and man holding hands|couple|man en vrouw hand in hand|afspraakje|bae|date|flirten|hand|hand in hand|koppel|man|stel|vasthouden|verliefd|vrienden|vrouw|bestie|bff|dating|flirt|friends|hold|twins|woman","t":{"1":["1f46b-1f3fb",22,16],"2":["1f46b-1f3fc",22,17],"3":["1f46b-1f3fd",22,18],"4":["1f46b-1f3fe",22,19],"5":["1f46b-1f3ff",22,20]}},{"u":"1f46c","c":"People \u0026 Body","o":510,"x":22,"y":41,"s":"two_men_holding_hands","n":"mannen hand in hand","k":"two men holding hands|men holding hands|mannen hand in hand|beste vrienden|bff|broers|daten|flirten|hand|jongens|mannen|paar|schatje|tweeling|vasthouden|vrienden|bae|bestie|boys|brothers|couple|dating|flirt|friends|hold|men|twins","t":{"1":["1f46c-1f3fb",22,42],"2":["1f46c-1f3fc",22,43],"3":["1f46c-1f3fd",22,44],"4":["1f46c-1f3fe",22,45],"5":["1f46c-1f3ff",22,46]}},{"u":"1f48f","c":"People \u0026 Body","o":511,"x":27,"y":11,"s":"couplekiss","n":"kus","k":"couplekiss|kiss|kus|afspraakje|date|kussen|liefde|personen|romantiek|stel|stelletje|verliefd|anniversary|babe|bae|couple|dating|heart|love|mwah|person|romance|together|xoxo","t":{"1":["1f48f-1f3fb",27,12],"2":["1f48f-1f3fc",27,13],"3":["1f48f-1f3fd",27,14],"4":["1f48f-1f3fe",27,15],"5":["1f48f-1f3ff",27,16]}},{"u":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f468","c":"People \u0026 Body","o":512,"x":21,"y":18,"s":"woman-kiss-man","n":"kus: vrouw, man","k":"woman-kiss-man|kiss: woman, man|kus: vrouw, man|afspraakje|date|kus|kussen|liefde|man|personen|romantiek|stel|stelletje|verliefd|vrouw|anniversary|babe|bae|couple|dating|heart|kiss|love|mwah|person|romance|together|woman|xoxo","t":{"1":["1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",21,19],"2":["1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",21,25],"3":["1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",21,31],"4":["1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",21,37],"5":["1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff",21,43]}},{"u":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468","c":"People \u0026 Body","o":513,"x":17,"y":10,"s":"man-kiss-man","n":"kus: man, man","k":"man-kiss-man|kiss: man, man|kus: man, man|afspraakje|date|kus|kussen|liefde|man|personen|romantiek|stel|stelletje|verliefd|anniversary|babe|bae|couple|dating|heart|kiss|love|mwah|person|romance|together|xoxo","t":{"1":["1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",17,11],"2":["1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",17,17],"3":["1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",17,23],"4":["1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",17,29],"5":["1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff",17,35]}},{"u":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469","c":"People \u0026 Body","o":514,"x":21,"y":44,"s":"woman-kiss-woman","n":"kus: vrouw, vrouw","k":"woman-kiss-woman|kiss: woman, woman|kus: vrouw, vrouw|afspraakje|date|kus|kussen|liefde|personen|romantiek|stel|stelletje|verliefd|vrouw|anniversary|babe|bae|couple|dating|heart|kiss|love|mwah|person|romance|together|woman|xoxo","t":{"1":["1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb",21,45],"2":["1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc",21,51],"3":["1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd",21,57],"4":["1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe",22,1],"5":["1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff",22,7]}},{"u":"1f491","c":"People \u0026 Body","o":515,"x":27,"y":38,"s":"couple_with_heart","n":"stel met hart","k":"couple with heart|stel met hart|hart|jubileum|liefde|personen|relatie|romantiek|stel|stelletje|stelletje met hart|verliefd|anniversary|babe|bae|couple|dating|heart|kiss|love|person|relationship|romance|together|you","t":{"1":["1f491-1f3fb",27,39],"2":["1f491-1f3fc",27,40],"3":["1f491-1f3fd",27,41],"4":["1f491-1f3fe",27,42],"5":["1f491-1f3ff",27,43]}},{"u":"1f469-200d-2764-fe0f-200d-1f468","c":"People \u0026 Body","o":516,"x":20,"y":28,"s":"woman-heart-man","n":"stel met hart: vrouw, man","k":"woman-heart-man|couple with heart: woman, man|stel met hart: vrouw, man|hart|jubileum|liefde|man|personen|relatie|romantiek|stel|stel met hart|stelletje|stelletje met hart|verliefd|vrouw|anniversary|babe|bae|couple|dating|heart|kiss|love|person|relationship|romance|together|woman|you","t":{"1":["1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb",20,29],"2":["1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc",20,35],"3":["1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd",20,41],"4":["1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe",20,47],"5":["1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff",20,53]}},{"u":"1f468-200d-2764-fe0f-200d-1f468","c":"People \u0026 Body","o":517,"x":16,"y":46,"s":"man-heart-man","n":"stel met hart: man, man","k":"man-heart-man|couple with heart: man, man|stel met hart: man, man|hart|jubileum|liefde|man|personen|relatie|romantiek|stel|stel met hart|stelletje|stelletje met hart|verliefd|anniversary|babe|bae|couple|dating|heart|kiss|love|person|relationship|romance|together|you","t":{"1":["1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb",16,47],"2":["1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc",16,53],"3":["1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd",16,59],"4":["1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe",17,3],"5":["1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff",17,9]}},{"u":"1f469-200d-2764-fe0f-200d-1f469","c":"People \u0026 Body","o":518,"x":20,"y":54,"s":"woman-heart-woman","n":"stel met hart: vrouw, vrouw","k":"woman-heart-woman|couple with heart: woman, woman|stel met hart: vrouw, vrouw|hart|jubileum|liefde|personen|relatie|romantiek|stel|stel met hart|stelletje|stelletje met hart|verliefd|vrouw|anniversary|babe|bae|couple|dating|heart|kiss|love|person|relationship|romance|together|woman|you","t":{"1":["1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb",20,55],"2":["1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc",20,61],"3":["1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd",21,5],"4":["1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe",21,11],"5":["1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff",21,17]}},{"u":"1f468-200d-1f469-200d-1f466","c":"People \u0026 Body","o":519,"x":14,"y":51,"s":"man-woman-boy","n":"gezin: man, vrouw, jongen","k":"man-woman-boy|family: man, woman, boy|gezin: man, vrouw, jongen|gezin|jongen|kind|man|vrouw|boy|child|family|woman"},{"u":"1f468-200d-1f469-200d-1f467","c":"People \u0026 Body","o":520,"x":14,"y":53,"s":"man-woman-girl","n":"gezin: man, vrouw, meisje","k":"man-woman-girl|family: man, woman, girl|gezin: man, vrouw, meisje|gezin|kind|man|meisje|vrouw|child|family|girl|woman"},{"u":"1f468-200d-1f469-200d-1f467-200d-1f466","c":"People \u0026 Body","o":521,"x":14,"y":54,"s":"man-woman-girl-boy","n":"gezin: man, vrouw, meisje, jongen","k":"man-woman-girl-boy|family: man, woman, girl, boy|gezin: man, vrouw, meisje, jongen|gezin|jongen|kind|man|meisje|vrouw|boy|child|family|girl|woman"},{"u":"1f468-200d-1f469-200d-1f466-200d-1f466","c":"People \u0026 Body","o":522,"x":14,"y":52,"s":"man-woman-boy-boy","n":"gezin: man, vrouw, jongen, jongen","k":"man-woman-boy-boy|family: man, woman, boy, boy|gezin: man, vrouw, jongen, jongen|gezin|jongen|kind|man|vrouw|boy|child|family|woman"},{"u":"1f468-200d-1f469-200d-1f467-200d-1f467","c":"People \u0026 Body","o":523,"x":14,"y":55,"s":"man-woman-girl-girl","n":"gezin: man, vrouw, meisje, meisje","k":"man-woman-girl-girl|family: man, woman, girl, girl|gezin: man, vrouw, meisje, meisje|gezin|kind|man|meisje|vrouw|child|family|girl|woman"},{"u":"1f468-200d-1f468-200d-1f466","c":"People \u0026 Body","o":524,"x":14,"y":46,"s":"man-man-boy","n":"gezin: man, man, jongen","k":"man-man-boy|family: man, man, boy|gezin: man, man, jongen|gezin|jongen|kind|man|boy|child|family"},{"u":"1f468-200d-1f468-200d-1f467","c":"People \u0026 Body","o":525,"x":14,"y":48,"s":"man-man-girl","n":"gezin: man, man, meisje","k":"man-man-girl|family: man, man, girl|gezin: man, man, meisje|gezin|kind|man|meisje|child|family|girl"},{"u":"1f468-200d-1f468-200d-1f467-200d-1f466","c":"People \u0026 Body","o":526,"x":14,"y":49,"s":"man-man-girl-boy","n":"gezin: man, man, meisje, jongen","k":"man-man-girl-boy|family: man, man, girl, boy|gezin: man, man, meisje, jongen|gezin|jongen|kind|man|meisje|boy|child|family|girl"},{"u":"1f468-200d-1f468-200d-1f466-200d-1f466","c":"People \u0026 Body","o":527,"x":14,"y":47,"s":"man-man-boy-boy","n":"gezin: man, man, jongen, jongen","k":"man-man-boy-boy|family: man, man, boy, boy|gezin: man, man, jongen, jongen|gezin|jongen|kind|man|boy|child|family"},{"u":"1f468-200d-1f468-200d-1f467-200d-1f467","c":"People \u0026 Body","o":528,"x":14,"y":50,"s":"man-man-girl-girl","n":"gezin: man, man, meisje, meisje","k":"man-man-girl-girl|family: man, man, girl, girl|gezin: man, man, meisje, meisje|gezin|kind|man|meisje|child|family|girl"},{"u":"1f469-200d-1f469-200d-1f466","c":"People \u0026 Body","o":529,"x":18,"y":33,"s":"woman-woman-boy","n":"gezin: vrouw, vrouw, jongen","k":"woman-woman-boy|family: woman, woman, boy|gezin: vrouw, vrouw, jongen|gezin|jongen|kind|vrouw|boy|child|family|woman"},{"u":"1f469-200d-1f469-200d-1f467","c":"People \u0026 Body","o":530,"x":18,"y":35,"s":"woman-woman-girl","n":"gezin: vrouw, vrouw, meisje","k":"woman-woman-girl|family: woman, woman, girl|gezin: vrouw, vrouw, meisje|gezin|kind|meisje|vrouw|child|family|girl|woman"},{"u":"1f469-200d-1f469-200d-1f467-200d-1f466","c":"People \u0026 Body","o":531,"x":18,"y":36,"s":"woman-woman-girl-boy","n":"gezin: vrouw, vrouw, meisje, jongen","k":"woman-woman-girl-boy|family: woman, woman, girl, boy|gezin: vrouw, vrouw, meisje, jongen|gezin|jongen|kind|meisje|vrouw|boy|child|family|girl|woman"},{"u":"1f469-200d-1f469-200d-1f466-200d-1f466","c":"People \u0026 Body","o":532,"x":18,"y":34,"s":"woman-woman-boy-boy","n":"gezin: vrouw, vrouw, jongen, jongen","k":"woman-woman-boy-boy|family: woman, woman, boy, boy|gezin: vrouw, vrouw, jongen, jongen|gezin|jongen|kind|vrouw|boy|child|family|woman"},{"u":"1f469-200d-1f469-200d-1f467-200d-1f467","c":"People \u0026 Body","o":533,"x":18,"y":37,"s":"woman-woman-girl-girl","n":"gezin: vrouw, vrouw, meisje, meisje","k":"woman-woman-girl-girl|family: woman, woman, girl, girl|gezin: vrouw, vrouw, meisje, meisje|gezin|kind|meisje|vrouw|child|family|girl|woman"},{"u":"1f468-200d-1f466","c":"People \u0026 Body","o":534,"x":14,"y":42,"s":"man-boy","n":"gezin: man, jongen","k":"man-boy|family: man, boy|gezin: man, jongen|gezin|jongen|kind|man|boy|child|family"},{"u":"1f468-200d-1f466-200d-1f466","c":"People \u0026 Body","o":535,"x":14,"y":41,"s":"man-boy-boy","n":"gezin: man, jongen, jongen","k":"man-boy-boy|family: man, boy, boy|gezin: man, jongen, jongen|gezin|jongen|kind|man|boy|child|family"},{"u":"1f468-200d-1f467","c":"People \u0026 Body","o":536,"x":14,"y":45,"s":"man-girl","n":"gezin: man, meisje","k":"man-girl|family: man, girl|gezin: man, meisje|gezin|kind|man|meisje|child|family|girl"},{"u":"1f468-200d-1f467-200d-1f466","c":"People \u0026 Body","o":537,"x":14,"y":43,"s":"man-girl-boy","n":"gezin: man, meisje, jongen","k":"man-girl-boy|family: man, girl, boy|gezin: man, meisje, jongen|gezin|jongen|kind|man|meisje|boy|child|family|girl"},{"u":"1f468-200d-1f467-200d-1f467","c":"People \u0026 Body","o":538,"x":14,"y":44,"s":"man-girl-girl","n":"gezin: man, meisje, meisje","k":"man-girl-girl|family: man, girl, girl|gezin: man, meisje, meisje|gezin|kind|man|meisje|child|family|girl"},{"u":"1f469-200d-1f466","c":"People \u0026 Body","o":539,"x":18,"y":29,"s":"woman-boy","n":"gezin: vrouw, jongen","k":"woman-boy|family: woman, boy|gezin: vrouw, jongen|gezin|jongen|kind|vrouw|boy|child|family|woman"},{"u":"1f469-200d-1f466-200d-1f466","c":"People \u0026 Body","o":540,"x":18,"y":28,"s":"woman-boy-boy","n":"gezin: vrouw, jongen, jongen","k":"woman-boy-boy|family: woman, boy, boy|gezin: vrouw, jongen, jongen|gezin|jongen|kind|vrouw|boy|child|family|woman"},{"u":"1f469-200d-1f467","c":"People \u0026 Body","o":541,"x":18,"y":32,"s":"woman-girl","n":"gezin: vrouw, meisje","k":"woman-girl|family: woman, girl|gezin: vrouw, meisje|gezin|kind|meisje|vrouw|child|family|girl|woman"},{"u":"1f469-200d-1f467-200d-1f466","c":"People \u0026 Body","o":542,"x":18,"y":30,"s":"woman-girl-boy","n":"gezin: vrouw, meisje, jongen","k":"woman-girl-boy|family: woman, girl, boy|gezin: vrouw, meisje, jongen|gezin|jongen|kind|meisje|vrouw|boy|child|family|girl|woman"},{"u":"1f469-200d-1f467-200d-1f467","c":"People \u0026 Body","o":543,"x":18,"y":31,"s":"woman-girl-girl","n":"gezin: vrouw, meisje, meisje","k":"woman-girl-girl|family: woman, girl, girl|gezin: vrouw, meisje, meisje|gezin|kind|meisje|vrouw|child|family|girl|woman"},{"u":"1f5e3-fe0f","c":"People \u0026 Body","o":544,"x":32,"y":36,"s":"speaking_head_in_silhouette","n":"silhouet van sprekend hoofd","k":"speaking head in silhouette|speaking head|silhouet van sprekend hoofd|gezicht|hoofd|silhouet|spreek|spreken|face|head|silhouette|speak|speaking"},{"u":"1f464","c":"People \u0026 Body","o":545,"x":13,"y":41,"s":"bust_in_silhouette","n":"silhouet van persoon","k":"bust in silhouette|silhouet van persoon|buste|mysterieus|schaduw|silhouet|bust|mysterious|shadow|silhouette"},{"u":"1f465","c":"People \u0026 Body","o":546,"x":13,"y":42,"s":"busts_in_silhouette","n":"silhouet van twee personen","k":"busts in silhouette|silhouet van twee personen|bff|buste|bustes in silhouet|schaduw|silhouet|vrienden|bust|busts|everyone|friend|friends|people|silhouette"},{"u":"1fac2","c":"People \u0026 Body","o":547,"x":55,"y":59,"s":"people_hugging","n":"personen in een omhelzing","k":"people hugging|personen in een omhelzing|bedankt|dag|hallo|knuffel|knuffelen|liefde|omhelzing|persoon|vriendschap|comfort|embrace|farewell|friendship|goodbye|hello|hug|hugging|love|people|thanks"},{"u":"1f463","c":"People \u0026 Body","o":553,"x":13,"y":40,"s":"footprints","n":"voetafdrukken","k":"footprints|voetafdrukken|afdruk|blote voeten|kleding|lopen|onderweg|voetafdruk|barefoot|clothing|footprint|omw|print|walk"},{"u":"1f435","c":"Animals \u0026 Nature","o":559,"x":11,"y":51,"s":"monkey_face","n":"apengezicht","k":"monkey face|apengezicht|aap|dier|gezicht|animal|banana|face|monkey"},{"u":"1f412","c":"Animals \u0026 Nature","o":560,"x":11,"y":13,"s":"monkey","n":"aap","k":"monkey|aap|dier|animal|banana"},{"u":"1f98d","c":"Animals \u0026 Nature","o":561,"x":45,"y":4,"s":"gorilla","n":"gorilla","k":"gorilla|dier|animal"},{"u":"1f9a7","c":"Animals \u0026 Nature","o":562,"x":45,"y":30,"s":"orangutan","n":"orang-oetang","k":"orangutan|orang-oetang|aap|dier|animal|ape|monkey"},{"u":"1f436","c":"Animals \u0026 Nature","o":563,"x":11,"y":52,"s":"dog","n":"hondengezicht","k":"dog|dog face|hondengezicht|dier|gezicht|hond|huisdier|viervoeter|adorbs|animal|face|pet|puppies|puppy"},{"u":"1f415","c":"Animals \u0026 Nature","o":564,"x":11,"y":17,"s":"dog2","n":"hond","k":"dog2|dog|hond|dier|huisdier|viervoeter|animal|animals|dogs|pet"},{"u":"1f9ae","c":"Animals \u0026 Nature","o":565,"x":45,"y":37,"s":"guide_dog","n":"blindengeleidehond","k":"guide dog|blindengeleidehond|blind|dier|geleide|hond|toegankelijkheid|accessibility|animal|dog|guide"},{"u":"1f415-200d-1f9ba","c":"Animals \u0026 Nature","o":566,"x":11,"y":16,"s":"service_dog","n":"assistentiehond","k":"service dog|assistentiehond|assistentie|dier|hond|hulp|toegankelijkheid|accessibility|animal|assistance|dog|service"},{"u":"1f429","c":"Animals \u0026 Nature","o":567,"x":11,"y":39,"s":"poodle","n":"poedel","k":"poodle|poedel|dier|hond|pluizig|animal|dog|fluffy"},{"u":"1f43a","c":"Animals \u0026 Nature","o":568,"x":11,"y":56,"s":"wolf","n":"wolf","k":"wolf|wolf face|dier|gezicht|animal|face"},{"u":"1f98a","c":"Animals \u0026 Nature","o":569,"x":45,"y":1,"s":"fox_face","n":"vos","k":"fox face|vos|dier|gezicht|fox|animal|face"},{"u":"1f99d","c":"Animals \u0026 Nature","o":570,"x":45,"y":20,"s":"raccoon","n":"wasbeer","k":"raccoon|wasbeer|dier|nieuwsgierig|sluw|animal|curious|sly"},{"u":"1f431","c":"Animals \u0026 Nature","o":571,"x":11,"y":47,"s":"cat","n":"kattengezicht","k":"cat|cat face|kattengezicht|dier|gezicht|huisdier|kat|kitten|animal|face|kitty|pet"},{"u":"1f408","c":"Animals \u0026 Nature","o":572,"x":11,"y":3,"s":"cat2","n":"kat","k":"cat2|cat|kat|dier|huisdier|kitten|animal|animals|cats|pet"},{"u":"1f408-200d-2b1b","c":"Animals \u0026 Nature","o":573,"x":11,"y":2,"s":"black_cat","n":"zwarte kat","k":"black cat|zwarte kat|dier|halloween|kat|katachtig|miauw|pech|zwart|animal|black|cat|feline|meow|unlucky"},{"u":"1f981","c":"Animals \u0026 Nature","o":574,"x":44,"y":54,"s":"lion_face","n":"leeuw","k":"lion face|leeuw|brul|dier|gezicht|horoscoop|leeuwengezicht|leo|simba|sterrenbeeld|lion|alpha|animal|face|mane|order|rawr|roar|safari|strong|zodiac"},{"u":"1f42f","c":"Animals \u0026 Nature","o":575,"x":11,"y":45,"s":"tiger","n":"tijgergezicht","k":"tiger|tiger face|tijgergezicht|dier|gezicht|roofdier|tijger|animal|big|cat|face|predator"},{"u":"1f405","c":"Animals \u0026 Nature","o":576,"x":10,"y":61,"s":"tiger2","n":"tijger","k":"tiger2|tiger|tijger|dier|roofdier|animal|big|cat|predator|zoo"},{"u":"1f406","c":"Animals \u0026 Nature","o":577,"x":11,"y":0,"s":"leopard","n":"luipaard","k":"leopard|luipaard|dier|panter|roofdier|animal|big|cat|predator|zoo"},{"u":"1f434","c":"Animals \u0026 Nature","o":578,"x":11,"y":50,"s":"horse","n":"paardengezicht","k":"horse|horse face|paardengezicht|dier|gezicht|paard|animal|dressage|equine|face|farm|horses"},{"u":"1face","c":"Animals \u0026 Nature","o":579,"x":56,"y":16,"s":"moose","n":"eland","k":"moose|eland|dier|gewei|zoogdier|alces|animal|antlers|elk|mammal"},{"u":"1facf","c":"Animals \u0026 Nature","o":580,"x":56,"y":17,"s":"donkey","n":"ezel","k":"donkey|ezel|dier|grauwtje|koppig|muildier|pakezel|zoogdier|animal|ass|burro|hinny|mammal|mule|stubborn"},{"u":"1f40e","c":"Animals \u0026 Nature","o":581,"x":11,"y":9,"s":"racehorse","n":"paard","k":"racehorse|horse|paard|dier|racen|racepaard|renpaard|ruitersport|animal|equestrian|farm|racing"},{"u":"1f984","c":"Animals \u0026 Nature","o":582,"x":44,"y":57,"s":"unicorn_face","n":"eenhoorn","k":"unicorn face|eenhoorn|gezicht|unicorn|face"},{"u":"1f993","c":"Animals \u0026 Nature","o":583,"x":45,"y":10,"s":"zebra_face","n":"zebra","k":"zebra face|zebra|dier|streep|animal|stripe"},{"u":"1f98c","c":"Animals \u0026 Nature","o":584,"x":45,"y":3,"s":"deer","n":"hert","k":"deer|hert|dier|animal"},{"u":"1f9ac","c":"Animals \u0026 Nature","o":585,"x":45,"y":35,"s":"bison","n":"bizon","k":"bison|bizon|buffel|dier|kudde|wisent|animal|buffalo|herd"},{"u":"1f42e","c":"Animals \u0026 Nature","o":586,"x":11,"y":44,"s":"cow","n":"koeiengezicht","k":"cow|cow face|koeiengezicht|boe|dier|gezicht|koe|animal|face|farm|milk|moo"},{"u":"1f402","c":"Animals \u0026 Nature","o":587,"x":10,"y":58,"s":"ox","n":"os","k":"ox|os|dier|horoscoop|sterrenbeeld|stier|taurus|animal|animals|bull|farm|zodiac"},{"u":"1f403","c":"Animals \u0026 Nature","o":588,"x":10,"y":59,"s":"water_buffalo","n":"waterbuffel","k":"water buffalo|waterbuffel|buffel|dier|water|animal|buffalo|zoo"},{"u":"1f404","c":"Animals \u0026 Nature","o":589,"x":10,"y":60,"s":"cow2","n":"koe","k":"cow2|cow|koe|boe|dier|melk|animal|animals|farm|milk|moo"},{"u":"1f437","c":"Animals \u0026 Nature","o":590,"x":11,"y":53,"s":"pig","n":"varkensgezicht","k":"pig|pig face|varkensgezicht|dier|gezicht|varken|animal|bacon|face|farm|pork"},{"u":"1f416","c":"Animals \u0026 Nature","o":591,"x":11,"y":18,"s":"pig2","n":"varken","k":"pig2|pig|varken|big|dier|zeug|animal|bacon|farm|pork|sow"},{"u":"1f417","c":"Animals \u0026 Nature","o":592,"x":11,"y":19,"s":"boar","n":"zwijn","k":"boar|zwijn|dier|varken|animal|pig"},{"u":"1f43d","c":"Animals \u0026 Nature","o":593,"x":11,"y":60,"s":"pig_nose","n":"varkensneus","k":"pig nose|varkensneus|gezicht|neus|varken|animal|face|farm|nose|pig|smell|snout"},{"u":"1f40f","c":"Animals \u0026 Nature","o":594,"x":11,"y":10,"s":"ram","n":"ram","k":"ram|aries|dier|horoscoop|mannelijk|schaap|sterrenbeeld|animal|horns|male|sheep|zodiac|zoo"},{"u":"1f411","c":"Animals \u0026 Nature","o":595,"x":11,"y":12,"s":"sheep","n":"ooi","k":"sheep|ooi|blaten|dier|ram|schaap|vrouwelijk|ewe|animal|baa|farm|female|fluffy|lamb|wool"},{"u":"1f410","c":"Animals \u0026 Nature","o":596,"x":11,"y":11,"s":"goat","n":"geit","k":"goat|geit|bok|dier|horoscoop|steenbok|sterrenbeeld|animal|capricorn|farm|milk|zodiac"},{"u":"1f42a","c":"Animals \u0026 Nature","o":597,"x":11,"y":40,"s":"dromedary_camel","n":"dromedaris","k":"dromedary camel|dromedaris|bult|dier|kameel met één bult|woestijn|camel|animal|desert|dromedary|hump|one"},{"u":"1f42b","c":"Animals \u0026 Nature","o":598,"x":11,"y":41,"s":"camel","n":"kameel","k":"camel|bactrian camel|kameel|bult|dier|kameel met twee bulten|vervoermiddel|woestijn|two-hump camel|animal|bactrian|desert|hump|two|two-hump"},{"u":"1f999","c":"Animals \u0026 Nature","o":599,"x":45,"y":16,"s":"llama","n":"lama","k":"llama|lama|alpaca|dier|guanaco|vicuña|wol|animal|wool"},{"u":"1f992","c":"Animals \u0026 Nature","o":600,"x":45,"y":9,"s":"giraffe_face","n":"giraffe","k":"giraffe face|giraffe|dier|vlekken|animal|spots"},{"u":"1f418","c":"Animals \u0026 Nature","o":601,"x":11,"y":20,"s":"elephant","n":"olifant","k":"elephant|olifant|dier|animal"},{"u":"1f9a3","c":"Animals \u0026 Nature","o":602,"x":45,"y":26,"s":"mammoth","n":"mammoet","k":"mammoth|mammoet|dier|groot|slagtand|uitsterven|wollig|animal|extinction|large|tusk|wooly"},{"u":"1f98f","c":"Animals \u0026 Nature","o":603,"x":45,"y":6,"s":"rhinoceros","n":"neushoorn","k":"rhinoceros|neushoorn|dier|animal"},{"u":"1f99b","c":"Animals \u0026 Nature","o":604,"x":45,"y":18,"s":"hippopotamus","n":"nijlpaard","k":"hippopotamus|nijlpaard|dier|animal|hippo"},{"u":"1f42d","c":"Animals \u0026 Nature","o":605,"x":11,"y":43,"s":"mouse","n":"muizengezicht","k":"mouse|mouse face|muizengezicht|dier|gezicht|muis|animal|face"},{"u":"1f401","c":"Animals \u0026 Nature","o":606,"x":10,"y":57,"s":"mouse2","n":"muis","k":"mouse2|mouse|muis|dier|knaagdier|animal|animals"},{"u":"1f400","c":"Animals \u0026 Nature","o":607,"x":10,"y":56,"s":"rat","n":"rat","k":"rat|dier|animal"},{"u":"1f439","c":"Animals \u0026 Nature","o":608,"x":11,"y":55,"s":"hamster","n":"hamster","k":"hamster|hamster face|dier|gezicht|huisdier|animal|face|pet"},{"u":"1f430","c":"Animals \u0026 Nature","o":609,"x":11,"y":46,"s":"rabbit","n":"konijnengezicht","k":"rabbit|rabbit face|konijnengezicht|dier|gezicht|huisdier|konijn|animal|bunny|face|pet"},{"u":"1f407","c":"Animals \u0026 Nature","o":610,"x":11,"y":1,"s":"rabbit2","n":"konijn","k":"rabbit2|rabbit|konijn|dier|huisdier|konijntje|animal|bunny|pet"},{"u":"1f43f-fe0f","c":"Animals \u0026 Nature","o":611,"x":12,"y":0,"s":"chipmunk","n":"eekhoorn","k":"chipmunk|eekhoorn|dier|animal|squirrel"},{"u":"1f9ab","c":"Animals \u0026 Nature","o":612,"x":45,"y":34,"s":"beaver","n":"bever","k":"beaver|bever|dam|dier|tanden|animal|teeth"},{"u":"1f994","c":"Animals \u0026 Nature","o":613,"x":45,"y":11,"s":"hedgehog","n":"egel","k":"hedgehog|egel|dier|stekelig|animal|spiny"},{"u":"1f987","c":"Animals \u0026 Nature","o":614,"x":44,"y":60,"s":"bat","n":"vleermuis","k":"bat|vleermuis|dier|vampier|animal|vampire"},{"u":"1f43b","c":"Animals \u0026 Nature","o":615,"x":11,"y":58,"s":"bear","n":"beer","k":"bear|bear face|beer|berengezicht|dier|gezicht|knuffel|animal|face|grizzly|growl|honey"},{"u":"1f43b-200d-2744-fe0f","c":"Animals \u0026 Nature","o":616,"x":11,"y":57,"s":"polar_bear","n":"ijsbeer","k":"polar bear|ijsbeer|beer|noordpool|wit|animal|arctic|bear|polar|white"},{"u":"1f428","c":"Animals \u0026 Nature","o":617,"x":11,"y":38,"s":"koala","n":"koala","k":"koala|australië|beer|dier|down under|animal|australia|bear|down|face|marsupial|under"},{"u":"1f43c","c":"Animals \u0026 Nature","o":618,"x":11,"y":59,"s":"panda_face","n":"panda","k":"panda face|panda|bamboe|dier|gezicht|animal|bamboo|face"},{"u":"1f9a5","c":"Animals \u0026 Nature","o":619,"x":45,"y":28,"s":"sloth","n":"luiaard","k":"sloth|luiaard|lui|traag|lazy|slow"},{"u":"1f9a6","c":"Animals \u0026 Nature","o":620,"x":45,"y":29,"s":"otter","n":"otter","k":"otter|dier|speels|vissen|animal|fishing|playful"},{"u":"1f9a8","c":"Animals \u0026 Nature","o":621,"x":45,"y":31,"s":"skunk","n":"stinkdier","k":"skunk|stinkdier|dier|stank|animal|stink"},{"u":"1f998","c":"Animals \u0026 Nature","o":622,"x":45,"y":15,"s":"kangaroo","n":"kangoeroe","k":"kangaroo|kangoeroe|buideldier|dier|joey|springen|animal|jump|marsupial"},{"u":"1f9a1","c":"Animals \u0026 Nature","o":623,"x":45,"y":24,"s":"badger","n":"das","k":"badger|das|dier|honing|kwellen|animal|honey|pester"},{"u":"1f43e","c":"Animals \u0026 Nature","o":624,"x":11,"y":61,"s":"feet","n":"pootafdrukken","k":"feet|paw prints|pootafdrukken|afdruk|poot|poten|paw|paws|print|prints"},{"u":"1f983","c":"Animals \u0026 Nature","o":625,"x":44,"y":56,"s":"turkey","n":"kalkoen","k":"turkey|kalkoen|dier|gevogelte|bird|gobble|thanksgiving"},{"u":"1f414","c":"Animals \u0026 Nature","o":626,"x":11,"y":15,"s":"chicken","n":"kip","k":"chicken|kip|dier|gevogelte|animal|bird|ornithology"},{"u":"1f413","c":"Animals \u0026 Nature","o":627,"x":11,"y":14,"s":"rooster","n":"haan","k":"rooster|haan|dier|ornithologie|vogel|animal|bird|ornithology"},{"u":"1f423","c":"Animals \u0026 Nature","o":628,"x":11,"y":31,"s":"hatching_chick","n":"kuiken uit ei","k":"hatching chick|kuiken uit ei|baby|dier|ei|kuiken|uitkomen|vogel|animal|bird|chick|egg|hatching"},{"u":"1f424","c":"Animals \u0026 Nature","o":629,"x":11,"y":32,"s":"baby_chick","n":"kuikentje","k":"baby chick|kuikentje|baby|dier|gevogelte|kuiken|vogel|animal|bird|chick|ornithology"},{"u":"1f425","c":"Animals \u0026 Nature","o":630,"x":11,"y":33,"s":"hatched_chick","n":"naar voren kijkend kuikentje","k":"hatched chick|front-facing baby chick|naar voren kijkend kuikentje|baby|dier|gevogelte|kuiken|vogel|animal|bird|chick|front-facing|newborn|ornithology"},{"u":"1f426","c":"Animals \u0026 Nature","o":631,"x":11,"y":36,"s":"bird","n":"vogel","k":"bird|vogel|dier|duif|animal|ornithology"},{"u":"1f427","c":"Animals \u0026 Nature","o":632,"x":11,"y":37,"s":"penguin","n":"pinguïn","k":"penguin|pinguïn|antarctica|dier|vogel|animal|bird|ornithology"},{"u":"1f54a-fe0f","c":"Animals \u0026 Nature","o":633,"x":30,"y":55,"s":"dove_of_peace","n":"duif","k":"dove of peace|dove|duif|ornithologie|vliegen|vogel|vrede|bird|fly|ornithology|peace"},{"u":"1f985","c":"Animals \u0026 Nature","o":634,"x":44,"y":58,"s":"eagle","n":"adelaar","k":"eagle|adelaar|dier|ornithologie|vogel|animal|bird|ornithology"},{"u":"1f986","c":"Animals \u0026 Nature","o":635,"x":44,"y":59,"s":"duck","n":"eend","k":"duck|eend|dier|vogel|woerd|animal|bird|ornithology"},{"u":"1f9a2","c":"Animals \u0026 Nature","o":636,"x":45,"y":25,"s":"swan","n":"zwaan","k":"swan|zwaan|dier|jonge zwaan|lelijk eendje|vogel|zwanenjong|animal|bird|cygnet|duckling|ornithology|ugly"},{"u":"1f989","c":"Animals \u0026 Nature","o":637,"x":45,"y":0,"s":"owl","n":"uil","k":"owl|uil|dier|vogel|wijs|wijsheid|animal|bird|ornithology|wise"},{"u":"1f9a4","c":"Animals \u0026 Nature","o":638,"x":45,"y":27,"s":"dodo","n":"dodo","k":"dodo|dier|groot|ornithologie|uitsterven|vogel|animal|bird|extinction|large|ornithology"},{"u":"1fab6","c":"Animals \u0026 Nature","o":639,"x":55,"y":48,"s":"feather","n":"veer","k":"feather|veer|licht|verenkleed|vlucht|vogel|bird|flight|light|plumage"},{"u":"1f9a9","c":"Animals \u0026 Nature","o":640,"x":45,"y":32,"s":"flamingo","n":"flamingo","k":"flamingo|dier|flamboyant|ornithologie|tropisch|vogel|animal|bird|ornithology|tropical"},{"u":"1f99a","c":"Animals \u0026 Nature","o":641,"x":45,"y":17,"s":"peacock","n":"pauw","k":"peacock|pauw|dier|kleurrijk|mooie vogel|opzichtig|pauwhen|pronkerig|trots|trots als een pauw|vogel|animal|bird|colorful|ornithology|ostentatious|peahen|pretty|proud"},{"u":"1f99c","c":"Animals \u0026 Nature","o":642,"x":45,"y":19,"s":"parrot","n":"papegaai","k":"parrot|papegaai|dier|lorre|napraten|piraat|praten|vogel|animal|bird|ornithology|pirate|talk"},{"u":"1fabd","c":"Animals \u0026 Nature","o":643,"x":55,"y":55,"s":"wing","n":"vleugel","k":"wing|vleugel|engelachtig|luchtvaart|mythologie|vliegen|vogel|angelic|ascend|aviation|bird|fly|flying|heavenly|mythology|soar"},{"u":"1f426-200d-2b1b","c":"Animals \u0026 Nature","o":644,"x":11,"y":35,"s":"black_bird","n":"merel","k":"black bird|merel|dier|kauw|kraai|kraaiachtige|ornithologie|raaf|roek|snavel|vogel|zwart|animal|beak|bird|black|caw|corvid|crow|ornithology|raven|rook"},{"u":"1fabf","c":"Animals \u0026 Nature","o":645,"x":55,"y":56,"s":"goose","n":"gans","k":"goose|gans|gevogelte|onnozel|snateren|vogel|animal|bird|duck|flock|fowl|gaggle|gander|geese|honk|ornithology|silly"},{"u":"1f438","c":"Animals \u0026 Nature","o":647,"x":11,"y":54,"s":"frog","n":"kikker","k":"frog|frog face|kikker|dier|gezicht|animal|face"},{"u":"1f40a","c":"Animals \u0026 Nature","o":648,"x":11,"y":5,"s":"crocodile","n":"krokodil","k":"crocodile|krokodil|dier|dierentuin|animal|zoo"},{"u":"1f422","c":"Animals \u0026 Nature","o":649,"x":11,"y":30,"s":"turtle","n":"schildpad","k":"turtle|schildpad|dier|waterschildpad|animal|terrapin|tortoise"},{"u":"1f98e","c":"Animals \u0026 Nature","o":650,"x":45,"y":5,"s":"lizard","n":"hagedis","k":"lizard|hagedis|dier|reptiel|animal|reptile"},{"u":"1f40d","c":"Animals \u0026 Nature","o":651,"x":11,"y":8,"s":"snake","n":"slang","k":"snake|slang|dier|dierenriem|drager|ophiuchus|serpent|animal|bearer|zodiac"},{"u":"1f432","c":"Animals \u0026 Nature","o":652,"x":11,"y":48,"s":"dragon_face","n":"drakengezicht","k":"dragon face|drakengezicht|dier|draak|gezicht|sprookje|animal|dragon|face|fairy|fairytale|tale"},{"u":"1f409","c":"Animals \u0026 Nature","o":653,"x":11,"y":4,"s":"dragon","n":"draak","k":"dragon|draak|dier|ridders|sprookje|animal|fairy|fairytale|knights|tale"},{"u":"1f995","c":"Animals \u0026 Nature","o":654,"x":45,"y":12,"s":"sauropod","n":"sauropode","k":"sauropod|sauropode|brachiosaurus|brontosaurus|dinosaurus|diplodocus|dinosaur"},{"u":"1f996","c":"Animals \u0026 Nature","o":655,"x":45,"y":13,"s":"t-rex","n":"T-Rex","k":"t-rex|dinosaurus|rex|t|tyrannosaurus|dinosaur"},{"u":"1f433","c":"Animals \u0026 Nature","o":656,"x":11,"y":49,"s":"whale","n":"spuitende walvis","k":"whale|spouting whale|spuitende walvis|dier|gezicht|spuitend|spuitgat|walvis|animal|beach|face|ocean|spouting"},{"u":"1f40b","c":"Animals \u0026 Nature","o":657,"x":11,"y":6,"s":"whale2","n":"walvis","k":"whale2|whale|walvis|dier|vis|animal|beach|ocean"},{"u":"1f42c","c":"Animals \u0026 Nature","o":658,"x":11,"y":42,"s":"dolphin","n":"dolfijn","k":"dolphin|flipper|dolfijn|dier|animal|beach|ocean"},{"u":"1f9ad","c":"Animals \u0026 Nature","o":659,"x":45,"y":36,"s":"seal","n":"zeehond","k":"seal|zeehond|dier|leeuw|oceaan|zee|animal|lion|ocean|sea"},{"u":"1f41f","c":"Animals \u0026 Nature","o":660,"x":11,"y":27,"s":"fish","n":"vis","k":"fish|vis|dier|horoscoop|sterrenbeeld|vissen|animal|dinner|fishes|fishing|pisces|zodiac"},{"u":"1f420","c":"Animals \u0026 Nature","o":661,"x":11,"y":28,"s":"tropical_fish","n":"tropische vis","k":"tropical fish|tropische vis|dier|tropisch|vis|animal|fish|fishes|tropical"},{"u":"1f421","c":"Animals \u0026 Nature","o":662,"x":11,"y":29,"s":"blowfish","n":"kogelvis","k":"blowfish|kogelvis|dier|vis|animal|fish"},{"u":"1f988","c":"Animals \u0026 Nature","o":663,"x":44,"y":61,"s":"shark","n":"haai","k":"shark|haai|dier|vis|animal|fish"},{"u":"1f419","c":"Animals \u0026 Nature","o":664,"x":11,"y":21,"s":"octopus","n":"octopus","k":"octopus|dier|oceaan|zee|animal|creature|ocean"},{"u":"1f41a","c":"Animals \u0026 Nature","o":665,"x":11,"y":22,"s":"shell","n":"schelp","k":"shell|spiral shell|schelp|dier|spiraal|strand|zee|animal|beach|conch|sea|spiral"},{"u":"1fab8","c":"Animals \u0026 Nature","o":666,"x":55,"y":50,"s":"coral","n":"koraal","k":"coral|koraal|klimaat|oceaan|rif|verandering|zee|change|climate|ocean|reef|sea"},{"u":"1fabc","c":"Animals \u0026 Nature","o":667,"x":55,"y":54,"s":"jellyfish","n":"kwal","k":"jellyfish|kwal|au|branden|gelei|oceaan|ongewerveld|stekel|tentakels|zee|animal|aquarium|burn|invertebrate|jelly|life|marine|ocean|ouch|plankton|sea|sting|stinger|tentacles"},{"u":"1f40c","c":"Animals \u0026 Nature","o":668,"x":11,"y":7,"s":"snail","n":"slak","k":"snail|slak|dier|escargot|naaktslak|natuur|tuin|animal|garden|nature|slug"},{"u":"1f98b","c":"Animals \u0026 Nature","o":669,"x":45,"y":2,"s":"butterfly","n":"vlinder","k":"butterfly|vlinder|insect|mooi|pretty"},{"u":"1f41b","c":"Animals \u0026 Nature","o":670,"x":11,"y":23,"s":"bug","n":"insect","k":"bug|insect|beestje|dier|rups|animal|garden"},{"u":"1f41c","c":"Animals \u0026 Nature","o":671,"x":11,"y":24,"s":"ant","n":"mier","k":"ant|mier|dier|insect|animal|garden"},{"u":"1f41d","c":"Animals \u0026 Nature","o":672,"x":11,"y":25,"s":"bee","n":"honingbij","k":"bee|honeybee|honingbij|bij|dier|hommel|insect|wesp|animal|bumblebee|honey|nature|spring"},{"u":"1fab2","c":"Animals \u0026 Nature","o":673,"x":55,"y":44,"s":"beetle","n":"kever","k":"beetle|kever|beestje|dier|insect|animal|bug"},{"u":"1f41e","c":"Animals \u0026 Nature","o":674,"x":11,"y":26,"s":"ladybug","n":"lieveheersbeestje","k":"ladybug|lady beetle|lieveheersbeestje|dier|insect|kever|lieveheersbeest|animal|beetle|garden|lady|ladybird|nature"},{"u":"1f997","c":"Animals \u0026 Nature","o":675,"x":45,"y":14,"s":"cricket","n":"krekel","k":"cricket|krekel|dier|insect|orthoptera|sprinkhaan|animal|bug|grasshopper"},{"u":"1fab3","c":"Animals \u0026 Nature","o":676,"x":55,"y":45,"s":"cockroach","n":"kakkerlak","k":"cockroach|kakkerlak|bakkerstor|dier|insect|plaag|animal|pest|roach"},{"u":"1f577-fe0f","c":"Animals \u0026 Nature","o":677,"x":31,"y":50,"s":"spider","n":"spin","k":"spider|spin|dier|geleedpotigen|insect|animal"},{"u":"1f578-fe0f","c":"Animals \u0026 Nature","o":678,"x":31,"y":51,"s":"spider_web","n":"spinnenweb","k":"spider web|spinnenweb|spin|web|spider"},{"u":"1f982","c":"Animals \u0026 Nature","o":679,"x":44,"y":55,"s":"scorpion","n":"schorpioen","k":"scorpion|schorpioen|dier|horoscoop|scorpio|sterrenbeeld|scorpius|zodiac"},{"u":"1f99f","c":"Animals \u0026 Nature","o":680,"x":45,"y":22,"s":"mosquito","n":"mug","k":"mosquito|mug|beet|insect|koorts|malaria|ongedierte|virus|ziekte|bite|disease|fever|pest"},{"u":"1fab0","c":"Animals \u0026 Nature","o":681,"x":55,"y":42,"s":"fly","n":"vlieg","k":"fly|vlieg|dier|insect|made|ongedierte|rottend|ziekte|animal|disease|maggot|pest|rotting"},{"u":"1fab1","c":"Animals \u0026 Nature","o":682,"x":55,"y":43,"s":"worm","n":"worm","k":"worm|dier|parasiet|regenworm|ringworm|animal|annelid|earthworm|parasite"},{"u":"1f9a0","c":"Animals \u0026 Nature","o":683,"x":45,"y":23,"s":"microbe","n":"microbe","k":"microbe|amoebe|bacteriën|virus|wetenschap|amoeba|bacteria|science"},{"u":"1f490","c":"Animals \u0026 Nature","o":684,"x":27,"y":37,"s":"bouquet","n":"boeket","k":"bouquet|boeket|afspraakje|bedankt|beterschap|bloem|date|jubileum|romantiek|verjaardag|anniversary|birthday|flower|love|plant|romance"},{"u":"1f338","c":"Animals \u0026 Nature","o":685,"x":5,"y":48,"s":"cherry_blossom","n":"kersenbloesem","k":"cherry blossom|kersenbloesem|bloem|bloesem|kers|plant|blossom|cherry|flower|spring|springtime"},{"u":"1f4ae","c":"Animals \u0026 Nature","o":686,"x":28,"y":35,"s":"white_flower","n":"witte bloem","k":"white flower|witte bloem|bloem|bloemenstempel|flower|white"},{"u":"1fab7","c":"Animals \u0026 Nature","o":687,"x":55,"y":49,"s":"lotus","n":"lotus","k":"lotus|bloem|boeddhisme|hindoeïsme|puurheid|rust|schoonheid|sereen|vrede|beauty|buddhism|calm|flower|hinduism|peace|purity|serenity"},{"u":"1f3f5-fe0f","c":"Animals \u0026 Nature","o":688,"x":10,"y":46,"s":"rosette","n":"rozet","k":"rosette|rozet|plant"},{"u":"1f339","c":"Animals \u0026 Nature","o":689,"x":5,"y":49,"s":"rose","n":"roos","k":"rose|roos|bloem|liefde|plant|valentijn|beauty|elegant|flower|love|red|valentine"},{"u":"1f940","c":"Animals \u0026 Nature","o":690,"x":43,"y":47,"s":"wilted_flower","n":"verwelkte bloem","k":"wilted flower|verwelkte bloem|bloem|sterven|verwelkt|dying|flower|wilted"},{"u":"1f33a","c":"Animals \u0026 Nature","o":691,"x":5,"y":50,"s":"hibiscus","n":"hibiscus","k":"hibiscus|bloem|plant|flower"},{"u":"1f33b","c":"Animals \u0026 Nature","o":692,"x":5,"y":51,"s":"sunflower","n":"zonnebloem","k":"sunflower|zonnebloem|bloem|plant|zon|flower|outdoors|sun"},{"u":"1f33c","c":"Animals \u0026 Nature","o":693,"x":5,"y":52,"s":"blossom","n":"bloesem","k":"blossom|bloesem|bloem|boterbloem|paardenbloem|plant|buttercup|dandelion|flower"},{"u":"1f337","c":"Animals \u0026 Nature","o":694,"x":5,"y":47,"s":"tulip","n":"tulp","k":"tulip|tulp|bloem|plant|blossom|flower|growth"},{"u":"1fabb","c":"Animals \u0026 Nature","o":695,"x":55,"y":53,"s":"hyacinth","n":"hyacint","k":"hyacinth|hyacint|bloem|lavendel|leeuwenbek|lupine|vlinderbloemige|bloom|bluebonnet|flower|indigo|lavender|lilac|plant|purple|shrub|snapdragon|spring|violet"},{"u":"1f331","c":"Animals \u0026 Nature","o":696,"x":5,"y":41,"s":"seedling","n":"zaailing","k":"seedling|zaailing|jong|plant|spruit|stekje|sapling|sprout|young"},{"u":"1fab4","c":"Animals \u0026 Nature","o":697,"x":55,"y":46,"s":"potted_plant","n":"potplant","k":"potted plant|potplant|decor|groeien|huis|plant|pot|verzorgen|grow|house|nurturing|potted"},{"u":"1f332","c":"Animals \u0026 Nature","o":698,"x":5,"y":42,"s":"evergreen_tree","n":"naaldboom","k":"evergreen tree|naaldboom|boom|dennenboom|plant|spar|christmas|evergreen|forest|pine|tree"},{"u":"1f333","c":"Animals \u0026 Nature","o":699,"x":5,"y":43,"s":"deciduous_tree","n":"loofboom","k":"deciduous tree|loofboom|bladeren verliezen|boom|boom die bladeren verliest|bos|loof verliezen|deciduous|forest|green|habitat|shedding|tree"},{"u":"1f334","c":"Animals \u0026 Nature","o":700,"x":5,"y":44,"s":"palm_tree","n":"palmboom","k":"palm tree|palmboom|boom|palm|plant|tropisch|vakantie|beach|tree|tropical"},{"u":"1f335","c":"Animals \u0026 Nature","o":701,"x":5,"y":45,"s":"cactus","n":"cactus","k":"cactus|droogte|plant|woestijn|desert|drought|nature"},{"u":"1f33e","c":"Animals \u0026 Nature","o":702,"x":5,"y":54,"s":"ear_of_rice","n":"rijstplant","k":"ear of rice|rijstplant|aar|graan|plant|rijst|rijstaar|sheaf of rice|ear|grain|grains|rice|sheaf"},{"u":"1f33f","c":"Animals \u0026 Nature","o":703,"x":5,"y":55,"s":"herb","n":"kruid","k":"herb|kruid|blad|plant|leaf"},{"u":"2618-fe0f","c":"Animals \u0026 Nature","o":704,"x":58,"y":17,"s":"shamrock","n":"klavertjedrie","k":"shamrock|klavertjedrie|iers|plant|irish"},{"u":"1f340","c":"Animals \u0026 Nature","o":705,"x":5,"y":56,"s":"four_leaf_clover","n":"klavertjevier","k":"four leaf clover|klavertjevier|4|blad|geluk|klaver|plant|vier|clover|four|four-leaf|irish|leaf|lucky"},{"u":"1f341","c":"Animals \u0026 Nature","o":706,"x":5,"y":57,"s":"maple_leaf","n":"esdoornblad","k":"maple leaf|esdoornblad|blad|esdoorn|vallend|falling|leaf|maple"},{"u":"1f342","c":"Animals \u0026 Nature","o":707,"x":5,"y":58,"s":"fallen_leaf","n":"vallende bladeren","k":"fallen leaf|vallende bladeren|blad|gevallen|herfst|vallend|autumn|fall|fallen|falling|leaf"},{"u":"1f343","c":"Animals \u0026 Nature","o":708,"x":5,"y":59,"s":"leaves","n":"blad in de wind","k":"leaves|leaf fluttering in wind|blad in de wind|blad|blazen|fladderen|wind|blow|flutter|fluttering|leaf"},{"u":"1fab9","c":"Animals \u0026 Nature","o":709,"x":55,"y":51,"s":"empty_nest","n":"leeg nest","k":"empty nest|leeg nest|leeg|nest|nestelen|tak|thuis|branch|empty|home|nesting"},{"u":"1faba","c":"Animals \u0026 Nature","o":710,"x":55,"y":52,"s":"nest_with_eggs","n":"nest met eieren","k":"nest with eggs|nest met eieren|ei|eieren|nest|nestelen|tak|vogel|bird|branch|egg|eggs|nesting"},{"u":"1f344","c":"Animals \u0026 Nature","o":711,"x":5,"y":61,"s":"mushroom","n":"paddenstoel","k":"mushroom|paddenstoel|schimmel|zwam|fungus|toadstool"},{"u":"1f347","c":"Food \u0026 Drink","o":712,"x":6,"y":2,"s":"grapes","n":"druiven","k":"grapes|druiven|dionysus|druif|fruit|grape"},{"u":"1f348","c":"Food \u0026 Drink","o":713,"x":6,"y":3,"s":"melon","n":"meloen","k":"melon|meloen|fruit|kanteloep|cantaloupe"},{"u":"1f349","c":"Food \u0026 Drink","o":714,"x":6,"y":4,"s":"watermelon","n":"watermeloen","k":"watermelon|watermeloen|fruit"},{"u":"1f34a","c":"Food \u0026 Drink","o":715,"x":6,"y":5,"s":"tangerine","n":"mandarijn","k":"tangerine|mandarijn|c|citrus|fruit|nectarine|sinaasappel|vitamine|orange|vitamin"},{"u":"1f34b","c":"Food \u0026 Drink","o":716,"x":6,"y":7,"s":"lemon","n":"citroen","k":"lemon|citroen|citrus|fruit|zuur|sour"},{"u":"1f34c","c":"Food \u0026 Drink","o":718,"x":6,"y":8,"s":"banana","n":"banaan","k":"banana|banaan|fruit|kalium|potassium"},{"u":"1f34d","c":"Food \u0026 Drink","o":719,"x":6,"y":9,"s":"pineapple","n":"ananas","k":"pineapple|ananas|eten|fruit|tropisch|voedsel|colada|pina|tropical"},{"u":"1f96d","c":"Food \u0026 Drink","o":720,"x":44,"y":29,"s":"mango","n":"mango","k":"mango|eten|fruit|tropisch|food|tropical"},{"u":"1f34e","c":"Food \u0026 Drink","o":721,"x":6,"y":10,"s":"apple","n":"rode appel","k":"apple|red apple|rode appel|appel|dieet|fruit|gezondheid|rijp|rood|voedsel|diet|food|health|red|ripe"},{"u":"1f34f","c":"Food \u0026 Drink","o":722,"x":6,"y":11,"s":"green_apple","n":"groene appel","k":"green apple|groene appel|appel|fruit|groen|apple|green"},{"u":"1f350","c":"Food \u0026 Drink","o":723,"x":6,"y":12,"s":"pear","n":"peer","k":"pear|peer|fruit"},{"u":"1f351","c":"Food \u0026 Drink","o":724,"x":6,"y":13,"s":"peach","n":"perzik","k":"peach|perzik|fruit"},{"u":"1f352","c":"Food \u0026 Drink","o":725,"x":6,"y":14,"s":"cherries","n":"kersen","k":"cherries|kersen|bessen|fruit|kers|rood|berries|cherry|red"},{"u":"1f353","c":"Food \u0026 Drink","o":726,"x":6,"y":15,"s":"strawberry","n":"aardbei","k":"strawberry|aardbei|bes|fruit|berry"},{"u":"1fad0","c":"Food \u0026 Drink","o":727,"x":56,"y":18,"s":"blueberries","n":"bosbessen","k":"blueberries|bosbessen|bes|bessen|blauw|blauwbessen|bosbes|fruit|voedsel|berries|berry|bilberry|blue|blueberry|food"},{"u":"1f95d","c":"Food \u0026 Drink","o":728,"x":44,"y":13,"s":"kiwifruit","n":"kiwi","k":"kiwifruit|kiwi|fruit|voedsel|kiwi fruit|food"},{"u":"1f345","c":"Food \u0026 Drink","o":729,"x":6,"y":0,"s":"tomato","n":"tomaat","k":"tomato|tomaat|fruit|groente|voedsel|food|vegetable"},{"u":"1fad2","c":"Food \u0026 Drink","o":730,"x":56,"y":20,"s":"olive","n":"olijf","k":"olive|olijf|voedsel|food"},{"u":"1f965","c":"Food \u0026 Drink","o":731,"x":44,"y":21,"s":"coconut","n":"kokosnoot","k":"coconut|kokosnoot|eten|palm|palmboom|pina colada|voedsel|colada|piña"},{"u":"1f951","c":"Food \u0026 Drink","o":732,"x":44,"y":1,"s":"avocado","n":"avocado","k":"avocado|fruit|voedsel|food"},{"u":"1f346","c":"Food \u0026 Drink","o":733,"x":6,"y":1,"s":"eggplant","n":"aubergine","k":"eggplant|aubergine|groente|vegetable"},{"u":"1f954","c":"Food \u0026 Drink","o":734,"x":44,"y":4,"s":"potato","n":"aardappel","k":"potato|aardappel|groente|voedsel|food|vegetable"},{"u":"1f955","c":"Food \u0026 Drink","o":735,"x":44,"y":5,"s":"carrot","n":"wortel","k":"carrot|wortel|groente|voedsel|food|vegetable"},{"u":"1f33d","c":"Food \u0026 Drink","o":736,"x":5,"y":53,"s":"corn","n":"maïskolf","k":"corn|ear of maize|maïskolf|boerderij|doolhof|gewassen|kolf|maïs|ear of corn|crops|ear|farm|maize|maze"},{"u":"1f336-fe0f","c":"Food \u0026 Drink","o":737,"x":5,"y":46,"s":"hot_pepper","n":"hete peper","k":"hot pepper|hete peper|heet|peper|hot|pepper"},{"u":"1fad1","c":"Food \u0026 Drink","o":738,"x":56,"y":19,"s":"bell_pepper","n":"paprika","k":"bell pepper|paprika|capsicum|groente|peper|voedsel|bell|food|pepper|vegetable"},{"u":"1f952","c":"Food \u0026 Drink","o":739,"x":44,"y":2,"s":"cucumber","n":"komkommer","k":"cucumber|komkommer|augurk|eten|groente|food|pickle|vegetable"},{"u":"1f96c","c":"Food \u0026 Drink","o":740,"x":44,"y":28,"s":"leafy_green","n":"bladgroente","k":"leafy green|bladgroente|bladgroen|boerenkool|bok choy|burgers|kool|paksoi|salade|sla|bok|cabbage|choy|green|kale|leafy|lettuce|salad"},{"u":"1f966","c":"Food \u0026 Drink","o":741,"x":44,"y":22,"s":"broccoli","n":"broccoli","k":"broccoli|kool|wild|cabbage"},{"u":"1f9c4","c":"Food \u0026 Drink","o":742,"x":46,"y":42,"s":"garlic","n":"knoflook","k":"garlic|knoflook|smaakmaker|flavoring"},{"u":"1f9c5","c":"Food \u0026 Drink","o":743,"x":46,"y":43,"s":"onion","n":"ui","k":"onion|ui|smaakmaker|flavoring"},{"u":"1f95c","c":"Food \u0026 Drink","o":744,"x":44,"y":12,"s":"peanuts","n":"pinda’s","k":"peanuts|pinda’s|eten|groente|noot|pinda|food|nut|peanut|vegetable"},{"u":"1fad8","c":"Food \u0026 Drink","o":745,"x":56,"y":26,"s":"beans","n":"bonen","k":"beans|bonen|kidneyboon|klein|peulvrucht|voedsel|food|kidney|legume|small"},{"u":"1f330","c":"Food \u0026 Drink","o":746,"x":5,"y":40,"s":"chestnut","n":"kastanje","k":"chestnut|kastanje|amandel|plant|almond"},{"u":"1fada","c":"Food \u0026 Drink","o":747,"x":56,"y":28,"s":"ginger_root","n":"gemberwortel","k":"ginger root|gemberwortel|bier|gember|specerij|wortel|beer|ginger|health|herb|natural|root|spice"},{"u":"1fadb","c":"Food \u0026 Drink","o":748,"x":56,"y":29,"s":"pea_pod","n":"erwtendop","k":"pea pod|erwtendop|bonen|dop|edamame|erwt|groente|peul|peulvrucht|beans|beanstalk|legume|pea|pod|soybean|vegetable|veggie"},{"u":"1f35e","c":"Food \u0026 Drink","o":750,"x":6,"y":26,"s":"bread","n":"brood","k":"bread|brood|eten|koolhydraten|tarwe|voedsel|carbs|food|grain|loaf|restaurant|toast|wheat"},{"u":"1f950","c":"Food \u0026 Drink","o":751,"x":44,"y":0,"s":"croissant","n":"croissant","k":"croissant|brood|eten|frans|ontbijt|voedsel|bread|breakfast|crescent|food|french|roll"},{"u":"1f956","c":"Food \u0026 Drink","o":752,"x":44,"y":6,"s":"baguette_bread","n":"stokbrood","k":"baguette bread|stokbrood|brood|eten|frans|baguette|bread|food|french"},{"u":"1fad3","c":"Food \u0026 Drink","o":753,"x":56,"y":21,"s":"flatbread","n":"platbrood","k":"flatbread|platbrood|arepa|brood|eten|gordita|lavash|naan|pita|bread|food"},{"u":"1f968","c":"Food \u0026 Drink","o":754,"x":44,"y":24,"s":"pretzel","n":"pretzel","k":"pretzel|gedraaid|krakeling|convoluted|twisted"},{"u":"1f96f","c":"Food \u0026 Drink","o":755,"x":44,"y":31,"s":"bagel","n":"bagel","k":"bagel|bakkerij|brood|ontbijt|spread|bakery|bread|breakfast|schmear"},{"u":"1f95e","c":"Food \u0026 Drink","o":756,"x":44,"y":14,"s":"pancakes","n":"pannenkoeken","k":"pancakes|pannenkoeken|crêpe|eten|flensje|ontbijt|pannenkoek|breakfast|food|hotcake|pancake"},{"u":"1f9c7","c":"Food \u0026 Drink","o":757,"x":46,"y":45,"s":"waffle","n":"wafel","k":"waffle|wafel|besluiteloos|ijzer|ontbijt|breakfast|indecisive|iron"},{"u":"1f9c0","c":"Food \u0026 Drink","o":758,"x":46,"y":38,"s":"cheese_wedge","n":"stuk kaas","k":"cheese wedge|stuk kaas|kaas|plak|cheese|wedge"},{"u":"1f356","c":"Food \u0026 Drink","o":759,"x":6,"y":18,"s":"meat_on_bone","n":"vlees met bot","k":"meat on bone|vlees met bot|bot|vlees|bone|meat"},{"u":"1f357","c":"Food \u0026 Drink","o":760,"x":6,"y":19,"s":"poultry_leg","n":"kippenpoot","k":"poultry leg|kippenpoot|bot|gevogelte|honger|kalkoen|kip|poot|bone|chicken|drumstick|hungry|leg|poultry|turkey"},{"u":"1f969","c":"Food \u0026 Drink","o":761,"x":44,"y":25,"s":"cut_of_meat","n":"vlees","k":"cut of meat|vlees|biefstuk|bout|karbonade|kotelet|lamskotelet|rood|chop|cut|lambchop|meat|porkchop|red|steak"},{"u":"1f953","c":"Food \u0026 Drink","o":762,"x":44,"y":3,"s":"bacon","n":"bacon","k":"bacon|eten|ontbijt|spek|vlees|breakfast|food|meat"},{"u":"1f354","c":"Food \u0026 Drink","o":763,"x":6,"y":16,"s":"hamburger","n":"hamburger","k":"hamburger|burger|eten|fastfood|honger|eat|fast|food|hungry"},{"u":"1f35f","c":"Food \u0026 Drink","o":764,"x":6,"y":27,"s":"fries","n":"patat","k":"fries|french fries|patat|eten|fastfood|frans|frietjes|fast|food|french"},{"u":"1f355","c":"Food \u0026 Drink","o":765,"x":6,"y":17,"s":"pizza","n":"pizzapunt","k":"pizza|slice of pizza|pizzapunt|eten|honger|kaas|pepperoni|punt|cheese|food|hungry|slice"},{"u":"1f32d","c":"Food \u0026 Drink","o":766,"x":5,"y":37,"s":"hotdog","n":"hotdog","k":"hotdog|hot dog|braadworst|frankfurter|knakworst|worst|dog|hot|sausage"},{"u":"1f96a","c":"Food \u0026 Drink","o":767,"x":44,"y":26,"s":"sandwich","n":"boterham","k":"sandwich|boterham|brood|bread"},{"u":"1f32e","c":"Food \u0026 Drink","o":768,"x":5,"y":38,"s":"taco","n":"taco","k":"taco|mexicaans|mexican"},{"u":"1f32f","c":"Food \u0026 Drink","o":769,"x":5,"y":39,"s":"burrito","n":"burrito","k":"burrito|mexicaans|wrap|mexican"},{"u":"1fad4","c":"Food \u0026 Drink","o":770,"x":56,"y":22,"s":"tamale","n":"tamale","k":"tamale|eten|mexicaans|pamonha|verpakt|food|mexican|wrapped"},{"u":"1f959","c":"Food \u0026 Drink","o":771,"x":44,"y":9,"s":"stuffed_flatbread","n":"gevuld pitabroodje","k":"stuffed flatbread|gevuld pitabroodje|eten|falafel|gevuld|gyros|kebab|pitabrood|flatbread|food|gyro|stuffed"},{"u":"1f9c6","c":"Food \u0026 Drink","o":772,"x":46,"y":44,"s":"falafel","n":"falafel","k":"falafel|gehaktbal|kikkererwt|chickpea|meatball"},{"u":"1f95a","c":"Food \u0026 Drink","o":773,"x":44,"y":10,"s":"egg","n":"ei","k":"egg|ei|eten|voedsel|breakfast|food"},{"u":"1f373","c":"Food \u0026 Drink","o":774,"x":6,"y":47,"s":"fried_egg","n":"koken","k":"fried egg|cooking|koken|bakken|ei|gemakkelijk|ontbijt|pan|restaurant|spiegelei|breakfast|easy|egg|fry|frying|over|side|sunny|up"},{"u":"1f958","c":"Food \u0026 Drink","o":775,"x":44,"y":8,"s":"shallow_pan_of_food","n":"paellapan","k":"shallow pan of food|paellapan|braadpan|eten|ondiep|paella|pan|casserole|food|shallow"},{"u":"1f372","c":"Food \u0026 Drink","o":776,"x":6,"y":46,"s":"stew","n":"stoofschotel","k":"stew|pot of food|stoofschotel|eenpansgerecht|eten|voedsel|food|pot|soup"},{"u":"1fad5","c":"Food \u0026 Drink","o":777,"x":56,"y":23,"s":"fondue","n":"fondue","k":"fondue|chocolade|eten|gesmolten|kaas|pot|ski|cheese|chocolate|food|melted"},{"u":"1f963","c":"Food \u0026 Drink","o":778,"x":44,"y":19,"s":"bowl_with_spoon","n":"kom met lepel","k":"bowl with spoon|kom met lepel|cornflakes|eten|muesli|ontbijt|ontbijtgranen|pap|soep|voedsel|bowl|breakfast|cereal|congee|oatmeal|porridge|spoon"},{"u":"1f957","c":"Food \u0026 Drink","o":779,"x":44,"y":7,"s":"green_salad","n":"groene salade","k":"green salad|groene salade|eten|groen|salade|food|green|salad"},{"u":"1f37f","c":"Food \u0026 Drink","o":780,"x":6,"y":59,"s":"popcorn","n":"popcorn","k":"popcorn|film|maïs|pop|corn|movie"},{"u":"1f9c8","c":"Food \u0026 Drink","o":781,"x":46,"y":46,"s":"butter","n":"boter","k":"butter|boter|zuivel|dairy"},{"u":"1f9c2","c":"Food \u0026 Drink","o":782,"x":46,"y":40,"s":"salt","n":"zout","k":"salt|salt shaker|zout|gezouten|overstuur|smaak|specerij|zoutvaatje|condiment|flavor|mad|salty|shaker|taste|upset"},{"u":"1f96b","c":"Food \u0026 Drink","o":783,"x":44,"y":27,"s":"canned_food","n":"blikvoedsel","k":"canned food|blikvoedsel|blik|ingeblikt|voedsel|can|canned|food"},{"u":"1f371","c":"Food \u0026 Drink","o":784,"x":6,"y":45,"s":"bento","n":"bentobox","k":"bento|bento box|bentobox|box|voedsel|food"},{"u":"1f358","c":"Food \u0026 Drink","o":785,"x":6,"y":20,"s":"rice_cracker","n":"rijstwafel","k":"rice cracker|rijstwafel|cracker|eten|rijst|food|rice"},{"u":"1f359","c":"Food \u0026 Drink","o":786,"x":6,"y":21,"s":"rice_ball","n":"rijstballetje","k":"rice ball|rijstballetje|balletje|eten|japans|rijst|ball|food|japanese|rice"},{"u":"1f35a","c":"Food \u0026 Drink","o":787,"x":6,"y":22,"s":"rice","n":"gekookte rijst","k":"rice|cooked rice|gekookte rijst|gekookt|rijst|voedsel|cooked|food"},{"u":"1f35b","c":"Food \u0026 Drink","o":788,"x":6,"y":23,"s":"curry","n":"curry en rijst","k":"curry|curry and rice|curry en rijst|rijst|voedsel|curry rice|food|rice"},{"u":"1f35c","c":"Food \u0026 Drink","o":789,"x":6,"y":24,"s":"ramen","n":"dampende kom","k":"ramen|steaming bowl|dampende kom|chopsticks|dampend|eten|kom|noedels|pho|soep|bowl|food|noodle|soup|steaming"},{"u":"1f35d","c":"Food \u0026 Drink","o":790,"x":6,"y":25,"s":"spaghetti","n":"spaghetti","k":"spaghetti|eten|gehaktballen|pasta|restaurant|food|meatballs"},{"u":"1f360","c":"Food \u0026 Drink","o":791,"x":6,"y":28,"s":"sweet_potato","n":"gepofte zoete aardappel","k":"sweet potato|roasted sweet potato|gepofte zoete aardappel|aardappel|eten|gepoft|zoet|food|potato|roasted|sweet"},{"u":"1f362","c":"Food \u0026 Drink","o":792,"x":6,"y":30,"s":"oden","n":"oden","k":"oden|eten|kebab|restaurant|spies|stokje|zeevruchten|food|seafood|skewer|stick"},{"u":"1f363","c":"Food \u0026 Drink","o":793,"x":6,"y":31,"s":"sushi","n":"sushi","k":"sushi|eten|food"},{"u":"1f364","c":"Food \u0026 Drink","o":794,"x":6,"y":32,"s":"fried_shrimp","n":"gefrituurde garnaal","k":"fried shrimp|gefrituurde garnaal|garnaal|garnalen|gefrituurd|tempura|fried|prawn|shrimp"},{"u":"1f365","c":"Food \u0026 Drink","o":795,"x":6,"y":33,"s":"fish_cake","n":"viskoekje met krul","k":"fish cake|fish cake with swirl design|viskoekje met krul|koekje|krul|vis|viskoekje|fish cake with swirl|cake|fish|food|pastry|restaurant|swirl"},{"u":"1f96e","c":"Food \u0026 Drink","o":796,"x":44,"y":30,"s":"moon_cake","n":"maancake","k":"moon cake|maancake|cake|festival|herfst|maan|yuèbǐng|autumn|moon"},{"u":"1f361","c":"Food \u0026 Drink","o":797,"x":6,"y":29,"s":"dango","n":"dango","k":"dango|dessert|japans|spies|stokje|zoet|japanese|skewer|stick|sweet"},{"u":"1f95f","c":"Food \u0026 Drink","o":798,"x":44,"y":15,"s":"dumpling","n":"knoedel","k":"dumpling|knoedel|empanada|gyōza|jiaozi|pierogi|potsticker"},{"u":"1f960","c":"Food \u0026 Drink","o":799,"x":44,"y":16,"s":"fortune_cookie","n":"gelukskoekje","k":"fortune cookie|gelukskoekje|geluk|koekje|profetie|cookie|fortune|prophecy"},{"u":"1f961","c":"Food \u0026 Drink","o":800,"x":44,"y":17,"s":"takeout_box","n":"afhaalmaaltijd","k":"takeout box|afhaalmaaltijd|bezorgen|doggybag|eten|oesteremmer|stokjes|voedsel|box|chopsticks|delivery|food|oyster|pail|takeout"},{"u":"1f980","c":"Food \u0026 Drink","o":801,"x":44,"y":53,"s":"crab","n":"krab","k":"crab|krab|dierenriem|kreeft|cancer|zodiac"},{"u":"1f99e","c":"Food \u0026 Drink","o":802,"x":45,"y":21,"s":"lobster","n":"kreeft","k":"lobster|kreeft|bisque|dier|scharen|zeevruchten|animal|claws|seafood"},{"u":"1f990","c":"Food \u0026 Drink","o":803,"x":45,"y":7,"s":"shrimp","n":"garnaal","k":"shrimp|garnaal|klein|schaaldier|voedsel|food|shellfish|small"},{"u":"1f991","c":"Food \u0026 Drink","o":804,"x":45,"y":8,"s":"squid","n":"inktvis","k":"squid|inktvis|dier|voedsel|weekdier|animal|food|mollusk"},{"u":"1f9aa","c":"Food \u0026 Drink","o":805,"x":45,"y":33,"s":"oyster","n":"oester","k":"oyster|oester|duiken|parel|diving|pearl"},{"u":"1f366","c":"Food \u0026 Drink","o":806,"x":6,"y":34,"s":"icecream","n":"softijs","k":"icecream|soft ice cream|softijs|dessert|eten|ijs|restaurant|room|zoet|cream|food|ice|serve|soft|sweet"},{"u":"1f367","c":"Food \u0026 Drink","o":807,"x":6,"y":35,"s":"shaved_ice","n":"geschaafd ijs","k":"shaved ice|geschaafd ijs|dessert|geschaafd|ijs|restaurant|zoet|ice|shaved|sweet"},{"u":"1f368","c":"Food \u0026 Drink","o":808,"x":6,"y":36,"s":"ice_cream","n":"ijs","k":"ice cream|ijs|dessert|eten|restaurant|room|zoet|cream|food|ice|sweet"},{"u":"1f369","c":"Food \u0026 Drink","o":809,"x":6,"y":37,"s":"doughnut","n":"donut","k":"doughnut|donut|dessert|eten|voedsel|zoet|breakfast|food|sweet"},{"u":"1f36a","c":"Food \u0026 Drink","o":810,"x":6,"y":38,"s":"cookie","n":"koekje","k":"cookie|koekje|chip|chocolade|dessert|zoet|chocolate|sweet"},{"u":"1f382","c":"Food \u0026 Drink","o":811,"x":7,"y":0,"s":"birthday","n":"verjaardagstaart","k":"birthday|birthday cake|verjaardagstaart|dessert|gebak|gelukkig|taart|verjaardag|viering|zoet|bday|cake|celebration|happy|pastry|sweet"},{"u":"1f370","c":"Food \u0026 Drink","o":812,"x":6,"y":44,"s":"cake","n":"cake","k":"cake|shortcake|dessert|gebak|plak|zandgebak|zoet|pastry|slice|sweet"},{"u":"1f9c1","c":"Food \u0026 Drink","o":813,"x":46,"y":39,"s":"cupcake","n":"cupcake","k":"cupcake|bakkerij|dessert|hagelslag|suiker|traktatie|zoet|bakery|sprinkles|sugar|sweet|treat"},{"u":"1f967","c":"Food \u0026 Drink","o":814,"x":44,"y":23,"s":"pie","n":"taart","k":"pie|taart|fruit|gebak|gebakje|hartige taart|pastei|vlees|vulling|apple|filling|meat|pastry|pumpkin|slice"},{"u":"1f36b","c":"Food \u0026 Drink","o":815,"x":6,"y":39,"s":"chocolate_bar","n":"chocoladereep","k":"chocolate bar|chocoladereep|chocolade|dessert|halloween|reep|snoep|zoetekauw|bar|candy|chocolate|sweet|tooth"},{"u":"1f36c","c":"Food \u0026 Drink","o":816,"x":6,"y":40,"s":"candy","n":"snoep","k":"candy|snoep|dessert|eten|gaatjes|voedsel|wikkel|zoet|cavities|halloween|restaurant|sweet|tooth|wrapper"},{"u":"1f36d","c":"Food \u0026 Drink","o":817,"x":6,"y":41,"s":"lollipop","n":"lolly","k":"lollipop|lolly|dessert|eten|snoep|voedsel|zoet|candy|food|restaurant|sweet"},{"u":"1f36e","c":"Food \u0026 Drink","o":818,"x":6,"y":42,"s":"custard","n":"vla","k":"custard|vla|dessert|pudding|zoet|sweet"},{"u":"1f36f","c":"Food \u0026 Drink","o":819,"x":6,"y":43,"s":"honey_pot","n":"honingpot","k":"honey pot|honingpot|beer|eten|honing|pot|vat|zoet|barrel|bear|food|honey|honeypot|jar|sweet"},{"u":"1f37c","c":"Food \u0026 Drink","o":820,"x":6,"y":56,"s":"baby_bottle","n":"babyflesje","k":"baby bottle|babyflesje|baby|babyfles|drinken|fles|flesje|flesvoeding|geboorte|melk|babies|birth|born|bottle|drink|infant|milk|newborn"},{"u":"1f95b","c":"Food \u0026 Drink","o":821,"x":44,"y":11,"s":"glass_of_milk","n":"glas melk","k":"glass of milk|glas melk|drinken|glas|melk|drink|glass|milk"},{"u":"2615","c":"Food \u0026 Drink","o":822,"x":58,"y":16,"s":"coffee","n":"warme drank","k":"coffee|hot beverage|warme drank|café|cafeïne|chai|drank|drinken|koffie|ochtend|stomen|thee|warm|beverage|cafe|caffeine|drink|hot|morning|steaming|tea"},{"u":"1fad6","c":"Food \u0026 Drink","o":823,"x":56,"y":24,"s":"teapot","n":"theepot","k":"teapot|theepot|drinken|eten|pot|thee|zettten|brew|drink|food|tea"},{"u":"1f375","c":"Food \u0026 Drink","o":824,"x":6,"y":49,"s":"tea","n":"theekopje zonder oor","k":"tea|teacup without handle|theekopje zonder oor|drankje|drinken|kop|thee|theekopje|beverage|cup|drink|handle|oolong|teacup"},{"u":"1f376","c":"Food \u0026 Drink","o":825,"x":6,"y":50,"s":"sake","n":"sake","k":"sake|sake bottle and cup|bar|café|drankje|drinken|fles|kopje|beverage|bottle|cup|drink|restaurant"},{"u":"1f37e","c":"Food \u0026 Drink","o":826,"x":6,"y":58,"s":"champagne","n":"fles met knallende kurk","k":"champagne|bottle with popping cork|fles met knallende kurk|bar|drinken|fles|knallen|kurk|bottle|cork|drink|popping"},{"u":"1f377","c":"Food \u0026 Drink","o":827,"x":6,"y":51,"s":"wine_glass","n":"wijnglas","k":"wine glass|wijnglas|alcohol|bar|café|drankje|drinken|glas|restaurant|wijn|beverage|booze|club|drink|drinking|drinks|glass|wine"},{"u":"1f378","c":"Food \u0026 Drink","o":828,"x":6,"y":52,"s":"cocktail","n":"cocktailglas","k":"cocktail|cocktail glass|cocktailglas|alcohol|bar|café|drinken|glas|mad men|martini|booze|club|drink|drinking|drinks|glass|mad|men"},{"u":"1f379","c":"Food \u0026 Drink","o":829,"x":6,"y":53,"s":"tropical_drink","n":"tropisch drankje","k":"tropical drink|tropisch drankje|alcohol|bar|club|drankjes|drinken|dronken|mai tai|mix|tropisch|booze|cocktail|drink|drinking|drinks|drunk|mai|party|tai|tropical|tropics"},{"u":"1f37a","c":"Food \u0026 Drink","o":830,"x":6,"y":54,"s":"beer","n":"bierglas","k":"beer|beer mug|bierglas|alcohol|bar|bier|café|drinken|duitsland|glas|oktoberfest|pils|pint|ale|booze|drink|drinking|drinks|mug|octoberfest|stein|summer"},{"u":"1f37b","c":"Food \u0026 Drink","o":831,"x":6,"y":55,"s":"beers","n":"klinkende bierglazen","k":"beers|clinking beer mugs|klinkende bierglazen|alcohol|bar|bier|café|drinken|glas|proosten|proostende bierglazen|beer|booze|bottoms|cheers|clink|clinking|drinking|drinks|mugs"},{"u":"1f942","c":"Food \u0026 Drink","o":832,"x":43,"y":49,"s":"clinking_glasses","n":"klinkende glazen","k":"clinking glasses|klinkende glazen|drinken|glas|glazen|klinken|toosten|vieren|celebrate|clink|clinking|drink|glass|glasses"},{"u":"1f943","c":"Food \u0026 Drink","o":833,"x":43,"y":50,"s":"tumbler_glass","n":"tumblerglas","k":"tumbler glass|tumblerglas|glas|likeur|shot|tumbler|whiskey|whisky|glass|liquor|scotch"},{"u":"1fad7","c":"Food \u0026 Drink","o":834,"x":56,"y":25,"s":"pouring_liquid","n":"vloeistof uitgieten","k":"pouring liquid|vloeistof uitgieten|drinken|gieten|glas|leeg|morsen|oeps|ongelukje|accident|drink|empty|glass|liquid|oops|pour|pouring|spill|water"},{"u":"1f964","c":"Food \u0026 Drink","o":835,"x":44,"y":20,"s":"cup_with_straw","n":"beker met rietje","k":"cup with straw|beker met rietje|drinken|frisdrank|sap|water|cup|drink|juice|malt|soda|soft|straw"},{"u":"1f9cb","c":"Food \u0026 Drink","o":836,"x":46,"y":49,"s":"bubble_tea","n":"bubbelthee","k":"bubble tea|bubbelthee|boba|bubbel|melk|parel|thee|voedsel|bubble|food|milk|pearl|tea"},{"u":"1f9c3","c":"Food \u0026 Drink","o":837,"x":46,"y":41,"s":"beverage_box","n":"pakje drinken","k":"beverage box|pakje drinken|drankje|pakje|rietje|sap|zoet|beverage|box|juice|straw|sweet"},{"u":"1f9c9","c":"Food \u0026 Drink","o":838,"x":46,"y":47,"s":"mate_drink","n":"maté","k":"mate drink|maté|drank|mate|drink"},{"u":"1f9ca","c":"Food \u0026 Drink","o":839,"x":46,"y":48,"s":"ice_cube","n":"ijsklontje","k":"ice cube|ijsklontje|ijs|ijsberg|klontje|koud|ice|cold|cube|iceberg"},{"u":"1f962","c":"Food \u0026 Drink","o":840,"x":44,"y":18,"s":"chopsticks","n":"chopsticks","k":"chopsticks|eetstokjes|eten|stokjes|hashi|jeotgarak|kuaizi"},{"u":"1f37d-fe0f","c":"Food \u0026 Drink","o":841,"x":6,"y":57,"s":"knife_fork_plate","n":"mes en vork met bord","k":"knife fork plate|fork and knife with plate|mes en vork met bord|bord|diner|eten|koken|mes|vork|cooking|dinner|eat|fork|knife|plate"},{"u":"1f374","c":"Food \u0026 Drink","o":842,"x":6,"y":48,"s":"fork_and_knife","n":"mes en vork","k":"fork and knife|mes en vork|bestek|eten|honger|koken|lekker|lunch|mes|ontbijt|restaurant|uit eten|vork|vork en mes|breakfast|breaky|cooking|cutlery|delicious|dinner|eat|feed|food|fork|hungry|knife|yum|yummy"},{"u":"1f944","c":"Food \u0026 Drink","o":843,"x":43,"y":51,"s":"spoon","n":"lepel","k":"spoon|lepel|bestek|tafelgerei|eat|tableware"},{"u":"1f52a","c":"Food \u0026 Drink","o":844,"x":30,"y":34,"s":"hocho","n":"keukenmes","k":"hocho|knife|keukenmes|koken|koksmes|mes|wapen|kitchen knife|chef|cooking|kitchen|tool|weapon"},{"u":"1fad9","c":"Food \u0026 Drink","o":845,"x":56,"y":27,"s":"jar","n":"pot","k":"jar|pot|container|leeg|niets|saus|specerij|winkel|condiment|empty|nothing|sauce|store"},{"u":"1f3fa","c":"Food \u0026 Drink","o":846,"x":10,"y":50,"s":"amphora","n":"amfora","k":"amphora|amfora|amfoor|drinken|horoscoop|koken|kruik|sterrenbeeld|waterman|aquarius|cooking|drink|jug|tool|weapon|zodiac"},{"u":"1f30d","c":"Travel \u0026 Places","o":847,"x":5,"y":7,"s":"earth_africa","n":"wereldbol met Europa-Afrika","k":"earth africa|earth globe europe-africa|wereldbol met europa-afrika|aarde|afrika|europa|wereld|wereldbol|globe showing europe-africa|africa|earth|europe|europe-africa|globe|showing|world"},{"u":"1f30e","c":"Travel \u0026 Places","o":848,"x":5,"y":8,"s":"earth_americas","n":"wereldbol met Noord- en Zuid-Amerika","k":"earth americas|earth globe americas|wereldbol met noord- en zuid-amerika|aarde|amerika|noord- en zuid-amerika|wereld|wereldbol|globe showing americas|americas|earth|globe|showing|world"},{"u":"1f30f","c":"Travel \u0026 Places","o":849,"x":5,"y":9,"s":"earth_asia","n":"wereldbol met Azië-Australië","k":"earth asia|earth globe asia-australia|wereldbol met azië-australië|aarde|australië|azië|wereld|wereldbol|globe showing asia-australia|asia|asia-australia|australia|earth|globe|showing|world"},{"u":"1f310","c":"Travel \u0026 Places","o":850,"x":5,"y":10,"s":"globe_with_meridians","n":"wereldbol met meridianen","k":"globe with meridians|wereldbol met meridianen|aarde|internet|meridianen|wereld|wereldbol|www|earth|globe|meridians|web|world|worldwide"},{"u":"1f5fa-fe0f","c":"Travel \u0026 Places","o":851,"x":32,"y":40,"s":"world_map","n":"wereldkaart","k":"world map|wereldkaart|kaart|wereld|map|world"},{"u":"1f5fe","c":"Travel \u0026 Places","o":852,"x":32,"y":44,"s":"japan","n":"kaart van Japan","k":"japan|silhouette of japan|kaart van japan|kaart|map of japan|map"},{"u":"1f9ed","c":"Travel \u0026 Places","o":853,"x":54,"y":31,"s":"compass","n":"kompas","k":"compass|kompas|magnetisch|navigatie|oriëntatielopen|oriënteringslopen|richting|direction|magnetic|navigation|orienteering"},{"u":"1f3d4-fe0f","c":"Travel \u0026 Places","o":854,"x":10,"y":9,"s":"snow_capped_mountain","n":"berg met besneeuwde toppen","k":"snow capped mountain|snow-capped mountain|berg met besneeuwde toppen|berg|koud|sneeuw|cold|mountain|snow|snow-capped"},{"u":"26f0-fe0f","c":"Travel \u0026 Places","o":855,"x":59,"y":24,"s":"mountain","n":"berg","k":"mountain|berg"},{"u":"1f30b","c":"Travel \u0026 Places","o":856,"x":5,"y":5,"s":"volcano","n":"vulkaan","k":"volcano|vulkaan|berg|lava|magma|natuur|vulkaanuitbarsting|eruption|mountain|nature"},{"u":"1f5fb","c":"Travel \u0026 Places","o":857,"x":32,"y":41,"s":"mount_fuji","n":"berg Fuji","k":"mount fuji|berg fuji|berg|fuji|natuur|vulkaan|mount|mountain|nature"},{"u":"1f3d5-fe0f","c":"Travel \u0026 Places","o":858,"x":10,"y":10,"s":"camping","n":"kamperen","k":"camping|kamperen|tent"},{"u":"1f3d6-fe0f","c":"Travel \u0026 Places","o":859,"x":10,"y":11,"s":"beach_with_umbrella","n":"strand met parasol","k":"beach with umbrella|strand met parasol|parasol|strand|beach|umbrella"},{"u":"1f3dc-fe0f","c":"Travel \u0026 Places","o":860,"x":10,"y":17,"s":"desert","n":"woestijn","k":"desert|woestijn"},{"u":"1f3dd-fe0f","c":"Travel \u0026 Places","o":861,"x":10,"y":18,"s":"desert_island","n":"onbewoond eiland","k":"desert island|onbewoond eiland|eiland|onbewoond|desert|island"},{"u":"1f3de-fe0f","c":"Travel \u0026 Places","o":862,"x":10,"y":19,"s":"national_park","n":"nationaal park","k":"national park|nationaal park|natuurgebied|park|national"},{"u":"1f3df-fe0f","c":"Travel \u0026 Places","o":863,"x":10,"y":20,"s":"stadium","n":"stadion","k":"stadium|stadion|amfitheater"},{"u":"1f3db-fe0f","c":"Travel \u0026 Places","o":864,"x":10,"y":16,"s":"classical_building","n":"klassiek gebouw","k":"classical building|klassiek gebouw|gebouw|historisch gebouw|klassiek|klassieke oudheid|renaissance|rome|zuilen|building|classical"},{"u":"1f3d7-fe0f","c":"Travel \u0026 Places","o":865,"x":10,"y":12,"s":"building_construction","n":"woningbouw","k":"building construction|woningbouw|bouw|bouwen|haven|hijskraan|building|construction|crane"},{"u":"1f9f1","c":"Travel \u0026 Places","o":866,"x":54,"y":35,"s":"bricks","n":"baksteen","k":"bricks|brick|baksteen|bakstenen|cement|gemetseld|klei|metselen|mortel|muur|steen|clay|mortar|wall"},{"u":"1faa8","c":"Travel \u0026 Places","o":867,"x":55,"y":34,"s":"rock","n":"rots","k":"rock|rots|betrouwbaar|graniet|rotsblok|steen|sterk|zwaar|boulder|heavy|solid|stone|tough"},{"u":"1fab5","c":"Travel \u0026 Places","o":868,"x":55,"y":47,"s":"wood","n":"hout","k":"wood|hout|balk|bijl|boomstam|hakken|open haard|stam|timmerhout|vuur|zagen|log|lumber|timber"},{"u":"1f6d6","c":"Travel \u0026 Places","o":869,"x":38,"y":46,"s":"hut","n":"hut","k":"hut|huis|joert|onderdak|ronde hut|strand|woning|home|house|roundhouse|shelter|yurt"},{"u":"1f3d8-fe0f","c":"Travel \u0026 Places","o":870,"x":10,"y":13,"s":"house_buildings","n":"huizen","k":"house buildings|houses|huizen|buurt|huis|house"},{"u":"1f3da-fe0f","c":"Travel \u0026 Places","o":871,"x":10,"y":15,"s":"derelict_house_building","n":"vervallen huis","k":"derelict house building|derelict house|vervallen huis|bouwval|gebouw|huis|vervallen|derelict|home|house"},{"u":"1f3e0","c":"Travel \u0026 Places","o":872,"x":10,"y":21,"s":"house","n":"huis","k":"house|house building|huis|gebouw|settelen|thuis|villa|voorstad|vrijstaande woning|building|country|heart|home|ranch|settle|simple|suburban|suburbia|where"},{"u":"1f3e1","c":"Travel \u0026 Places","o":873,"x":10,"y":22,"s":"house_with_garden","n":"huis met tuin","k":"house with garden|huis met tuin|gebouw|huis|huisje boompje beestje|settelen|thuis|tuin|voorstad|vrijstaande woning|building|country|garden|heart|home|house|ranch|settle|simple|suburban|suburbia|where"},{"u":"1f3e2","c":"Travel \u0026 Places","o":874,"x":10,"y":23,"s":"office","n":"kantoorgebouw","k":"office|office building|kantoorgebouw|gebouw|kantoorbaan|werk|building|city|cubical|job"},{"u":"1f3e3","c":"Travel \u0026 Places","o":875,"x":10,"y":24,"s":"post_office","n":"Japans postkantoor","k":"post office|japanese post office|japans postkantoor|gebouw|japans|post|building|japanese|office"},{"u":"1f3e4","c":"Travel \u0026 Places","o":876,"x":10,"y":25,"s":"european_post_office","n":"postkantoor","k":"european post office|postkantoor|europees|gebouw|post|post office|building|european|office"},{"u":"1f3e5","c":"Travel \u0026 Places","o":877,"x":10,"y":26,"s":"hospital","n":"ziekenhuis","k":"hospital|ziekenhuis|dokter|gebouw|medicijnen|building|doctor|medicine"},{"u":"1f3e6","c":"Travel \u0026 Places","o":878,"x":10,"y":27,"s":"bank","n":"bank","k":"bank|gebouw|building"},{"u":"1f3e8","c":"Travel \u0026 Places","o":879,"x":10,"y":29,"s":"hotel","n":"hotel","k":"hotel|gebouw|building"},{"u":"1f3e9","c":"Travel \u0026 Places","o":880,"x":10,"y":30,"s":"love_hotel","n":"love-hotel","k":"love hotel|love-hotel|gebouw|hotel|liefde|liefdeshotel|lovehotel|building|love"},{"u":"1f3ea","c":"Travel \u0026 Places","o":881,"x":10,"y":31,"s":"convenience_store","n":"supermarkt","k":"convenience store|supermarkt|boodschappen|gebouw|winkel|24|building|convenience|hours|store"},{"u":"1f3eb","c":"Travel \u0026 Places","o":882,"x":10,"y":32,"s":"school","n":"school","k":"school|gebouw|building"},{"u":"1f3ec","c":"Travel \u0026 Places","o":883,"x":10,"y":33,"s":"department_store","n":"warenhuis","k":"department store|warenhuis|gebouw|winkel|winkelen|building|department|store"},{"u":"1f3ed","c":"Travel \u0026 Places","o":884,"x":10,"y":34,"s":"factory","n":"fabriek","k":"factory|fabriek|gebouw|building"},{"u":"1f3ef","c":"Travel \u0026 Places","o":885,"x":10,"y":36,"s":"japanese_castle","n":"Japans kasteel","k":"japanese castle|japans kasteel|gebouw|japans|kasteel|building|castle|japanese"},{"u":"1f3f0","c":"Travel \u0026 Places","o":886,"x":10,"y":37,"s":"european_castle","n":"kasteel","k":"european castle|kasteel|europees|gebouw|middeleeuwen|castle|building|european"},{"u":"1f492","c":"Travel \u0026 Places","o":887,"x":28,"y":2,"s":"wedding","n":"bruiloft","k":"wedding|bruiloft|huwelijk|kapel|romantiek|trouwkapel|chapel|hitched|nuptials|romance"},{"u":"1f5fc","c":"Travel \u0026 Places","o":888,"x":32,"y":42,"s":"tokyo_tower","n":"Tokio-toren","k":"tokyo tower|tokio-toren|tokio|tokiotoren|toren|tokyo|tower"},{"u":"1f5fd","c":"Travel \u0026 Places","o":889,"x":32,"y":43,"s":"statue_of_liberty","n":"vrijheidsbeeld","k":"statue of liberty|vrijheidsbeeld|beeld|new york|nyc|vrijheid|liberty|new|ny|statue|york"},{"u":"26ea","c":"Travel \u0026 Places","o":890,"x":59,"y":23,"s":"church","n":"kerk","k":"church|kerk|christelijk|geloof|kapel|kruis|religie|bless|chapel|christian|cross|religion"},{"u":"1f54c","c":"Travel \u0026 Places","o":891,"x":30,"y":57,"s":"mosque","n":"moskee","k":"mosque|moskee|geloof|islam|moslim|religie|masjid|muslim|religion"},{"u":"1f6d5","c":"Travel \u0026 Places","o":892,"x":38,"y":45,"s":"hindu_temple","n":"hindoetempel","k":"hindu temple|hindoetempel|gebouw|geloof|goden|hindoe|india|religie|tempel|hindu|temple"},{"u":"1f54d","c":"Travel \u0026 Places","o":893,"x":30,"y":58,"s":"synagogue","n":"synagoge","k":"synagogue|synagoge|geloof|jodendom|jood|joods|religie|tempel|jew|jewish|judaism|religion|temple"},{"u":"26e9-fe0f","c":"Travel \u0026 Places","o":894,"x":59,"y":22,"s":"shinto_shrine","n":"shinto-tempel","k":"shinto shrine|shinto-tempel|geloof|japans|poort|religie|shinto|tempel|torii|religion|shrine"},{"u":"1f54b","c":"Travel \u0026 Places","o":895,"x":30,"y":56,"s":"kaaba","n":"kaäba","k":"kaaba|kaäba|bedevaart|geloof|islam|mekka|moslim|religie|hajj|muslim|religion|umrah"},{"u":"26f2","c":"Travel \u0026 Places","o":896,"x":59,"y":26,"s":"fountain","n":"fontein","k":"fountain|fontein"},{"u":"26fa","c":"Travel \u0026 Places","o":897,"x":59,"y":50,"s":"tent","n":"tent","k":"tent|kamperen|camping"},{"u":"1f301","c":"Travel \u0026 Places","o":898,"x":4,"y":57,"s":"foggy","n":"mistig","k":"foggy|mistig|mist|fog"},{"u":"1f303","c":"Travel \u0026 Places","o":899,"x":4,"y":59,"s":"night_with_stars","n":"sterrenhemel","k":"night with stars|sterrenhemel|metropool|miljoenenstad|nacht|stad bij nacht|sterren|night|star|stars"},{"u":"1f3d9-fe0f","c":"Travel \u0026 Places","o":900,"x":10,"y":14,"s":"cityscape","n":"stadsgezicht","k":"cityscape|stadsgezicht|flatgebouwen|gebouw|metropool|miljoenenstad|stad|city"},{"u":"1f304","c":"Travel \u0026 Places","o":901,"x":4,"y":60,"s":"sunrise_over_mountains","n":"zonsopgang in de bergen","k":"sunrise over mountains|zonsopgang in de bergen|berg|bergen|ochtend|zon|zonsopgang|morning|mountains|over|sun|sunrise"},{"u":"1f305","c":"Travel \u0026 Places","o":902,"x":4,"y":61,"s":"sunrise","n":"zonsopgang","k":"sunrise|zonsopgang|ochtend|zon|morning|nature|sun"},{"u":"1f306","c":"Travel \u0026 Places","o":903,"x":5,"y":0,"s":"city_sunset","n":"stad bij schemering","k":"city sunset|cityscape at dusk|stad bij schemering|avond|gebouw|landschap|metropool|miljoenenstad|schemer|stad|zonsondergang|at|building|city|cityscape|dusk|evening|landscape|sun|sunset"},{"u":"1f307","c":"Travel \u0026 Places","o":904,"x":5,"y":1,"s":"city_sunrise","n":"zonsondergang","k":"city sunrise|sunset over buildings|zonsondergang|flatgebouwen|gebouw|metropool|miljoenenstad|schemer|zon|sunset|building|dusk|sun"},{"u":"1f309","c":"Travel \u0026 Places","o":905,"x":5,"y":3,"s":"bridge_at_night","n":"brug bij nacht","k":"bridge at night|brug bij nacht|avond|brug|nacht|nachtelijke brug|at|bridge|night"},{"u":"2668-fe0f","c":"Travel \u0026 Places","o":906,"x":58,"y":53,"s":"hotsprings","n":"warmwaterbronnen","k":"hotsprings|hot springs|warmwaterbronnen|bronnen|stomend|warm|hot|springs|steaming"},{"u":"1f3a0","c":"Travel \u0026 Places","o":907,"x":7,"y":30,"s":"carousel_horse","n":"draaimolenpaard","k":"carousel horse|draaimolenpaard|carrousel|draaimolen|kermis|paard|pretpark|carousel|entertainment|horse"},{"u":"1f6dd","c":"Travel \u0026 Places","o":908,"x":38,"y":49,"s":"playground_slide","n":"glijbaan","k":"playground slide|glijbaan|glijden|kind|kinderen|speeltuin|spelen|amusement|park|play|playground|playing|slide|sliding|theme"},{"u":"1f3a1","c":"Travel \u0026 Places","o":909,"x":7,"y":31,"s":"ferris_wheel","n":"reuzenrad","k":"ferris wheel|reuzenrad|kermis|pretpark|rad|amusement|ferris|park|theme|wheel"},{"u":"1f3a2","c":"Travel \u0026 Places","o":910,"x":7,"y":32,"s":"roller_coaster","n":"achtbaan","k":"roller coaster|achtbaan|baan|pretpark|amusement|coaster|park|roller|theme"},{"u":"1f488","c":"Travel \u0026 Places","o":911,"x":27,"y":4,"s":"barber","n":"kapperspaal","k":"barber|barber pole|kapperspaal|kapper|kapsel|paal|cut|fresh|haircut|pole|shave"},{"u":"1f3aa","c":"Travel \u0026 Places","o":912,"x":7,"y":40,"s":"circus_tent","n":"circustent","k":"circus tent|circustent|circus|tent"},{"u":"1f682","c":"Travel \u0026 Places","o":913,"x":35,"y":59,"s":"steam_locomotive","n":"locomotief","k":"steam locomotive|locomotief|reizen|spoor|spoorweg|stoom|stoomtrein|trein|vervoermiddel|voertuig|locomotive|caboose|engine|railway|steam|train|trains|travel"},{"u":"1f683","c":"Travel \u0026 Places","o":914,"x":35,"y":60,"s":"railway_car","n":"treinwagon","k":"railway car|treinwagon|elektrisch|spoor|tram|trein|trolleybus|vervoermiddel|voertuig|wagon|car|electric|railway|train|travel"},{"u":"1f684","c":"Travel \u0026 Places","o":915,"x":35,"y":61,"s":"bullettrain_side","n":"hogesnelheidstrein","k":"bullettrain side|high-speed train|hogesnelheidstrein|hsl|shinkansen|snelheid|spoor|trein|ultrasnel|vervoermiddel|voertuig|high-speed|railway|speed|train"},{"u":"1f685","c":"Travel \u0026 Places","o":916,"x":36,"y":0,"s":"bullettrain_front","n":"hogesnelheidstrein met kogelneus","k":"bullettrain front|high-speed train with bullet nose|hogesnelheidstrein met kogelneus|hoge snelheid|kogeltrein|neus|reizen|shinkansen|snelheid|spoorweg|trein|bullet train|bullet|high-speed|nose|railway|speed|train|travel"},{"u":"1f686","c":"Travel \u0026 Places","o":917,"x":36,"y":1,"s":"train2","n":"trein","k":"train2|train|trein|aankomst|spoor|vertrek|vervoermiddel|voertuig|arrived|choo|railway"},{"u":"1f687","c":"Travel \u0026 Places","o":918,"x":36,"y":2,"s":"metro","n":"metro","k":"metro|ondergrondse|vervoermiddel|voertuig|subway|travel"},{"u":"1f688","c":"Travel \u0026 Places","o":919,"x":36,"y":3,"s":"light_rail","n":"lightrail","k":"light rail|lightrail|monorail|spoor|vervoermiddel|voertuig|arrived|light|rail|railway"},{"u":"1f689","c":"Travel \u0026 Places","o":920,"x":36,"y":4,"s":"station","n":"treinstation","k":"station|treinstation|spoor|trein|vervoermiddel|voertuig|railway|train"},{"u":"1f68a","c":"Travel \u0026 Places","o":921,"x":36,"y":5,"s":"tram","n":"tram","k":"tram|trolleybus|vervoermiddel|voertuig"},{"u":"1f69d","c":"Travel \u0026 Places","o":922,"x":36,"y":24,"s":"monorail","n":"monorail","k":"monorail|vervoermiddel|voertuig|vehicle"},{"u":"1f69e","c":"Travel \u0026 Places","o":923,"x":36,"y":25,"s":"mountain_railway","n":"bergspoor","k":"mountain railway|bergspoor|berg|spoor|vervoermiddel|voertuig|wagon|car|mountain|railway|trip"},{"u":"1f68b","c":"Travel \u0026 Places","o":924,"x":36,"y":6,"s":"train","n":"tramwagon","k":"train|tram car|tramwagon|tram|trolleybus|vervoermiddel|voertuig|wagon|bus|car|trolley"},{"u":"1f68c","c":"Travel \u0026 Places","o":925,"x":36,"y":7,"s":"bus","n":"bus","k":"bus|schoolbus|vervoermiddel|voertuig|school|vehicle"},{"u":"1f68d","c":"Travel \u0026 Places","o":926,"x":36,"y":8,"s":"oncoming_bus","n":"naderende bus","k":"oncoming bus|naderende bus|bus|naderend|tegemoetkomende bus|vervoermiddel|voertuig|cars|oncoming"},{"u":"1f68e","c":"Travel \u0026 Places","o":927,"x":36,"y":9,"s":"trolleybus","n":"trolleybus","k":"trolleybus|bus|tram|trolley|vervoermiddel|voertuig"},{"u":"1f690","c":"Travel \u0026 Places","o":928,"x":36,"y":11,"s":"minibus","n":"minibus","k":"minibus|bus|vervoermiddel|voertuig|drive|van|vehicle"},{"u":"1f691","c":"Travel \u0026 Places","o":929,"x":36,"y":12,"s":"ambulance","n":"ambulance","k":"ambulance|hulpdienst|spoed|vervoermiddel|voertuig|emergency|vehicle"},{"u":"1f692","c":"Travel \u0026 Places","o":930,"x":36,"y":13,"s":"fire_engine","n":"brandweerauto","k":"fire engine|brandweerauto|auto|brand|hulpdienst|spoed|vervoermiddel|voertuig|engine|fire|truck"},{"u":"1f693","c":"Travel \u0026 Places","o":931,"x":36,"y":14,"s":"police_car","n":"politieauto","k":"police car|politieauto|auto|hulpdienst|politie|politiewagen|vervoermiddel|voertuig|5–0|car|cops|patrol|police"},{"u":"1f694","c":"Travel \u0026 Places","o":932,"x":36,"y":15,"s":"oncoming_police_car","n":"naderende politieauto","k":"oncoming police car|naderende politieauto|auto|hulpdienst|naderend|politie|tegemoetkomende politiewagen|vervoermiddel|voertuig|car|oncoming|police"},{"u":"1f695","c":"Travel \u0026 Places","o":933,"x":36,"y":16,"s":"taxi","n":"taxi","k":"taxi|taxichauffeur|uber|vervoermiddel|voertuig|cab|cabbie|car|drive|vehicle|yellow"},{"u":"1f696","c":"Travel \u0026 Places","o":934,"x":36,"y":17,"s":"oncoming_taxi","n":"naderende taxi","k":"oncoming taxi|naderende taxi|auto’s|geel|naderend|rijden|roepen|taxi|cab|cabbie|cars|drove|hail|oncoming|yellow"},{"u":"1f697","c":"Travel \u0026 Places","o":935,"x":36,"y":18,"s":"car","n":"auto","k":"car|red car|automobile|auto|automobiel|rijden|vervoermiddel|voertuig|driving|vehicle"},{"u":"1f698","c":"Travel \u0026 Places","o":936,"x":36,"y":19,"s":"oncoming_automobile","n":"naderende auto","k":"oncoming automobile|naderende auto|auto|automobiel|naderend|tegemoetkomende auto|vervoermiddel|voertuig|automobile|car|cars|drove|oncoming|vehicle"},{"u":"1f699","c":"Travel \u0026 Places","o":937,"x":36,"y":20,"s":"blue_car","n":"SUV","k":"blue car|recreational vehicle|suv|auto|kampeerauto|recreatie|rijden|vervoermiddel|voertuig|sport utility vehicle|car|drive|recreational|sport|sportutility|utility|vehicle"},{"u":"1f6fb","c":"Travel \u0026 Places","o":938,"x":39,"y":8,"s":"pickup_truck","n":"pick-up","k":"pickup truck|pick-up|auto|bestelbak|laadbak|laadbakwagen|transport|truck|vervoer|vracht|wagen|automobile|car|flatbed|pickup|transportation"},{"u":"1f69a","c":"Travel \u0026 Places","o":939,"x":36,"y":21,"s":"truck","n":"bestelbus","k":"truck|delivery truck|bestelbus|bestelwagen|bezorging|bus|levering|pakketdienst|vervoermiddel|voertuig|car|delivery|drive|vehicle"},{"u":"1f69b","c":"Travel \u0026 Places","o":940,"x":36,"y":22,"s":"articulated_lorry","n":"vrachtwagen","k":"articulated lorry|vrachtwagen|truck|vervoermiddel|voertuig|vrachtauto|vrachtwagen met oplegger|articulated|car|drive|lorry|move|semi|vehicle"},{"u":"1f69c","c":"Travel \u0026 Places","o":941,"x":36,"y":23,"s":"tractor","n":"tractor","k":"tractor|trekker|vervoermiddel|voertuig|vehicle"},{"u":"1f3ce-fe0f","c":"Travel \u0026 Places","o":942,"x":10,"y":3,"s":"racing_car","n":"raceauto","k":"racing car|raceauto|auto|formule 1|racen|racewagen|vervoermiddel|voertuig|vroem|car|racing|zoom"},{"u":"1f3cd-fe0f","c":"Travel \u0026 Places","o":943,"x":10,"y":2,"s":"racing_motorcycle","n":"motor","k":"racing motorcycle|motorcycle|motor|racen|vervoermiddel|voertuig|racing"},{"u":"1f6f5","c":"Travel \u0026 Places","o":944,"x":39,"y":2,"s":"motor_scooter","n":"scooter","k":"motor scooter|scooter|brommer|motor|vervoermiddel|voertuig"},{"u":"1f9bd","c":"Travel \u0026 Places","o":945,"x":46,"y":35,"s":"manual_wheelchair","n":"rolstoel","k":"manual wheelchair|rolstoel|duwen|toegankelijkheid|zitten|accessibility|manual|wheelchair"},{"u":"1f9bc","c":"Travel \u0026 Places","o":946,"x":46,"y":34,"s":"motorized_wheelchair","n":"elektrische rolstoel","k":"motorized wheelchair|elektrische rolstoel|rijden|toegankelijkheid|wiel|accessibility|motorized|wheelchair"},{"u":"1f6fa","c":"Travel \u0026 Places","o":947,"x":39,"y":7,"s":"auto_rickshaw","n":"riksja","k":"auto rickshaw|riksja|auto|azië|thailand|tuktuk|vervoer|wagen|rickshaw|tuk"},{"u":"1f6b2","c":"Travel \u0026 Places","o":948,"x":37,"y":0,"s":"bike","n":"fiets","k":"bike|bicycle|fiets|fietsen|rijwiel|spinning|vervoermiddel|voertuig|class|cycle|cycling|cyclist|gang|ride|spin"},{"u":"1f6f4","c":"Travel \u0026 Places","o":949,"x":39,"y":1,"s":"scooter","n":"step","k":"scooter|step|autoped|steppen|vervoermiddel|voertuig|kick scooter|kick"},{"u":"1f6f9","c":"Travel \u0026 Places","o":950,"x":39,"y":6,"s":"skateboard","n":"skateboard","k":"skateboard|board|deck|skate|skaten|skater|wielen|wheels"},{"u":"1f6fc","c":"Travel \u0026 Places","o":951,"x":39,"y":9,"s":"roller_skate","n":"rolschaats","k":"roller skate|rolschaats|hobby|rollerskate|rollerskates|rolschaatsen|schaats|skaten|sport|sporten|blades|roller|skate|skates"},{"u":"1f68f","c":"Travel \u0026 Places","o":952,"x":36,"y":10,"s":"busstop","n":"bushalte","k":"busstop|bus stop|bushalte|bus|halte|stop"},{"u":"1f6e3-fe0f","c":"Travel \u0026 Places","o":953,"x":38,"y":55,"s":"motorway","n":"snelweg","k":"motorway|snelweg|autosnelweg|weg|highway|road"},{"u":"1f6e4-fe0f","c":"Travel \u0026 Places","o":954,"x":38,"y":56,"s":"railway_track","n":"treinspoor","k":"railway track|treinspoor|spoor|trein|railway|track|train"},{"u":"1f6e2-fe0f","c":"Travel \u0026 Places","o":955,"x":38,"y":54,"s":"oil_drum","n":"olievat","k":"oil drum|olievat|olie|vat|drum|oil"},{"u":"26fd","c":"Travel \u0026 Places","o":956,"x":59,"y":51,"s":"fuelpump","n":"benzinestation","k":"fuelpump|fuel pump|benzinestation|benzine|benzinepomp|brandstof|pomp|station|diesel|fuel|gas|gasoline|pump"},{"u":"1f6de","c":"Travel \u0026 Places","o":957,"x":38,"y":50,"s":"wheel","n":"wiel","k":"wheel|wiel|auto|band|cirkel|draaien|velg|velgen|vervoer|voertuig|car|circle|tire|turn|vehicle"},{"u":"1f6a8","c":"Travel \u0026 Places","o":958,"x":36,"y":52,"s":"rotating_light","n":"zwaailicht van politieauto","k":"rotating light|police cars revolving light|zwaailicht van politieauto|alarm|auto|baken|draaiend|licht|noodgeval|politie|sirene|waarschuwing|police car light|alert|beacon|car|emergency|light|police|revolving|siren"},{"u":"1f6a5","c":"Travel \u0026 Places","o":959,"x":36,"y":49,"s":"traffic_light","n":"horizontaal verkeerslicht","k":"traffic light|horizontal traffic light|horizontaal verkeerslicht|licht|stoplicht|verkeer|verkeerslichten|horizontal|intersection|light|signal|stop|stoplight|traffic"},{"u":"1f6a6","c":"Travel \u0026 Places","o":960,"x":36,"y":50,"s":"vertical_traffic_light","n":"verticaal verkeerslicht","k":"vertical traffic light|verticaal verkeerslicht|kruising|licht|stoplicht|verkeer|verkeerslicht|verkeerslichten|drove|intersection|light|signal|stop|stoplight|traffic|vertical"},{"u":"1f6d1","c":"Travel \u0026 Places","o":961,"x":38,"y":43,"s":"octagonal_sign","n":"stopteken","k":"octagonal sign|stopteken|achthoekig|bord|stop|verkeersteken|stop sign|octagonal|sign"},{"u":"1f6a7","c":"Travel \u0026 Places","o":962,"x":36,"y":51,"s":"construction","n":"bouwwerkzaamheden","k":"construction|construction sign|bouwwerkzaamheden|barricade|werkzaamheden|barrier"},{"u":"2693","c":"Travel \u0026 Places","o":963,"x":58,"y":58,"s":"anchor","n":"anker","k":"anchor|anker|hulpmiddel|schip|ship|tool"},{"u":"1f6df","c":"Travel \u0026 Places","o":964,"x":38,"y":51,"s":"ring_buoy","n":"reddingsboei","k":"ring buoy|reddingsboei|boei|drijven|redden|reddingsgordel|reddingsvest|veiligheid|verdrinken|zwemmen|buoy|float|life|lifesaver|preserver|rescue|ring|safety|save|saver|swim"},{"u":"26f5","c":"Travel \u0026 Places","o":965,"x":59,"y":29,"s":"boat","n":"zeilboot","k":"boat|sailboat|zeilboot|boot|jacht|jachthaven|vaartuig|vervoermiddel|zee|resort|sailing|sea|yacht"},{"u":"1f6f6","c":"Travel \u0026 Places","o":966,"x":39,"y":3,"s":"canoe","n":"kano","k":"canoe|kano|boot|kajak|vaartuig|vervoermiddel|boat"},{"u":"1f6a4","c":"Travel \u0026 Places","o":967,"x":36,"y":48,"s":"speedboat","n":"speedboot","k":"speedboat|speedboot|boot|jacht|luxe|miljonair|reizen|vaartuig|zomer|billionaire|boat|lake|luxury|millionaire|summer|travel"},{"u":"1f6f3-fe0f","c":"Travel \u0026 Places","o":968,"x":39,"y":0,"s":"passenger_ship","n":"passagiersschip","k":"passenger ship|passagiersschip|passagier|schip|veerboot|vervoermiddel|voertuig|passenger|ship"},{"u":"26f4-fe0f","c":"Travel \u0026 Places","o":969,"x":59,"y":28,"s":"ferry","n":"veerboot","k":"ferry|veerboot|boot|passagier|veerpont|boat|passenger"},{"u":"1f6e5-fe0f","c":"Travel \u0026 Places","o":970,"x":38,"y":57,"s":"motor_boat","n":"motorboot","k":"motor boat|motorboot|boot|vaartuig|vervoermiddel|boat|motor|motorboat"},{"u":"1f6a2","c":"Travel \u0026 Places","o":971,"x":36,"y":29,"s":"ship","n":"schip","k":"ship|schip|boot|passagier|passagiersschip|titanic|vaartuig|boat|passenger|travel"},{"u":"2708-fe0f","c":"Travel \u0026 Places","o":972,"x":59,"y":54,"s":"airplane","n":"vliegtuig","k":"airplane|vliegtuig|luchtvaartuig|reizen|vervoermiddel|vliegen|vliegmachine|aeroplane|fly|flying|jet|plane|travel"},{"u":"1f6e9-fe0f","c":"Travel \u0026 Places","o":973,"x":38,"y":58,"s":"small_airplane","n":"vliegtuigje","k":"small airplane|vliegtuigje|jet|klein vliegtuig|luchtvaartuig|vervoermiddel|vliegmachine|vliegtuig|aeroplane|airplane|plane|small"},{"u":"1f6eb","c":"Travel \u0026 Places","o":974,"x":38,"y":59,"s":"airplane_departure","n":"vertrek van vliegtuig","k":"airplane departure|vertrek van vliegtuig|inchecken|opstijgen|vertrek|vertrekken|vervoermiddel|vliegmachine|vliegtuig|voertuig|aeroplane|airplane|check-in|departure|departures|plane"},{"u":"1f6ec","c":"Travel \u0026 Places","o":975,"x":38,"y":60,"s":"airplane_arriving","n":"aankomst van vliegtuig","k":"airplane arriving|aankomst van vliegtuig|aankomen|aankomst|landen|landing|vervoermiddel|vliegmachine|vliegtuig|voertuig|airplane arrival|aeroplane|airplane|arrival|arrivals|arriving|plane"},{"u":"1fa82","c":"Travel \u0026 Places","o":976,"x":55,"y":3,"s":"parachute","n":"parachute","k":"parachute|activiteit|deltavliegen|hanggliden|parachutespringen|parasailen|skydiven|hang-glide|parasail|skydive"},{"u":"1f4ba","c":"Travel \u0026 Places","o":977,"x":28,"y":47,"s":"seat","n":"stoel","k":"seat|stoel|treinstoel|vliegtuigstoel|chair"},{"u":"1f681","c":"Travel \u0026 Places","o":978,"x":35,"y":58,"s":"helicopter","n":"helikopter","k":"helicopter|helikopter|roflcopter|roflkopter|vervoermiddel|voertuig|copter|travel|vehicle"},{"u":"1f69f","c":"Travel \u0026 Places","o":979,"x":36,"y":26,"s":"suspension_railway","n":"zweeftrein","k":"suspension railway|zweeftrein|hangend spoor|spoor|vervoermiddel|voertuig|zwevend|railway|suspension"},{"u":"1f6a0","c":"Travel \u0026 Places","o":980,"x":36,"y":27,"s":"mountain_cableway","n":"bergkabelbaan","k":"mountain cableway|bergkabelbaan|berg|gondel|kabel|skilift|vervoermiddel|voertuig|cable|cableway|gondola|lift|mountain|ski"},{"u":"1f6a1","c":"Travel \u0026 Places","o":981,"x":36,"y":28,"s":"aerial_tramway","n":"kabelbaan","k":"aerial tramway|kabelbaan|baan|gondel|kabel|transportbaan|vervoermiddel|voertuig|aerial|cable|car|gondola|ropeway|tramway"},{"u":"1f6f0-fe0f","c":"Travel \u0026 Places","o":982,"x":38,"y":61,"s":"satellite","n":"satelliet","k":"satellite|satelliet|ruimte|ruimtevaart|space"},{"u":"1f680","c":"Travel \u0026 Places","o":983,"x":35,"y":57,"s":"rocket","n":"raket","k":"rocket|raket|lancering|ruimte|ruimtereis|vervoermiddel|voertuig|launch|rockets|space|travel"},{"u":"1f6f8","c":"Travel \u0026 Places","o":984,"x":39,"y":5,"s":"flying_saucer","n":"vliegende schotel","k":"flying saucer|vliegende schotel|aliens|buitenaards|buitenaardse wezens|science fiction|ufo|vervoermiddel|voertuig|extra|flying|saucer|terrestrial"},{"u":"1f6ce-fe0f","c":"Travel \u0026 Places","o":985,"x":38,"y":40,"s":"bellhop_bell","n":"piccolobel","k":"bellhop bell|piccolobel|balie|baliebel|bel|hotel|bell|bellhop"},{"u":"1f9f3","c":"Travel \u0026 Places","o":986,"x":54,"y":37,"s":"luggage","n":"bagage","k":"luggage|bagage|inpakken|koffer|reis|reizen|rolkoffer|trolley|bag|packing|roller|suitcase|travel"},{"u":"231b","c":"Travel \u0026 Places","o":987,"x":57,"y":44,"s":"hourglass","n":"zandloper","k":"hourglass|zandloper|tijd|timer|zand|hourglass done|done|sand|time"},{"u":"23f3","c":"Travel \u0026 Places","o":988,"x":57,"y":57,"s":"hourglass_flowing_sand","n":"zandloper met stromend zand","k":"hourglass flowing sand|hourglass with flowing sand|zandloper met stromend zand|tijd|timer|zand|zandloper|hourglass not done|done|flowing|hourglass|hours|not|sand|waiting|yolo"},{"u":"231a","c":"Travel \u0026 Places","o":989,"x":57,"y":43,"s":"watch","n":"horloge","k":"watch|horloge|klok|polshorloge|tijd|clock|time"},{"u":"23f0","c":"Travel \u0026 Places","o":990,"x":57,"y":54,"s":"alarm_clock","n":"wekker","k":"alarm clock|wekker|alarm|klok|tijd|clock|hours|hrs|late|time|waiting"},{"u":"23f1-fe0f","c":"Travel \u0026 Places","o":991,"x":57,"y":55,"s":"stopwatch","n":"stopwatch","k":"stopwatch|klok|timer|clock|time"},{"u":"23f2-fe0f","c":"Travel \u0026 Places","o":992,"x":57,"y":56,"s":"timer_clock","n":"keukenwekker","k":"timer clock|keukenwekker|klok|kookwekker|timer|clock"},{"u":"1f570-fe0f","c":"Travel \u0026 Places","o":993,"x":31,"y":23,"s":"mantelpiece_clock","n":"klok","k":"mantelpiece clock|klok|pendule|staande klok|tijd|clock|mantelpiece|time"},{"u":"1f55b","c":"Travel \u0026 Places","o":994,"x":31,"y":9,"s":"clock12","n":"twaalf uur","k":"clock12|clock face twelve oclock|twaalf uur|00|12|12:00|klok|tijd|twaalf|uur|twelve o’clock|clock|o’clock|time|twelve"},{"u":"1f567","c":"Travel \u0026 Places","o":995,"x":31,"y":21,"s":"clock1230","n":"half één","k":"clock1230|clock face twelve-thirty|half één|00:30|12|12:30|30|dertig|klok|tijd|twaalf|uur|twelve-thirty|clock|thirty|time|twelve"},{"u":"1f550","c":"Travel \u0026 Places","o":996,"x":30,"y":60,"s":"clock1","n":"één uur","k":"clock1|clock face one oclock|één uur|00|01:00|1|1:00|13:00|één|klok|tijd|uur|one o’clock|clock|o’clock|one|time"},{"u":"1f55c","c":"Travel \u0026 Places","o":997,"x":31,"y":10,"s":"clock130","n":"half twee","k":"clock130|clock face one-thirty|half twee|1|1:30|13:30|30|dertig|een|één|klok|tijd|one-thirty|clock|one|thirty|time"},{"u":"1f551","c":"Travel \u0026 Places","o":998,"x":30,"y":61,"s":"clock2","n":"twee uur","k":"clock2|clock face two oclock|twee uur|00|02:00|14:00|2|2:00|klok|tijd|twee|uur|two o’clock|clock|o’clock|time|two"},{"u":"1f55d","c":"Travel \u0026 Places","o":999,"x":31,"y":11,"s":"clock230","n":"half drie","k":"clock230|clock face two-thirty|half drie|14:30|2|2:30|30|dertig|klok|tijd|twee|two-thirty|clock|thirty|time|two"},{"u":"1f552","c":"Travel \u0026 Places","o":1000,"x":31,"y":0,"s":"clock3","n":"drie uur","k":"clock3|clock face three oclock|drie uur|00|03:00|15:00|3|3:00|drie|klok|tijd|uur|three o’clock|clock|o’clock|three|time"},{"u":"1f55e","c":"Travel \u0026 Places","o":1001,"x":31,"y":12,"s":"clock330","n":"half vier","k":"clock330|clock face three-thirty|half vier|15:30|3|3:30|30|dertig|drie|klok|tijd|three-thirty|clock|thirty|three|time"},{"u":"1f553","c":"Travel \u0026 Places","o":1002,"x":31,"y":1,"s":"clock4","n":"vier uur","k":"clock4|clock face four oclock|vier uur|00|04:00|16:00|4|4:00|klok|tijd|uur|vier|four o’clock|clock|four|o’clock|time"},{"u":"1f55f","c":"Travel \u0026 Places","o":1003,"x":31,"y":13,"s":"clock430","n":"half vijf","k":"clock430|clock face four-thirty|half vijf|16:30|30|4|4:30|dertig|klok|tijd|vier|four-thirty|clock|four|thirty|time"},{"u":"1f554","c":"Travel \u0026 Places","o":1004,"x":31,"y":2,"s":"clock5","n":"vijf uur","k":"clock5|clock face five oclock|vijf uur|00|05:00|17:00|5|5:00|klok|uur|vijf|five o’clock|clock|five|o’clock|time"},{"u":"1f560","c":"Travel \u0026 Places","o":1005,"x":31,"y":14,"s":"clock530","n":"half zes","k":"clock530|clock face five-thirty|half zes|05:30|17:30|30|5|5:30|dertig|klok|tijd|vijf|five-thirty|clock|five|thirty|time"},{"u":"1f555","c":"Travel \u0026 Places","o":1006,"x":31,"y":3,"s":"clock6","n":"zes uur","k":"clock6|clock face six oclock|zes uur|00|06:00|18:00|6|6:00|klok|tijd|uur|zes|six o’clock|clock|o’clock|six|time"},{"u":"1f561","c":"Travel \u0026 Places","o":1007,"x":31,"y":15,"s":"clock630","n":"half zeven","k":"clock630|clock face six-thirty|half zeven|06:30|18:30|30|6|6:30|dertig|klok|tijd|zes|six-thirty|clock|six|thirty"},{"u":"1f556","c":"Travel \u0026 Places","o":1008,"x":31,"y":4,"s":"clock7","n":"zeven uur","k":"clock7|clock face seven oclock|zeven uur|00|07:00|19:00|7|7:00|klok|tijd|uur|zeven|seven o’clock|0|clock|o’clock|seven"},{"u":"1f562","c":"Travel \u0026 Places","o":1009,"x":31,"y":16,"s":"clock730","n":"half acht","k":"clock730|clock face seven-thirty|half acht|07:30|19:30|30|7|7:30|dertig|klok|tijd|zeven|seven-thirty|clock|seven|thirty"},{"u":"1f557","c":"Travel \u0026 Places","o":1010,"x":31,"y":5,"s":"clock8","n":"acht uur","k":"clock8|clock face eight oclock|acht uur|00|08:00|20:00|8|8:00|acht|klok|tijd|uur|eight o’clock|clock|eight|o’clock|time"},{"u":"1f563","c":"Travel \u0026 Places","o":1011,"x":31,"y":17,"s":"clock830","n":"half negen","k":"clock830|clock face eight-thirty|half negen|08:30|20:30|30|8|8:30|acht|dertig|klok|tijd|eight-thirty|clock|eight|thirty|time"},{"u":"1f558","c":"Travel \u0026 Places","o":1012,"x":31,"y":6,"s":"clock9","n":"negen uur","k":"clock9|clock face nine oclock|negen uur|00|09:00|21:00|9|9:00|klok|negen|tijd|uur|nine o’clock|clock|nine|o’clock|time"},{"u":"1f564","c":"Travel \u0026 Places","o":1013,"x":31,"y":18,"s":"clock930","n":"half tien","k":"clock930|clock face nine-thirty|half tien|09:30|21:30|30|9|9:30|dertig|klok|negen|tijd|nine-thirty|clock|nine|thirty|time"},{"u":"1f559","c":"Travel \u0026 Places","o":1014,"x":31,"y":7,"s":"clock10","n":"tien uur","k":"clock10|clock face ten oclock|tien uur|00|10|10:00|22:00|klok|tien|tijd|uur|ten o’clock|0|clock|o’clock|ten"},{"u":"1f565","c":"Travel \u0026 Places","o":1015,"x":31,"y":19,"s":"clock1030","n":"half elf","k":"clock1030|clock face ten-thirty|half elf|10|10:30|22:30|30|dertig|klok|tien|tijd|ten-thirty|clock|ten|thirty|time"},{"u":"1f55a","c":"Travel \u0026 Places","o":1016,"x":31,"y":8,"s":"clock11","n":"elf uur","k":"clock11|clock face eleven oclock|elf uur|00|11|11:00|23:00|elf|klok|tijd|uur|eleven o’clock|clock|eleven|o’clock|time"},{"u":"1f566","c":"Travel \u0026 Places","o":1017,"x":31,"y":20,"s":"clock1130","n":"half twaalf","k":"clock1130|clock face eleven-thirty|half twaalf|11|11:30|23:30|30|dertig|elf|klok|tijd|eleven-thirty|clock|eleven|thirty|time"},{"u":"1f311","c":"Travel \u0026 Places","o":1018,"x":5,"y":11,"s":"new_moon","n":"nieuwe maan","k":"new moon|new moon symbol|nieuwe maan|avond|donker|maan|maansverduistering|ruimte|dark|moon|new|space"},{"u":"1f312","c":"Travel \u0026 Places","o":1019,"x":5,"y":12,"s":"waxing_crescent_moon","n":"jonge maansikkel","k":"waxing crescent moon|waxing crescent moon symbol|jonge maansikkel|avond|maan|ruimte|sikkel|wassend|wassende halvemaan|crescent|dreams|moon|space|waxing"},{"u":"1f313","c":"Travel \u0026 Places","o":1020,"x":5,"y":13,"s":"first_quarter_moon","n":"maan in eerste kwartier","k":"first quarter moon|first quarter moon symbol|maan in eerste kwartier|avond|kwartier|maan|ruimte|first|moon|quarter|space"},{"u":"1f314","c":"Travel \u0026 Places","o":1021,"x":5,"y":14,"s":"moon","n":"wassende maan","k":"moon|waxing gibbous moon|waxing gibbous moon symbol|wassende maan|avond|bolvormig|maan|ruimte|tussen halve maan en volle maan|wassend|gibbous|space|waxing"},{"u":"1f315","c":"Travel \u0026 Places","o":1022,"x":5,"y":15,"s":"full_moon","n":"volle maan","k":"full moon|full moon symbol|volle maan|avond|maan|ruimte|vol|full|moon|space"},{"u":"1f316","c":"Travel \u0026 Places","o":1023,"x":5,"y":16,"s":"waning_gibbous_moon","n":"afnemende maan","k":"waning gibbous moon|waning gibbous moon symbol|afnemende maan|afnemend|avond|bolvormig|maan|ruimte|tussen halve maan en volle maan|wassend|gibbous|moon|space|waning"},{"u":"1f317","c":"Travel \u0026 Places","o":1024,"x":5,"y":17,"s":"last_quarter_moon","n":"maan in laatste kwartier","k":"last quarter moon|last quarter moon symbol|maan in laatste kwartier|avond|kwartier|maan|ruimte|last|moon|quarter|space"},{"u":"1f318","c":"Travel \u0026 Places","o":1025,"x":5,"y":18,"s":"waning_crescent_moon","n":"asgrauwe maan","k":"waning crescent moon|waning crescent moon symbol|asgrauwe maan|afnemend|afnemende halvemaan|avond|maan|maansikkel|nacht|ruimte|sikkel|crescent|moon|space|waning"},{"u":"1f319","c":"Travel \u0026 Places","o":1026,"x":5,"y":19,"s":"crescent_moon","n":"maansikkel","k":"crescent moon|maansikkel|avond|halvemaan|maan|ramadan|ruimte|sikkel|slapen|crescent|moon|space"},{"u":"1f31a","c":"Travel \u0026 Places","o":1027,"x":5,"y":20,"s":"new_moon_with_face","n":"nieuwe maan met gezicht","k":"new moon with face|nieuwe maan met gezicht|avond|gezicht|maan|nieuwe maan-gezicht|ruimte|new moon face|face|moon|new|space"},{"u":"1f31b","c":"Travel \u0026 Places","o":1028,"x":5,"y":21,"s":"first_quarter_moon_with_face","n":"maan met gezicht in eerste kwartier","k":"first quarter moon with face|maan met gezicht in eerste kwartier|avond|eerste kwartier|gezicht|kwartier|maan|maan in eerste kwartier met gezicht|ruimte|slapen|first quarter moon face|face|first|moon|quarter|space"},{"u":"1f31c","c":"Travel \u0026 Places","o":1029,"x":5,"y":22,"s":"last_quarter_moon_with_face","n":"maan met gezicht in laatste kwartier","k":"last quarter moon with face|maan met gezicht in laatste kwartier|avond|gezicht|kwartier|laatste kwartier|maan|maan in laatste kwartier met gezicht|ruimte|slapen|last quarter moon face|dreams|face|last|moon|quarter"},{"u":"1f321-fe0f","c":"Travel \u0026 Places","o":1030,"x":5,"y":27,"s":"thermometer","n":"thermometer","k":"thermometer|koorts|weer|weather"},{"u":"2600-fe0f","c":"Travel \u0026 Places","o":1031,"x":58,"y":8,"s":"sunny","n":"zon","k":"sunny|black sun with rays|zon|felle zon|helder|stralen|weer|zonnig|sun|bright|rays|space|weather"},{"u":"1f31d","c":"Travel \u0026 Places","o":1032,"x":5,"y":23,"s":"full_moon_with_face","n":"volle maan met gezicht","k":"full moon with face|volle maan met gezicht|avond|gezicht|helder|heldere maan|maan|ruimte|vol|volle maan|full moon face|bright|face|full|moon"},{"u":"1f31e","c":"Travel \u0026 Places","o":1033,"x":5,"y":24,"s":"sun_with_face","n":"zon met gezicht","k":"sun with face|zon met gezicht|gezicht|helder|warm|weer|zon|zonneschijn|beach|bright|day|face|heat|shine|sun|sunny|sunshine|weather"},{"u":"1fa90","c":"Travel \u0026 Places","o":1034,"x":55,"y":10,"s":"ringed_planet","n":"planeet met ringen","k":"ringed planet|planeet met ringen|heelal|planeet|ringen|ruimte|saturnus|zonnestelsel|zwaarmoedig|planet|ringed|saturn|saturnine"},{"u":"2b50","c":"Travel \u0026 Places","o":1035,"x":60,"y":52,"s":"star","n":"witte middelgrote ster","k":"star|white medium star|witte middelgrote ster|ster|astronomy|medium|stars|white"},{"u":"1f31f","c":"Travel \u0026 Places","o":1036,"x":5,"y":25,"s":"star2","n":"stralende ster","k":"star2|glowing star|stralende ster|fonkelen|fonkelend|schitteren|schitterend|schittering|ster|stralen|glittery|glow|glowing|night|shining|sparkle|star|win"},{"u":"1f320","c":"Travel \u0026 Places","o":1037,"x":5,"y":26,"s":"stars","n":"vallende ster","k":"stars|shooting star|vallende ster|hemel|ruimte|ster|vallen|vallend|falling|night|shooting|space|star"},{"u":"1f30c","c":"Travel \u0026 Places","o":1038,"x":5,"y":6,"s":"milky_way","n":"melkweg","k":"milky way|melkweg|ruimte|milky|space|way"},{"u":"2601-fe0f","c":"Travel \u0026 Places","o":1039,"x":58,"y":9,"s":"cloud","n":"wolk","k":"cloud|wolk|weer|weather"},{"u":"26c5","c":"Travel \u0026 Places","o":1040,"x":59,"y":14,"s":"partly_sunny","n":"zon achter wolk","k":"partly sunny|sun behind cloud|zon achter wolk|weer|wolk|zon|zon achter wolken|behind|cloud|cloudy|sun|weather"},{"u":"26c8-fe0f","c":"Travel \u0026 Places","o":1041,"x":59,"y":15,"s":"thunder_cloud_and_rain","n":"wolk met bliksem en regen","k":"thunder cloud and rain|cloud with lightning and rain|wolk met bliksem en regen|onweer|regen|weer|wolk|cloud|lightning|rain|thunder|thunderstorm"},{"u":"1f324-fe0f","c":"Travel \u0026 Places","o":1042,"x":5,"y":28,"s":"mostly_sunny","n":"zon achter kleine wolk","k":"mostly sunny|sun small cloud|sun behind small cloud|zon achter kleine wolk|weer|wolk|zon|behind|cloud|sun|weather"},{"u":"1f325-fe0f","c":"Travel \u0026 Places","o":1043,"x":5,"y":29,"s":"barely_sunny","n":"zon achter grote wolk","k":"barely sunny|sun behind cloud|sun behind large cloud|zon achter grote wolk|weer|wolk|zon|behind|cloud|sun|weather"},{"u":"1f326-fe0f","c":"Travel \u0026 Places","o":1044,"x":5,"y":30,"s":"partly_sunny_rain","n":"zon achter regenwolk","k":"partly sunny rain|sun behind rain cloud|zon achter regenwolk|regen|weer|wolk|zon|zon achter wolk met regen|behind|cloud|rain|sun|weather"},{"u":"1f327-fe0f","c":"Travel \u0026 Places","o":1045,"x":5,"y":31,"s":"rain_cloud","n":"wolk met regen","k":"rain cloud|cloud with rain|wolk met regen|regen|weer|wolk|cloud|rain|weather"},{"u":"1f328-fe0f","c":"Travel \u0026 Places","o":1046,"x":5,"y":32,"s":"snow_cloud","n":"wolk met sneeuw","k":"snow cloud|cloud with snow|wolk met sneeuw|koud|sneeuw|weer|winter|wolk|cloud|cold|snow|weather"},{"u":"1f329-fe0f","c":"Travel \u0026 Places","o":1047,"x":5,"y":33,"s":"lightning","n":"wolk met bliksem","k":"lightning|lightning cloud|cloud with lightning|wolk met bliksem|bliksem|weer|wolk|cloud|weather"},{"u":"1f32a-fe0f","c":"Travel \u0026 Places","o":1048,"x":5,"y":34,"s":"tornado","n":"tornado","k":"tornado|tornado cloud|storm|weer|wervelwind|wolk|cloud|weather|whirlwind"},{"u":"1f32b-fe0f","c":"Travel \u0026 Places","o":1049,"x":5,"y":35,"s":"fog","n":"mist","k":"fog|mist|bewolkt|weer|wolk|cloud|weather"},{"u":"1f32c-fe0f","c":"Travel \u0026 Places","o":1050,"x":5,"y":36,"s":"wind_blowing_face","n":"gezicht dat wind blaast","k":"wind blowing face|wind face|gezicht dat wind blaast|blazen|gezicht|weer|wind|wind met gezicht|wolk|blow|cloud|face"},{"u":"1f300","c":"Travel \u0026 Places","o":1051,"x":4,"y":56,"s":"cyclone","n":"cycloon","k":"cyclone|cycloon|duizelig|spiraal|twister|tyfoon|weer|dizzy|hurricane|typhoon|weather"},{"u":"1f308","c":"Travel \u0026 Places","o":1052,"x":5,"y":2,"s":"rainbow","n":"regenboog","k":"rainbow|regenboog|genderqueer|glbt|homoseksueel|lesbisch|lgbt|lgbtq|lgtbqia|lhbt|natuur|pride|queer|regen|transgender|weer|gay|glbtq|lesbian|lgbtqia|nature|rain|trans|weather"},{"u":"1f302","c":"Travel \u0026 Places","o":1053,"x":4,"y":58,"s":"closed_umbrella","n":"ingevouwen paraplu","k":"closed umbrella|ingevouwen paraplu|dichte paraplu|kleding|paraplu|regen|weer|closed|clothing|rain|umbrella"},{"u":"2602-fe0f","c":"Travel \u0026 Places","o":1054,"x":58,"y":10,"s":"umbrella","n":"paraplu","k":"umbrella|paraplu|geopende paraplu|kleding|open paraplu|regen|weer|clothing|rain"},{"u":"2614","c":"Travel \u0026 Places","o":1055,"x":58,"y":15,"s":"umbrella_with_rain_drops","n":"paraplu met regendruppels","k":"umbrella with rain drops|paraplu met regendruppels|druppels|kleding|paraplu|regen|weer|clothing|drop|drops|rain|umbrella|weather"},{"u":"26f1-fe0f","c":"Travel \u0026 Places","o":1056,"x":59,"y":25,"s":"umbrella_on_ground","n":"strandparasol","k":"umbrella on ground|strandparasol|parasol|parasol op de grond|regen|zon|ground|rain|sun|umbrella"},{"u":"26a1","c":"Travel \u0026 Places","o":1057,"x":59,"y":5,"s":"zap","n":"hoog voltage","k":"zap|high voltage sign|hoog voltage|bliksem|donderslag|elektriciteit|elektrisch|gevaar|schok|spanning|voltage|high voltage|danger|electric|electricity|high|lightning|nature|thunder|thunderbolt"},{"u":"2744-fe0f","c":"Travel \u0026 Places","o":1058,"x":60,"y":27,"s":"snowflake","n":"sneeuwvlok","k":"snowflake|sneeuwvlok|koud|sneeuw|weer|cold|snow|weather"},{"u":"2603-fe0f","c":"Travel \u0026 Places","o":1059,"x":58,"y":11,"s":"snowman","n":"sneeuwpop","k":"snowman|sneeuwpop|koud|sneeuw|weer|cold|man|snow"},{"u":"26c4","c":"Travel \u0026 Places","o":1060,"x":59,"y":13,"s":"snowman_without_snow","n":"sneeuwpop zonder sneeuwvlokken","k":"snowman without snow|sneeuwpop zonder sneeuwvlokken|koud|sneeuw|sneeuwpop|cold|man|snow|snowman"},{"u":"2604-fe0f","c":"Travel \u0026 Places","o":1061,"x":58,"y":12,"s":"comet","n":"komeet","k":"comet|komeet|ruimte|vuurbal|space"},{"u":"1f525","c":"Travel \u0026 Places","o":1062,"x":30,"y":29,"s":"fire","n":"vuur","k":"fire|vuur|brand|heet|hulpmiddel|vlam|af|burn|flame|hot|lit|litaf|tool"},{"u":"1f4a7","c":"Travel \u0026 Places","o":1063,"x":28,"y":23,"s":"droplet","n":"druppel","k":"droplet|druppel|bedroefd|koud|strip|water|weer|zweet|cold|comic|drop|nature|sad|sweat|tear|weather"},{"u":"1f30a","c":"Travel \u0026 Places","o":1064,"x":5,"y":4,"s":"ocean","n":"golf","k":"ocean|water wave|golf|golfsurfen|golven|japan|kanagawa|oceaan|surfen|water|weer|zee|nature|surf|surfer|surfing|wave"},{"u":"1f383","c":"Activities","o":1065,"x":7,"y":1,"s":"jack_o_lantern","n":"halloweenlantaarn","k":"jack o lantern|jack-o-lantern|halloweenlantaarn|feest|halloween|lampion|lantaarn|pompoen|pompoenlantaarn|sint maarten|celebration|jack|lantern|pumpkin"},{"u":"1f384","c":"Activities","o":1066,"x":7,"y":2,"s":"christmas_tree","n":"kerstboom","k":"christmas tree|kerstboom|boom|feest|kerstmis|viering|celebration|christmas|tree"},{"u":"1f386","c":"Activities","o":1067,"x":7,"y":9,"s":"fireworks","n":"vuurwerk","k":"fireworks|vuurwerk|feest|jaarwisseling|knal|oud en nieuw|oudejaarsavond|vermaak|viering|boom|celebration|entertainment|yolo"},{"u":"1f387","c":"Activities","o":1068,"x":7,"y":10,"s":"sparkler","n":"sterretje","k":"sparkler|firework sparkler|sterretje|afsteken|feest|jaarwisseling|knal|oud en nieuw|oudejaarsavond|viering|vuurwerk|vuurwerksterretje|boom|celebration|fireworks|sparkle"},{"u":"1f9e8","c":"Activities","o":1069,"x":54,"y":26,"s":"firecracker","n":"rotje","k":"firecracker|rotje|boem|dynamiet|explosief|licht|ontploffing|vonk|vuur|vuurwerk|dynamite|explosive|fire|fireworks|light|pop|popping|spark"},{"u":"2728","c":"Activities","o":1070,"x":60,"y":24,"s":"sparkles","n":"sterretjes","k":"sparkles|sterretjes|*|glinsteren|glinsterende sterren|ster|magic|sparkle|star"},{"u":"1f388","c":"Activities","o":1071,"x":7,"y":11,"s":"balloon","n":"ballon","k":"balloon|ballon|feest|jarig|verjaardag|vieren|viering|birthday|celebrate|celebration"},{"u":"1f389","c":"Activities","o":1072,"x":7,"y":12,"s":"tada","n":"feestknaller","k":"tada|party popper|feestknaller|confetti|feest|hoera|jarig|knaller|partypopper|verjaardag|viering|awesome|birthday|celebrate|celebration|excited|hooray|party|popper|woohoo"},{"u":"1f38a","c":"Activities","o":1073,"x":7,"y":13,"s":"confetti_ball","n":"confettibal","k":"confetti ball|confettibal|bal|confetti|feest|hoera|jarig|verjaardag|viering|ball|celebrate|celebration|party|woohoo"},{"u":"1f38b","c":"Activities","o":1074,"x":7,"y":14,"s":"tanabata_tree","n":"tanabataboom","k":"tanabata tree|tanabataboom|boom|boom met papierlinten|feest|japans|papierlinten|tanabata|banner|celebration|japanese|tree"},{"u":"1f38d","c":"Activities","o":1075,"x":7,"y":16,"s":"bamboo","n":"dennenboomversiering","k":"bamboo|pine decoration|dennenboomversiering|bamboe|den|dennentakdecoratie|feest|japans|plant|celebration|decoration|japanese|pine"},{"u":"1f38e","c":"Activities","o":1076,"x":7,"y":17,"s":"dolls","n":"Japanse poppen","k":"dolls|japanese dolls|japanse poppen|feest|festival|japans|pop|poppen|viering|celebration|doll|japanese"},{"u":"1f38f","c":"Activities","o":1077,"x":7,"y":18,"s":"flags","n":"karperslinger","k":"flags|carp streamer|karperslinger|feest|karper|karpers|karperwimpel|slinger|wimpel|carp|celebration|streamer"},{"u":"1f390","c":"Activities","o":1078,"x":7,"y":19,"s":"wind_chime","n":"windorgel","k":"wind chime|windorgel|bel|feest|wind|windklokkenspel|bell|celebration|chime"},{"u":"1f391","c":"Activities","o":1079,"x":7,"y":20,"s":"rice_scene","n":"maanobservatieceremonie","k":"rice scene|moon viewing ceremony|maanobservatieceremonie|ceremonie|feest|maan|maanceremonie|viering|celebration|ceremony|moon|viewing"},{"u":"1f9e7","c":"Activities","o":1080,"x":54,"y":25,"s":"red_envelope","n":"rode envelop","k":"red envelope|red gift envelope|rode envelop|cadeau|geld|geluk|geschenk|hóngbāo|lai see|rode enveloppe|voorspoed|envelope|gift|good|lai|luck|money|red|see"},{"u":"1f380","c":"Activities","o":1081,"x":6,"y":60,"s":"ribbon","n":"strik","k":"ribbon|strik|feest|roze lint|viering|celebration"},{"u":"1f381","c":"Activities","o":1082,"x":6,"y":61,"s":"gift","n":"ingepakt cadeau","k":"gift|wrapped present|ingepakt cadeau|cadeau|cadeautje|cadeauverpakking met strik|feest|ingepakt|verpakking|wrapped gift|birthday|bow|box|celebration|christmas|present|surprise|wrapped"},{"u":"1f397-fe0f","c":"Activities","o":1083,"x":7,"y":24,"s":"reminder_ribbon","n":"bewustzijnslintje","k":"reminder ribbon|bewustzijnslintje|herinnering|herinneringslintje|lintje|viering|celebration|reminder|ribbon"},{"u":"1f39f-fe0f","c":"Activities","o":1084,"x":7,"y":29,"s":"admission_tickets","n":"entreekaartjes","k":"admission tickets|entreekaartjes|entree|kaartje|toegang|toegangskaartje|admission|ticket|tickets"},{"u":"1f3ab","c":"Activities","o":1085,"x":7,"y":41,"s":"ticket","n":"ticket","k":"ticket|entree|entreekaartje|kaartje|toegang|toegangskaartje|admission|stub"},{"u":"1f396-fe0f","c":"Activities","o":1086,"x":7,"y":23,"s":"medal","n":"militaire medaille","k":"medal|military medal|militaire medaille|medaille|militair|onderscheiding|viering|award|celebration|military"},{"u":"1f3c6","c":"Activities","o":1087,"x":9,"y":1,"s":"trophy","n":"trofee","k":"trophy|trofee|beker|gewonnen|kampioen|overwinning|prijs|winnaar|champion|champs|prize|slay|sport|victory|win|winning"},{"u":"1f3c5","c":"Activities","o":1088,"x":9,"y":0,"s":"sports_medal","n":"sportmedaille","k":"sports medal|sportmedaille|eerste|eerste plaats|gewonnen|medaille|medaille 1e plaats|medaille met ster|winnaar|award|gold|medal|sports|winner"},{"u":"1f947","c":"Activities","o":1089,"x":43,"y":53,"s":"first_place_medal","n":"medaille 1e plaats","k":"first place medal|medaille 1e plaats|eerste|gewonnen|goud|gouden|medaille|winnaar|1st place medal|1st|first|gold|medal|place"},{"u":"1f948","c":"Activities","o":1090,"x":43,"y":54,"s":"second_place_medal","n":"medaille 2e plaats","k":"second place medal|medaille 2e plaats|medaille|tweede|tweede plaats|zilver|2nd place medal|2nd|medal|place|second|silver"},{"u":"1f949","c":"Activities","o":1091,"x":43,"y":55,"s":"third_place_medal","n":"medaille 3e plaats","k":"third place medal|medaille 3e plaats|brons|bronzen|derde|derde plaats|medaille|3rd place medal|3rd|bronze|medal|place|third"},{"u":"26bd","c":"Activities","o":1092,"x":59,"y":11,"s":"soccer","n":"Georgische lari","k":"soccer|soccer ball|georgische lari|georgian lari"},{"u":"26be","c":"Activities","o":1093,"x":59,"y":12,"s":"baseball","n":"Georgische lari","k":"baseball|georgische lari|georgian lari"},{"u":"1f94e","c":"Activities","o":1094,"x":43,"y":60,"s":"softball","n":"softbal","k":"softball|softbal|bal|handschoen|onderarm|onderhands|sport|werpen|ball|glove|sports|underarm"},{"u":"1f3c0","c":"Activities","o":1095,"x":8,"y":0,"s":"basketball","n":"basketbal","k":"basketball|basketball and hoop|basketbal|bal|basket|sport|ball|hoop"},{"u":"1f3d0","c":"Activities","o":1096,"x":10,"y":5,"s":"volleyball","n":"volleybal","k":"volleyball|volleybal|bal|wedstrijd|ball|game"},{"u":"1f3c8","c":"Activities","o":1097,"x":9,"y":8,"s":"football","n":"american football","k":"football|american football|amerikaans|bal|sport|super bowl|american|ball|bowl|super"},{"u":"1f3c9","c":"Activities","o":1098,"x":9,"y":9,"s":"rugby_football","n":"rugby","k":"rugby football|rugby|bal|football|sport|voetbal|ball"},{"u":"1f3be","c":"Activities","o":1099,"x":7,"y":60,"s":"tennis","n":"tennis","k":"tennis|tennis racquet and ball|bal|sport|tennisbal|tennisracket|ball|racquet"},{"u":"1f94f","c":"Activities","o":1100,"x":43,"y":61,"s":"flying_disc","n":"frisbee","k":"flying disc|frisbee|schijf|ultiem|ultimate|vliegende schotel|werpschotel|disc|flying"},{"u":"1f3b3","c":"Activities","o":1101,"x":7,"y":49,"s":"bowling","n":"bowlen","k":"bowling|bowlen|bal|spel|sport|strike|ball|game"},{"u":"1f3cf","c":"Activities","o":1102,"x":10,"y":4,"s":"cricket_bat_and_ball","n":"cricket","k":"cricket bat and ball|cricket|bal|bat|cricketbat|cricketbat en bal|slaghout|sport|wedstrijd|cricket game|ball|game"},{"u":"1f3d1","c":"Activities","o":1103,"x":10,"y":6,"s":"field_hockey_stick_and_ball","n":"hockey","k":"field hockey stick and ball|hockey|bal|hockeystick|hockeystick en bal|sport|stick|veld|wedstrijd|field hockey|ball|field|game"},{"u":"1f3d2","c":"Activities","o":1104,"x":10,"y":7,"s":"ice_hockey_stick_and_puck","n":"ijshockeystick en puck","k":"ice hockey stick and puck|ijshockeystick en puck|ijs|ijshockey|puck|sport|stick|wedstrijd|ice hockey|game|hockey|ice"},{"u":"1f94d","c":"Activities","o":1105,"x":43,"y":59,"s":"lacrosse","n":"lacrosse","k":"lacrosse|lacrosse stick and ball|bal|doel|sport|stick|ball|goal|sports"},{"u":"1f3d3","c":"Activities","o":1106,"x":10,"y":8,"s":"table_tennis_paddle_and_ball","n":"pingpong","k":"table tennis paddle and ball|pingpong|bal|bat|batje|sport|tafeltennis|wedstrijd|ping pong|ball|game|paddle|ping|pong|table|tennis"},{"u":"1f3f8","c":"Activities","o":1107,"x":10,"y":48,"s":"badminton_racquet_and_shuttlecock","n":"badminton","k":"badminton racquet and shuttlecock|badminton|badmintonracket en shuttle|pluimbal|racket|shuttle|sport|wedstrijd|birdie|game|racquet|shuttlecock"},{"u":"1f94a","c":"Activities","o":1108,"x":43,"y":56,"s":"boxing_glove","n":"bokshandschoen","k":"boxing glove|bokshandschoen|boksen|handschoen|sport|boxing|glove"},{"u":"1f94b","c":"Activities","o":1109,"x":43,"y":57,"s":"martial_arts_uniform","n":"pak voor vechtsporten","k":"martial arts uniform|pak voor vechtsporten|judo|karate|kunst|taekwondo|uniform|vecht|arts|martial"},{"u":"1f945","c":"Activities","o":1110,"x":43,"y":52,"s":"goal_net","n":"doelnet","k":"goal net|doelnet|doel|goal|net|sport"},{"u":"26f3","c":"Activities","o":1111,"x":59,"y":27,"s":"golf","n":"vlag in hole","k":"golf|flag in hole|vlag in hole|hole|sport|flag"},{"u":"26f8-fe0f","c":"Activities","o":1112,"x":59,"y":31,"s":"ice_skate","n":"schaats","k":"ice skate|schaats|ijs|kunstschaatsen|schaatsen|sport|witte schaats|ice|skate|skating"},{"u":"1f3a3","c":"Activities","o":1113,"x":7,"y":33,"s":"fishing_pole_and_fish","n":"vishengel","k":"fishing pole and fish|vishengel|hengel|sport|vis|fishing pole|entertainment|fish|fishing|pole"},{"u":"1f93f","c":"Activities","o":1114,"x":43,"y":46,"s":"diving_mask","n":"duikbril","k":"diving mask|duikbril|duiken|duikmasker|onder water|scuba|scubaduiken|snorkelen|vis|zee|diving|mask|snorkeling"},{"u":"1f3bd","c":"Activities","o":1115,"x":7,"y":59,"s":"running_shirt_with_sash","n":"hardloopshirt","k":"running shirt with sash|hardloopshirt|atletiek|hardlopen|shirt|sjerp|sport|running shirt|athletics|running|sash"},{"u":"1f3bf","c":"Activities","o":1116,"x":7,"y":61,"s":"ski","n":"ski’s","k":"ski|ski and ski boot|ski’s|laars en skis|skiën|skis|skischoen|sneeuw|sport|wintersport|snow"},{"u":"1f6f7","c":"Activities","o":1117,"x":39,"y":4,"s":"sled","n":"slee","k":"sled|slee|rodelen|roetsjen|slede|sleeën|sleetje|sneeuw|luge|sledge|sleigh|snow|toboggan"},{"u":"1f94c","c":"Activities","o":1118,"x":43,"y":58,"s":"curling_stone","n":"curlingsteen","k":"curling stone|curlingsteen|curling|kei|spel|sport|steen|game|rock|stone"},{"u":"1f3af","c":"Activities","o":1119,"x":7,"y":45,"s":"dart","n":"directe treffer","k":"dart|direct hit|directe treffer|bull’s eye|bullseye|darts|doelwit|in de roos|spel|sport|treffer|voltreffer|bull|direct|entertainment|game|hit|target"},{"u":"1fa80","c":"Activities","o":1120,"x":55,"y":1,"s":"yo-yo","n":"jojo","k":"yo-yo|jojo|fluctueren|kinderen|op en neer|speelgoed|spelen|fluctuate|toy"},{"u":"1fa81","c":"Activities","o":1121,"x":55,"y":2,"s":"kite","n":"vlieger","k":"kite|vlieger|buiten|opstijgen|spelen|vliegen|zweven|fly|soar"},{"u":"1f52b","c":"Activities","o":1122,"x":30,"y":35,"s":"gun","n":"waterpistool","k":"gun|pistol|waterpistool|gereedschap|pistool|revolver|vuurwapen|wapen|water|water pistol|handgun|tool|weapon"},{"u":"1f3b1","c":"Activities","o":1123,"x":7,"y":47,"s":"8ball","n":"biljart","k":"8ball|billiards|biljart|8|8 ball|8-ball|acht|bal|pool|spel|pool 8 ball|ball|billiard|eight|game"},{"u":"1f52e","c":"Activities","o":1124,"x":30,"y":38,"s":"crystal_ball","n":"kristallen bol","k":"crystal ball|kristallen bol|bol|glazen bol|kristal|magie|sprookje|toekomst voorspellen|waarzeggen|waarzeggerij|ball|crystal|fairy|fairytale|fantasy|fortune|future|magic|tale|tool"},{"u":"1fa84","c":"Activities","o":1125,"x":55,"y":5,"s":"magic_wand","n":"toverstok","k":"magic wand|toverstok|goochelaar|goochelen|heks|magie|magiër|tovenaar|toveren|tovertruc|magic|magician|wand|witch|wizard"},{"u":"1f3ae","c":"Activities","o":1126,"x":7,"y":44,"s":"video_game","n":"videogame","k":"video game|videogame|controller|game|gamecontroller|playstation|spel|videospel|xbox|entertainment|video"},{"u":"1f579-fe0f","c":"Activities","o":1127,"x":31,"y":52,"s":"joystick","n":"joystick","k":"joystick|game|videogame|videospel|video"},{"u":"1f3b0","c":"Activities","o":1128,"x":7,"y":46,"s":"slot_machine","n":"fruitautomaat","k":"slot machine|fruitautomaat|casino|eenarmige bandiet|gokkast|gokken|spel|gamble|gambling|game|machine|slot|slots"},{"u":"1f3b2","c":"Activities","o":1129,"x":7,"y":48,"s":"game_die","n":"dobbelsteen","k":"game die|dobbelsteen|dobbelen|dobbelstenen|spel|yahtzee|dice|die|entertainment|game"},{"u":"1f9e9","c":"Activities","o":1130,"x":54,"y":27,"s":"jigsaw","n":"puzzelstukje","k":"jigsaw|jigsaw puzzle piece|puzzelstukje|aanwijzing|gekoppeld|legpuzzel|passen|passend|puzzel|schakel|stukje|puzzle piece|clue|interlocking|piece|puzzle"},{"u":"1f9f8","c":"Activities","o":1131,"x":54,"y":42,"s":"teddy_bear","n":"teddybeer","k":"teddy bear|teddybeer|beer|beertje|knuffel|knuffelbeer|knuffelbeest|pluche|speelgoed|speeltje|teddy beer|bear|plaything|plush|stuffed|teddy|toy"},{"u":"1fa85","c":"Activities","o":1132,"x":55,"y":6,"s":"pinata","n":"piñata","k":"pinata|piñata|cinco de mayo|feest|mexicaans|mexico|snoep|snoepgoed|vieren|viering|candy|celebrate|celebration|cinco|de|festive|mayo|party|pinada"},{"u":"1faa9","c":"Activities","o":1133,"x":55,"y":35,"s":"mirror_ball","n":"spiegelbal","k":"mirror ball|spiegelbal|dans|dansen|disco|discobal|feest|glitter|ball|dance|mirror|party"},{"u":"1fa86","c":"Activities","o":1134,"x":55,"y":7,"s":"nesting_dolls","n":"matroesjka","k":"nesting dolls|matroesjka|baboesjka|baboesjka’s|genest|pop|poppetjes|rusland|russisch|babooshka|baboushka|babushka|doll|dolls|matryoshka|nesting|russia"},{"u":"2660-fe0f","c":"Activities","o":1135,"x":58,"y":49,"s":"spades","n":"schoppen","k":"spades|black spade suit|schoppen|kaart|kaarten|spel|spade suit|card|game|spade|suit"},{"u":"2665-fe0f","c":"Activities","o":1136,"x":58,"y":51,"s":"hearts","n":"harten","k":"hearts|black heart suit|harten|hart|kaart|kaarten|spel|heart suit|card|emotion|game|heart|suit"},{"u":"2666-fe0f","c":"Activities","o":1137,"x":58,"y":52,"s":"diamonds","n":"ruiten","k":"diamonds|black diamond suit|ruiten|kaart|kaarten|ruit|spel|vorm|diamond suit|card|diamond|game|suit"},{"u":"2663-fe0f","c":"Activities","o":1138,"x":58,"y":50,"s":"clubs","n":"klaveren","k":"clubs|black club suit|klaveren|kaart|kaarten|klaver|spel|club suit|card|club|game|suit"},{"u":"265f-fe0f","c":"Activities","o":1139,"x":58,"y":48,"s":"chess_pawn","n":"pion","k":"chess pawn|pion|schaken|slachtoffer|waardeloos|chess|dupe|expendable|pawn"},{"u":"1f0cf","c":"Activities","o":1140,"x":0,"y":15,"s":"black_joker","n":"Jokerkaart","k":"black joker|playing card black joker|jokerkaart|joker|kaart|kaarten|spel|spelen|card|game|wildcard"},{"u":"1f004","c":"Activities","o":1141,"x":0,"y":14,"s":"mahjong","n":"mahjong rode draak","k":"mahjong|mahjong tile red dragon|mahjong rode draak|rode draak|rood|spel|stenen|mahjong red dragon|dragon|game|red"},{"u":"1f3b4","c":"Activities","o":1142,"x":7,"y":50,"s":"flower_playing_cards","n":"speelkaarten","k":"flower playing cards|speelkaarten|bloem|bloemenkaart|bloemspeelkaarten|hanafuda|japans|kaart|kaartspel|spel|spelen|card|cards|flower|game|japanese|playing"},{"u":"1f3ad","c":"Activities","o":1143,"x":7,"y":43,"s":"performing_arts","n":"toneelkunsten","k":"performing arts|toneelkunsten|kunst|masker|maskers|optreden|theater|toneel|toneelkunst|treurspel|actor|actress|art|arts|entertainment|mask|performing|theatre|thespian"},{"u":"1f5bc-fe0f","c":"Activities","o":1144,"x":32,"y":25,"s":"frame_with_picture","n":"lijst met afbeelding","k":"frame with picture|framed picture|lijst met afbeelding|afbeelding|kunst|lijst|museum|schilderij|art|frame|framed|painting|picture"},{"u":"1f3a8","c":"Activities","o":1145,"x":7,"y":38,"s":"art","n":"schilderspalet","k":"art|artist palette|schilderspalet|creatief|kleurrijk|kunst|kunstzinnig|museum|palet|schilderen|schilderij|artist|artsy|arty|colorful|creative|entertainment|painter|painting|palette"},{"u":"1f9f5","c":"Activities","o":1146,"x":54,"y":39,"s":"thread","n":"garen","k":"thread|spool of thread|garen|draad|klos|naaien|naald|needle|sewing|spool|string"},{"u":"1faa1","c":"Activities","o":1147,"x":55,"y":27,"s":"sewing_needle","n":"naald","k":"sewing needle|naald|borduren|draad|hechten|hechtingen|hobby|kleding|kleermaken|naaien|speld|embroidery|needle|sew|sewing|stitches|sutures|tailoring|thread"},{"u":"1f9f6","c":"Activities","o":1148,"x":54,"y":40,"s":"yarn","n":"wol","k":"yarn|ball of yarn|wol|bal|bol|breien|draad|haken|ball|crochet|knit"},{"u":"1faa2","c":"Activities","o":1149,"x":55,"y":28,"s":"knot","n":"knoop","k":"knot|knoop|boot|geknoopt|hobby|knopen|kronkel|padvinder|streng|touw|zeilen|cord|rope|tangled|tie|twine|twist"},{"u":"1f453","c":"Objects","o":1150,"x":13,"y":24,"s":"eyeglasses","n":"bril","k":"eyeglasses|bril|bijziend|brillen|kleding|oog|verziend|zien|zonnebril|glasses|clothing|eye|eyewear"},{"u":"1f576-fe0f","c":"Objects","o":1151,"x":31,"y":49,"s":"dark_sunglasses","n":"zonnebril","k":"dark sunglasses|sunglasses|zonnebril|bril|brillen|donker|oog|dark|eye|eyewear|glasses"},{"u":"1f97d","c":"Objects","o":1152,"x":44,"y":50,"s":"goggles","n":"oogscherm","k":"goggles|oogscherm|bescherming|bril|duik|duiken|lassen|oog|zwemmen|dive|eye|protection|scuba|swimming|welding"},{"u":"1f97c","c":"Objects","o":1153,"x":44,"y":49,"s":"lab_coat","n":"labjas","k":"lab coat|labjas|dokter|dr.|experiment|jas|kleding|lab|wetenschapper|wit|clothes|coat|doctor|dr|jacket|scientist|white"},{"u":"1f9ba","c":"Objects","o":1154,"x":46,"y":27,"s":"safety_vest","n":"veiligheidsvest","k":"safety vest|veiligheidsvest|gevaarlijk|noodgeval|veilig|veiligheid|vest|emergency|safety"},{"u":"1f454","c":"Objects","o":1155,"x":13,"y":25,"s":"necktie","n":"stropdas","k":"necktie|stropdas|formeel|kleding|overhemd|pak|clothing|employed|serious|shirt|tie"},{"u":"1f455","c":"Objects","o":1156,"x":13,"y":26,"s":"shirt","n":"T-shirt","k":"shirt|tshirt|t-shirt|blauw shirt|kleding|kraag|poloshirt|vrijetijdskleding|blue|casual|clothes|clothing|collar|dressed|shopping|weekend"},{"u":"1f456","c":"Objects","o":1157,"x":13,"y":27,"s":"jeans","n":"spijkerbroek","k":"jeans|spijkerbroek|broek|kleding|blue|casual|clothes|clothing|denim|dressed|pants|shopping|trousers|weekend"},{"u":"1f9e3","c":"Objects","o":1158,"x":54,"y":21,"s":"scarf","n":"sjaal","k":"scarf|sjaal|koud|nek|bundle|cold|neck|up"},{"u":"1f9e4","c":"Objects","o":1159,"x":54,"y":22,"s":"gloves","n":"handschoenen","k":"gloves|handschoenen|hand"},{"u":"1f9e5","c":"Objects","o":1160,"x":54,"y":23,"s":"coat","n":"jas","k":"coat|jas|blazer|brr|jack|koud|warm aankleden|bundle|cold|jacket|up"},{"u":"1f9e6","c":"Objects","o":1161,"x":54,"y":24,"s":"socks","n":"sokken","k":"socks|sokken|kousen|stocking"},{"u":"1f457","c":"Objects","o":1162,"x":13,"y":28,"s":"dress","n":"jurk","k":"dress|jurk|blauwe jurk|dansen|kleding|kledingstuk|sjiek|winkelen|clothes|clothing|dressed|fancy|shopping"},{"u":"1f458","c":"Objects","o":1163,"x":13,"y":29,"s":"kimono","n":"kimono","k":"kimono|japans|japon|kleding|clothing|comfortable"},{"u":"1f97b","c":"Objects","o":1164,"x":44,"y":48,"s":"sari","n":"sari","k":"sari|jurk|kledij|kleding|clothing|dress"},{"u":"1fa71","c":"Objects","o":1165,"x":54,"y":51,"s":"one-piece_swimsuit","n":"badpak","k":"one-piece swimsuit|badpak|badpak uit één stuk|strand|zomer|zwembad|zwemgerief|zwemmen|zwempak|bathing|one-piece|suit|swimsuit"},{"u":"1fa72","c":"Objects","o":1166,"x":54,"y":52,"s":"briefs","n":"slip","k":"briefs|slip|onderbroek|ondergoed|sporten|strand|zwembroek|zwemgerief|zwemkleding|zwemmen|bathing|one-piece|suit|swimsuit|underwear"},{"u":"1fa73","c":"Objects","o":1167,"x":54,"y":53,"s":"shorts","n":"korte broek","k":"shorts|korte broek|badpak|broek|ondergoed|pak|zwem|bathing|pants|suit|swimsuit|underwear"},{"u":"1f459","c":"Objects","o":1168,"x":13,"y":30,"s":"bikini","n":"bikini","k":"bikini|kleding|zwembad|zwemkleding|zwemmen|bathing|beach|clothing|pool|suit|swim"},{"u":"1f45a","c":"Objects","o":1169,"x":13,"y":31,"s":"womans_clothes","n":"dameskleding","k":"womans clothes|dameskleding|blouse|dames|kleding|shirt|woman’s clothes|clothes|clothing|collar|dress|dressed|lady|shopping|woman|woman’s"},{"u":"1faad","c":"Objects","o":1170,"x":55,"y":39,"s":"folding_hand_fan","n":"opvouwbare waaier","k":"folding hand fan|opvouwbare waaier|afkoelen|dansen|fladderen|heet|verlegen|waaier|clack|clap|cool|cooling|dance|fan|flirt|flutter|folding|hand|hot|shy"},{"u":"1f45b","c":"Objects","o":1171,"x":13,"y":32,"s":"purse","n":"portemonnee","k":"purse|portemonnee|accessoire|beurs|geld uitgeven|kleding|knip|munt|portefeuille|roze portemonnee|winkelen|clothes|clothing|coin|dress|fancy|handbag|shopping"},{"u":"1f45c","c":"Objects","o":1172,"x":13,"y":33,"s":"handbag","n":"handtas","k":"handbag|handtas|accessoire|kleding|modieuze tas|tas|winkelen|bag|clothes|clothing|dress|lady|purse|shopping"},{"u":"1f45d","c":"Objects","o":1173,"x":13,"y":34,"s":"pouch","n":"tasje","k":"pouch|tasje|accessoire|clutch|enveloptas|handtas|kleding|tas|clutch bag|bag|clothes|clothing|dress|handbag|purse"},{"u":"1f6cd-fe0f","c":"Objects","o":1174,"x":38,"y":39,"s":"shopping_bags","n":"boodschappentassen","k":"shopping bags|boodschappentassen|hotel|tas|winkelen|bag|bags|shopping"},{"u":"1f392","c":"Objects","o":1175,"x":7,"y":21,"s":"school_satchel","n":"schooltas","k":"school satchel|schooltas|boekentas|rugzak|school|tas|backpack|backpacking|bag|bookbag|education|rucksack|satchel"},{"u":"1fa74","c":"Objects","o":1176,"x":54,"y":54,"s":"thong_sandal","n":"teenslipper","k":"thong sandal|teenslipper|sandaal|sandalen|schoen|slipper|strand|strandslipper|zōri|beach|flip|flop|sandal|sandals|shoe|thong|thongs"},{"u":"1f45e","c":"Objects","o":1177,"x":13,"y":35,"s":"mans_shoe","n":"herenschoen","k":"mans shoe|shoe|herenschoen|formeel|kleding|leren schoen|man|nette schoen|schoen|man’s shoe|brown|clothes|clothing|feet|foot|kick|man’s|shoes|shopping"},{"u":"1f45f","c":"Objects","o":1178,"x":13,"y":36,"s":"athletic_shoe","n":"sportschoen","k":"athletic shoe|sportschoen|atletiek|hardlopen|kleding|rennen|schoen|sneaker|sporten|running shoe|athletic|clothes|clothing|fast|kick|running|shoe|shoes|shopping|tennis"},{"u":"1f97e","c":"Objects","o":1179,"x":44,"y":51,"s":"hiking_boot","n":"wandelschoen","k":"hiking boot|wandelschoen|backpacken|bruin|buiten|kamperen|laars|schoen|wandelen|backpacking|boot|brown|camping|hiking|outdoors|shoe"},{"u":"1f97f","c":"Objects","o":1180,"x":44,"y":52,"s":"womans_flat_shoe","n":"platte schoen","k":"womans flat shoe|flat shoe|platte schoen|ballerina|ballerina’s|comfortabel|flatjes|instapper|slip-on|ballet|comfy|flat|flats|shoe|slipper"},{"u":"1f460","c":"Objects","o":1181,"x":13,"y":37,"s":"high_heel","n":"schoen met hoge hak","k":"high heel|high-heeled shoe|schoen met hoge hak|hak|hoge hak|kleding|naaldhak|pump|schoen|stiletto|vrouw|clothes|clothing|dress|fashion|heel|heels|high-heeled|shoe|shoes|shopping|woman"},{"u":"1f461","c":"Objects","o":1182,"x":13,"y":38,"s":"sandal","n":"damessandaal","k":"sandal|womans sandal|damessandaal|hak|hoge hak|kleding|muiltje|sandaal|schoen|schoen met open teen|vrouw|woman’s sandal|clothing|shoe|woman|woman’s"},{"u":"1fa70","c":"Objects","o":1183,"x":54,"y":50,"s":"ballet_shoes","n":"balletschoenen","k":"ballet shoes|balletschoenen|ballerina|ballet|dans|dansen|pirouette|schoenen|spitzen|dance|shoes"},{"u":"1f462","c":"Objects","o":1184,"x":13,"y":39,"s":"boot","n":"dameslaars","k":"boot|womans boots|dameslaars|kleding|laars|schoen|vrouw|woman’s boot|clothes|clothing|dress|shoe|shoes|shopping|woman|woman’s"},{"u":"1faae","c":"Objects","o":1185,"x":55,"y":40,"s":"hair_pick","n":"haarkam","k":"hair pick|haarkam|afro|haar|kam|kroes|comb|groom|hair|pick"},{"u":"1f451","c":"Objects","o":1186,"x":13,"y":22,"s":"crown","n":"kroon","k":"crown|kroon|adel|game of thrones|kleding|koning|koningin|koninklijk|middeleeuwen|vorst|vorstin|clothing|family|king|medieval|queen|royal|royalty|win"},{"u":"1f452","c":"Objects","o":1187,"x":13,"y":23,"s":"womans_hat","n":"dameshoed","k":"womans hat|dameshoed|hoed|hoed met strik|kleding|vrouw|woman’s hat|clothes|clothing|garden|hat|hats|party|woman|woman’s"},{"u":"1f3a9","c":"Objects","o":1188,"x":7,"y":39,"s":"tophat","n":"hoge hoed","k":"tophat|top hat|hoge hoed|fancy|formeel|goochelen|goochelhoed|hoed|hoog|kleding|clothes|clothing|formal|hat|magic|top"},{"u":"1f393","c":"Objects","o":1189,"x":7,"y":22,"s":"mortar_board","n":"academische baret","k":"mortar board|graduation cap|academische baret|afstuderen|baret|feest|hoed|kleding|opleiding|student|cap|celebration|clothing|education|graduation|hat|scholar"},{"u":"1f9e2","c":"Objects","o":1190,"x":54,"y":20,"s":"billed_cap","n":"pet","k":"billed cap|pet|baseballcap|hoofddeksel|baseball|bent|billed|cap|dad|hat"},{"u":"1fa96","c":"Objects","o":1191,"x":55,"y":16,"s":"military_helmet","n":"legerhelm","k":"military helmet|legerhelm|helm|krijger|leger|militair|oorlog|soldaat|vechter|voorwerp|army|helmet|military|soldier|war|warrior"},{"u":"26d1-fe0f","c":"Objects","o":1192,"x":59,"y":18,"s":"helmet_with_white_cross","n":"helm van reddingswerker","k":"helmet with white cross|rescue worker’s helmet|helm van reddingswerker|gezicht|helm|hoed|hulp|kruis|redding|werknemer|aid|cross|face|hat|helmet|rescue|worker’s"},{"u":"1f4ff","c":"Objects","o":1193,"x":29,"y":53,"s":"prayer_beads","n":"gebedssnoer","k":"prayer beads|gebedssnoer|gebed|gebedsketting|gebedskralen|geloof|ketting|kleding|kralen|beads|clothing|necklace|prayer|religion"},{"u":"1f484","c":"Objects","o":1194,"x":26,"y":23,"s":"lipstick","n":"lippenstift","k":"lipstick|lippenstift|afspraakje|cosmetica|date|make-up|opmaken|cosmetics|makeup"},{"u":"1f48d","c":"Objects","o":1195,"x":27,"y":9,"s":"ring","n":"ring","k":"ring|bruiloft|diamant|glinsteren|romantiek|schitteren|trouwen|verloving|diamond|engaged|engagement|married|romance|shiny|sparkling|wedding"},{"u":"1f48e","c":"Objects","o":1196,"x":27,"y":10,"s":"gem","n":"edelsteen","k":"gem|gem stone|edelsteen|bruiloft|diamant|juweel|romantiek|trouwen|verloving|diamond|engagement|jewel|money|romance|stone|wedding"},{"u":"1f507","c":"Objects","o":1197,"x":29,"y":61,"s":"mute","n":"speaker uit","k":"mute|speaker with cancellation stroke|speaker uit|dempen|geen geluid|geluid uit|luidspreker|speaker|stil|volume|muted speaker|muted|quiet|silent|sound"},{"u":"1f508","c":"Objects","o":1198,"x":30,"y":0,"s":"speaker","n":"speaker","k":"speaker|laag volume|luidspreker|volume|zacht|speaker low volume|low|soft|sound"},{"u":"1f509","c":"Objects","o":1199,"x":30,"y":1,"s":"sound","n":"speaker aan","k":"sound|speaker with one sound wave|speaker aan|gemiddeld volume|luidspreker|speaker|volume|speaker medium volume|medium"},{"u":"1f50a","c":"Objects","o":1200,"x":30,"y":2,"s":"loud_sound","n":"speaker luid","k":"loud sound|speaker with three sound waves|speaker luid|hard|hoog volume|luid|luidspreker|speaker|volume|speaker high volume|high|loud|music|sound"},{"u":"1f4e2","c":"Objects","o":1201,"x":29,"y":25,"s":"loudspeaker","n":"luidspreker","k":"loudspeaker|public address loudspeaker|luidspreker|luid|megafoon|toespraak|toespreken|address|communication|loud|public|sound"},{"u":"1f4e3","c":"Objects","o":1202,"x":29,"y":26,"s":"mega","n":"megafoon","k":"mega|cheering megaphone|megafoon|communicatie|geluid|gouden megafoon|juichen|versterken|megaphone|cheering|sound"},{"u":"1f4ef","c":"Objects","o":1203,"x":29,"y":38,"s":"postal_horn","n":"posthoorn","k":"postal horn|posthoorn|blaasinstrument|hoorn|jachthoorn|post|horn|postal"},{"u":"1f514","c":"Objects","o":1204,"x":30,"y":12,"s":"bell","n":"bel","k":"bell|bel|kerkklok|klok|luiden|pauze|rinkelen|break|church|sound"},{"u":"1f515","c":"Objects","o":1205,"x":30,"y":13,"s":"no_bell","n":"doorgestreepte bel","k":"no bell|bell with cancellation stroke|doorgestreepte bel|bel|dempen|geen|geen geluid|geluid uit|niet toegestaan|stil|stilte|bell with slash|bell|forbidden|mute|no|not|prohibited|quiet|silent|slash|sound"},{"u":"1f3bc","c":"Objects","o":1206,"x":7,"y":58,"s":"musical_score","n":"notenschift","k":"musical score|notenschift|g-sleutel|muziek|partituur|music|musical|note|score"},{"u":"1f3b5","c":"Objects","o":1207,"x":7,"y":51,"s":"musical_note","n":"muzieknoot","k":"musical note|muzieknoot|achtste noten|muziek|noot|music|musical|note|sound"},{"u":"1f3b6","c":"Objects","o":1208,"x":7,"y":52,"s":"notes","n":"muzieknoten","k":"notes|multiple musical notes|muzieknoten|achtste noten|geluid|muziek|noot|noten|musical notes|music|musical|note|sound"},{"u":"1f399-fe0f","c":"Objects","o":1209,"x":7,"y":25,"s":"studio_microphone","n":"studiomicrofoon","k":"studio microphone|studiomicrofoon|microfoon|muziek|studio|mic|microphone|music"},{"u":"1f39a-fe0f","c":"Objects","o":1210,"x":7,"y":26,"s":"level_slider","n":"schuifregelaar","k":"level slider|schuifregelaar|muziek|niveau|schuifje|volumeregelaar|level|music|slider"},{"u":"1f39b-fe0f","c":"Objects","o":1211,"x":7,"y":27,"s":"control_knobs","n":"controleknoppen","k":"control knobs|controleknoppen|bediening|knoppen|muziek|control|knobs|music"},{"u":"1f3a4","c":"Objects","o":1212,"x":7,"y":34,"s":"microphone","n":"microfoon","k":"microphone|microfoon|geluid|karaoke|muziek|zingen|mic|music|sing|sound"},{"u":"1f3a7","c":"Objects","o":1213,"x":7,"y":37,"s":"headphones","n":"hoofdtelefoon","k":"headphones|headphone|hoofdtelefoon|geluid|koptelefoon|oordopje|earbud|sound"},{"u":"1f4fb","c":"Objects","o":1214,"x":29,"y":50,"s":"radio","n":"radio","k":"radio|entertainment|muziek|tbt|video"},{"u":"1f3b7","c":"Objects","o":1215,"x":7,"y":53,"s":"saxophone","n":"saxofoon","k":"saxophone|saxofoon|instrument|muziek|muziekinstrument|sax|music"},{"u":"1fa97","c":"Objects","o":1216,"x":55,"y":17,"s":"accordion","n":"accordeon","k":"accordion|accordeon|bandoneon|concertina|instrument|muziek|trek|trekzak|box|music|squeeze|squeezebox"},{"u":"1f3b8","c":"Objects","o":1217,"x":7,"y":54,"s":"guitar","n":"gitaar","k":"guitar|gitaar|instrument|muziek|muziekinstrument|strat|stratocaster|music"},{"u":"1f3b9","c":"Objects","o":1218,"x":7,"y":55,"s":"musical_keyboard","n":"piano","k":"musical keyboard|piano|instrument|keyboard|muziek|muziekinstrument|music|musical"},{"u":"1f3ba","c":"Objects","o":1219,"x":7,"y":56,"s":"trumpet","n":"trompet","k":"trumpet|trompet|instrument|muziek|muziekinstrument|music"},{"u":"1f3bb","c":"Objects","o":1220,"x":7,"y":57,"s":"violin","n":"viool","k":"violin|viool|instrument|muziek|muziekinstrument|stradivarius|music"},{"u":"1fa95","c":"Objects","o":1221,"x":55,"y":15,"s":"banjo","n":"banjo","k":"banjo|besnaard|instrument|muziek|snaarinstrument|spelen|music|stringed"},{"u":"1f941","c":"Objects","o":1222,"x":43,"y":48,"s":"drum_with_drumsticks","n":"trommel","k":"drum with drumsticks|trommel|drummen|drums|drumsticks|muziek|muziekinstrument|trommelen|trommelstokken|drum|music"},{"u":"1fa98","c":"Objects","o":1223,"x":55,"y":18,"s":"long_drum","n":"hoge trom","k":"long drum|hoge trom|beat|bongo|conga|dans|dansen|drummen|ritme|trom|trommelen|voorwerp|drum|instrument|long|rhythm"},{"u":"1fa87","c":"Objects","o":1224,"x":55,"y":8,"s":"maracas","n":"sambaballen","k":"maracas|sambaballen|instrument|muziek|percussie|ratelen|schudden|cha|dance|music|party|percussion|rattle|shake|shaker"},{"u":"1fa88","c":"Objects","o":1225,"x":55,"y":9,"s":"flute","n":"fluit","k":"flute|fluit|blokfluit|dwarsfluit|houtblazer|muziek|pijperfluit|band|fife|flautist|instrument|marching|music|orchestra|piccolo|pipe|recorder|woodwind"},{"u":"1f4f1","c":"Objects","o":1226,"x":29,"y":40,"s":"iphone","n":"mobiele telefoon","k":"iphone|mobile phone|mobiele telefoon|bellen|communicatie|mobiel|smartphone|telefoon|cell|communication|mobile|phone|telephone"},{"u":"1f4f2","c":"Objects","o":1227,"x":29,"y":41,"s":"calling","n":"mobiel met pijl","k":"calling|mobile phone with rightwards arrow at left|mobiel met pijl|bellen|mobiel|mobiele telefoon|ontvangen|pijl|smartphone|telefoon|mobile phone with arrow|arrow|build|call|cell|communication|mobile|phone|receive|telephone"},{"u":"260e-fe0f","c":"Objects","o":1228,"x":58,"y":13,"s":"phone","n":"telefoon","k":"phone|telephone|black telephone|telefoon|rode telefoon met hoorn|vaste telefoon"},{"u":"1f4de","c":"Objects","o":1229,"x":29,"y":21,"s":"telephone_receiver","n":"telefoonhoorn","k":"telephone receiver|telefoonhoorn|bellen|hoorn|telefoon|communication|phone|receiver|telephone|voip"},{"u":"1f4df","c":"Objects","o":1230,"x":29,"y":22,"s":"pager","n":"pager","k":"pager|pieper|communication"},{"u":"1f4e0","c":"Objects","o":1231,"x":29,"y":23,"s":"fax","n":"fax","k":"fax|fax machine|communicatie|faxapparaat|communication|machine"},{"u":"1f50b","c":"Objects","o":1232,"x":30,"y":3,"s":"battery","n":"batterij","k":"battery|batterij"},{"u":"1faab","c":"Objects","o":1233,"x":55,"y":37,"s":"low_battery","n":"batterij bijna leeg","k":"low battery|batterij bijna leeg|accu|batterij|electronisch|lege batterij|weinig batterijlading|battery|drained|electronic|energy|low|power"},{"u":"1f50c","c":"Objects","o":1234,"x":30,"y":4,"s":"electric_plug","n":"stekker","k":"electric plug|stekker|elektriciteit|elektrisch|electric|electricity|plug"},{"u":"1f4bb","c":"Objects","o":1235,"x":28,"y":48,"s":"computer","n":"laptop","k":"computer|personal computer|laptop|notebook|pc|office|personal"},{"u":"1f5a5-fe0f","c":"Objects","o":1236,"x":32,"y":21,"s":"desktop_computer","n":"desktop","k":"desktop computer|desktop|beeldscherm|computer|monitor"},{"u":"1f5a8-fe0f","c":"Objects","o":1237,"x":32,"y":22,"s":"printer","n":"printer","k":"printer|afdrukken|computer"},{"u":"2328-fe0f","c":"Objects","o":1238,"x":57,"y":45,"s":"keyboard","n":"toetsenbord","k":"keyboard|toetsenbord|computer"},{"u":"1f5b1-fe0f","c":"Objects","o":1239,"x":32,"y":23,"s":"three_button_mouse","n":"computermuis","k":"three button mouse|computer mouse|computermuis|computer|muis|mouse"},{"u":"1f5b2-fe0f","c":"Objects","o":1240,"x":32,"y":24,"s":"trackball","n":"trackball","k":"trackball|computer"},{"u":"1f4bd","c":"Objects","o":1241,"x":28,"y":50,"s":"minidisc","n":"harddisk","k":"minidisc|harddisk|computer|disk|optisch|computer disk|minidisk|optical"},{"u":"1f4be","c":"Objects","o":1242,"x":28,"y":51,"s":"floppy_disk","n":"floppydisk","k":"floppy disk|floppydisk|computer|disk|diskette|floppy|opslaan"},{"u":"1f4bf","c":"Objects","o":1243,"x":28,"y":52,"s":"cd","n":"optische schijf","k":"cd|optical disc|optische schijf|blu-ray|cd-rom|computer|dvd|optisch|schijf|optical disk|disk|optical"},{"u":"1f4c0","c":"Objects","o":1244,"x":28,"y":53,"s":"dvd","n":"dvd","k":"dvd|blu-ray|cd|computer|optisch|schijf|disk|optical"},{"u":"1f9ee","c":"Objects","o":1245,"x":54,"y":32,"s":"abacus","n":"abacus","k":"abacus|berekenen|optellen|rekenen|rekenmachine|tellen|telraam|calculation|calculator"},{"u":"1f3a5","c":"Objects","o":1246,"x":7,"y":35,"s":"movie_camera","n":"filmcamera","k":"movie camera|filmcamera|bioscoop|bollywood|camera|film|hollywood|opnemen|cinema|movie|record"},{"u":"1f39e-fe0f","c":"Objects","o":1247,"x":7,"y":28,"s":"film_frames","n":"filmframes","k":"film frames|filmframes|bioscoop|film|filmrol|films|frames|cinema|movie"},{"u":"1f4fd-fe0f","c":"Objects","o":1248,"x":29,"y":52,"s":"film_projector","n":"filmprojector","k":"film projector|filmprojector|bioscoop|film|projector|video|cinema|movie"},{"u":"1f3ac","c":"Objects","o":1249,"x":7,"y":42,"s":"clapper","n":"klapbord","k":"clapper|clapper board|klapbord|actie|entertainment|film|filmklapper|filmset|klapper|opnames|action|board|movie"},{"u":"1f4fa","c":"Objects","o":1250,"x":29,"y":49,"s":"tv","n":"tv","k":"tv|television|beeld|beeldbuis|televisie|video"},{"u":"1f4f7","c":"Objects","o":1251,"x":29,"y":46,"s":"camera","n":"camera","k":"camera|fotocamera|fotograferen|selfie|snap|video|photo|tbt|trip"},{"u":"1f4f8","c":"Objects","o":1252,"x":29,"y":47,"s":"camera_with_flash","n":"camera met flitser","k":"camera with flash|camera met flitser|camera|flitser|fotograferen|video|flash"},{"u":"1f4f9","c":"Objects","o":1253,"x":29,"y":48,"s":"video_camera","n":"videocamera","k":"video camera|videocamera|camcorder|camera|video|tbt"},{"u":"1f4fc","c":"Objects","o":1254,"x":29,"y":51,"s":"vhs","n":"videoband","k":"vhs|videocassette|videoband|band|film|video|old|school|tape|vcr"},{"u":"1f50d","c":"Objects","o":1255,"x":30,"y":5,"s":"mag","n":"vergrootglas naar links gericht","k":"mag|left-pointing magnifying glass|vergrootglas naar links gericht|gereedschap|glas|vergrootglas|vergroten|zoeken|magnifying glass tilted left|glass|lab|left|left-pointing|magnifying|science|search|tilted|tool"},{"u":"1f50e","c":"Objects","o":1256,"x":30,"y":6,"s":"mag_right","n":"vergrootglas naar rechts gericht","k":"mag right|right-pointing magnifying glass|vergrootglas naar rechts gericht|gereedschap|glas|vergrootglas|vergroten|zoeken|magnifying glass tilted right|contact|glass|lab|magnifying|right|right-pointing|science|search|tilted|tool"},{"u":"1f56f-fe0f","c":"Objects","o":1257,"x":31,"y":22,"s":"candle","n":"kaars","k":"candle|kaars|kaarslicht|licht|light"},{"u":"1f4a1","c":"Objects","o":1258,"x":28,"y":17,"s":"bulb","n":"gloeilamp","k":"bulb|electric light bulb|gloeilamp|elektrisch|idee|lamp|licht|peertje|strip|light bulb|comic|electric|idea|light"},{"u":"1f526","c":"Objects","o":1259,"x":30,"y":30,"s":"flashlight","n":"zaklamp","k":"flashlight|electric torch|zaklamp|elektrisch|lamp|licht|zaklantaarn|electric|light|tool|torch"},{"u":"1f3ee","c":"Objects","o":1260,"x":10,"y":35,"s":"izakaya_lantern","n":"rode papieren lantaarn","k":"izakaya lantern|lantern|rode papieren lantaarn|bar|lantaarn|licht|rood|red paper lantern|light|paper|red|restaurant"},{"u":"1fa94","c":"Objects","o":1261,"x":55,"y":14,"s":"diya_lamp","n":"diya-lamp","k":"diya lamp|diya-lamp|diya|lamp|licht|olie|vlam|light|oil"},{"u":"1f4d4","c":"Objects","o":1262,"x":29,"y":11,"s":"notebook_with_decorative_cover","n":"versierd schrift","k":"notebook with decorative cover|versierd schrift|boek|decoratief|notitieboekje|omslag|opleiding|school|schrijven|versierd|book|cover|decorated|decorative|education|notebook|writing"},{"u":"1f4d5","c":"Objects","o":1263,"x":29,"y":12,"s":"closed_book","n":"gesloten boek","k":"closed book|gesloten boek|bibliotheek|boek|educatie|gesloten|lezen|onderwijs|book|closed|education"},{"u":"1f4d6","c":"Objects","o":1264,"x":29,"y":13,"s":"book","n":"geopend boek","k":"book|open book|geopend boek|boek|geopend|open|education|fantasy|knowledge|library|novels|reading"},{"u":"1f4d7","c":"Objects","o":1265,"x":29,"y":14,"s":"green_book","n":"groen boek","k":"green book|groen boek|bibliotheek|boek|educatie|groen|lezen|onderwijs|book|education|fantasy|green|library|reading"},{"u":"1f4d8","c":"Objects","o":1266,"x":29,"y":15,"s":"blue_book","n":"blauw boek","k":"blue book|blauw boek|bibliotheek|blauw|boek|educatie|lezen|onderwijs|blue|book|education|fantasy|library|reading"},{"u":"1f4d9","c":"Objects","o":1267,"x":29,"y":16,"s":"orange_book","n":"oranje boek","k":"orange book|oranje boek|bibliotheek|boek|educatie|lezen|onderwijs|oranje|book|education|fantasy|library|orange|reading"},{"u":"1f4da","c":"Objects","o":1268,"x":29,"y":17,"s":"books","n":"boeken","k":"books|boeken|boek|educatie|kennis|lezen|onderwijs|opleiding|school|book|education|fantasy|knowledge|library|novels|reading|study"},{"u":"1f4d3","c":"Objects","o":1269,"x":29,"y":10,"s":"notebook","n":"schrift","k":"notebook|schrift|notitieboek"},{"u":"1f4d2","c":"Objects","o":1270,"x":29,"y":9,"s":"ledger","n":"grootboek","k":"ledger|grootboek|map|notitieboek|ringband|schrift|notebook"},{"u":"1f4c3","c":"Objects","o":1271,"x":28,"y":56,"s":"page_with_curl","n":"omkrullende pagina","k":"page with curl|omkrullende pagina|bladzijde|document|half opgerold papier|krul|pagina|pagina met krul|papier|curl|page|paper"},{"u":"1f4dc","c":"Objects","o":1272,"x":29,"y":19,"s":"scroll","n":"rol","k":"scroll|rol|papier|papierrol|perkament|perkamentpapier|paper"},{"u":"1f4c4","c":"Objects","o":1273,"x":28,"y":57,"s":"page_facing_up","n":"pagina met bovenzijde omhoog","k":"page facing up|pagina met bovenzijde omhoog|bladzijde|document|pagina|facing|page|paper|up"},{"u":"1f4f0","c":"Objects","o":1274,"x":29,"y":39,"s":"newspaper","n":"krant","k":"newspaper|krant|dagblad|nieuws|nieuwsblad|voorpagina|weekblad|communication|news|paper"},{"u":"1f5de-fe0f","c":"Objects","o":1275,"x":32,"y":34,"s":"rolled_up_newspaper","n":"opgerolde krant","k":"rolled up newspaper|rolled-up newspaper|opgerolde krant|dagblad|krant|nieuws|nieuwsblad|opgerold|weekblad|news|newspaper|paper|rolled|rolled-up"},{"u":"1f4d1","c":"Objects","o":1276,"x":29,"y":8,"s":"bookmark_tabs","n":"bladwijzertabs","k":"bookmark tabs|bladwijzertabs|bladwijzer|bladwijzers|markering|tabbladen|tabs|bookmark|mark|marker"},{"u":"1f516","c":"Objects","o":1277,"x":30,"y":14,"s":"bookmark","n":"bladwijzer","k":"bookmark|bladwijzer|markering|mark"},{"u":"1f3f7-fe0f","c":"Objects","o":1278,"x":10,"y":47,"s":"label","n":"label","k":"label|tag"},{"u":"1f4b0","c":"Objects","o":1279,"x":28,"y":37,"s":"moneybag","n":"zak met geld","k":"moneybag|money bag|zak met geld|dollar|geld|geldzak|rijk|zak|bag|bank|bet|billion|cash|cost|gold|million|money|paid|paying|pot|rich|win"},{"u":"1fa99","c":"Objects","o":1280,"x":55,"y":19,"s":"coin","n":"munt","k":"coin|munt|dollar|euro|geld|goud|metaal|rijk|schat|zilver|gold|metal|money|rich|silver|treasure"},{"u":"1f4b4","c":"Objects","o":1281,"x":28,"y":41,"s":"yen","n":"yenbiljet","k":"yen|banknote with yen sign|yenbiljet|bankbiljet|biljet|briefgeld|briefje|geld|valuta|yen banknote|bank|banknote|bill|currency|money|note"},{"u":"1f4b5","c":"Objects","o":1282,"x":28,"y":42,"s":"dollar","n":"dollarbiljet","k":"dollar|banknote with dollar sign|dollarbiljet|bankbiljet|biljet|briefgeld|briefje|geld|valuta|dollar banknote|bank|banknote|bill|currency|money|note"},{"u":"1f4b6","c":"Objects","o":1283,"x":28,"y":43,"s":"euro","n":"eurobiljet","k":"euro|banknote with euro sign|eurobiljet|bankbiljet|biljet|briefgeld|briefje|geld|valuta|euro banknote|100|bank|banknote|bill|currency|money|note|rich"},{"u":"1f4b7","c":"Objects","o":1284,"x":28,"y":44,"s":"pound","n":"pondbiljet","k":"pound|banknote with pound sign|pondbiljet|bankbiljet|biljet|briefgeld|briefje|geld|pond|valuta|pound banknote|bank|banknote|bill|billion|cash|currency|money|note|pounds"},{"u":"1f4b8","c":"Objects","o":1285,"x":28,"y":45,"s":"money_with_wings","n":"vliegend geld","k":"money with wings|vliegend geld|bankbiljet|biljet|briefgeld|dollar|geld|geld met vleugels|vleugels|vliegen|vliegend bankbiljet|bank|banknote|bill|billion|cash|fly|million|money|note|pay|wings"},{"u":"1f4b3","c":"Objects","o":1286,"x":28,"y":40,"s":"credit_card","n":"creditcard","k":"credit card|creditcard|bank|betaalkaart|geld|kaart|krediet|pinpas|card|cash|charge|credit|money|pay"},{"u":"1f9fe","c":"Objects","o":1287,"x":54,"y":48,"s":"receipt","n":"kassabon","k":"receipt|kassabon|administratie|bewijs|boekhouden|boekhouding|bonnetje|factuur|kwitantie|rekening|accounting|bookkeeping|evidence|invoice|proof"},{"u":"1f4b9","c":"Objects","o":1288,"x":28,"y":46,"s":"chart","n":"stijgende grafiek met yenteken","k":"chart|chart with upwards trend and yen sign|stijgende grafiek met yenteken|bank|geld|grafiek|groei|markt|stijging|toenemend|trend|valuta|yen|chart increasing with yen|currency|graph|growth|increasing|market|money|rise|upward"},{"u":"2709-fe0f","c":"Objects","o":1289,"x":59,"y":55,"s":"email","n":"envelop","k":"email|envelope|envelop|brief|e-mail|mail|letter"},{"u":"1f4e7","c":"Objects","o":1290,"x":29,"y":30,"s":"e-mail","n":"e-mail","k":"e-mail|e-mail symbol|brief|mail|post|email|letter"},{"u":"1f4e8","c":"Objects","o":1291,"x":29,"y":31,"s":"incoming_envelope","n":"inkomende post","k":"incoming envelope|inkomende post|binnengekomen|brief|e-mail|elektronische post|envelop|inkomend|mail|ontvangen|post|delivering|email|envelope|incoming|letter|receive|sent"},{"u":"1f4e9","c":"Objects","o":1292,"x":29,"y":32,"s":"envelope_with_arrow","n":"envelop met pijl","k":"envelope with arrow|envelope with downwards arrow above|envelop met pijl|brief|communicatie|e-mail|envelop|omlaag|pijl|post|uitgaand|verzenden|verzonden|arrow|communication|down|email|envelope|letter|mail|outgoing|send|sent"},{"u":"1f4e4","c":"Objects","o":1293,"x":29,"y":27,"s":"outbox_tray","n":"postvak uit","k":"outbox tray|postvak uit|brief|mail|post|postvak|uitgaand|verzonden|box|email|letter|outbox|sent|tray"},{"u":"1f4e5","c":"Objects","o":1294,"x":29,"y":28,"s":"inbox_tray","n":"postvak in","k":"inbox tray|postvak in|brief|inkomend|mail|ontvangen|post|postvak|box|email|inbox|letter|receive|tray|zero"},{"u":"1f4e6","c":"Objects","o":1295,"x":29,"y":29,"s":"package","n":"pakket","k":"package|pakket|bezorging|dichtgeplakte doos|doos|pakketje|box|communication|delivery|parcel|shipping"},{"u":"1f4eb","c":"Objects","o":1296,"x":29,"y":34,"s":"mailbox","n":"gesloten brievenbus met vlaggetje omhoog","k":"mailbox|closed mailbox with raised flag|gesloten brievenbus met vlaggetje omhoog|brievenbus|gesloten|post|postbus|closed|communication|flag|mail|postbox|raised"},{"u":"1f4ea","c":"Objects","o":1297,"x":29,"y":33,"s":"mailbox_closed","n":"gesloten brievenbus met vlaggetje omlaag","k":"mailbox closed|closed mailbox with lowered flag|gesloten brievenbus met vlaggetje omlaag|brievenbus|gesloten|omlaag|post|postbus|closed|flag|lowered|mail|mailbox|postbox"},{"u":"1f4ec","c":"Objects","o":1298,"x":29,"y":35,"s":"mailbox_with_mail","n":"open brievenbus met vlaggetje omhoog","k":"mailbox with mail|open mailbox with raised flag|open brievenbus met vlaggetje omhoog|brievenbus|open|post|postbus|flag|mail|mailbox|postbox|raised"},{"u":"1f4ed","c":"Objects","o":1299,"x":29,"y":36,"s":"mailbox_with_no_mail","n":"open brievenbus met vlaggetje omlaag","k":"mailbox with no mail|open mailbox with lowered flag|open brievenbus met vlaggetje omlaag|brievenbus|omlaag|open|post|postbus|flag|lowered|mail|mailbox|postbox"},{"u":"1f4ee","c":"Objects","o":1300,"x":29,"y":37,"s":"postbox","n":"brievenbus","k":"postbox|brievenbus|brief posten|brievenbus met brief|post|postbus|mail|mailbox"},{"u":"1f5f3-fe0f","c":"Objects","o":1301,"x":32,"y":39,"s":"ballot_box_with_ballot","n":"stembus met stembiljet","k":"ballot box with ballot|stembus met stembiljet|doos|stem uitbrengen|stembus|ballot|box"},{"u":"270f-fe0f","c":"Objects","o":1302,"x":60,"y":18,"s":"pencil2","n":"potlood","k":"pencil2|pencil|potlood"},{"u":"2712-fe0f","c":"Objects","o":1303,"x":60,"y":19,"s":"black_nib","n":"kroontjespen met zwarte punt","k":"black nib|kroontjespen met zwarte punt|pen|punt|vulpen|black|nib"},{"u":"1f58b-fe0f","c":"Objects","o":1304,"x":31,"y":61,"s":"lower_left_fountain_pen","n":"vulpen","k":"lower left fountain pen|fountain pen|vulpen|pen|fountain"},{"u":"1f58a-fe0f","c":"Objects","o":1305,"x":31,"y":60,"s":"lower_left_ballpoint_pen","n":"pen","k":"lower left ballpoint pen|pen|ballpoint|balpen"},{"u":"1f58c-fe0f","c":"Objects","o":1306,"x":32,"y":0,"s":"lower_left_paintbrush","n":"kwast","k":"lower left paintbrush|paintbrush|kwast|penseel|schilderen|schilderkwast|verven|painting"},{"u":"1f58d-fe0f","c":"Objects","o":1307,"x":32,"y":1,"s":"lower_left_crayon","n":"krijtje","k":"lower left crayon|crayon|krijtje|krijt|rood krijtje"},{"u":"1f4dd","c":"Objects","o":1308,"x":29,"y":20,"s":"memo","n":"memo","k":"memo|pencil|aantekeningen|opmerkingen|papier|potlood|communication|media|notes"},{"u":"1f4bc","c":"Objects","o":1309,"x":28,"y":49,"s":"briefcase","n":"aktentas","k":"briefcase|aktentas|aktetas|boekentas|handtas|kantoor|office"},{"u":"1f4c1","c":"Objects","o":1310,"x":28,"y":54,"s":"file_folder","n":"bestandsmap","k":"file folder|bestandsmap|bestand|map|file|folder"},{"u":"1f4c2","c":"Objects","o":1311,"x":28,"y":55,"s":"open_file_folder","n":"geopende map","k":"open file folder|geopende map|bestand|geopende bestandsmap|map|open|file|folder"},{"u":"1f5c2-fe0f","c":"Objects","o":1312,"x":32,"y":26,"s":"card_index_dividers","n":"tabbladen","k":"card index dividers|tabbladen|index|kaart|kaarten|card|dividers"},{"u":"1f4c5","c":"Objects","o":1313,"x":28,"y":58,"s":"date","n":"kalender","k":"date|calendar|kalender|datum"},{"u":"1f4c6","c":"Objects","o":1314,"x":28,"y":59,"s":"calendar","n":"scheurkalender","k":"calendar|tear-off calendar|scheurkalender|kalender|tear-off"},{"u":"1f5d2-fe0f","c":"Objects","o":1315,"x":32,"y":30,"s":"spiral_note_pad","n":"schrijfblok met spiraal","k":"spiral note pad|spiral notepad|schrijfblok met spiraal|notitie|notitieblok|schrijfblok|spiraal|note|notepad|pad|spiral"},{"u":"1f5d3-fe0f","c":"Objects","o":1316,"x":32,"y":31,"s":"spiral_calendar_pad","n":"kalender met spiraal","k":"spiral calendar pad|spiral calendar|kalender met spiraal|blok|jaarkalender|kalender|omlegkalender|spiraal|calendar|pad|spiral"},{"u":"1f4c7","c":"Objects","o":1317,"x":28,"y":60,"s":"card_index","n":"kaartindex","k":"card index|kaartindex|index|kaart|rolodex|systeemkaarten|card|old|school"},{"u":"1f4c8","c":"Objects","o":1318,"x":28,"y":61,"s":"chart_with_upwards_trend","n":"stijgende trend","k":"chart with upwards trend|stijgende trend|diagram|grafiek|grafiek met stijgende trend|groei|positief|stijgend|chart increasing|chart|data|graph|growth|increasing|right|trend|up|upward"},{"u":"1f4c9","c":"Objects","o":1319,"x":29,"y":0,"s":"chart_with_downwards_trend","n":"dalende trend","k":"chart with downwards trend|dalende trend|dalend|daling|diagram|grafiek|grafiek met dalende trend|negatief|chart decreasing|chart|data|decreasing|down|downward|graph|negative|trend"},{"u":"1f4ca","c":"Objects","o":1320,"x":29,"y":1,"s":"bar_chart","n":"staafdiagram","k":"bar chart|staafdiagram|diagram|grafiek|staaf|staafgrafiek|bar|chart|data|graph"},{"u":"1f4cb","c":"Objects","o":1321,"x":29,"y":2,"s":"clipboard","n":"klembord","k":"clipboard|klembord|notities|to-dolijst|do|list|notes"},{"u":"1f4cc","c":"Objects","o":1322,"x":29,"y":3,"s":"pushpin","n":"punaise","k":"pushpin|punaise|speld|collage|pin"},{"u":"1f4cd","c":"Objects","o":1323,"x":29,"y":4,"s":"round_pushpin","n":"ronde speld","k":"round pushpin|ronde speld|kaart|kopspeld|locatie|speld|location|map|pin|pushpin|round"},{"u":"1f4ce","c":"Objects","o":1324,"x":29,"y":5,"s":"paperclip","n":"paperclip","k":"paperclip|clip"},{"u":"1f587-fe0f","c":"Objects","o":1325,"x":31,"y":59,"s":"linked_paperclips","n":"twee paperclips aan elkaar","k":"linked paperclips|twee paperclips aan elkaar|aan elkaar|paperclip|paperclips|vastgemaakt|link|linked"},{"u":"1f4cf","c":"Objects","o":1326,"x":29,"y":6,"s":"straight_ruler","n":"liniaal","k":"straight ruler|liniaal|meetinstrument|meten|rechte lijn|wiskunde|angle|edge|math|ruler|straight|straightedge"},{"u":"1f4d0","c":"Objects","o":1327,"x":29,"y":7,"s":"triangular_ruler","n":"geodriehoek","k":"triangular ruler|geodriehoek|driehoek|geo|liniaal|meetinstrument|meten|wiskunde|angle|math|rule|ruler|set|slide|triangle|triangular"},{"u":"2702-fe0f","c":"Objects","o":1328,"x":59,"y":52,"s":"scissors","n":"schaar","k":"scissors|black scissors|schaar|gereedschap|knippen|cut|cutting|paper|tool"},{"u":"1f5c3-fe0f","c":"Objects","o":1329,"x":32,"y":27,"s":"card_file_box","n":"kaartenbak","k":"card file box|kaartenbak|archief|bak|kaart|box|card|file"},{"u":"1f5c4-fe0f","c":"Objects","o":1330,"x":32,"y":28,"s":"file_cabinet","n":"archiefkast","k":"file cabinet|archiefkast|archief|archiveren|kast|cabinet|file|filing|paper"},{"u":"1f5d1-fe0f","c":"Objects","o":1331,"x":32,"y":29,"s":"wastebasket","n":"prullenmand","k":"wastebasket|prullenmand|prullenbak|recyclen|can|garbage|trash|waste"},{"u":"1f512","c":"Objects","o":1332,"x":30,"y":10,"s":"lock","n":"slot","k":"lock|slot|gesloten slot|privé|locked|closed|private"},{"u":"1f513","c":"Objects","o":1333,"x":30,"y":11,"s":"unlock","n":"geopend hangslot","k":"unlock|open lock|geopend hangslot|gekraakt slot|geopend|hangslot|open|open slot|openen|unlocked|cracked|lock"},{"u":"1f50f","c":"Objects","o":1334,"x":30,"y":7,"s":"lock_with_ink_pen","n":"slot met pen","k":"lock with ink pen|slot met pen|inkt|pen|privacy|slot|slot met vulpen|vulpen|locked with pen|ink|lock|locked|nib"},{"u":"1f510","c":"Objects","o":1335,"x":30,"y":8,"s":"closed_lock_with_key","n":"gesloten slot met sleutel","k":"closed lock with key|gesloten slot met sleutel|beveiligd|gesloten|sleutel|slok|slot met sleutel|locked with key|bike|closed|key|lock|locked|secure"},{"u":"1f511","c":"Objects","o":1336,"x":30,"y":9,"s":"key","n":"sleutel","k":"key|sleutel|beveiligd|op slot|openen|wachtwoord|keys|lock|major|password|unlock"},{"u":"1f5dd-fe0f","c":"Objects","o":1337,"x":32,"y":33,"s":"old_key","n":"oude sleutel","k":"old key|oude sleutel|aanwijzing|oud|ouderwetse sleutel|sleutel|slot|clue|key|lock|old"},{"u":"1f528","c":"Objects","o":1338,"x":30,"y":32,"s":"hammer","n":"hamer","k":"hammer|hamer|gereedschap|timmeren|home|improvement|repairs|tool"},{"u":"1fa93","c":"Objects","o":1339,"x":55,"y":13,"s":"axe","n":"bijl","k":"axe|bijl|gereedschap|hakken|hout|houthakker|splijten|ax|chop|hatchet|split|wood"},{"u":"26cf-fe0f","c":"Objects","o":1340,"x":59,"y":17,"s":"pick","n":"pikhouweel","k":"pick|pikhouweel|gereedschap|mijnbouw|hammer|mining|tool"},{"u":"2692-fe0f","c":"Objects","o":1341,"x":58,"y":57,"s":"hammer_and_pick","n":"twee hamers","k":"hammer and pick|twee hamers|gereedschap|hamer|hamer en pikhouweel|hamers|pikhouweel|hammer|pick|tool"},{"u":"1f6e0-fe0f","c":"Objects","o":1342,"x":38,"y":52,"s":"hammer_and_wrench","n":"hamer en moersleutel","k":"hammer and wrench|hamer en moersleutel|gereedschap|hamer|klussen|moersleutel|hammer|spanner|tool|wrench"},{"u":"1f5e1-fe0f","c":"Objects","o":1343,"x":32,"y":35,"s":"dagger_knife","n":"dolk","k":"dagger knife|dagger|dolk|mes|wapen|knife|weapon"},{"u":"2694-fe0f","c":"Objects","o":1344,"x":58,"y":59,"s":"crossed_swords","n":"gekruiste zwaarden","k":"crossed swords|gekruiste zwaarden|degens gekruist|gekruist|wapen|zwaarden|crossed|swords|weapon"},{"u":"1f4a3","c":"Objects","o":1345,"x":28,"y":19,"s":"bomb","n":"bom","k":"bomb|bom|cartoonbom|explosie|gevaarlijk|ontploffing|strip|boom|comic|dangerous|explosion|hot"},{"u":"1fa83","c":"Objects","o":1346,"x":55,"y":4,"s":"boomerang","n":"boemerang","k":"boomerang|boemerang|australië|buiten|reactie|spel|terugslag|rebound|repercussion|weapon"},{"u":"1f3f9","c":"Objects","o":1347,"x":10,"y":49,"s":"bow_and_arrow","n":"pijl en boog","k":"bow and arrow|pijl en boog|boog|boogschieten|boogschutter|horoscoop|pijl|sport|sterrenbeeld|wapen|archer|archery|arrow|bow|sagittarius|tool|weapon|zodiac"},{"u":"1f6e1-fe0f","c":"Objects","o":1348,"x":38,"y":53,"s":"shield","n":"schild","k":"shield|schild|bescherming|middeleeuwen|wapen|weapon"},{"u":"1fa9a","c":"Objects","o":1349,"x":55,"y":20,"s":"carpentry_saw","n":"houtzaag","k":"carpentry saw|houtzaag|afzagen|gereedschap|hout|timmeren|timmerman|voorwerp|zaag|zagen|carpenter|carpentry|cut|lumber|saw|tool|trim"},{"u":"1f527","c":"Objects","o":1350,"x":30,"y":31,"s":"wrench","n":"moersleutel","k":"wrench|moersleutel|engelse sleutel|gereedschap|schroefsleutel|home|improvement|spanner|tool"},{"u":"1fa9b","c":"Objects","o":1351,"x":55,"y":21,"s":"screwdriver","n":"schroevendraaier","k":"screwdriver|schroevendraaier|gereedschap|klussen|repareren|schroef|flathead|handy|screw|tool"},{"u":"1f529","c":"Objects","o":1352,"x":30,"y":33,"s":"nut_and_bolt","n":"bout en moer","k":"nut and bolt|bout en moer|bout|gereedschap|moer|bolt|home|improvement|nut|tool"},{"u":"2699-fe0f","c":"Objects","o":1353,"x":59,"y":1,"s":"gear","n":"tandwiel","k":"gear|tandwiel|gereedschap|instellingen|radertje|tandrad|cog|cogwheel|tool"},{"u":"1f5dc-fe0f","c":"Objects","o":1354,"x":32,"y":32,"s":"compression","n":"lijmklem","k":"compression|clamp|lijmklem|bankschroef|gereedschap|samendrukken|compress|tool|vice"},{"u":"2696-fe0f","c":"Objects","o":1355,"x":58,"y":61,"s":"scales","n":"weegschaal","k":"scales|balance scale|weegschaal|balans|dierenriem|gerechtigheid|gewichten|horoscoop|libra|recht|sterrenbeeld|weegschaal in balans|balance|justice|scale|tool|weight|zodiac"},{"u":"1f9af","c":"Objects","o":1356,"x":45,"y":38,"s":"probing_cane","n":"taststok","k":"probing cane|taststok|blind|blindenstok|lopen|toegankelijkheid|white cane|accessibility|cane|probing|white"},{"u":"1f517","c":"Objects","o":1357,"x":30,"y":15,"s":"link","n":"schakels","k":"link|link symbol|schakels|twee ringen|links"},{"u":"26d3-fe0f","c":"Objects","o":1359,"x":59,"y":20,"s":"chains","n":"kettingen","k":"chains|kettingen|ketting|chain"},{"u":"1fa9d","c":"Objects","o":1360,"x":55,"y":23,"s":"hook","n":"haak","k":"hook|haak|aanbeveling|bocht|hengel|kronkel|vangen|verstrikken|vissen|catch|crook|curve|ensnare|point|selling"},{"u":"1f9f0","c":"Objects","o":1361,"x":54,"y":34,"s":"toolbox","n":"gereedschapskist","k":"toolbox|gereedschapskist|doos|gereedschap|kist|monteur|rode kist|box|chest|mechanic|red|tool"},{"u":"1f9f2","c":"Objects","o":1362,"x":54,"y":36,"s":"magnet","n":"magneet","k":"magnet|magneet|aantrekking|aantrekkingskracht|hoefijzer|magnetisch|positief negatief|uvormig|attraction|horseshoe|magnetic|negative|positive|shape|u"},{"u":"1fa9c","c":"Objects","o":1363,"x":55,"y":22,"s":"ladder","n":"ladder","k":"ladder|klimmen|omhoog|omlaag|sport|trede|voorwerp|climb|rung|step"},{"u":"2697-fe0f","c":"Objects","o":1364,"x":59,"y":0,"s":"alembic","n":"distilleerkolf","k":"alembic|distilleerkolf|gereedschap|scheikunde|chemistry|tool"},{"u":"1f9ea","c":"Objects","o":1365,"x":54,"y":28,"s":"test_tube","n":"reageerbuis","k":"test tube|reageerbuis|chemicus|experiment|lab|laboratorium|scheikunde|scheikundige|wetenschap|chemist|chemistry|science|test|tube"},{"u":"1f9eb","c":"Objects","o":1366,"x":54,"y":29,"s":"petri_dish","n":"petrischaal","k":"petri dish|petrischaal|bacterie|bacteriën|biologe|biologie|bioloog|cultuur|kweek|lab|laboratorium|bacteria|biologist|biology|culture|dish|petri"},{"u":"1f9ec","c":"Objects","o":1367,"x":54,"y":30,"s":"dna","n":"DNA","k":"dna|dna double helix|biologe|bioloog|evolutie|gen|genetica|genetisch|leven|biologist|evolution|gene|genetics|life"},{"u":"1f52c","c":"Objects","o":1368,"x":30,"y":36,"s":"microscope","n":"microscoop","k":"microscope|microscoop|experiment|gereedschap|instrument|laboratorium|onderzoek|wetenschap|lab|science|tool"},{"u":"1f52d","c":"Objects","o":1369,"x":30,"y":37,"s":"telescope","n":"telescoop","k":"telescope|telescoop|buitenaards leven|gereedschap|heelal|instrument|sterrenkijker|wetenschap|contact|extraterrestrial|science|tool"},{"u":"1f4e1","c":"Objects","o":1370,"x":29,"y":24,"s":"satellite_antenna","n":"satellietschotel","k":"satellite antenna|satellietschotel|antenne|communicatie|satelliet|schotel|aliens|antenna|contact|dish|satellite|science"},{"u":"1f489","c":"Objects","o":1371,"x":27,"y":5,"s":"syringe","n":"injectiespuit","k":"syringe|injectiespuit|dokter|gereedschap|griep|injectie|medicijn|naald|spuit|vaccinatie|ziek|doctor|flu|medicine|needle|shot|sick|tool|vaccination"},{"u":"1fa78","c":"Objects","o":1372,"x":54,"y":58,"s":"drop_of_blood","n":"bloeddruppel","k":"drop of blood|bloeddruppel|bloed|bloeden|donatie|druppel|medicijnen|menstruatie|verwonding|bleed|blood|donation|drop|injury|medicine|menstruation"},{"u":"1f48a","c":"Objects","o":1373,"x":27,"y":6,"s":"pill","n":"pil","k":"pill|pil|dokter|geneeskunde|medicatie|medicijn|vitamine|ziek|doctor|drugs|medicated|medicine|pills|sick|vitamin"},{"u":"1fa79","c":"Objects","o":1374,"x":54,"y":59,"s":"adhesive_bandage","n":"pleister","k":"adhesive bandage|pleister|bloed|pijn|snee|verband|wond|ziekenhuis|adhesive|bandage"},{"u":"1fa7c","c":"Objects","o":1375,"x":55,"y":0,"s":"crutch","n":"kruk","k":"crutch|kruk|gewond|handicap|lopen|mobiliteitshulp|stok|wandelstok|aid|cane|disability|help|hurt|injured|mobility|stick"},{"u":"1fa7a","c":"Objects","o":1376,"x":54,"y":60,"s":"stethoscope","n":"stethoscoop","k":"stethoscope|stethoscoop|arts|dokter|geneeskunde|hart|medicijnen|ziekenhuis|doctor|heart|medicine"},{"u":"1fa7b","c":"Objects","o":1377,"x":54,"y":61,"s":"x-ray","n":"röntgenfoto","k":"x-ray|röntgenfoto|borstkas|botten|dokter|medisch|ribben|skelet|ziek|ziekenhuis|bones|doctor|medical|skeleton|skull|xray"},{"u":"1f6aa","c":"Objects","o":1378,"x":36,"y":54,"s":"door","n":"deur","k":"door|deur|achterdeur|gesloten deur|voordeur|back|closet|front"},{"u":"1f6d7","c":"Objects","o":1379,"x":38,"y":47,"s":"elevator","n":"lift","k":"elevator|lift|hijstoestel|machine|omhoog|omlaag|personenlift|toegankelijkheid|voorwerp|accessibility|hoist"},{"u":"1fa9e","c":"Objects","o":1380,"x":55,"y":24,"s":"mirror","n":"spiegel","k":"mirror|spiegel|make-up|opmaken|reflectie|reflector|speculum|spiegelbeeld|spiegels|voorwerp|weerspiegeling|makeup|reflection"},{"u":"1fa9f","c":"Objects","o":1381,"x":55,"y":25,"s":"window","n":"raam","k":"window|raam|doorzichtig|frisse lucht|kijken|kozijn|opening|raamkozijn|uitzicht|venster|voorwerp|air|frame|fresh|transparent|view"},{"u":"1f6cf-fe0f","c":"Objects","o":1382,"x":38,"y":41,"s":"bed","n":"bed","k":"bed|hotel|slapen|sleep"},{"u":"1f6cb-fe0f","c":"Objects","o":1383,"x":38,"y":32,"s":"couch_and_lamp","n":"bank en lamp","k":"couch and lamp|bank en lamp|bank|hotel|lamp|sofa|couch"},{"u":"1fa91","c":"Objects","o":1384,"x":55,"y":11,"s":"chair","n":"hoge stoel","k":"chair|hoge stoel|meubels|meubelstuk|stoel|zetel|zitten|seat|sit"},{"u":"1f6bd","c":"Objects","o":1385,"x":38,"y":18,"s":"toilet","n":"toilet","k":"toilet|wc|bathroom"},{"u":"1faa0","c":"Objects","o":1386,"x":55,"y":26,"s":"plunger","n":"ontstopper","k":"plunger|ontstopper|kracht|loodgieter|poep|wc|zuiger|zuigkracht|cup|force|plumber|poop|suction|toilet"},{"u":"1f6bf","c":"Objects","o":1387,"x":38,"y":20,"s":"shower","n":"douche","k":"shower|douche|douchekop|water"},{"u":"1f6c1","c":"Objects","o":1388,"x":38,"y":27,"s":"bathtub","n":"badkuip","k":"bathtub|badkuip|bad|badkuip met douche|bath"},{"u":"1faa4","c":"Objects","o":1389,"x":55,"y":30,"s":"mouse_trap","n":"muizenval","k":"mouse trap|muizenval|aas|kaas|lokken|strik|valstrik|vangen|bait|cheese|lure|mouse|mousetrap|snare|trap"},{"u":"1fa92","c":"Objects","o":1390,"x":55,"y":12,"s":"razor","n":"scheermes","k":"razor|scheermes|baard|badkamer|mesjes|scheren|scherp|voorwerp|sharp|shave"},{"u":"1f9f4","c":"Objects","o":1391,"x":54,"y":38,"s":"lotion_bottle","n":"lotionfles","k":"lotion bottle|lotionfles|crème|huidcrème|hydraterende lotion|lotion|lotion flacon|moisturizer|shampoo|zonnebrandcrème|zonnebrandolie|bottle|sunscreen"},{"u":"1f9f7","c":"Objects","o":1392,"x":54,"y":41,"s":"safety_pin","n":"veiligheidsspeld","k":"safety pin|veiligheidsspeld|luier|luierspeld|punk|speld|diaper|pin|rock|safety"},{"u":"1f9f9","c":"Objects","o":1393,"x":54,"y":43,"s":"broom","n":"bezem","k":"broom|bezem|bezemsteel|heks|schoonmaken|vegen|cleaning|sweeping|witch"},{"u":"1f9fa","c":"Objects","o":1394,"x":54,"y":44,"s":"basket","n":"mand","k":"basket|mand|boeren|landbouw|oogsten|picknick|wasgoed|wasmand|farming|laundry|picnic"},{"u":"1f9fb","c":"Objects","o":1395,"x":54,"y":45,"s":"roll_of_paper","n":"rol papier","k":"roll of paper|rol papier|closetrol|keukenrol|papieren handdoek|toiletpapier|toiletrol|wc-papier|wc-rol|paper|roll|toilet|towels"},{"u":"1faa3","c":"Objects","o":1396,"x":55,"y":29,"s":"bucket","n":"emmer","k":"bucket|emmer|aker|dweil|dweilen|poetsen|putemmer|schoonmaken|vat|voorwerp|water|cask|pail"},{"u":"1f9fc","c":"Objects","o":1397,"x":54,"y":46,"s":"soap","n":"zeep","k":"soap|bar of soap|zeep|baden|inzepen|schoon|schoonmaken|schuim|stuk zeep|wassen|zeepbakje|zeephouder|bar|bathing|clean|cleaning|lather|soapdish"},{"u":"1fae7","c":"Objects","o":1398,"x":56,"y":37,"s":"bubbles","n":"zeepbellen","k":"bubbles|zeepbellen|bad|bubbel|bubbels|onderwater|schoon|wassen|zeep|bubble|burp|clean|floating|pearl|soap|underwater"},{"u":"1faa5","c":"Objects","o":1399,"x":55,"y":31,"s":"toothbrush","n":"tandenborstel","k":"toothbrush|tandenborstel|badkamer|borstel|hygiëne|poetsen|tanden|tandheelkunde|toiletartikelen|bathroom|brush|clean|dental|hygiene|teeth|toiletry"},{"u":"1f9fd","c":"Objects","o":1400,"x":54,"y":47,"s":"sponge","n":"spons","k":"sponge|spons|absorberen|absorberend|baden|poreus|schoonmaken|schrobben|absorbing|cleaning|porous|soak"},{"u":"1f9ef","c":"Objects","o":1401,"x":54,"y":33,"s":"fire_extinguisher","n":"brandblusapparaat","k":"fire extinguisher|brandblusapparaat|blusapparaat|blussen|blusser|brandblusser|doven|vuur|extinguish|extinguisher|fire|quench"},{"u":"1f6d2","c":"Objects","o":1402,"x":38,"y":44,"s":"shopping_trolley","n":"winkelwagen","k":"shopping trolley|winkelwagen|boodschappen|shoppen|wagen|wagentje|winkelen|shopping cart|cart|shopping|trolley"},{"u":"1f6ac","c":"Objects","o":1403,"x":36,"y":56,"s":"smoking","n":"sigaret","k":"smoking|smoking symbol|sigaret|roken|cigarette"},{"u":"26b0-fe0f","c":"Objects","o":1404,"x":59,"y":9,"s":"coffin","n":"doodskist","k":"coffin|doodskist|dood|kist|vampier|dead|death|vampire"},{"u":"1faa6","c":"Objects","o":1405,"x":55,"y":32,"s":"headstone","n":"grafsteen","k":"headstone|grafsteen|begraafplaats|begrafenis|dood|graf|grafzerk|kerkhof|overleden|voorwerp|cemetery|dead|grave|graveyard|memorial|rip|tomb|tombstone"},{"u":"26b1-fe0f","c":"Objects","o":1406,"x":59,"y":10,"s":"funeral_urn","n":"urn","k":"funeral urn|urn|as|begrafenis|dood|ashes|death|funeral"},{"u":"1f9ff","c":"Objects","o":1407,"x":54,"y":49,"s":"nazar_amulet","n":"Nazar-amulet","k":"nazar amulet|nazar-amulet|amulet|bedel|blauw|boze oog|kraal|nazar|talisman|bead|blue|charm|evil-eye"},{"u":"1faac","c":"Objects","o":1408,"x":55,"y":38,"s":"hamsa","n":"hamsa","k":"hamsa|amulet|bescherming|fatima|geluk|hand|handpalm|maria|mirjam|oog|fortune|guide|mary|miriam|palm|protect|protection"},{"u":"1f5ff","c":"Objects","o":1409,"x":32,"y":45,"s":"moyai","n":"moai-beeld","k":"moyai|moai-beeld|beelden|gezicht|moai|paaseiland|reizen|standbeeld|face|statue|stoneface|travel"},{"u":"1faa7","c":"Objects","o":1410,"x":55,"y":33,"s":"placard","n":"plakkaat","k":"placard|plakkaat|bord|demonstratie|mars|poster|protest|protesteren|slogan|voorwerp|card|demonstration|notice|picket|plaque|sign"},{"u":"1faaa","c":"Objects","o":1411,"x":55,"y":36,"s":"identification_card","n":"legitimatiebewijs","k":"identification card|legitimatiebewijs|beveiliging|id|id-kaart|identificatie|identiteitskaart|overheid|vergunning|card|credentials|document|identification|license|security"},{"u":"1f3e7","c":"Symbols","o":1412,"x":10,"y":28,"s":"atm","n":"pinautomaat","k":"atm|automated teller machine|pinautomaat|automaat|bank|geld|pinnen|atm sign|automated|cash|money|sign|teller"},{"u":"1f6ae","c":"Symbols","o":1413,"x":36,"y":58,"s":"put_litter_in_its_place","n":"prullenbaksymbool","k":"put litter in its place|put litter in its place symbol|prullenbaksymbool|afval|prullenbak|teken|vuilnisbak|litter in bin sign|bin|litter|litterbin|sign"},{"u":"1f6b0","c":"Symbols","o":1414,"x":36,"y":60,"s":"potable_water","n":"drinkwater","k":"potable water|potable water symbol|drinkwater|drinkwatersymbool|kraan met glas|kraanwater|drinking|potable|water"},{"u":"267f","c":"Symbols","o":1415,"x":58,"y":56,"s":"wheelchair","n":"rolstoelsymbool","k":"wheelchair|wheelchair symbol|rolstoelsymbool|handicap|rolstoel|symbool|toegang|access|symbol"},{"u":"1f6b9","c":"Symbols","o":1416,"x":38,"y":14,"s":"mens","n":"herentoilet","k":"mens|mens symbol|herentoilet|heren-wc|herensymbool|man|mannen|symbool|toilet|wc|men’s room|bathroom|lavatory|men’s|restroom|room"},{"u":"1f6ba","c":"Symbols","o":1417,"x":38,"y":15,"s":"womens","n":"damestoilet","k":"womens|womens symbol|damestoilet|dames-wc|damessymbool|symbool|toilet|vrouw|vrouwen|wc|women’s room|bathroom|lavatory|restroom|room|woman|women’s"},{"u":"1f6bb","c":"Symbols","o":1418,"x":38,"y":16,"s":"restroom","n":"toiletten","k":"restroom|toiletten|toilet|toiletsymbool|unisex|wc|bathroom|lavatory"},{"u":"1f6bc","c":"Symbols","o":1419,"x":38,"y":17,"s":"baby_symbol","n":"babysymbool","k":"baby symbol|babysymbool|baby|symbool|verschonen|changing|symbol"},{"u":"1f6be","c":"Symbols","o":1420,"x":38,"y":19,"s":"wc","n":"wc","k":"wc|water closet|toilet|wasgelegenheid|water|bathroom|closet|lavatory|restroom"},{"u":"1f6c2","c":"Symbols","o":1421,"x":38,"y":28,"s":"passport_control","n":"paspoortcontrole","k":"passport control|paspoortcontrole|controle|paspoort|control|passport"},{"u":"1f6c3","c":"Symbols","o":1422,"x":38,"y":29,"s":"customs","n":"douane","k":"customs|douane|vliegveld|packing"},{"u":"1f6c4","c":"Symbols","o":1423,"x":38,"y":30,"s":"baggage_claim","n":"bagage afhalen","k":"baggage claim|bagage afhalen|aangekomen|bagage|bagage ophalen|bagageband|koffer|reizen|vliegveld|arrived|baggage|bags|case|checked|claim|journey|packing|plane|ready|travel|trip"},{"u":"1f6c5","c":"Symbols","o":1424,"x":38,"y":31,"s":"left_luggage","n":"bagagekluis","k":"left luggage|bagagekluis|achtergelaten|bagage|kluisje|koffer|baggage|case|left|locker|luggage"},{"u":"26a0-fe0f","c":"Symbols","o":1425,"x":59,"y":4,"s":"warning","n":"waarschuwing","k":"warning|warning sign|waarschuwing|voorzichtig|caution"},{"u":"1f6b8","c":"Symbols","o":1426,"x":38,"y":13,"s":"children_crossing","n":"overstekende kinderen","k":"children crossing|overstekende kinderen|kind|kinderen|oversteekplaats|verkeer|voetganger|child|children|crossing|pedestrian|traffic"},{"u":"26d4","c":"Symbols","o":1427,"x":59,"y":21,"s":"no_entry","n":"geen toegang","k":"no entry|geen toegang|nee|symbool|verboden|verboden toegang|do|entry|fail|forbidden|no|not|pass|prohibited|traffic"},{"u":"1f6ab","c":"Symbols","o":1428,"x":36,"y":55,"s":"no_entry_sign","n":"verboden","k":"no entry sign|verboden|nee|niet|roken|toegang|prohibited|entry|forbidden|no|not|smoke"},{"u":"1f6b3","c":"Symbols","o":1429,"x":37,"y":1,"s":"no_bicycles","n":"geen fietsen","k":"no bicycles|geen fietsen|fiets|fietsen|nee|niet|verboden|bicycle|bicycles|bike|forbidden|no|not|prohibited"},{"u":"1f6ad","c":"Symbols","o":1430,"x":36,"y":57,"s":"no_smoking","n":"niet roken","k":"no smoking|no smoking symbol|niet roken|nee|niet|roken|verboden|forbidden|no|not|prohibited|smoke|smoking"},{"u":"1f6af","c":"Symbols","o":1431,"x":36,"y":59,"s":"do_not_litter","n":"geen afval weggooien","k":"do not litter|do not litter symbol|geen afval weggooien|geen|niet|verboden|zwerfvuil|no littering|forbidden|litter|littering|no|not|prohibited"},{"u":"1f6b1","c":"Symbols","o":1432,"x":36,"y":61,"s":"non-potable_water","n":"geen drinkwater","k":"non-potable water|non-potable water symbol|geen drinkwater|drinken verboden|niet drinkbaar|niet drinken|water|dry|non-drinking|non-potable|prohibited"},{"u":"1f6b7","c":"Symbols","o":1433,"x":38,"y":12,"s":"no_pedestrians","n":"geen voetgangers","k":"no pedestrians|geen voetgangers|nee|niet|verboden|voetganger|voetgangers|forbidden|no|not|pedestrian|pedestrians|prohibited"},{"u":"1f4f5","c":"Symbols","o":1434,"x":29,"y":44,"s":"no_mobile_phones","n":"geen mobiele telefoon","k":"no mobile phones|geen mobiele telefoon|mobiel|nee|niet|telefoon|telefoons|verboden|cell|forbidden|mobile|no|not|phone|phones|prohibited|telephone"},{"u":"1f51e","c":"Symbols","o":1435,"x":30,"y":22,"s":"underage","n":"niemand onder de 18","k":"underage|no one under eighteen symbol|niemand onder de 18|18|achttien|beperking|één|leeftijd|minderjarig|nee|niet|verboden|no one under eighteen|age|eighteen|forbidden|no|not|one|prohibited|restriction"},{"u":"2622-fe0f","c":"Symbols","o":1436,"x":58,"y":25,"s":"radioactive_sign","n":"radioactief","k":"radioactive sign|radioactive|radioactief|teken|sign"},{"u":"2623-fe0f","c":"Symbols","o":1437,"x":58,"y":26,"s":"biohazard_sign","n":"biologisch gevaar","k":"biohazard sign|biohazard|biologisch gevaar|teken|sign"},{"u":"2b06-fe0f","c":"Symbols","o":1438,"x":60,"y":48,"s":"arrow_up","n":"pijl omhoog","k":"arrow up|upwards black arrow|pijl omhoog|noord|omhoog|pijl|richting|windrichting|up arrow|arrow|cardinal|direction|north|up"},{"u":"2197-fe0f","c":"Symbols","o":1439,"x":57,"y":38,"s":"arrow_upper_right","n":"pijl rechtsomhoog","k":"arrow upper right|north east arrow|pijl rechtsomhoog|noordoost|pijl|rechtsboven|richting|windrichting|up-right arrow|arrow|direction|intercardinal|northeast|up-right"},{"u":"27a1-fe0f","c":"Symbols","o":1440,"x":60,"y":42,"s":"arrow_right","n":"pijl naar rechts","k":"arrow right|black rightwards arrow|pijl naar rechts|oost|pijl|rechts|richting|windrichting|right arrow|arrow|cardinal|direction|east|right"},{"u":"2198-fe0f","c":"Symbols","o":1441,"x":57,"y":39,"s":"arrow_lower_right","n":"pijl rechtsomlaag","k":"arrow lower right|south east arrow|pijl rechtsomlaag|pijl|rechtsonder|richting|windrichting|zuidoost|down-right arrow|arrow|direction|down-right|intercardinal|southeast"},{"u":"2b07-fe0f","c":"Symbols","o":1442,"x":60,"y":49,"s":"arrow_down","n":"pijl omlaag","k":"arrow down|downwards black arrow|pijl omlaag|omlaag|pijl|richting|windrichting|zuid|down arrow|arrow|cardinal|direction|down|south"},{"u":"2199-fe0f","c":"Symbols","o":1443,"x":57,"y":40,"s":"arrow_lower_left","n":"pijl linksomlaag","k":"arrow lower left|south west arrow|pijl linksomlaag|linksonder|pijl|richting|windrichting|zuidwest|down-left arrow|arrow|direction|down-left|intercardinal|southwest"},{"u":"2b05-fe0f","c":"Symbols","o":1444,"x":60,"y":47,"s":"arrow_left","n":"pijl naar links","k":"arrow left|leftwards black arrow|pijl naar links|links|pijl|richting|west|windrichting|left arrow|arrow|cardinal|direction|left"},{"u":"2196-fe0f","c":"Symbols","o":1445,"x":57,"y":37,"s":"arrow_upper_left","n":"pijl linksomhoog","k":"arrow upper left|north west arrow|pijl linksomhoog|linksboven|noordwest|pijl|richting|windrichting|up-left arrow|arrow|direction|intercardinal|northwest|up-left"},{"u":"2195-fe0f","c":"Symbols","o":1446,"x":57,"y":36,"s":"arrow_up_down","n":"pijl omhoog en omlaag","k":"arrow up down|up down arrow|pijl omhoog en omlaag|omhoog en omlaag|pijl|up-down arrow|arrow|up-down"},{"u":"2194-fe0f","c":"Symbols","o":1447,"x":57,"y":35,"s":"left_right_arrow","n":"pijl naar links en rechts","k":"left right arrow|pijl naar links en rechts|pijl|left-right arrow|arrow|left-right"},{"u":"21a9-fe0f","c":"Symbols","o":1448,"x":57,"y":41,"s":"leftwards_arrow_with_hook","n":"pijl naar rechts die naar links draait","k":"leftwards arrow with hook|pijl naar rechts die naar links draait|gebogen|links|pijl|rechts|right arrow curving left|arrow|curving|left|right"},{"u":"21aa-fe0f","c":"Symbols","o":1449,"x":57,"y":42,"s":"arrow_right_hook","n":"pijl naar links die naar rechts draait","k":"arrow right hook|rightwards arrow with hook|pijl naar links die naar rechts draait|gebogen|links|pijl|rechts|left arrow curving right|arrow|curving|left|right"},{"u":"2934-fe0f","c":"Symbols","o":1450,"x":60,"y":45,"s":"arrow_heading_up","n":"pijl naar rechts die omhoog draait","k":"arrow heading up|arrow pointing rightwards then curving upwards|pijl naar rechts die omhoog draait|omhoog|pijl|rechts|right arrow curving up|arrow|curving|right|up"},{"u":"2935-fe0f","c":"Symbols","o":1451,"x":60,"y":46,"s":"arrow_heading_down","n":"pijl naar rechts die omlaag draait","k":"arrow heading down|arrow pointing rightwards then curving downwards|pijl naar rechts die omlaag draait|gebogen|omlaag|pijl|rechts|right arrow curving down|arrow|curving|down|right"},{"u":"1f503","c":"Symbols","o":1452,"x":29,"y":57,"s":"arrows_clockwise","n":"verticale pijlen met de klok mee","k":"arrows clockwise|clockwise downwards and upwards open circle arrows|verticale pijlen met de klok mee|met de klok mee|opnieuw laden|pijl|pijlen|verticaal|verversen|clockwise vertical arrows|arrow|arrows|clockwise|refresh|reload|vertical"},{"u":"1f504","c":"Symbols","o":1453,"x":29,"y":58,"s":"arrows_counterclockwise","n":"pijlen tegen de klok in","k":"arrows counterclockwise|anticlockwise downwards and upwards open circle arrows|pijlen tegen de klok in|déjà|knop|linksom|pijl|pijlen|tegen de klok in|vernieuwen|vu|weer|counterclockwise arrows button|again|anticlockwise|arrow|arrows|button|counterclockwise|deja|refresh|rewindershins"},{"u":"1f519","c":"Symbols","o":1454,"x":30,"y":17,"s":"back","n":"BACK-pijl","k":"back|back with leftwards arrow above|back-pijl|pijl|back arrow|arrow"},{"u":"1f51a","c":"Symbols","o":1455,"x":30,"y":18,"s":"end","n":"END-pijl","k":"end|end with leftwards arrow above|end-pijl|pijl|end arrow|arrow"},{"u":"1f51b","c":"Symbols","o":1456,"x":30,"y":19,"s":"on","n":"ON!-pijl","k":"on|on with exclamation mark with left right arrow above|on!-pijl|on!|pijl|teken|on! arrow|arrow|mark"},{"u":"1f51c","c":"Symbols","o":1457,"x":30,"y":20,"s":"soon","n":"SOON-pijl","k":"soon|soon with rightwards arrow above|soon-pijl|onderweg|pijl|zo terug|soon arrow|arrow|brb|omw"},{"u":"1f51d","c":"Symbols","o":1458,"x":30,"y":21,"s":"top","n":"TOP-pijl","k":"top|top with upwards arrow above|top-pijl|omhoog|pijl|top arrow|arrow|homie|up"},{"u":"1f6d0","c":"Symbols","o":1459,"x":38,"y":42,"s":"place_of_worship","n":"gebedsruimte","k":"place of worship|gebedsruimte|bidden|geloof|religie|tempel|place|pray|religion|worship"},{"u":"269b-fe0f","c":"Symbols","o":1460,"x":59,"y":2,"s":"atom_symbol","n":"atoomsymbool","k":"atom symbol|atoomsymbool|atheïst|atoom|symbool|atheist|atom|symbol"},{"u":"1f549-fe0f","c":"Symbols","o":1461,"x":30,"y":54,"s":"om_symbol","n":"om-symbool","k":"om symbol|om|om-symbool|hindoeïsme|religie|hindu|religion"},{"u":"2721-fe0f","c":"Symbols","o":1462,"x":60,"y":23,"s":"star_of_david","n":"davidster","k":"star of david|davidster|david|jodendom|jood|joods|religie|ster|jew|jewish|judaism|religion|star"},{"u":"2638-fe0f","c":"Symbols","o":1463,"x":58,"y":31,"s":"wheel_of_dharma","n":"wiel van dharma","k":"wheel of dharma|wiel van dharma|boeddhistisch|dharma|religie|wiel|buddhist|religion|wheel"},{"u":"262f-fe0f","c":"Symbols","o":1464,"x":58,"y":30,"s":"yin_yang","n":"yin en yang","k":"yin yang|yin en yang|leven|moeilijk|religie|tao|taoist|totaal|yang|yin|difficult|lives|religion|total|yinyang"},{"u":"271d-fe0f","c":"Symbols","o":1465,"x":60,"y":22,"s":"latin_cross","n":"christelijk kruis","k":"latin cross|christelijk kruis|christendom|geloof|kruis|religie|christ|christian|cross|latin|religion"},{"u":"2626-fe0f","c":"Symbols","o":1466,"x":58,"y":27,"s":"orthodox_cross","n":"russisch kruis","k":"orthodox cross|russisch kruis|christelijk|kruis|orthodox|religie|christian|cross|religion"},{"u":"262a-fe0f","c":"Symbols","o":1467,"x":58,"y":28,"s":"star_and_crescent","n":"wassende maan en ster","k":"star and crescent|wassende maan en ster|geloof|islam|moslim|ramadan|religie|crescent|muslim|religion|star"},{"u":"262e-fe0f","c":"Symbols","o":1468,"x":58,"y":29,"s":"peace_symbol","n":"vredessymbool","k":"peace symbol|vredessymbool|hippie|peace|symbool|vrede|vredesteken|healing|peaceful|symbol"},{"u":"1f54e","c":"Symbols","o":1469,"x":30,"y":59,"s":"menorah_with_nine_branches","n":"menora","k":"menorah with nine branches|menora|hannuka|jodendom|joods|kandelaar|religie|menorah|candelabrum|candlestick|hanukkah|jewish|judaism|religion"},{"u":"1f52f","c":"Symbols","o":1470,"x":30,"y":39,"s":"six_pointed_star","n":"zespuntige ster","k":"six pointed star|six pointed star with middle dot|zespuntige ster|geluk|jodendom|joods|met stip|ster|zespuntig|dotted six-pointed star|dotted|fortune|jewish|judaism|six-pointed|star"},{"u":"1faaf","c":"Symbols","o":1471,"x":55,"y":41,"s":"khanda","n":"khanda","k":"khanda|religie|sikh|deg|fateh|khalsa|religion|sikhism|tegh"},{"u":"2648","c":"Symbols","o":1472,"x":58,"y":36,"s":"aries","n":"ram (sterrenbeeld)","k":"aries|ram (sterrenbeeld)|dierenriem|horoscoop|ram|horoscope|zodiac"},{"u":"2649","c":"Symbols","o":1473,"x":58,"y":37,"s":"taurus","n":"stier (sterrenbeeld)","k":"taurus|stier (sterrenbeeld)|dierenriem|horoscoop|os|stier|bull|horoscope|ox|zodiac"},{"u":"264a","c":"Symbols","o":1474,"x":58,"y":38,"s":"gemini","n":"tweelingen (sterrenbeeld)","k":"gemini|tweelingen (sterrenbeeld)|dierenriem|horoscoop|tweelingen|horoscope|twins|zodiac"},{"u":"264b","c":"Symbols","o":1475,"x":58,"y":39,"s":"cancer","n":"kreeft (sterrenbeeld)","k":"cancer|kreeft (sterrenbeeld)|dierenriem|horoscoop|kreeft|crab|horoscope|zodiac"},{"u":"264c","c":"Symbols","o":1476,"x":58,"y":40,"s":"leo","n":"leeuw (sterrenbeeld)","k":"leo|leeuw (sterrenbeeld)|dierenriem|horoscoop|leeuw|horoscope|lion|zodiac"},{"u":"264d","c":"Symbols","o":1477,"x":58,"y":41,"s":"virgo","n":"maagd (sterrenbeeld)","k":"virgo|maagd (sterrenbeeld)|dierenriem|horoscoop|maagd|horoscope|zodiac"},{"u":"264e","c":"Symbols","o":1478,"x":58,"y":42,"s":"libra","n":"weegschaal (sterrenbeeld)","k":"libra|weegschaal (sterrenbeeld)|balans|dierenriem|gerechtigheid|horoscoop|weegschaal|balance|horoscope|justice|scales|zodiac"},{"u":"264f","c":"Symbols","o":1479,"x":58,"y":43,"s":"scorpius","n":"schorpioen (sterrenbeeld)","k":"scorpius|schorpioen (sterrenbeeld)|dierenriem|horoscoop|schorpioen|scorpio|horoscope|scorpion|zodiac"},{"u":"2650","c":"Symbols","o":1480,"x":58,"y":44,"s":"sagittarius","n":"boogschutter (sterrenbeeld)","k":"sagittarius|boogschutter (sterrenbeeld)|boogschutter|dierenriem|horoscoop|archer|horoscope|zodiac"},{"u":"2651","c":"Symbols","o":1481,"x":58,"y":45,"s":"capricorn","n":"steenbok (sterrenbeeld)","k":"capricorn|steenbok (sterrenbeeld)|dierenriem|horoscoop|steenbok|goat|horoscope|zodiac"},{"u":"2652","c":"Symbols","o":1482,"x":58,"y":46,"s":"aquarius","n":"waterman (sterrenbeeld)","k":"aquarius|waterman (sterrenbeeld)|dierenriem|drager|horoscoop|water|waterman|bearer|horoscope|zodiac"},{"u":"2653","c":"Symbols","o":1483,"x":58,"y":47,"s":"pisces","n":"vissen (sterrenbeeld)","k":"pisces|vissen (sterrenbeeld)|dierenriem|horoscoop|vissen|fish|horoscope|zodiac"},{"u":"26ce","c":"Symbols","o":1484,"x":59,"y":16,"s":"ophiuchus","n":"slangendrager (sterrenbeeld)","k":"ophiuchus|slangendrager (sterrenbeeld)|dierenriem|drager|horoscoop|serpent|slang|slangendrager|bearer|snake|zodiac"},{"u":"1f500","c":"Symbols","o":1485,"x":29,"y":54,"s":"twisted_rightwards_arrows","n":"knop voor shuffle","k":"twisted rightwards arrows|knop voor shuffle|gekruist|knop|nummers|pijl|shuffle|shuffle tracks button|arrow|button|crossed|tracks"},{"u":"1f501","c":"Symbols","o":1486,"x":29,"y":55,"s":"repeat","n":"knop voor herhalen","k":"repeat|clockwise rightwards and leftwards open circle arrows|knop voor herhalen|herhalen|knop|met de klok mee|pijl|repeat button|arrow|button|clockwise"},{"u":"1f502","c":"Symbols","o":1487,"x":29,"y":56,"s":"repeat_one","n":"knop voor één herhalen","k":"repeat one|clockwise rightwards and leftwards open circle arrows with circled one overlay|knop voor één herhalen|één keer|enkel|herhalen|knop|met de klok mee|pijl|repeat single button|arrow|button|clockwise|once|repeat|single"},{"u":"25b6-fe0f","c":"Symbols","o":1488,"x":58,"y":2,"s":"arrow_forward","n":"knop voor afspelen","k":"arrow forward|black right-pointing triangle|knop voor afspelen|afspelen|driehoek|knop|pijl|rechts|play button|arrow|button|play|right|triangle"},{"u":"23e9","c":"Symbols","o":1489,"x":57,"y":47,"s":"fast_forward","n":"knop voor snel vooruitspoelen","k":"fast forward|black right-pointing double triangle|knop voor snel vooruitspoelen|dubbel|knop|pijl|snel|vooruit|fast-forward button|arrow|button|double|fast|fast-forward|forward"},{"u":"23ed-fe0f","c":"Symbols","o":1490,"x":57,"y":51,"s":"black_right_pointing_double_triangle_with_vertical_bar","n":"knop voor volgende nummer","k":"black right pointing double triangle with vertical bar|next track button|knop voor volgende nummer|driehoek|knop|nummer|pijl|scène|volgende|arrow|button|next|scene|track|triangle"},{"u":"23ef-fe0f","c":"Symbols","o":1491,"x":57,"y":53,"s":"black_right_pointing_triangle_with_double_vertical_bar","n":"knop voor afspelen of pauzeren","k":"black right pointing triangle with double vertical bar|play or pause button|knop voor afspelen of pauzeren|driehoek|knop|pauzeren|pijl|rechts|spelen|arrow|button|pause|play|right|triangle"},{"u":"25c0-fe0f","c":"Symbols","o":1492,"x":58,"y":3,"s":"arrow_backward","n":"knop voor terugspoelen","k":"arrow backward|black left-pointing triangle|knop voor terugspoelen|achteruit|driehoek|knop|links|pijl|reverse button|arrow|button|left|reverse|triangle"},{"u":"23ea","c":"Symbols","o":1493,"x":57,"y":48,"s":"rewind","n":"knop voor versneld terugspoelen","k":"rewind|black left-pointing double triangle|knop voor versneld terugspoelen|dubbele pijl links|links|pijl|terugspoelen|fast reverse button|arrow|button|double|fast|reverse"},{"u":"23ee-fe0f","c":"Symbols","o":1494,"x":57,"y":52,"s":"black_left_pointing_double_triangle_with_vertical_bar","n":"knop voor vorige nummer","k":"black left pointing double triangle with vertical bar|last track button|knop voor vorige nummer|driehoek|dubbele pijl naar links|knop voor vorig nummer|pijl|vorige|vorige nummer|vorige scène|arrow|button|last|previous|scene|track|triangle"},{"u":"1f53c","c":"Symbols","o":1495,"x":30,"y":52,"s":"arrow_up_small","n":"knop voor omhoog","k":"arrow up small|up-pointing small red triangle|knop voor omhoog|knop|omhoog|pijl|rood|upwards button|arrow|button|red|up|upwards"},{"u":"23eb","c":"Symbols","o":1496,"x":57,"y":49,"s":"arrow_double_up","n":"knop voor versneld omhoog","k":"arrow double up|black up-pointing double triangle|knop voor versneld omhoog|dubbel|knop|omhoog|pijl|snel|fast up button|arrow|button|double|fast|up"},{"u":"1f53d","c":"Symbols","o":1497,"x":30,"y":53,"s":"arrow_down_small","n":"knop voor omlaag","k":"arrow down small|down-pointing small red triangle|knop voor omlaag|driehoek|knop|omlaag|pijl|rood|downwards button|arrow|button|down|downwards|red"},{"u":"23ec","c":"Symbols","o":1498,"x":57,"y":50,"s":"arrow_double_down","n":"knop voor versneld omlaag","k":"arrow double down|black down-pointing double triangle|knop voor versneld omlaag|dubbel|knop|omlaag|pijl|snel|fast down button|arrow|button|double|down|fast"},{"u":"23f8-fe0f","c":"Symbols","o":1499,"x":57,"y":58,"s":"double_vertical_bar","n":"Georgische lari","k":"double vertical bar|pause button|georgische lari|georgian lari"},{"u":"23f9-fe0f","c":"Symbols","o":1500,"x":57,"y":59,"s":"black_square_for_stop","n":"Georgische lari","k":"black square for stop|stop button|georgische lari|georgian lari"},{"u":"23fa-fe0f","c":"Symbols","o":1501,"x":57,"y":60,"s":"black_circle_for_record","n":"Georgische lari","k":"black circle for record|record button|georgische lari|georgian lari"},{"u":"23cf-fe0f","c":"Symbols","o":1502,"x":57,"y":46,"s":"eject","n":"knop voor uitwerpen","k":"eject|eject button|knop voor uitwerpen|uitwerpen|button"},{"u":"1f3a6","c":"Symbols","o":1503,"x":7,"y":36,"s":"cinema","n":"knop voor filmen","k":"cinema|knop voor filmen|bioscoop|camera|film|filmen|movie"},{"u":"1f505","c":"Symbols","o":1504,"x":29,"y":59,"s":"low_brightness","n":"knop voor lagere helderheid","k":"low brightness|low brightness symbol|knop voor lagere helderheid|dimmen|helderheid|laag|dim button|brightness|button|dim|low"},{"u":"1f506","c":"Symbols","o":1505,"x":29,"y":60,"s":"high_brightness","n":"knop voor hogere helderheid","k":"high brightness|high brightness symbol|knop voor hogere helderheid|helder|helderheid|knop|licht|bright button|bright|brightness|button|light"},{"u":"1f4f6","c":"Symbols","o":1506,"x":29,"y":45,"s":"signal_strength","n":"mobiel signaal","k":"signal strength|antenna with bars|mobiel signaal|antenne|communicatie|mobiel|signaal|streep|streepjes|telefoon|antenna bars|antenna|bar|bars|cell|communication|mobile|phone|signal|telephone"},{"u":"1f6dc","c":"Symbols","o":1507,"x":38,"y":48,"s":"wireless","n":"draadloos","k":"wireless|draadloos|computer|internet|netwerk|broadband|connectivity|hotspot|network|router|smartphone|wi-fi|wifi|wlan"},{"u":"1f4f3","c":"Symbols","o":1508,"x":29,"y":42,"s":"vibration_mode","n":"trilstand","k":"vibration mode|trilstand|communicatie|mobiel|modus|telefoon|trillen|cell|communication|mobile|mode|phone|telephone|vibration"},{"u":"1f4f4","c":"Symbols","o":1509,"x":29,"y":43,"s":"mobile_phone_off","n":"telefoon uit","k":"mobile phone off|telefoon uit|mobiel|telefoon|uit|cell|mobile|off|phone|telephone"},{"u":"2640-fe0f","c":"Symbols","o":1510,"x":58,"y":34,"s":"female_sign","n":"vrouwelijkheidssymbool","k":"female sign|vrouwelijkheidssymbool|vrouw|female|sign|woman"},{"u":"2642-fe0f","c":"Symbols","o":1511,"x":58,"y":35,"s":"male_sign","n":"mannelijkheidssymbool","k":"male sign|mannelijkheidssymbool|man|male|sign"},{"u":"26a7-fe0f","c":"Symbols","o":1512,"x":59,"y":6,"s":"transgender_symbol","n":"transgendersymbool","k":"transgender symbol|transgendersymbool|transgender|symbol"},{"u":"2716-fe0f","c":"Symbols","o":1513,"x":60,"y":21,"s":"heavy_multiplication_x","n":"vermenigvuldigen","k":"heavy multiplication x|vermenigvuldigen|×|annuleren|teken|x|multiply|cancel|multiplication|sign"},{"u":"2795","c":"Symbols","o":1514,"x":60,"y":39,"s":"heavy_plus_sign","n":"Georgische lari","k":"heavy plus sign|georgische lari|georgian lari"},{"u":"2796","c":"Symbols","o":1515,"x":60,"y":40,"s":"heavy_minus_sign","n":"Georgische lari","k":"heavy minus sign|georgische lari|georgian lari"},{"u":"2797","c":"Symbols","o":1516,"x":60,"y":41,"s":"heavy_division_sign","n":"Georgische lari","k":"heavy division sign|georgische lari|georgian lari"},{"u":"1f7f0","c":"Symbols","o":1517,"x":39,"y":22,"s":"heavy_equals_sign","n":"vetgedrukt gelijkteken","k":"heavy equals sign|vetgedrukt gelijkteken|dikgedrukt|gelijk|gelijkheid|is gelijk aan|teken|uitkomst|wiskunde|answer|equal|equality|equals|heavy|math|sign"},{"u":"267e-fe0f","c":"Symbols","o":1518,"x":58,"y":55,"s":"infinity","n":"oneindig","k":"infinity|oneindig|eeuwig|grenzeloos|universeel|forever|unbounded|universal"},{"u":"203c-fe0f","c":"Symbols","o":1519,"x":57,"y":31,"s":"bangbang","n":"dubbel uitroepteken","k":"bangbang|double exclamation mark|dubbel uitroepteken|!|!!|dubbel|interpunctie|teken|uitroep|double|exclamation|mark|punctuation"},{"u":"2049-fe0f","c":"Symbols","o":1520,"x":57,"y":32,"s":"interrobang","n":"uitroepteken en vraagteken","k":"interrobang|exclamation question mark|uitroepteken en vraagteken|!|!?|?|interpunctie|teken|uitroep|vraag|vraagteken-uitroepteken|exclamation|mark|punctuation|question"},{"u":"2753","c":"Symbols","o":1521,"x":60,"y":31,"s":"question","n":"rood vraagteken","k":"question|black question mark ornament|rood vraagteken|?|interpunctie|rood|teken|vraag|red question mark|mark|punctuation|red"},{"u":"2754","c":"Symbols","o":1522,"x":60,"y":32,"s":"grey_question","n":"wit vraagteken","k":"grey question|white question mark ornament|wit vraagteken|?|contour|interpunctie|teken|vraag|wit|white question mark|mark|outlined|punctuation|question|white"},{"u":"2755","c":"Symbols","o":1523,"x":60,"y":33,"s":"grey_exclamation","n":"wit uitroepteken","k":"grey exclamation|white exclamation mark ornament|wit uitroepteken|!|contour|interpunctie|teken|uitroep|wit|white exclamation mark|exclamation|mark|outlined|punctuation|white"},{"u":"2757","c":"Symbols","o":1524,"x":60,"y":34,"s":"exclamation","n":"rood uitroepteken","k":"exclamation|heavy exclamation mark|heavy exclamation mark symbol|rood uitroepteken|!|interpunctie|rood|teken|uitroep|red exclamation mark|mark|punctuation|red"},{"u":"3030-fe0f","c":"Symbols","o":1525,"x":60,"y":54,"s":"wavy_dash","n":"golvend streepje","k":"wavy dash|golvend streepje|golvend|interpunctie|streepje|dash|punctuation|wavy"},{"u":"1f4b1","c":"Symbols","o":1526,"x":28,"y":38,"s":"currency_exchange","n":"geld wisselen","k":"currency exchange|geld wisselen|bank|geld|valuta|wisselen|currency|exchange|money"},{"u":"1f4b2","c":"Symbols","o":1527,"x":28,"y":39,"s":"heavy_dollar_sign","n":"vetgedrukt dollarteken","k":"heavy dollar sign|vetgedrukt dollarteken|betalen|dikgedrukt dollarteken|dollar|dollarteken|geld|munteenheid|valuta|billion|cash|charge|currency|heavy|million|money|pay|sign"},{"u":"2695-fe0f","c":"Symbols","o":1528,"x":58,"y":60,"s":"medical_symbol","n":"esculaap","k":"medical symbol|staff of aesculapius|esculaap|apotheek|dokter|genezing|gezondheidszorg|slang om staf|zorg|aesculapius|medical|medicine|staff|symbol"},{"u":"267b-fe0f","c":"Symbols","o":1529,"x":58,"y":54,"s":"recycle","n":"recycling-symbool","k":"recycle|black universal recycling symbol|recycling-symbool|recycling|symbool|recycling symbol|symbol"},{"u":"269c-fe0f","c":"Symbols","o":1530,"x":59,"y":3,"s":"fleur_de_lis","n":"fleur de lis","k":"fleur de lis|fleur-de-lis|ridders|knights"},{"u":"1f531","c":"Symbols","o":1531,"x":30,"y":41,"s":"trident","n":"drietand-symbool","k":"trident|trident emblem|drietand-symbool|anker|drietand|embleem|gereedschap|poseidon|schip|anchor|emblem|ship|tool"},{"u":"1f4db","c":"Symbols","o":1532,"x":29,"y":18,"s":"name_badge","n":"naamkaartje","k":"name badge|naamkaartje|badge|kaartje|naam|name"},{"u":"1f530","c":"Symbols","o":1533,"x":30,"y":40,"s":"beginner","n":"Japans symbool voor beginner","k":"beginner|japanese symbol for beginner|japans symbool voor beginner|blad|chevron|groen en geel|japans|japans ideogram voor beginner|onderscheiding|green|japanese|leaf|symbol|tool|yellow"},{"u":"2b55","c":"Symbols","o":1534,"x":60,"y":53,"s":"o","n":"lege rode cirkel","k":"o|heavy large circle|lege rode cirkel|cirkel|groot|grote rode cirkel|rood|hollow red circle|circle|heavy|hollow|large|red"},{"u":"2705","c":"Symbols","o":1535,"x":59,"y":53,"s":"white_check_mark","n":"knop voor vinkje","k":"white check mark|white heavy check mark|knop voor vinkje|✓|afgevinkt|check|gedaan|klaar|knop|markeren|vink|vinkje|voltooid|check mark button|button|checked|checkmark|complete|completed|done|fixed|mark|tick"},{"u":"2611-fe0f","c":"Symbols","o":1536,"x":58,"y":14,"s":"ballot_box_with_check","n":"vinkje in vak","k":"ballot box with check|vinkje in vak|✓|check|gedaan|klaar|symbool|teken|to-do|vak|vinkje|wit vinkje in grijs vak|check box with check|ballot|box|checked|done|off|tick"},{"u":"2714-fe0f","c":"Symbols","o":1537,"x":60,"y":20,"s":"heavy_check_mark","n":"vinkje","k":"heavy check mark|vinkje|✓|afgevinkt|check|dikgedrukt|klaar|teken|check mark|checked|checkmark|done|heavy|mark|tick"},{"u":"274c","c":"Symbols","o":1538,"x":60,"y":29,"s":"x","n":"kruisteken","k":"x|cross mark|kruisteken|×|annuleren|kruis|teken|vermenigvuldigen|vermenigvuldiging|cancel|cross|mark|multiplication|multiply"},{"u":"274e","c":"Symbols","o":1539,"x":60,"y":30,"s":"negative_squared_cross_mark","n":"knop voor kruis","k":"negative squared cross mark|knop voor kruis|×|kruis|teken|vermenigvuldigen|vierkant|wit kruis in groen vak|x|cross mark button|button|cross|mark|multiplication|multiply|square"},{"u":"27b0","c":"Symbols","o":1540,"x":60,"y":43,"s":"curly_loop","n":"Georgische lari","k":"curly loop|georgische lari|georgian lari"},{"u":"27bf","c":"Symbols","o":1541,"x":60,"y":44,"s":"loop","n":"Georgische lari","k":"loop|double curly loop|georgische lari|georgian lari"},{"u":"303d-fe0f","c":"Symbols","o":1542,"x":60,"y":55,"s":"part_alternation_mark","n":"rolwisselingsmarkering","k":"part alternation mark|rolwisselingsmarkering|markering|rolwisseling|teken|alternation|mark|part"},{"u":"2733-fe0f","c":"Symbols","o":1543,"x":60,"y":25,"s":"eight_spoked_asterisk","n":"achtpuntige asterisk","k":"eight spoked asterisk|achtpuntige asterisk|*|achtpuntig|asterisk|eight-spoked asterisk|eight-spoked"},{"u":"2734-fe0f","c":"Symbols","o":1544,"x":60,"y":26,"s":"eight_pointed_black_star","n":"achtpuntige ster","k":"eight pointed black star|achtpuntige ster|*|achtpuntige|ster|eight-pointed star|eight-pointed|star"},{"u":"2747-fe0f","c":"Symbols","o":1545,"x":60,"y":28,"s":"sparkle","n":"sprankeling","k":"sparkle|sprankeling|*"},{"u":"00a9-fe0f","c":"Symbols","o":1546,"x":0,"y":12,"s":"copyright","n":"copyright","k":"copyright|copyright sign|c"},{"u":"00ae-fe0f","c":"Symbols","o":1547,"x":0,"y":13,"s":"registered","n":"gedeponeerd","k":"registered|registered sign|gedeponeerd|r"},{"u":"2122-fe0f","c":"Symbols","o":1548,"x":57,"y":33,"s":"tm","n":"handelsmerksymbool","k":"tm|trade mark sign|handelsmerksymbool|handelsmerk|symbool|teken|trademark|trade mark|mark|trade"},{"u":"0023-fe0f-20e3","c":"Symbols","o":1549,"x":0,"y":0,"s":"hash","n":"toets: #","k":"hash|hash key|toets: #|toets|keycap: #|keycap"},{"u":"002a-fe0f-20e3","c":"Symbols","o":1550,"x":0,"y":1,"s":"keycap_star","n":"toets: *","k":"keycap star|keycap: *|toets: *|toets|keycap"},{"u":"0030-fe0f-20e3","c":"Symbols","o":1551,"x":0,"y":2,"s":"zero","n":"toets: 0","k":"zero|keycap 0|toets: 0|toets|keycap: 0|keycap"},{"u":"0031-fe0f-20e3","c":"Symbols","o":1552,"x":0,"y":3,"s":"one","n":"toets: 1","k":"one|keycap 1|toets: 1|toets|keycap: 1|keycap"},{"u":"0032-fe0f-20e3","c":"Symbols","o":1553,"x":0,"y":4,"s":"two","n":"toets: 2","k":"two|keycap 2|toets: 2|toets|keycap: 2|keycap"},{"u":"0033-fe0f-20e3","c":"Symbols","o":1554,"x":0,"y":5,"s":"three","n":"toets: 3","k":"three|keycap 3|toets: 3|toets|keycap: 3|keycap"},{"u":"0034-fe0f-20e3","c":"Symbols","o":1555,"x":0,"y":6,"s":"four","n":"toets: 4","k":"four|keycap 4|toets: 4|toets|keycap: 4|keycap"},{"u":"0035-fe0f-20e3","c":"Symbols","o":1556,"x":0,"y":7,"s":"five","n":"toets: 5","k":"five|keycap 5|toets: 5|toets|keycap: 5|keycap"},{"u":"0036-fe0f-20e3","c":"Symbols","o":1557,"x":0,"y":8,"s":"six","n":"toets: 6","k":"six|keycap 6|toets: 6|toets|keycap: 6|keycap"},{"u":"0037-fe0f-20e3","c":"Symbols","o":1558,"x":0,"y":9,"s":"seven","n":"toets: 7","k":"seven|keycap 7|toets: 7|toets|keycap: 7|keycap"},{"u":"0038-fe0f-20e3","c":"Symbols","o":1559,"x":0,"y":10,"s":"eight","n":"toets: 8","k":"eight|keycap 8|toets: 8|toets|keycap: 8|keycap"},{"u":"0039-fe0f-20e3","c":"Symbols","o":1560,"x":0,"y":11,"s":"nine","n":"toets: 9","k":"nine|keycap 9|toets: 9|toets|keycap: 9|keycap"},{"u":"1f51f","c":"Symbols","o":1561,"x":30,"y":23,"s":"keycap_ten","n":"toets: 10","k":"keycap ten|toets: 10|toets|keycap: 10|keycap"},{"u":"1f520","c":"Symbols","o":1562,"x":30,"y":24,"s":"capital_abcd","n":"hoofdletters","k":"capital abcd|input symbol for latin capital letters|hoofdletters|abcd|invoeren|latijns|letters|input latin uppercase|input|latin|uppercase"},{"u":"1f521","c":"Symbols","o":1563,"x":30,"y":25,"s":"abcd","n":"kleine letters","k":"abcd|input symbol for latin small letters|kleine letters|invoeren|latijns|letters|input latin lowercase|input|latin|lowercase"},{"u":"1f522","c":"Symbols","o":1564,"x":30,"y":26,"s":"1234","n":"cijfers","k":"1234|input symbol for numbers|cijfers|invoeren|input numbers|input|numbers"},{"u":"1f523","c":"Symbols","o":1565,"x":30,"y":27,"s":"symbols","n":"symbolen","k":"symbols|input symbol for symbols|symbolen|\u0026|%|♪|〒|invoeren|input symbols|input"},{"u":"1f524","c":"Symbols","o":1566,"x":30,"y":28,"s":"abc","n":"Latijns alfabet","k":"abc|input symbol for latin letters|latijns alfabet|alfabet|invoeren|latijns|letters|input latin letters|alphabet|input|latin"},{"u":"1f170-fe0f","c":"Symbols","o":1567,"x":0,"y":16,"s":"a","n":"bloedgroep A","k":"a|negative squared latin capital letter a|bloedgroep a|a-knop|bloedgroep|a button (blood type)|blood|button|type"},{"u":"1f18e","c":"Symbols","o":1568,"x":0,"y":20,"s":"ab","n":"bloedgroep AB","k":"ab|negative squared ab|bloedgroep ab|bloed|bloedgroep|ab button (blood type)|blood|button|type"},{"u":"1f171-fe0f","c":"Symbols","o":1569,"x":0,"y":17,"s":"b","n":"bloedgroep B","k":"b|negative squared latin capital letter b|bloedgroep b|b-knop|bloed|bloedgroep|b button (blood type)|blood|button|type"},{"u":"1f191","c":"Symbols","o":1570,"x":0,"y":21,"s":"cl","n":"CL-knop","k":"cl|squared cl|cl-knop|knop|cl button|button"},{"u":"1f192","c":"Symbols","o":1571,"x":0,"y":22,"s":"cool","n":"COOL-knop","k":"cool|squared cool|cool-knop|knop|cool button|button"},{"u":"1f193","c":"Symbols","o":1572,"x":0,"y":23,"s":"free","n":"FREE-knop","k":"free|squared free|free-knop|knop|free button|button"},{"u":"2139-fe0f","c":"Symbols","o":1573,"x":57,"y":34,"s":"information_source","n":"informatie","k":"information source|informatie|i|information"},{"u":"1f194","c":"Symbols","o":1574,"x":0,"y":24,"s":"id","n":"ID-knop","k":"id|squared id|id-knop|identiteit|knop|id button|button|identity"},{"u":"24c2-fe0f","c":"Symbols","o":1575,"x":57,"y":61,"s":"m","n":"M in cirkel","k":"m|circled latin capital letter m|m in cirkel|cirkel|in cirkel|circled m|circle|circled"},{"u":"1f195","c":"Symbols","o":1576,"x":0,"y":25,"s":"new","n":"NEW-knop","k":"new|squared new|new-knop|knop|new button|button"},{"u":"1f196","c":"Symbols","o":1577,"x":0,"y":26,"s":"ng","n":"NG-knop","k":"ng|squared ng|ng-knop|knop|ng button|button"},{"u":"1f17e-fe0f","c":"Symbols","o":1578,"x":0,"y":18,"s":"o2","n":"bloedgroep O","k":"o2|negative squared latin capital letter o|bloedgroep o|bloed|bloedgroep|o|o-knop|o button (blood type)|blood|button|type"},{"u":"1f197","c":"Symbols","o":1579,"x":0,"y":27,"s":"ok","n":"OK-knop","k":"ok|squared ok|ok-knop|knop|oké|ok button|button|okay"},{"u":"1f17f-fe0f","c":"Symbols","o":1580,"x":0,"y":19,"s":"parking","n":"P-knop","k":"parking|negative squared latin capital letter p|p-knop|knop|p|parkeren|p button|button"},{"u":"1f198","c":"Symbols","o":1581,"x":0,"y":28,"s":"sos","n":"SOS-knop","k":"sos|squared sos|sos-knop|help|knop|sos button|button"},{"u":"1f199","c":"Symbols","o":1582,"x":0,"y":29,"s":"up","n":"UP!-knop","k":"up|squared up with exclamation mark|up!-knop|knop|teken|up!|up! button|button|mark"},{"u":"1f19a","c":"Symbols","o":1583,"x":0,"y":30,"s":"vs","n":"VS-knop","k":"vs|squared vs|vs-knop|knop|versus|vs button|button"},{"u":"1f201","c":"Symbols","o":1584,"x":4,"y":41,"s":"koko","n":"Japans teken voor ‘hier’","k":"koko|squared katakana koko|japans teken voor ‘hier’|hier|japans|katakana|knop|japanese “here” button|button|here|japanese"},{"u":"1f202-fe0f","c":"Symbols","o":1585,"x":4,"y":42,"s":"sa","n":"Japans teken voor ‘dienstenheffing’","k":"sa|squared katakana sa|japans teken voor ‘dienstenheffing’|dienstenheffing|japans|katakana|knop|service|japanese “service charge” button|button|charge|japanese"},{"u":"1f237-fe0f","c":"Symbols","o":1586,"x":4,"y":50,"s":"u6708","n":"Japans teken voor ‘maandelijks bedrag’","k":"u6708|squared cjk unified ideograph-6708|japans teken voor ‘maandelijks bedrag’|bedrag|ideogram|japans|knop|maandelijks|japanese “monthly amount” button|amount|button|ideograph|japanese|monthly"},{"u":"1f236","c":"Symbols","o":1587,"x":4,"y":49,"s":"u6709","n":"Japans teken voor ‘niet gratis’","k":"u6709|squared cjk unified ideograph-6709|japans teken voor ‘niet gratis’|gratis|ideogram|japans|knop|kosten|niet|japanese “not free of charge” button|button|charge|free|ideograph|japanese|not"},{"u":"1f22f","c":"Symbols","o":1588,"x":4,"y":44,"s":"u6307","n":"Japans teken voor ‘gereserveerd’","k":"u6307|squared cjk unified ideograph-6307|japans teken voor ‘gereserveerd’|gereserveerd|ideogram|japans|knop|japanese “reserved” button|button|ideograph|japanese|reserved"},{"u":"1f250","c":"Symbols","o":1589,"x":4,"y":54,"s":"ideograph_advantage","n":"Japans teken voor ‘koopje’","k":"ideograph advantage|circled ideograph advantage|japans teken voor ‘koopje’|ideogram|japans|knop|koopje|japanese “bargain” button|bargain|button|ideograph|japanese"},{"u":"1f239","c":"Symbols","o":1590,"x":4,"y":52,"s":"u5272","n":"Japans teken voor ‘korting’","k":"u5272|squared cjk unified ideograph-5272|japans teken voor ‘korting’|ideogram|japans|knop|korting|japanese “discount” button|button|discount|ideograph|japanese"},{"u":"1f21a","c":"Symbols","o":1591,"x":4,"y":43,"s":"u7121","n":"Japans teken voor ‘gratis’","k":"u7121|squared cjk unified ideograph-7121|japans teken voor ‘gratis’|gratis|ideogram|japans|knop|kosten|japanese “free of charge” button|button|charge|free|ideograph|japanese"},{"u":"1f232","c":"Symbols","o":1592,"x":4,"y":45,"s":"u7981","n":"Japans teken voor ‘verboden’","k":"u7981|squared cjk unified ideograph-7981|japans teken voor ‘verboden’|ideogram|japans|knop|verboden|japanese “prohibited” button|button|ideograph|japanese|prohibited"},{"u":"1f251","c":"Symbols","o":1593,"x":4,"y":55,"s":"accept","n":"Japans teken voor ‘acceptabel’","k":"accept|circled ideograph accept|japans teken voor ‘acceptabel’|acceptabel|ideogram|japans|knop|japanese “acceptable” button|acceptable|button|ideograph|japanese"},{"u":"1f238","c":"Symbols","o":1594,"x":4,"y":51,"s":"u7533","n":"Japans teken voor ‘toepassing’","k":"u7533|squared cjk unified ideograph-7533|japans teken voor ‘toepassing’|ideogram|japans|knop|toepassing|japanese “application” button|application|button|ideograph|japanese"},{"u":"1f234","c":"Symbols","o":1595,"x":4,"y":47,"s":"u5408","n":"Japans teken voor ‘voldoende (cijfer)‘","k":"u5408|squared cjk unified ideograph-5408|japans teken voor ‘voldoende (cijfer)‘|cijfer|ideogram|japans|knop|voldoende|japanese “passing grade” button|button|grade|ideograph|japanese|passing"},{"u":"1f233","c":"Symbols","o":1596,"x":4,"y":46,"s":"u7a7a","n":"Japans teken voor ‘plaats vrij’","k":"u7a7a|squared cjk unified ideograph-7a7a|japans teken voor ‘plaats vrij’|ideogram|japans|knop|plaats vrij|japanese “vacancy” button|button|ideograph|japanese|vacancy"},{"u":"3297-fe0f","c":"Symbols","o":1597,"x":60,"y":56,"s":"congratulations","n":"Japans teken voor ‘gefeliciteerd’","k":"congratulations|circled ideograph congratulation|japans teken voor ‘gefeliciteerd’|gefeliciteerd|ideogram|japans|knop|japanese “congratulations” button|button|ideograph|japanese"},{"u":"3299-fe0f","c":"Symbols","o":1598,"x":60,"y":57,"s":"secret","n":"Japans teken voor ‘geheim’","k":"secret|circled ideograph secret|japans teken voor ‘geheim’|geheim|ideogram|japans|knop|japanese “secret” button|button|ideograph|japanese"},{"u":"1f23a","c":"Symbols","o":1599,"x":4,"y":53,"s":"u55b6","n":"Japans teken voor ‘geopend’","k":"u55b6|squared cjk unified ideograph-55b6|japans teken voor ‘geopend’|bedrijf|ideogram|japans|knop|open|japanese “open for business” button|business|button|ideograph|japanese"},{"u":"1f235","c":"Symbols","o":1600,"x":4,"y":48,"s":"u6e80","n":"Japans teken voor ‘vol, geen plaats’","k":"u6e80|squared cjk unified ideograph-6e80|japans teken voor ‘vol, geen plaats’|geen|ideogram|japans|knop|plaats|japanese “no vacancy” button|button|ideograph|japanese|no|vacancy"},{"u":"1f534","c":"Symbols","o":1601,"x":30,"y":44,"s":"red_circle","n":"rode cirkel","k":"red circle|large red circle|rode cirkel|cirkel|geometrisch|rood|circle|geometric|red"},{"u":"1f7e0","c":"Symbols","o":1602,"x":39,"y":10,"s":"large_orange_circle","n":"oranje cirkel","k":"large orange circle|oranje cirkel|cirkel|oranje|orange circle|circle|orange"},{"u":"1f7e1","c":"Symbols","o":1603,"x":39,"y":11,"s":"large_yellow_circle","n":"gele cirkel","k":"large yellow circle|gele cirkel|cirkel|geel|yellow circle|circle|yellow"},{"u":"1f7e2","c":"Symbols","o":1604,"x":39,"y":12,"s":"large_green_circle","n":"groene cirkel","k":"large green circle|groene cirkel|cirkel|groen|green circle|circle|green"},{"u":"1f535","c":"Symbols","o":1605,"x":30,"y":45,"s":"large_blue_circle","n":"blauwe cirkel","k":"large blue circle|blauwe cirkel|blauw|cirkel|geometrisch|blue circle|blue|circle|geometric"},{"u":"1f7e3","c":"Symbols","o":1606,"x":39,"y":13,"s":"large_purple_circle","n":"paarse cirkel","k":"large purple circle|paarse cirkel|cirkel|paars|purple circle|circle|purple"},{"u":"1f7e4","c":"Symbols","o":1607,"x":39,"y":14,"s":"large_brown_circle","n":"bruine cirkel","k":"large brown circle|bruine cirkel|bruin|cirkel|brown circle|brown|circle"},{"u":"26ab","c":"Symbols","o":1608,"x":59,"y":8,"s":"black_circle","n":"zwarte cirkel","k":"black circle|medium black circle|zwarte cirkel|cirkel|geometrisch|zwart|black|circle|geometric"},{"u":"26aa","c":"Symbols","o":1609,"x":59,"y":7,"s":"white_circle","n":"witte cirkel","k":"white circle|medium white circle|witte cirkel|cirkel|geometrisch|wit|circle|geometric|white"},{"u":"1f7e5","c":"Symbols","o":1610,"x":39,"y":15,"s":"large_red_square","n":"rood vierkant","k":"large red square|rood vierkant|kaart|penalty|rood|vierkant|red square|card|red|square"},{"u":"1f7e7","c":"Symbols","o":1611,"x":39,"y":17,"s":"large_orange_square","n":"oranje vierkant","k":"large orange square|oranje vierkant|oranje|vierkant|orange square|orange|square"},{"u":"1f7e8","c":"Symbols","o":1612,"x":39,"y":18,"s":"large_yellow_square","n":"geel vierkant","k":"large yellow square|geel vierkant|geel|gele kaart|kaart|kleur|penalty|vierkant|yellow square|card|square|yellow"},{"u":"1f7e9","c":"Symbols","o":1613,"x":39,"y":19,"s":"large_green_square","n":"groen vierkant","k":"large green square|groen vierkant|groen|vierkant|green square|green|square"},{"u":"1f7e6","c":"Symbols","o":1614,"x":39,"y":16,"s":"large_blue_square","n":"blauw vierkant","k":"large blue square|blauw vierkant|blauw|vierkant|blue square|blue|square"},{"u":"1f7ea","c":"Symbols","o":1615,"x":39,"y":20,"s":"large_purple_square","n":"paars vierkant","k":"large purple square|paars vierkant|paars|vierkant|purple square|purple|square"},{"u":"1f7eb","c":"Symbols","o":1616,"x":39,"y":21,"s":"large_brown_square","n":"bruin vierkant","k":"large brown square|bruin vierkant|bruin|vierkant|brown square|brown|square"},{"u":"2b1b","c":"Symbols","o":1617,"x":60,"y":50,"s":"black_large_square","n":"groot zwart vierkant","k":"black large square|groot zwart vierkant|geometrisch|groot|vierkant|zwart|black|geometric|large|square"},{"u":"2b1c","c":"Symbols","o":1618,"x":60,"y":51,"s":"white_large_square","n":"groot wit vierkant","k":"white large square|groot wit vierkant|geometrisch|vierkant|vorm|geometric|large|square|white"},{"u":"25fc-fe0f","c":"Symbols","o":1619,"x":58,"y":5,"s":"black_medium_square","n":"middelgroot zwart vierkant","k":"black medium square|middelgroot zwart vierkant|geometrisch|middelgroot|vierkant|zwart|black|geometric|medium|square"},{"u":"25fb-fe0f","c":"Symbols","o":1620,"x":58,"y":4,"s":"white_medium_square","n":"middelgroot wit vierkant","k":"white medium square|middelgroot wit vierkant|middelgroot|vierkant|wit|geometric|medium|square|white"},{"u":"25fe","c":"Symbols","o":1621,"x":58,"y":7,"s":"black_medium_small_square","n":"klein tot middelgroot zwart vierkant","k":"black medium small square|klein tot middelgroot zwart vierkant|geometrisch|middelgroot zwart vierkant|redelijk klein zwart vierkant|vierkant|vorm|black medium-small square|black|geometric|medium-small|square"},{"u":"25fd","c":"Symbols","o":1622,"x":58,"y":6,"s":"white_medium_small_square","n":"klein tot middelgroot wit vierkant","k":"white medium small square|klein tot middelgroot wit vierkant|geometrisch|klein tot middelgroot|vierkant|wit|white medium-small square|geometric|medium-small|square|white"},{"u":"25aa-fe0f","c":"Symbols","o":1623,"x":58,"y":0,"s":"black_small_square","n":"klein zwart vierkant","k":"black small square|klein zwart vierkant|geometrisch|klein|vierkant|zwart|black|geometric|small|square"},{"u":"25ab-fe0f","c":"Symbols","o":1624,"x":58,"y":1,"s":"white_small_square","n":"klein wit vierkant","k":"white small square|klein wit vierkant|geometrisch|vierkant|vorm|geometric|small|square|white"},{"u":"1f536","c":"Symbols","o":1625,"x":30,"y":46,"s":"large_orange_diamond","n":"grote oranje ruit","k":"large orange diamond|grote oranje ruit|diamant|geometrisch|groot|oranje|diamond|geometric|large|orange"},{"u":"1f537","c":"Symbols","o":1626,"x":30,"y":47,"s":"large_blue_diamond","n":"grote blauwe ruit","k":"large blue diamond|grote blauwe ruit|blauw|diamant|geometrisch|groot|blue|diamond|geometric|large"},{"u":"1f538","c":"Symbols","o":1627,"x":30,"y":48,"s":"small_orange_diamond","n":"kleine oranje ruit","k":"small orange diamond|kleine oranje ruit|diamant|geometrisch|klein|oranje|diamond|geometric|orange|small"},{"u":"1f539","c":"Symbols","o":1628,"x":30,"y":49,"s":"small_blue_diamond","n":"kleine blauwe ruit","k":"small blue diamond|kleine blauwe ruit|blauw|diamant|geometrisch|klein|blue|diamond|geometric|small"},{"u":"1f53a","c":"Symbols","o":1629,"x":30,"y":50,"s":"small_red_triangle","n":"rode omhoogwijzende driehoek","k":"small red triangle|up-pointing red triangle|rode omhoogwijzende driehoek|driehoek|geometrisch|omhoog|rood|wijzend|red triangle pointed up|geometric|pointed|red|triangle|up"},{"u":"1f53b","c":"Symbols","o":1630,"x":30,"y":51,"s":"small_red_triangle_down","n":"rode omlaagwijzende driehoek","k":"small red triangle down|down-pointing red triangle|rode omlaagwijzende driehoek|driehoek|geometrisch|omlaag|rood|wijzend|red triangle pointed down|down|geometric|pointed|red|triangle"},{"u":"1f4a0","c":"Symbols","o":1631,"x":28,"y":16,"s":"diamond_shape_with_a_dot_inside","n":"ruitvorm met stip erin","k":"diamond shape with a dot inside|ruitvorm met stip erin|diamant|geometrisch|stip|strip|diamond with a dot|comic|diamond|dot|geometric"},{"u":"1f518","c":"Symbols","o":1632,"x":30,"y":16,"s":"radio_button","n":"keuzerondje","k":"radio button|keuzerondje|geometrisch|knop|radio|button|geometric"},{"u":"1f533","c":"Symbols","o":1633,"x":30,"y":43,"s":"white_square_button","n":"witte vierkante knop","k":"white square button|witte vierkante knop|geometrisch|knop|omlijnd|vierkant|wit|button|geometric|outlined|square|white"},{"u":"1f532","c":"Symbols","o":1634,"x":30,"y":42,"s":"black_square_button","n":"zwarte vierkante knop","k":"black square button|zwarte vierkante knop|geometrisch|knop|vierkant|zwart|black|button|geometric|square"},{"u":"1f3c1","c":"Flags","o":1635,"x":8,"y":1,"s":"checkered_flag","n":"geblokte vlag","k":"checkered flag|chequered flag|geblokte vlag|finish|formule 1|geblokt|racen|sport|vlag|checkered|chequered|flag|flags|game|race|racing|win"},{"u":"1f6a9","c":"Flags","o":1636,"x":36,"y":53,"s":"triangular_flag_on_post","n":"driehoekige vlag","k":"triangular flag on post|driehoekige vlag|golf|locatie|puntvlag|vlag|triangular flag|construction|flag|post|triangular"},{"u":"1f38c","c":"Flags","o":1637,"x":7,"y":15,"s":"crossed_flags","n":"gekruiste vlaggen","k":"crossed flags|gekruiste vlaggen|feest|gekruist|japans|kruis|celebration|cross|crossed|flags|japanese"},{"u":"1f3f4","c":"Flags","o":1638,"x":10,"y":45,"s":"waving_black_flag","n":"zwarte vlag","k":"waving black flag|zwarte vlag|vlag|wapperend|zwart|black flag|black|flag|waving"},{"u":"1f3f3-fe0f","c":"Flags","o":1639,"x":10,"y":40,"s":"waving_white_flag","n":"witte vlag","k":"waving white flag|white flag|witte vlag|vlag|wapperend|wit|flag|waving|white"},{"u":"1f3f3-fe0f-200d-1f308","c":"Flags","o":1640,"x":10,"y":38,"s":"rainbow-flag","n":"regenboogvlag","k":"rainbow-flag|rainbow flag|regenboogvlag|biseksueel|glbt|glbtq|homoseksueel|lesbisch|lgbt|lgbtq|lgbtqia|lhbt|pride|queer|regenboog|transgender|twijfelend|vlag|bisexual|flag|gay|genderqueer|lesbian|rainbow|trans"},{"u":"1f3f3-fe0f-200d-26a7-fe0f","c":"Flags","o":1641,"x":10,"y":39,"s":"transgender_flag","n":"transgendervlag","k":"transgender flag|transgendervlag|lichtblauw|roze|transgender|vlag|wit|blue|flag|light|pink|white"},{"u":"1f3f4-200d-2620-fe0f","c":"Flags","o":1642,"x":10,"y":41,"s":"pirate_flag","n":"piratenvlag","k":"pirate flag|piratenvlag|jolly roger|piraat|plunderen|schat|flag|jolly|pirate|plunder|roger|treasure"},{"u":"1f1e6-1f1e8","c":"Flags","o":1643,"x":0,"y":31,"s":"flag-ac","n":"vlag: Ascension","k":"flag-ac|ascension island flag|vlag: ascension|vlag|flag: ascension island|flag"},{"u":"1f1e6-1f1e9","c":"Flags","o":1644,"x":0,"y":32,"s":"flag-ad","n":"vlag: Andorra","k":"flag-ad|andorra flag|vlag: andorra|vlag|flag: andorra|flag"},{"u":"1f1e6-1f1ea","c":"Flags","o":1645,"x":0,"y":33,"s":"flag-ae","n":"vlag: Verenigde Arabische Emiraten","k":"flag-ae|united arab emirates flag|vlag: verenigde arabische emiraten|vlag|flag: united arab emirates|flag"},{"u":"1f1e6-1f1eb","c":"Flags","o":1646,"x":0,"y":34,"s":"flag-af","n":"vlag: Afghanistan","k":"flag-af|afghanistan flag|vlag: afghanistan|vlag|flag: afghanistan|flag"},{"u":"1f1e6-1f1ec","c":"Flags","o":1647,"x":0,"y":35,"s":"flag-ag","n":"vlag: Antigua en Barbuda","k":"flag-ag|antigua \u0026 barbuda flag|vlag: antigua en barbuda|vlag|flag: antigua \u0026 barbuda|flag"},{"u":"1f1e6-1f1ee","c":"Flags","o":1648,"x":0,"y":36,"s":"flag-ai","n":"vlag: Anguilla","k":"flag-ai|anguilla flag|vlag: anguilla|vlag|flag: anguilla|flag"},{"u":"1f1e6-1f1f1","c":"Flags","o":1649,"x":0,"y":37,"s":"flag-al","n":"vlag: Albanië","k":"flag-al|albania flag|vlag: albanië|vlag|flag: albania|flag"},{"u":"1f1e6-1f1f2","c":"Flags","o":1650,"x":0,"y":38,"s":"flag-am","n":"vlag: Armenië","k":"flag-am|armenia flag|vlag: armenië|vlag|flag: armenia|flag"},{"u":"1f1e6-1f1f4","c":"Flags","o":1651,"x":0,"y":39,"s":"flag-ao","n":"vlag: Angola","k":"flag-ao|angola flag|vlag: angola|vlag|flag: angola|flag"},{"u":"1f1e6-1f1f6","c":"Flags","o":1652,"x":0,"y":40,"s":"flag-aq","n":"vlag: Antarctica","k":"flag-aq|antarctica flag|vlag: antarctica|vlag|flag: antarctica|flag"},{"u":"1f1e6-1f1f7","c":"Flags","o":1653,"x":0,"y":41,"s":"flag-ar","n":"vlag: Argentinië","k":"flag-ar|argentina flag|vlag: argentinië|vlag|flag: argentina|flag"},{"u":"1f1e6-1f1f8","c":"Flags","o":1654,"x":0,"y":42,"s":"flag-as","n":"vlag: Amerikaans-Samoa","k":"flag-as|american samoa flag|vlag: amerikaans-samoa|vlag|flag: american samoa|flag"},{"u":"1f1e6-1f1f9","c":"Flags","o":1655,"x":0,"y":43,"s":"flag-at","n":"vlag: Oostenrijk","k":"flag-at|austria flag|vlag: oostenrijk|vlag|flag: austria|flag"},{"u":"1f1e6-1f1fa","c":"Flags","o":1656,"x":0,"y":44,"s":"flag-au","n":"vlag: Australië","k":"flag-au|australia flag|vlag: australië|vlag|flag: australia|flag"},{"u":"1f1e6-1f1fc","c":"Flags","o":1657,"x":0,"y":45,"s":"flag-aw","n":"vlag: Aruba","k":"flag-aw|aruba flag|vlag: aruba|vlag|flag: aruba|flag"},{"u":"1f1e6-1f1fd","c":"Flags","o":1658,"x":0,"y":46,"s":"flag-ax","n":"vlag: Åland","k":"flag-ax|åland islands flag|vlag: åland|vlag|flag: åland islands|flag"},{"u":"1f1e6-1f1ff","c":"Flags","o":1659,"x":0,"y":47,"s":"flag-az","n":"vlag: Azerbeidzjan","k":"flag-az|azerbaijan flag|vlag: azerbeidzjan|vlag|flag: azerbaijan|flag"},{"u":"1f1e7-1f1e6","c":"Flags","o":1660,"x":0,"y":48,"s":"flag-ba","n":"vlag: Bosnië en Herzegovina","k":"flag-ba|bosnia \u0026 herzegovina flag|vlag: bosnië en herzegovina|vlag|flag: bosnia \u0026 herzegovina|flag"},{"u":"1f1e7-1f1e7","c":"Flags","o":1661,"x":0,"y":49,"s":"flag-bb","n":"vlag: Barbados","k":"flag-bb|barbados flag|vlag: barbados|vlag|flag: barbados|flag"},{"u":"1f1e7-1f1e9","c":"Flags","o":1662,"x":0,"y":50,"s":"flag-bd","n":"vlag: Bangladesh","k":"flag-bd|bangladesh flag|vlag: bangladesh|vlag|flag: bangladesh|flag"},{"u":"1f1e7-1f1ea","c":"Flags","o":1663,"x":0,"y":51,"s":"flag-be","n":"vlag: België","k":"flag-be|belgium flag|vlag: belgië|vlag|flag: belgium|flag"},{"u":"1f1e7-1f1eb","c":"Flags","o":1664,"x":0,"y":52,"s":"flag-bf","n":"vlag: Burkina Faso","k":"flag-bf|burkina faso flag|vlag: burkina faso|vlag|flag: burkina faso|flag"},{"u":"1f1e7-1f1ec","c":"Flags","o":1665,"x":0,"y":53,"s":"flag-bg","n":"vlag: Bulgarije","k":"flag-bg|bulgaria flag|vlag: bulgarije|vlag|flag: bulgaria|flag"},{"u":"1f1e7-1f1ed","c":"Flags","o":1666,"x":0,"y":54,"s":"flag-bh","n":"vlag: Bahrein","k":"flag-bh|bahrain flag|vlag: bahrein|vlag|flag: bahrain|flag"},{"u":"1f1e7-1f1ee","c":"Flags","o":1667,"x":0,"y":55,"s":"flag-bi","n":"vlag: Burundi","k":"flag-bi|burundi flag|vlag: burundi|vlag|flag: burundi|flag"},{"u":"1f1e7-1f1ef","c":"Flags","o":1668,"x":0,"y":56,"s":"flag-bj","n":"vlag: Benin","k":"flag-bj|benin flag|vlag: benin|vlag|flag: benin|flag"},{"u":"1f1e7-1f1f1","c":"Flags","o":1669,"x":0,"y":57,"s":"flag-bl","n":"vlag: Saint-Barthélemy","k":"flag-bl|st. barthélemy flag|vlag: saint-barthélemy|vlag|flag: st. barthélemy|flag"},{"u":"1f1e7-1f1f2","c":"Flags","o":1670,"x":0,"y":58,"s":"flag-bm","n":"vlag: Bermuda","k":"flag-bm|bermuda flag|vlag: bermuda|vlag|flag: bermuda|flag"},{"u":"1f1e7-1f1f3","c":"Flags","o":1671,"x":0,"y":59,"s":"flag-bn","n":"vlag: Brunei","k":"flag-bn|brunei flag|vlag: brunei|vlag|flag: brunei|flag"},{"u":"1f1e7-1f1f4","c":"Flags","o":1672,"x":0,"y":60,"s":"flag-bo","n":"vlag: Bolivia","k":"flag-bo|bolivia flag|vlag: bolivia|vlag|flag: bolivia|flag"},{"u":"1f1e7-1f1f6","c":"Flags","o":1673,"x":0,"y":61,"s":"flag-bq","n":"vlag: Caribisch Nederland","k":"flag-bq|caribbean netherlands flag|vlag: caribisch nederland|vlag|flag: caribbean netherlands|flag"},{"u":"1f1e7-1f1f7","c":"Flags","o":1674,"x":1,"y":0,"s":"flag-br","n":"vlag: Brazilië","k":"flag-br|brazil flag|vlag: brazilië|vlag|flag: brazil|flag"},{"u":"1f1e7-1f1f8","c":"Flags","o":1675,"x":1,"y":1,"s":"flag-bs","n":"vlag: Bahama’s","k":"flag-bs|bahamas flag|vlag: bahama’s|vlag|flag: bahamas|flag"},{"u":"1f1e7-1f1f9","c":"Flags","o":1676,"x":1,"y":2,"s":"flag-bt","n":"vlag: Bhutan","k":"flag-bt|bhutan flag|vlag: bhutan|vlag|flag: bhutan|flag"},{"u":"1f1e7-1f1fb","c":"Flags","o":1677,"x":1,"y":3,"s":"flag-bv","n":"vlag: Bouveteiland","k":"flag-bv|bouvet island flag|vlag: bouveteiland|vlag|flag: bouvet island|flag"},{"u":"1f1e7-1f1fc","c":"Flags","o":1678,"x":1,"y":4,"s":"flag-bw","n":"vlag: Botswana","k":"flag-bw|botswana flag|vlag: botswana|vlag|flag: botswana|flag"},{"u":"1f1e7-1f1fe","c":"Flags","o":1679,"x":1,"y":5,"s":"flag-by","n":"vlag: Belarus","k":"flag-by|belarus flag|vlag: belarus|vlag|flag: belarus|flag"},{"u":"1f1e7-1f1ff","c":"Flags","o":1680,"x":1,"y":6,"s":"flag-bz","n":"vlag: Belize","k":"flag-bz|belize flag|vlag: belize|vlag|flag: belize|flag"},{"u":"1f1e8-1f1e6","c":"Flags","o":1681,"x":1,"y":7,"s":"flag-ca","n":"vlag: Canada","k":"flag-ca|canada flag|vlag: canada|vlag|flag: canada|flag"},{"u":"1f1e8-1f1e8","c":"Flags","o":1682,"x":1,"y":8,"s":"flag-cc","n":"vlag: Cocoseilanden","k":"flag-cc|cocos (keeling) islands flag|vlag: cocoseilanden|vlag|flag: cocos (keeling) islands|flag"},{"u":"1f1e8-1f1e9","c":"Flags","o":1683,"x":1,"y":9,"s":"flag-cd","n":"vlag: Congo-Kinshasa","k":"flag-cd|congo - kinshasa flag|vlag: congo-kinshasa|vlag|flag: congo - kinshasa|flag"},{"u":"1f1e8-1f1eb","c":"Flags","o":1684,"x":1,"y":10,"s":"flag-cf","n":"vlag: Centraal-Afrikaanse Republiek","k":"flag-cf|central african republic flag|vlag: centraal-afrikaanse republiek|vlag|flag: central african republic|flag"},{"u":"1f1e8-1f1ec","c":"Flags","o":1685,"x":1,"y":11,"s":"flag-cg","n":"vlag: Congo-Brazzaville","k":"flag-cg|congo - brazzaville flag|vlag: congo-brazzaville|vlag|flag: congo - brazzaville|flag"},{"u":"1f1e8-1f1ed","c":"Flags","o":1686,"x":1,"y":12,"s":"flag-ch","n":"vlag: Zwitserland","k":"flag-ch|switzerland flag|vlag: zwitserland|vlag|flag: switzerland|flag"},{"u":"1f1e8-1f1ee","c":"Flags","o":1687,"x":1,"y":13,"s":"flag-ci","n":"vlag: Ivoorkust","k":"flag-ci|côte d’ivoire flag|vlag: ivoorkust|vlag|flag: côte d’ivoire|flag"},{"u":"1f1e8-1f1f0","c":"Flags","o":1688,"x":1,"y":14,"s":"flag-ck","n":"vlag: Cookeilanden","k":"flag-ck|cook islands flag|vlag: cookeilanden|vlag|flag: cook islands|flag"},{"u":"1f1e8-1f1f1","c":"Flags","o":1689,"x":1,"y":15,"s":"flag-cl","n":"vlag: Chili","k":"flag-cl|chile flag|vlag: chili|vlag|flag: chile|flag"},{"u":"1f1e8-1f1f2","c":"Flags","o":1690,"x":1,"y":16,"s":"flag-cm","n":"vlag: Kameroen","k":"flag-cm|cameroon flag|vlag: kameroen|vlag|flag: cameroon|flag"},{"u":"1f1e8-1f1f3","c":"Flags","o":1691,"x":1,"y":17,"s":"cn","n":"vlag: China","k":"cn|flag-cn|china flag|vlag: china|vlag|flag: china|flag"},{"u":"1f1e8-1f1f4","c":"Flags","o":1692,"x":1,"y":18,"s":"flag-co","n":"vlag: Colombia","k":"flag-co|colombia flag|vlag: colombia|vlag|flag: colombia|flag"},{"u":"1f1e8-1f1f5","c":"Flags","o":1693,"x":1,"y":19,"s":"flag-cp","n":"vlag: Clipperton","k":"flag-cp|clipperton island flag|vlag: clipperton|vlag|flag: clipperton island|flag"},{"u":"1f1e8-1f1f7","c":"Flags","o":1694,"x":1,"y":20,"s":"flag-cr","n":"vlag: Costa Rica","k":"flag-cr|costa rica flag|vlag: costa rica|vlag|flag: costa rica|flag"},{"u":"1f1e8-1f1fa","c":"Flags","o":1695,"x":1,"y":21,"s":"flag-cu","n":"vlag: Cuba","k":"flag-cu|cuba flag|vlag: cuba|vlag|flag: cuba|flag"},{"u":"1f1e8-1f1fb","c":"Flags","o":1696,"x":1,"y":22,"s":"flag-cv","n":"vlag: Kaapverdië","k":"flag-cv|cape verde flag|vlag: kaapverdië|vlag|flag: cape verde|flag"},{"u":"1f1e8-1f1fc","c":"Flags","o":1697,"x":1,"y":23,"s":"flag-cw","n":"vlag: Curaçao","k":"flag-cw|curaçao flag|vlag: curaçao|vlag|flag: curaçao|flag"},{"u":"1f1e8-1f1fd","c":"Flags","o":1698,"x":1,"y":24,"s":"flag-cx","n":"vlag: Christmaseiland","k":"flag-cx|christmas island flag|vlag: christmaseiland|vlag|flag: christmas island|flag"},{"u":"1f1e8-1f1fe","c":"Flags","o":1699,"x":1,"y":25,"s":"flag-cy","n":"vlag: Cyprus","k":"flag-cy|cyprus flag|vlag: cyprus|vlag|flag: cyprus|flag"},{"u":"1f1e8-1f1ff","c":"Flags","o":1700,"x":1,"y":26,"s":"flag-cz","n":"vlag: Tsjechië","k":"flag-cz|czechia flag|vlag: tsjechië|vlag|flag: czechia|flag"},{"u":"1f1e9-1f1ea","c":"Flags","o":1701,"x":1,"y":27,"s":"de","n":"vlag: Duitsland","k":"de|flag-de|germany flag|vlag: duitsland|vlag|flag: germany|flag"},{"u":"1f1e9-1f1ec","c":"Flags","o":1702,"x":1,"y":28,"s":"flag-dg","n":"vlag: Diego Garcia","k":"flag-dg|diego garcia flag|vlag: diego garcia|vlag|flag: diego garcia|flag"},{"u":"1f1e9-1f1ef","c":"Flags","o":1703,"x":1,"y":29,"s":"flag-dj","n":"vlag: Djibouti","k":"flag-dj|djibouti flag|vlag: djibouti|vlag|flag: djibouti|flag"},{"u":"1f1e9-1f1f0","c":"Flags","o":1704,"x":1,"y":30,"s":"flag-dk","n":"vlag: Denemarken","k":"flag-dk|denmark flag|vlag: denemarken|vlag|flag: denmark|flag"},{"u":"1f1e9-1f1f2","c":"Flags","o":1705,"x":1,"y":31,"s":"flag-dm","n":"vlag: Dominica","k":"flag-dm|dominica flag|vlag: dominica|vlag|flag: dominica|flag"},{"u":"1f1e9-1f1f4","c":"Flags","o":1706,"x":1,"y":32,"s":"flag-do","n":"vlag: Dominicaanse Republiek","k":"flag-do|dominican republic flag|vlag: dominicaanse republiek|vlag|flag: dominican republic|flag"},{"u":"1f1e9-1f1ff","c":"Flags","o":1707,"x":1,"y":33,"s":"flag-dz","n":"vlag: Algerije","k":"flag-dz|algeria flag|vlag: algerije|vlag|flag: algeria|flag"},{"u":"1f1ea-1f1e6","c":"Flags","o":1708,"x":1,"y":34,"s":"flag-ea","n":"vlag: Ceuta en Melilla","k":"flag-ea|ceuta \u0026 melilla flag|vlag: ceuta en melilla|vlag|flag: ceuta \u0026 melilla|flag"},{"u":"1f1ea-1f1e8","c":"Flags","o":1709,"x":1,"y":35,"s":"flag-ec","n":"vlag: Ecuador","k":"flag-ec|ecuador flag|vlag: ecuador|vlag|flag: ecuador|flag"},{"u":"1f1ea-1f1ea","c":"Flags","o":1710,"x":1,"y":36,"s":"flag-ee","n":"vlag: Estland","k":"flag-ee|estonia flag|vlag: estland|vlag|flag: estonia|flag"},{"u":"1f1ea-1f1ec","c":"Flags","o":1711,"x":1,"y":37,"s":"flag-eg","n":"vlag: Egypte","k":"flag-eg|egypt flag|vlag: egypte|vlag|flag: egypt|flag"},{"u":"1f1ea-1f1ed","c":"Flags","o":1712,"x":1,"y":38,"s":"flag-eh","n":"vlag: Westelijke Sahara","k":"flag-eh|western sahara flag|vlag: westelijke sahara|vlag|flag: western sahara|flag"},{"u":"1f1ea-1f1f7","c":"Flags","o":1713,"x":1,"y":39,"s":"flag-er","n":"vlag: Eritrea","k":"flag-er|eritrea flag|vlag: eritrea|vlag|flag: eritrea|flag"},{"u":"1f1ea-1f1f8","c":"Flags","o":1714,"x":1,"y":40,"s":"es","n":"vlag: Spanje","k":"es|flag-es|spain flag|vlag: spanje|vlag|flag: spain|flag"},{"u":"1f1ea-1f1f9","c":"Flags","o":1715,"x":1,"y":41,"s":"flag-et","n":"vlag: Ethiopië","k":"flag-et|ethiopia flag|vlag: ethiopië|vlag|flag: ethiopia|flag"},{"u":"1f1ea-1f1fa","c":"Flags","o":1716,"x":1,"y":42,"s":"flag-eu","n":"vlag: Europese Unie","k":"flag-eu|european union flag|vlag: europese unie|vlag|flag: european union|flag"},{"u":"1f1eb-1f1ee","c":"Flags","o":1717,"x":1,"y":43,"s":"flag-fi","n":"vlag: Finland","k":"flag-fi|finland flag|vlag: finland|vlag|flag: finland|flag"},{"u":"1f1eb-1f1ef","c":"Flags","o":1718,"x":1,"y":44,"s":"flag-fj","n":"vlag: Fiji","k":"flag-fj|fiji flag|vlag: fiji|vlag|flag: fiji|flag"},{"u":"1f1eb-1f1f0","c":"Flags","o":1719,"x":1,"y":45,"s":"flag-fk","n":"vlag: Falklandeilanden","k":"flag-fk|falkland islands flag|vlag: falklandeilanden|vlag|flag: falkland islands|flag"},{"u":"1f1eb-1f1f2","c":"Flags","o":1720,"x":1,"y":46,"s":"flag-fm","n":"vlag: Micronesia","k":"flag-fm|micronesia flag|vlag: micronesia|vlag|flag: micronesia|flag"},{"u":"1f1eb-1f1f4","c":"Flags","o":1721,"x":1,"y":47,"s":"flag-fo","n":"vlag: Faeröer","k":"flag-fo|faroe islands flag|vlag: faeröer|vlag|flag: faroe islands|flag"},{"u":"1f1eb-1f1f7","c":"Flags","o":1722,"x":1,"y":48,"s":"fr","n":"vlag: Frankrijk","k":"fr|flag-fr|france flag|vlag: frankrijk|vlag|flag: france|flag"},{"u":"1f1ec-1f1e6","c":"Flags","o":1723,"x":1,"y":49,"s":"flag-ga","n":"vlag: Gabon","k":"flag-ga|gabon flag|vlag: gabon|vlag|flag: gabon|flag"},{"u":"1f1ec-1f1e7","c":"Flags","o":1724,"x":1,"y":50,"s":"gb","n":"vlag: Verenigd Koninkrijk","k":"gb|uk|flag-gb|united kingdom flag|vlag: verenigd koninkrijk|vlag|flag: united kingdom|flag"},{"u":"1f1ec-1f1e9","c":"Flags","o":1725,"x":1,"y":51,"s":"flag-gd","n":"vlag: Grenada","k":"flag-gd|grenada flag|vlag: grenada|vlag|flag: grenada|flag"},{"u":"1f1ec-1f1ea","c":"Flags","o":1726,"x":1,"y":52,"s":"flag-ge","n":"vlag: Georgië","k":"flag-ge|georgia flag|vlag: georgië|vlag|flag: georgia|flag"},{"u":"1f1ec-1f1eb","c":"Flags","o":1727,"x":1,"y":53,"s":"flag-gf","n":"vlag: Frans-Guyana","k":"flag-gf|french guiana flag|vlag: frans-guyana|vlag|flag: french guiana|flag"},{"u":"1f1ec-1f1ec","c":"Flags","o":1728,"x":1,"y":54,"s":"flag-gg","n":"vlag: Guernsey","k":"flag-gg|guernsey flag|vlag: guernsey|vlag|flag: guernsey|flag"},{"u":"1f1ec-1f1ed","c":"Flags","o":1729,"x":1,"y":55,"s":"flag-gh","n":"vlag: Ghana","k":"flag-gh|ghana flag|vlag: ghana|vlag|flag: ghana|flag"},{"u":"1f1ec-1f1ee","c":"Flags","o":1730,"x":1,"y":56,"s":"flag-gi","n":"vlag: Gibraltar","k":"flag-gi|gibraltar flag|vlag: gibraltar|vlag|flag: gibraltar|flag"},{"u":"1f1ec-1f1f1","c":"Flags","o":1731,"x":1,"y":57,"s":"flag-gl","n":"vlag: Groenland","k":"flag-gl|greenland flag|vlag: groenland|vlag|flag: greenland|flag"},{"u":"1f1ec-1f1f2","c":"Flags","o":1732,"x":1,"y":58,"s":"flag-gm","n":"vlag: Gambia","k":"flag-gm|gambia flag|vlag: gambia|vlag|flag: gambia|flag"},{"u":"1f1ec-1f1f3","c":"Flags","o":1733,"x":1,"y":59,"s":"flag-gn","n":"vlag: Guinee","k":"flag-gn|guinea flag|vlag: guinee|vlag|flag: guinea|flag"},{"u":"1f1ec-1f1f5","c":"Flags","o":1734,"x":1,"y":60,"s":"flag-gp","n":"vlag: Guadeloupe","k":"flag-gp|guadeloupe flag|vlag: guadeloupe|vlag|flag: guadeloupe|flag"},{"u":"1f1ec-1f1f6","c":"Flags","o":1735,"x":1,"y":61,"s":"flag-gq","n":"vlag: Equatoriaal-Guinea","k":"flag-gq|equatorial guinea flag|vlag: equatoriaal-guinea|vlag|flag: equatorial guinea|flag"},{"u":"1f1ec-1f1f7","c":"Flags","o":1736,"x":2,"y":0,"s":"flag-gr","n":"vlag: Griekenland","k":"flag-gr|greece flag|vlag: griekenland|vlag|flag: greece|flag"},{"u":"1f1ec-1f1f8","c":"Flags","o":1737,"x":2,"y":1,"s":"flag-gs","n":"vlag: Zuid-Georgia en Zuidelijke Sandwicheilanden","k":"flag-gs|south georgia \u0026 south sandwich islands flag|vlag: zuid-georgia en zuidelijke sandwicheilanden|vlag|flag: south georgia \u0026 south sandwich islands|flag"},{"u":"1f1ec-1f1f9","c":"Flags","o":1738,"x":2,"y":2,"s":"flag-gt","n":"vlag: Guatemala","k":"flag-gt|guatemala flag|vlag: guatemala|vlag|flag: guatemala|flag"},{"u":"1f1ec-1f1fa","c":"Flags","o":1739,"x":2,"y":3,"s":"flag-gu","n":"vlag: Guam","k":"flag-gu|guam flag|vlag: guam|vlag|flag: guam|flag"},{"u":"1f1ec-1f1fc","c":"Flags","o":1740,"x":2,"y":4,"s":"flag-gw","n":"vlag: Guinee-Bissau","k":"flag-gw|guinea-bissau flag|vlag: guinee-bissau|vlag|flag: guinea-bissau|flag"},{"u":"1f1ec-1f1fe","c":"Flags","o":1741,"x":2,"y":5,"s":"flag-gy","n":"vlag: Guyana","k":"flag-gy|guyana flag|vlag: guyana|vlag|flag: guyana|flag"},{"u":"1f1ed-1f1f0","c":"Flags","o":1742,"x":2,"y":6,"s":"flag-hk","n":"vlag: Hongkong SAR van China","k":"flag-hk|hong kong sar china flag|vlag: hongkong sar van china|vlag|flag: hong kong sar china|flag"},{"u":"1f1ed-1f1f2","c":"Flags","o":1743,"x":2,"y":7,"s":"flag-hm","n":"vlag: Heard en McDonaldeilanden","k":"flag-hm|heard \u0026 mcdonald islands flag|vlag: heard en mcdonaldeilanden|vlag|flag: heard \u0026 mcdonald islands|flag"},{"u":"1f1ed-1f1f3","c":"Flags","o":1744,"x":2,"y":8,"s":"flag-hn","n":"vlag: Honduras","k":"flag-hn|honduras flag|vlag: honduras|vlag|flag: honduras|flag"},{"u":"1f1ed-1f1f7","c":"Flags","o":1745,"x":2,"y":9,"s":"flag-hr","n":"vlag: Kroatië","k":"flag-hr|croatia flag|vlag: kroatië|vlag|flag: croatia|flag"},{"u":"1f1ed-1f1f9","c":"Flags","o":1746,"x":2,"y":10,"s":"flag-ht","n":"vlag: Haïti","k":"flag-ht|haiti flag|vlag: haïti|vlag|flag: haiti|flag"},{"u":"1f1ed-1f1fa","c":"Flags","o":1747,"x":2,"y":11,"s":"flag-hu","n":"vlag: Hongarije","k":"flag-hu|hungary flag|vlag: hongarije|vlag|flag: hungary|flag"},{"u":"1f1ee-1f1e8","c":"Flags","o":1748,"x":2,"y":12,"s":"flag-ic","n":"vlag: Canarische Eilanden","k":"flag-ic|canary islands flag|vlag: canarische eilanden|vlag|flag: canary islands|flag"},{"u":"1f1ee-1f1e9","c":"Flags","o":1749,"x":2,"y":13,"s":"flag-id","n":"vlag: Indonesië","k":"flag-id|indonesia flag|vlag: indonesië|vlag|flag: indonesia|flag"},{"u":"1f1ee-1f1ea","c":"Flags","o":1750,"x":2,"y":14,"s":"flag-ie","n":"vlag: Ierland","k":"flag-ie|ireland flag|vlag: ierland|vlag|flag: ireland|flag"},{"u":"1f1ee-1f1f1","c":"Flags","o":1751,"x":2,"y":15,"s":"flag-il","n":"vlag: Israël","k":"flag-il|israel flag|vlag: israël|vlag|flag: israel|flag"},{"u":"1f1ee-1f1f2","c":"Flags","o":1752,"x":2,"y":16,"s":"flag-im","n":"vlag: Isle of Man","k":"flag-im|isle of man flag|vlag: isle of man|vlag|flag: isle of man|flag"},{"u":"1f1ee-1f1f3","c":"Flags","o":1753,"x":2,"y":17,"s":"flag-in","n":"vlag: India","k":"flag-in|india flag|vlag: india|vlag|flag: india|flag"},{"u":"1f1ee-1f1f4","c":"Flags","o":1754,"x":2,"y":18,"s":"flag-io","n":"vlag: Brits Indische Oceaanterritorium","k":"flag-io|british indian ocean territory flag|vlag: brits indische oceaanterritorium|vlag|flag: british indian ocean territory|flag"},{"u":"1f1ee-1f1f6","c":"Flags","o":1755,"x":2,"y":19,"s":"flag-iq","n":"vlag: Irak","k":"flag-iq|iraq flag|vlag: irak|vlag|flag: iraq|flag"},{"u":"1f1ee-1f1f7","c":"Flags","o":1756,"x":2,"y":20,"s":"flag-ir","n":"vlag: Iran","k":"flag-ir|iran flag|vlag: iran|vlag|flag: iran|flag"},{"u":"1f1ee-1f1f8","c":"Flags","o":1757,"x":2,"y":21,"s":"flag-is","n":"vlag: IJsland","k":"flag-is|iceland flag|vlag: ijsland|vlag|flag: iceland|flag"},{"u":"1f1ee-1f1f9","c":"Flags","o":1758,"x":2,"y":22,"s":"it","n":"vlag: Italië","k":"it|flag-it|italy flag|vlag: italië|vlag|flag: italy|flag"},{"u":"1f1ef-1f1ea","c":"Flags","o":1759,"x":2,"y":23,"s":"flag-je","n":"vlag: Jersey","k":"flag-je|jersey flag|vlag: jersey|vlag|flag: jersey|flag"},{"u":"1f1ef-1f1f2","c":"Flags","o":1760,"x":2,"y":24,"s":"flag-jm","n":"vlag: Jamaica","k":"flag-jm|jamaica flag|vlag: jamaica|vlag|flag: jamaica|flag"},{"u":"1f1ef-1f1f4","c":"Flags","o":1761,"x":2,"y":25,"s":"flag-jo","n":"vlag: Jordanië","k":"flag-jo|jordan flag|vlag: jordanië|vlag|flag: jordan|flag"},{"u":"1f1ef-1f1f5","c":"Flags","o":1762,"x":2,"y":26,"s":"jp","n":"vlag: Japan","k":"jp|flag-jp|japan flag|vlag: japan|vlag|flag: japan|flag"},{"u":"1f1f0-1f1ea","c":"Flags","o":1763,"x":2,"y":27,"s":"flag-ke","n":"vlag: Kenia","k":"flag-ke|kenya flag|vlag: kenia|vlag|flag: kenya|flag"},{"u":"1f1f0-1f1ec","c":"Flags","o":1764,"x":2,"y":28,"s":"flag-kg","n":"vlag: Kirgizië","k":"flag-kg|kyrgyzstan flag|vlag: kirgizië|vlag|flag: kyrgyzstan|flag"},{"u":"1f1f0-1f1ed","c":"Flags","o":1765,"x":2,"y":29,"s":"flag-kh","n":"vlag: Cambodja","k":"flag-kh|cambodia flag|vlag: cambodja|vlag|flag: cambodia|flag"},{"u":"1f1f0-1f1ee","c":"Flags","o":1766,"x":2,"y":30,"s":"flag-ki","n":"vlag: Kiribati","k":"flag-ki|kiribati flag|vlag: kiribati|vlag|flag: kiribati|flag"},{"u":"1f1f0-1f1f2","c":"Flags","o":1767,"x":2,"y":31,"s":"flag-km","n":"vlag: Comoren","k":"flag-km|comoros flag|vlag: comoren|vlag|flag: comoros|flag"},{"u":"1f1f0-1f1f3","c":"Flags","o":1768,"x":2,"y":32,"s":"flag-kn","n":"vlag: Saint Kitts en Nevis","k":"flag-kn|st. kitts \u0026 nevis flag|vlag: saint kitts en nevis|vlag|flag: st. kitts \u0026 nevis|flag"},{"u":"1f1f0-1f1f5","c":"Flags","o":1769,"x":2,"y":33,"s":"flag-kp","n":"vlag: Noord-Korea","k":"flag-kp|north korea flag|vlag: noord-korea|vlag|flag: north korea|flag"},{"u":"1f1f0-1f1f7","c":"Flags","o":1770,"x":2,"y":34,"s":"kr","n":"vlag: Zuid-Korea","k":"kr|flag-kr|south korea flag|vlag: zuid-korea|vlag|flag: south korea|flag"},{"u":"1f1f0-1f1fc","c":"Flags","o":1771,"x":2,"y":35,"s":"flag-kw","n":"vlag: Koeweit","k":"flag-kw|kuwait flag|vlag: koeweit|vlag|flag: kuwait|flag"},{"u":"1f1f0-1f1fe","c":"Flags","o":1772,"x":2,"y":36,"s":"flag-ky","n":"vlag: Kaaimaneilanden","k":"flag-ky|cayman islands flag|vlag: kaaimaneilanden|vlag|flag: cayman islands|flag"},{"u":"1f1f0-1f1ff","c":"Flags","o":1773,"x":2,"y":37,"s":"flag-kz","n":"vlag: Kazachstan","k":"flag-kz|kazakhstan flag|vlag: kazachstan|vlag|flag: kazakhstan|flag"},{"u":"1f1f1-1f1e6","c":"Flags","o":1774,"x":2,"y":38,"s":"flag-la","n":"vlag: Laos","k":"flag-la|laos flag|vlag: laos|vlag|flag: laos|flag"},{"u":"1f1f1-1f1e7","c":"Flags","o":1775,"x":2,"y":39,"s":"flag-lb","n":"vlag: Libanon","k":"flag-lb|lebanon flag|vlag: libanon|vlag|flag: lebanon|flag"},{"u":"1f1f1-1f1e8","c":"Flags","o":1776,"x":2,"y":40,"s":"flag-lc","n":"vlag: Saint Lucia","k":"flag-lc|st. lucia flag|vlag: saint lucia|vlag|flag: st. lucia|flag"},{"u":"1f1f1-1f1ee","c":"Flags","o":1777,"x":2,"y":41,"s":"flag-li","n":"vlag: Liechtenstein","k":"flag-li|liechtenstein flag|vlag: liechtenstein|vlag|flag: liechtenstein|flag"},{"u":"1f1f1-1f1f0","c":"Flags","o":1778,"x":2,"y":42,"s":"flag-lk","n":"vlag: Sri Lanka","k":"flag-lk|sri lanka flag|vlag: sri lanka|vlag|flag: sri lanka|flag"},{"u":"1f1f1-1f1f7","c":"Flags","o":1779,"x":2,"y":43,"s":"flag-lr","n":"vlag: Liberia","k":"flag-lr|liberia flag|vlag: liberia|vlag|flag: liberia|flag"},{"u":"1f1f1-1f1f8","c":"Flags","o":1780,"x":2,"y":44,"s":"flag-ls","n":"vlag: Lesotho","k":"flag-ls|lesotho flag|vlag: lesotho|vlag|flag: lesotho|flag"},{"u":"1f1f1-1f1f9","c":"Flags","o":1781,"x":2,"y":45,"s":"flag-lt","n":"vlag: Litouwen","k":"flag-lt|lithuania flag|vlag: litouwen|vlag|flag: lithuania|flag"},{"u":"1f1f1-1f1fa","c":"Flags","o":1782,"x":2,"y":46,"s":"flag-lu","n":"vlag: Luxemburg","k":"flag-lu|luxembourg flag|vlag: luxemburg|vlag|flag: luxembourg|flag"},{"u":"1f1f1-1f1fb","c":"Flags","o":1783,"x":2,"y":47,"s":"flag-lv","n":"vlag: Letland","k":"flag-lv|latvia flag|vlag: letland|vlag|flag: latvia|flag"},{"u":"1f1f1-1f1fe","c":"Flags","o":1784,"x":2,"y":48,"s":"flag-ly","n":"vlag: Libië","k":"flag-ly|libya flag|vlag: libië|vlag|flag: libya|flag"},{"u":"1f1f2-1f1e6","c":"Flags","o":1785,"x":2,"y":49,"s":"flag-ma","n":"vlag: Marokko","k":"flag-ma|morocco flag|vlag: marokko|vlag|flag: morocco|flag"},{"u":"1f1f2-1f1e8","c":"Flags","o":1786,"x":2,"y":50,"s":"flag-mc","n":"vlag: Monaco","k":"flag-mc|monaco flag|vlag: monaco|vlag|flag: monaco|flag"},{"u":"1f1f2-1f1e9","c":"Flags","o":1787,"x":2,"y":51,"s":"flag-md","n":"vlag: Moldavië","k":"flag-md|moldova flag|vlag: moldavië|vlag|flag: moldova|flag"},{"u":"1f1f2-1f1ea","c":"Flags","o":1788,"x":2,"y":52,"s":"flag-me","n":"vlag: Montenegro","k":"flag-me|montenegro flag|vlag: montenegro|vlag|flag: montenegro|flag"},{"u":"1f1f2-1f1eb","c":"Flags","o":1789,"x":2,"y":53,"s":"flag-mf","n":"vlag: Saint-Martin","k":"flag-mf|st. martin flag|vlag: saint-martin|vlag|flag: st. martin|flag"},{"u":"1f1f2-1f1ec","c":"Flags","o":1790,"x":2,"y":54,"s":"flag-mg","n":"vlag: Madagaskar","k":"flag-mg|madagascar flag|vlag: madagaskar|vlag|flag: madagascar|flag"},{"u":"1f1f2-1f1ed","c":"Flags","o":1791,"x":2,"y":55,"s":"flag-mh","n":"vlag: Marshalleilanden","k":"flag-mh|marshall islands flag|vlag: marshalleilanden|vlag|flag: marshall islands|flag"},{"u":"1f1f2-1f1f0","c":"Flags","o":1792,"x":2,"y":56,"s":"flag-mk","n":"vlag: Noord-Macedonië","k":"flag-mk|north macedonia flag|vlag: noord-macedonië|vlag|flag: north macedonia|flag"},{"u":"1f1f2-1f1f1","c":"Flags","o":1793,"x":2,"y":57,"s":"flag-ml","n":"vlag: Mali","k":"flag-ml|mali flag|vlag: mali|vlag|flag: mali|flag"},{"u":"1f1f2-1f1f2","c":"Flags","o":1794,"x":2,"y":58,"s":"flag-mm","n":"vlag: Myanmar (Birma)","k":"flag-mm|myanmar (burma) flag|vlag: myanmar (birma)|vlag|flag: myanmar (burma)|flag"},{"u":"1f1f2-1f1f3","c":"Flags","o":1795,"x":2,"y":59,"s":"flag-mn","n":"vlag: Mongolië","k":"flag-mn|mongolia flag|vlag: mongolië|vlag|flag: mongolia|flag"},{"u":"1f1f2-1f1f4","c":"Flags","o":1796,"x":2,"y":60,"s":"flag-mo","n":"vlag: Macau SAR van China","k":"flag-mo|macao sar china flag|vlag: macau sar van china|vlag|flag: macao sar china|flag"},{"u":"1f1f2-1f1f5","c":"Flags","o":1797,"x":2,"y":61,"s":"flag-mp","n":"vlag: Noordelijke Marianen","k":"flag-mp|northern mariana islands flag|vlag: noordelijke marianen|vlag|flag: northern mariana islands|flag"},{"u":"1f1f2-1f1f6","c":"Flags","o":1798,"x":3,"y":0,"s":"flag-mq","n":"vlag: Martinique","k":"flag-mq|martinique flag|vlag: martinique|vlag|flag: martinique|flag"},{"u":"1f1f2-1f1f7","c":"Flags","o":1799,"x":3,"y":1,"s":"flag-mr","n":"vlag: Mauritanië","k":"flag-mr|mauritania flag|vlag: mauritanië|vlag|flag: mauritania|flag"},{"u":"1f1f2-1f1f8","c":"Flags","o":1800,"x":3,"y":2,"s":"flag-ms","n":"vlag: Montserrat","k":"flag-ms|montserrat flag|vlag: montserrat|vlag|flag: montserrat|flag"},{"u":"1f1f2-1f1f9","c":"Flags","o":1801,"x":3,"y":3,"s":"flag-mt","n":"vlag: Malta","k":"flag-mt|malta flag|vlag: malta|vlag|flag: malta|flag"},{"u":"1f1f2-1f1fa","c":"Flags","o":1802,"x":3,"y":4,"s":"flag-mu","n":"vlag: Mauritius","k":"flag-mu|mauritius flag|vlag: mauritius|vlag|flag: mauritius|flag"},{"u":"1f1f2-1f1fb","c":"Flags","o":1803,"x":3,"y":5,"s":"flag-mv","n":"vlag: Maldiven","k":"flag-mv|maldives flag|vlag: maldiven|vlag|flag: maldives|flag"},{"u":"1f1f2-1f1fc","c":"Flags","o":1804,"x":3,"y":6,"s":"flag-mw","n":"vlag: Malawi","k":"flag-mw|malawi flag|vlag: malawi|vlag|flag: malawi|flag"},{"u":"1f1f2-1f1fd","c":"Flags","o":1805,"x":3,"y":7,"s":"flag-mx","n":"vlag: Mexico","k":"flag-mx|mexico flag|vlag: mexico|vlag|flag: mexico|flag"},{"u":"1f1f2-1f1fe","c":"Flags","o":1806,"x":3,"y":8,"s":"flag-my","n":"vlag: Maleisië","k":"flag-my|malaysia flag|vlag: maleisië|vlag|flag: malaysia|flag"},{"u":"1f1f2-1f1ff","c":"Flags","o":1807,"x":3,"y":9,"s":"flag-mz","n":"vlag: Mozambique","k":"flag-mz|mozambique flag|vlag: mozambique|vlag|flag: mozambique|flag"},{"u":"1f1f3-1f1e6","c":"Flags","o":1808,"x":3,"y":10,"s":"flag-na","n":"vlag: Namibië","k":"flag-na|namibia flag|vlag: namibië|vlag|flag: namibia|flag"},{"u":"1f1f3-1f1e8","c":"Flags","o":1809,"x":3,"y":11,"s":"flag-nc","n":"vlag: Nieuw-Caledonië","k":"flag-nc|new caledonia flag|vlag: nieuw-caledonië|vlag|flag: new caledonia|flag"},{"u":"1f1f3-1f1ea","c":"Flags","o":1810,"x":3,"y":12,"s":"flag-ne","n":"vlag: Niger","k":"flag-ne|niger flag|vlag: niger|vlag|flag: niger|flag"},{"u":"1f1f3-1f1eb","c":"Flags","o":1811,"x":3,"y":13,"s":"flag-nf","n":"vlag: Norfolk","k":"flag-nf|norfolk island flag|vlag: norfolk|vlag|flag: norfolk island|flag"},{"u":"1f1f3-1f1ec","c":"Flags","o":1812,"x":3,"y":14,"s":"flag-ng","n":"vlag: Nigeria","k":"flag-ng|nigeria flag|vlag: nigeria|vlag|flag: nigeria|flag"},{"u":"1f1f3-1f1ee","c":"Flags","o":1813,"x":3,"y":15,"s":"flag-ni","n":"vlag: Nicaragua","k":"flag-ni|nicaragua flag|vlag: nicaragua|vlag|flag: nicaragua|flag"},{"u":"1f1f3-1f1f1","c":"Flags","o":1814,"x":3,"y":16,"s":"flag-nl","n":"vlag: Nederland","k":"flag-nl|netherlands flag|vlag: nederland|vlag|flag: netherlands|flag"},{"u":"1f1f3-1f1f4","c":"Flags","o":1815,"x":3,"y":17,"s":"flag-no","n":"vlag: Noorwegen","k":"flag-no|norway flag|vlag: noorwegen|vlag|flag: norway|flag"},{"u":"1f1f3-1f1f5","c":"Flags","o":1816,"x":3,"y":18,"s":"flag-np","n":"vlag: Nepal","k":"flag-np|nepal flag|vlag: nepal|vlag|flag: nepal|flag"},{"u":"1f1f3-1f1f7","c":"Flags","o":1817,"x":3,"y":19,"s":"flag-nr","n":"vlag: Nauru","k":"flag-nr|nauru flag|vlag: nauru|vlag|flag: nauru|flag"},{"u":"1f1f3-1f1fa","c":"Flags","o":1818,"x":3,"y":20,"s":"flag-nu","n":"vlag: Niue","k":"flag-nu|niue flag|vlag: niue|vlag|flag: niue|flag"},{"u":"1f1f3-1f1ff","c":"Flags","o":1819,"x":3,"y":21,"s":"flag-nz","n":"vlag: Nieuw-Zeeland","k":"flag-nz|new zealand flag|vlag: nieuw-zeeland|vlag|flag: new zealand|flag"},{"u":"1f1f4-1f1f2","c":"Flags","o":1820,"x":3,"y":22,"s":"flag-om","n":"vlag: Oman","k":"flag-om|oman flag|vlag: oman|vlag|flag: oman|flag"},{"u":"1f1f5-1f1e6","c":"Flags","o":1821,"x":3,"y":23,"s":"flag-pa","n":"vlag: Panama","k":"flag-pa|panama flag|vlag: panama|vlag|flag: panama|flag"},{"u":"1f1f5-1f1ea","c":"Flags","o":1822,"x":3,"y":24,"s":"flag-pe","n":"vlag: Peru","k":"flag-pe|peru flag|vlag: peru|vlag|flag: peru|flag"},{"u":"1f1f5-1f1eb","c":"Flags","o":1823,"x":3,"y":25,"s":"flag-pf","n":"vlag: Frans-Polynesië","k":"flag-pf|french polynesia flag|vlag: frans-polynesië|vlag|flag: french polynesia|flag"},{"u":"1f1f5-1f1ec","c":"Flags","o":1824,"x":3,"y":26,"s":"flag-pg","n":"vlag: Papoea-Nieuw-Guinea","k":"flag-pg|papua new guinea flag|vlag: papoea-nieuw-guinea|vlag|flag: papua new guinea|flag"},{"u":"1f1f5-1f1ed","c":"Flags","o":1825,"x":3,"y":27,"s":"flag-ph","n":"vlag: Filipijnen","k":"flag-ph|philippines flag|vlag: filipijnen|vlag|flag: philippines|flag"},{"u":"1f1f5-1f1f0","c":"Flags","o":1826,"x":3,"y":28,"s":"flag-pk","n":"vlag: Pakistan","k":"flag-pk|pakistan flag|vlag: pakistan|vlag|flag: pakistan|flag"},{"u":"1f1f5-1f1f1","c":"Flags","o":1827,"x":3,"y":29,"s":"flag-pl","n":"vlag: Polen","k":"flag-pl|poland flag|vlag: polen|vlag|flag: poland|flag"},{"u":"1f1f5-1f1f2","c":"Flags","o":1828,"x":3,"y":30,"s":"flag-pm","n":"vlag: Saint-Pierre en Miquelon","k":"flag-pm|st. pierre \u0026 miquelon flag|vlag: saint-pierre en miquelon|vlag|flag: st. pierre \u0026 miquelon|flag"},{"u":"1f1f5-1f1f3","c":"Flags","o":1829,"x":3,"y":31,"s":"flag-pn","n":"vlag: Pitcairneilanden","k":"flag-pn|pitcairn islands flag|vlag: pitcairneilanden|vlag|flag: pitcairn islands|flag"},{"u":"1f1f5-1f1f7","c":"Flags","o":1830,"x":3,"y":32,"s":"flag-pr","n":"vlag: Puerto Rico","k":"flag-pr|puerto rico flag|vlag: puerto rico|vlag|flag: puerto rico|flag"},{"u":"1f1f5-1f1f8","c":"Flags","o":1831,"x":3,"y":33,"s":"flag-ps","n":"vlag: Palestijnse gebieden","k":"flag-ps|palestinian territories flag|vlag: palestijnse gebieden|vlag|flag: palestinian territories|flag"},{"u":"1f1f5-1f1f9","c":"Flags","o":1832,"x":3,"y":34,"s":"flag-pt","n":"vlag: Portugal","k":"flag-pt|portugal flag|vlag: portugal|vlag|flag: portugal|flag"},{"u":"1f1f5-1f1fc","c":"Flags","o":1833,"x":3,"y":35,"s":"flag-pw","n":"vlag: Palau","k":"flag-pw|palau flag|vlag: palau|vlag|flag: palau|flag"},{"u":"1f1f5-1f1fe","c":"Flags","o":1834,"x":3,"y":36,"s":"flag-py","n":"vlag: Paraguay","k":"flag-py|paraguay flag|vlag: paraguay|vlag|flag: paraguay|flag"},{"u":"1f1f6-1f1e6","c":"Flags","o":1835,"x":3,"y":37,"s":"flag-qa","n":"vlag: Qatar","k":"flag-qa|qatar flag|vlag: qatar|vlag|flag: qatar|flag"},{"u":"1f1f7-1f1ea","c":"Flags","o":1836,"x":3,"y":38,"s":"flag-re","n":"vlag: Réunion","k":"flag-re|réunion flag|vlag: réunion|vlag|flag: réunion|flag"},{"u":"1f1f7-1f1f4","c":"Flags","o":1837,"x":3,"y":39,"s":"flag-ro","n":"vlag: Roemenië","k":"flag-ro|romania flag|vlag: roemenië|vlag|flag: romania|flag"},{"u":"1f1f7-1f1f8","c":"Flags","o":1838,"x":3,"y":40,"s":"flag-rs","n":"vlag: Servië","k":"flag-rs|serbia flag|vlag: servië|vlag|flag: serbia|flag"},{"u":"1f1f7-1f1fa","c":"Flags","o":1839,"x":3,"y":41,"s":"ru","n":"vlag: Rusland","k":"ru|flag-ru|russia flag|vlag: rusland|vlag|flag: russia|flag"},{"u":"1f1f7-1f1fc","c":"Flags","o":1840,"x":3,"y":42,"s":"flag-rw","n":"vlag: Rwanda","k":"flag-rw|rwanda flag|vlag: rwanda|vlag|flag: rwanda|flag"},{"u":"1f1f8-1f1e6","c":"Flags","o":1841,"x":3,"y":43,"s":"flag-sa","n":"vlag: Saoedi-Arabië","k":"flag-sa|saudi arabia flag|vlag: saoedi-arabië|vlag|flag: saudi arabia|flag"},{"u":"1f1f8-1f1e7","c":"Flags","o":1842,"x":3,"y":44,"s":"flag-sb","n":"vlag: Salomonseilanden","k":"flag-sb|solomon islands flag|vlag: salomonseilanden|vlag|flag: solomon islands|flag"},{"u":"1f1f8-1f1e8","c":"Flags","o":1843,"x":3,"y":45,"s":"flag-sc","n":"vlag: Seychellen","k":"flag-sc|seychelles flag|vlag: seychellen|vlag|flag: seychelles|flag"},{"u":"1f1f8-1f1e9","c":"Flags","o":1844,"x":3,"y":46,"s":"flag-sd","n":"vlag: Soedan","k":"flag-sd|sudan flag|vlag: soedan|vlag|flag: sudan|flag"},{"u":"1f1f8-1f1ea","c":"Flags","o":1845,"x":3,"y":47,"s":"flag-se","n":"vlag: Zweden","k":"flag-se|sweden flag|vlag: zweden|vlag|flag: sweden|flag"},{"u":"1f1f8-1f1ec","c":"Flags","o":1846,"x":3,"y":48,"s":"flag-sg","n":"vlag: Singapore","k":"flag-sg|singapore flag|vlag: singapore|vlag|flag: singapore|flag"},{"u":"1f1f8-1f1ed","c":"Flags","o":1847,"x":3,"y":49,"s":"flag-sh","n":"vlag: Sint-Helena","k":"flag-sh|st. helena flag|vlag: sint-helena|vlag|flag: st. helena|flag"},{"u":"1f1f8-1f1ee","c":"Flags","o":1848,"x":3,"y":50,"s":"flag-si","n":"vlag: Slovenië","k":"flag-si|slovenia flag|vlag: slovenië|vlag|flag: slovenia|flag"},{"u":"1f1f8-1f1ef","c":"Flags","o":1849,"x":3,"y":51,"s":"flag-sj","n":"vlag: Spitsbergen en Jan Mayen","k":"flag-sj|svalbard \u0026 jan mayen flag|vlag: spitsbergen en jan mayen|vlag|flag: svalbard \u0026 jan mayen|flag"},{"u":"1f1f8-1f1f0","c":"Flags","o":1850,"x":3,"y":52,"s":"flag-sk","n":"vlag: Slowakije","k":"flag-sk|slovakia flag|vlag: slowakije|vlag|flag: slovakia|flag"},{"u":"1f1f8-1f1f1","c":"Flags","o":1851,"x":3,"y":53,"s":"flag-sl","n":"vlag: Sierra Leone","k":"flag-sl|sierra leone flag|vlag: sierra leone|vlag|flag: sierra leone|flag"},{"u":"1f1f8-1f1f2","c":"Flags","o":1852,"x":3,"y":54,"s":"flag-sm","n":"vlag: San Marino","k":"flag-sm|san marino flag|vlag: san marino|vlag|flag: san marino|flag"},{"u":"1f1f8-1f1f3","c":"Flags","o":1853,"x":3,"y":55,"s":"flag-sn","n":"vlag: Senegal","k":"flag-sn|senegal flag|vlag: senegal|vlag|flag: senegal|flag"},{"u":"1f1f8-1f1f4","c":"Flags","o":1854,"x":3,"y":56,"s":"flag-so","n":"vlag: Somalië","k":"flag-so|somalia flag|vlag: somalië|vlag|flag: somalia|flag"},{"u":"1f1f8-1f1f7","c":"Flags","o":1855,"x":3,"y":57,"s":"flag-sr","n":"vlag: Suriname","k":"flag-sr|suriname flag|vlag: suriname|vlag|flag: suriname|flag"},{"u":"1f1f8-1f1f8","c":"Flags","o":1856,"x":3,"y":58,"s":"flag-ss","n":"vlag: Zuid-Soedan","k":"flag-ss|south sudan flag|vlag: zuid-soedan|vlag|flag: south sudan|flag"},{"u":"1f1f8-1f1f9","c":"Flags","o":1857,"x":3,"y":59,"s":"flag-st","n":"vlag: Sao Tomé en Principe","k":"flag-st|são tomé \u0026 príncipe flag|vlag: sao tomé en principe|vlag|flag: são tomé \u0026 príncipe|flag"},{"u":"1f1f8-1f1fb","c":"Flags","o":1858,"x":3,"y":60,"s":"flag-sv","n":"vlag: El Salvador","k":"flag-sv|el salvador flag|vlag: el salvador|vlag|flag: el salvador|flag"},{"u":"1f1f8-1f1fd","c":"Flags","o":1859,"x":3,"y":61,"s":"flag-sx","n":"vlag: Sint-Maarten","k":"flag-sx|sint maarten flag|vlag: sint-maarten|vlag|flag: sint maarten|flag"},{"u":"1f1f8-1f1fe","c":"Flags","o":1860,"x":4,"y":0,"s":"flag-sy","n":"vlag: Syrië","k":"flag-sy|syria flag|vlag: syrië|vlag|flag: syria|flag"},{"u":"1f1f8-1f1ff","c":"Flags","o":1861,"x":4,"y":1,"s":"flag-sz","n":"vlag: Eswatini","k":"flag-sz|eswatini flag|vlag: eswatini|vlag|flag: eswatini|flag"},{"u":"1f1f9-1f1e6","c":"Flags","o":1862,"x":4,"y":2,"s":"flag-ta","n":"vlag: Tristan da Cunha","k":"flag-ta|tristan da cunha flag|vlag: tristan da cunha|vlag|flag: tristan da cunha|flag"},{"u":"1f1f9-1f1e8","c":"Flags","o":1863,"x":4,"y":3,"s":"flag-tc","n":"vlag: Turks- en Caicoseilanden","k":"flag-tc|turks \u0026 caicos islands flag|vlag: turks- en caicoseilanden|vlag|flag: turks \u0026 caicos islands|flag"},{"u":"1f1f9-1f1e9","c":"Flags","o":1864,"x":4,"y":4,"s":"flag-td","n":"vlag: Tsjaad","k":"flag-td|chad flag|vlag: tsjaad|vlag|flag: chad|flag"},{"u":"1f1f9-1f1eb","c":"Flags","o":1865,"x":4,"y":5,"s":"flag-tf","n":"vlag: Franse Gebieden in de zuidelijke Indische Oceaan","k":"flag-tf|french southern territories flag|vlag: franse gebieden in de zuidelijke indische oceaan|vlag|flag: french southern territories|flag"},{"u":"1f1f9-1f1ec","c":"Flags","o":1866,"x":4,"y":6,"s":"flag-tg","n":"vlag: Togo","k":"flag-tg|togo flag|vlag: togo|vlag|flag: togo|flag"},{"u":"1f1f9-1f1ed","c":"Flags","o":1867,"x":4,"y":7,"s":"flag-th","n":"vlag: Thailand","k":"flag-th|thailand flag|vlag: thailand|vlag|flag: thailand|flag"},{"u":"1f1f9-1f1ef","c":"Flags","o":1868,"x":4,"y":8,"s":"flag-tj","n":"vlag: Tadzjikistan","k":"flag-tj|tajikistan flag|vlag: tadzjikistan|vlag|flag: tajikistan|flag"},{"u":"1f1f9-1f1f0","c":"Flags","o":1869,"x":4,"y":9,"s":"flag-tk","n":"vlag: Tokelau","k":"flag-tk|tokelau flag|vlag: tokelau|vlag|flag: tokelau|flag"},{"u":"1f1f9-1f1f1","c":"Flags","o":1870,"x":4,"y":10,"s":"flag-tl","n":"vlag: Oost-Timor","k":"flag-tl|timor-leste flag|vlag: oost-timor|vlag|flag: timor-leste|flag"},{"u":"1f1f9-1f1f2","c":"Flags","o":1871,"x":4,"y":11,"s":"flag-tm","n":"vlag: Turkmenistan","k":"flag-tm|turkmenistan flag|vlag: turkmenistan|vlag|flag: turkmenistan|flag"},{"u":"1f1f9-1f1f3","c":"Flags","o":1872,"x":4,"y":12,"s":"flag-tn","n":"vlag: Tunesië","k":"flag-tn|tunisia flag|vlag: tunesië|vlag|flag: tunisia|flag"},{"u":"1f1f9-1f1f4","c":"Flags","o":1873,"x":4,"y":13,"s":"flag-to","n":"vlag: Tonga","k":"flag-to|tonga flag|vlag: tonga|vlag|flag: tonga|flag"},{"u":"1f1f9-1f1f7","c":"Flags","o":1874,"x":4,"y":14,"s":"flag-tr","n":"vlag: Turkije","k":"flag-tr|türkiye flag|vlag: turkije|vlag|flag: türkiye|flag"},{"u":"1f1f9-1f1f9","c":"Flags","o":1875,"x":4,"y":15,"s":"flag-tt","n":"vlag: Trinidad en Tobago","k":"flag-tt|trinidad \u0026 tobago flag|vlag: trinidad en tobago|vlag|flag: trinidad \u0026 tobago|flag"},{"u":"1f1f9-1f1fb","c":"Flags","o":1876,"x":4,"y":16,"s":"flag-tv","n":"vlag: Tuvalu","k":"flag-tv|tuvalu flag|vlag: tuvalu|vlag|flag: tuvalu|flag"},{"u":"1f1f9-1f1fc","c":"Flags","o":1877,"x":4,"y":17,"s":"flag-tw","n":"vlag: Taiwan","k":"flag-tw|taiwan flag|vlag: taiwan|vlag|flag: taiwan|flag"},{"u":"1f1f9-1f1ff","c":"Flags","o":1878,"x":4,"y":18,"s":"flag-tz","n":"vlag: Tanzania","k":"flag-tz|tanzania flag|vlag: tanzania|vlag|flag: tanzania|flag"},{"u":"1f1fa-1f1e6","c":"Flags","o":1879,"x":4,"y":19,"s":"flag-ua","n":"vlag: Oekraïne","k":"flag-ua|ukraine flag|vlag: oekraïne|vlag|flag: ukraine|flag"},{"u":"1f1fa-1f1ec","c":"Flags","o":1880,"x":4,"y":20,"s":"flag-ug","n":"vlag: Oeganda","k":"flag-ug|uganda flag|vlag: oeganda|vlag|flag: uganda|flag"},{"u":"1f1fa-1f1f2","c":"Flags","o":1881,"x":4,"y":21,"s":"flag-um","n":"vlag: Kleine afgelegen eilanden van de Verenigde Staten","k":"flag-um|u.s. outlying islands flag|vlag: kleine afgelegen eilanden van de verenigde staten|vlag|flag: u.s. outlying islands|flag"},{"u":"1f1fa-1f1f3","c":"Flags","o":1882,"x":4,"y":22,"s":"flag-un","n":"vlag: Verenigde Naties","k":"flag-un|united nations flag|vlag: verenigde naties|vlag|flag: united nations|flag"},{"u":"1f1fa-1f1f8","c":"Flags","o":1883,"x":4,"y":23,"s":"us","n":"vlag: Verenigde Staten","k":"us|flag-us|united states flag|vlag: verenigde staten|vlag|flag: united states|flag"},{"u":"1f1fa-1f1fe","c":"Flags","o":1884,"x":4,"y":24,"s":"flag-uy","n":"vlag: Uruguay","k":"flag-uy|uruguay flag|vlag: uruguay|vlag|flag: uruguay|flag"},{"u":"1f1fa-1f1ff","c":"Flags","o":1885,"x":4,"y":25,"s":"flag-uz","n":"vlag: Oezbekistan","k":"flag-uz|uzbekistan flag|vlag: oezbekistan|vlag|flag: uzbekistan|flag"},{"u":"1f1fb-1f1e6","c":"Flags","o":1886,"x":4,"y":26,"s":"flag-va","n":"vlag: Vaticaanstad","k":"flag-va|vatican city flag|vlag: vaticaanstad|vlag|flag: vatican city|flag"},{"u":"1f1fb-1f1e8","c":"Flags","o":1887,"x":4,"y":27,"s":"flag-vc","n":"vlag: Saint Vincent en de Grenadines","k":"flag-vc|st. vincent \u0026 grenadines flag|vlag: saint vincent en de grenadines|vlag|flag: st. vincent \u0026 grenadines|flag"},{"u":"1f1fb-1f1ea","c":"Flags","o":1888,"x":4,"y":28,"s":"flag-ve","n":"vlag: Venezuela","k":"flag-ve|venezuela flag|vlag: venezuela|vlag|flag: venezuela|flag"},{"u":"1f1fb-1f1ec","c":"Flags","o":1889,"x":4,"y":29,"s":"flag-vg","n":"vlag: Britse Maagdeneilanden","k":"flag-vg|british virgin islands flag|vlag: britse maagdeneilanden|vlag|flag: british virgin islands|flag"},{"u":"1f1fb-1f1ee","c":"Flags","o":1890,"x":4,"y":30,"s":"flag-vi","n":"vlag: Amerikaanse Maagdeneilanden","k":"flag-vi|u.s. virgin islands flag|vlag: amerikaanse maagdeneilanden|vlag|flag: u.s. virgin islands|flag"},{"u":"1f1fb-1f1f3","c":"Flags","o":1891,"x":4,"y":31,"s":"flag-vn","n":"vlag: Vietnam","k":"flag-vn|vietnam flag|vlag: vietnam|vlag|flag: vietnam|flag"},{"u":"1f1fb-1f1fa","c":"Flags","o":1892,"x":4,"y":32,"s":"flag-vu","n":"vlag: Vanuatu","k":"flag-vu|vanuatu flag|vlag: vanuatu|vlag|flag: vanuatu|flag"},{"u":"1f1fc-1f1eb","c":"Flags","o":1893,"x":4,"y":33,"s":"flag-wf","n":"vlag: Wallis en Futuna","k":"flag-wf|wallis \u0026 futuna flag|vlag: wallis en futuna|vlag|flag: wallis \u0026 futuna|flag"},{"u":"1f1fc-1f1f8","c":"Flags","o":1894,"x":4,"y":34,"s":"flag-ws","n":"vlag: Samoa","k":"flag-ws|samoa flag|vlag: samoa|vlag|flag: samoa|flag"},{"u":"1f1fd-1f1f0","c":"Flags","o":1895,"x":4,"y":35,"s":"flag-xk","n":"vlag: Kosovo","k":"flag-xk|kosovo flag|vlag: kosovo|vlag|flag: kosovo|flag"},{"u":"1f1fe-1f1ea","c":"Flags","o":1896,"x":4,"y":36,"s":"flag-ye","n":"vlag: Jemen","k":"flag-ye|yemen flag|vlag: jemen|vlag|flag: yemen|flag"},{"u":"1f1fe-1f1f9","c":"Flags","o":1897,"x":4,"y":37,"s":"flag-yt","n":"vlag: Mayotte","k":"flag-yt|mayotte flag|vlag: mayotte|vlag|flag: mayotte|flag"},{"u":"1f1ff-1f1e6","c":"Flags","o":1898,"x":4,"y":38,"s":"flag-za","n":"vlag: Zuid-Afrika","k":"flag-za|south africa flag|vlag: zuid-afrika|vlag|flag: south africa|flag"},{"u":"1f1ff-1f1f2","c":"Flags","o":1899,"x":4,"y":39,"s":"flag-zm","n":"vlag: Zambia","k":"flag-zm|zambia flag|vlag: zambia|vlag|flag: zambia|flag"},{"u":"1f1ff-1f1fc","c":"Flags","o":1900,"x":4,"y":40,"s":"flag-zw","n":"vlag: Zimbabwe","k":"flag-zw|zimbabwe flag|vlag: zimbabwe|vlag|flag: zimbabwe|flag"},{"u":"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f","c":"Flags","o":1901,"x":10,"y":42,"s":"flag-england","n":"vlag: Engeland","k":"flag-england|england flag|vlag: engeland|vlag|flag: england|flag"},{"u":"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f","c":"Flags","o":1902,"x":10,"y":43,"s":"flag-scotland","n":"vlag: Schotland","k":"flag-scotland|scotland flag|vlag: schotland|vlag|flag: scotland|flag"},{"u":"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f","c":"Flags","o":1903,"x":10,"y":44,"s":"flag-wales","n":"vlag: Wales","k":"flag-wales|wales flag|vlag: wales|vlag|flag: wales|flag"}] \ No newline at end of file diff --git a/src/Kniip/Assets/Emoji/twemoji-64.png b/src/Kniip/Assets/Emoji/twemoji-64.png new file mode 100644 index 0000000..d7d9598 Binary files /dev/null and b/src/Kniip/Assets/Emoji/twemoji-64.png differ diff --git a/src/Kniip/Capture/CaptureCoordinator.cs b/src/Kniip/Capture/CaptureCoordinator.cs new file mode 100644 index 0000000..7a6d44e --- /dev/null +++ b/src/Kniip/Capture/CaptureCoordinator.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Windows.Media.Imaging; +using System.Windows.Threading; +using Kniip.Infrastructure; +using Kniip.Interop; +using Kniip.Settings; + +namespace Kniip.Capture; + +/// +/// Combineert klembord- en mapbewaking. Het Knipprogramma kopieert én bewaart elk knipsel, +/// dus dubbele meldingen van hetzelfde knipsel worden hier weggefilterd. +/// +internal sealed class CaptureCoordinator : IDisposable +{ + private static readonly TimeSpan HashWindow = TimeSpan.FromSeconds(30); + private static readonly TimeSpan SameSizeWindow = TimeSpan.FromSeconds(4); + + private readonly ClipboardWatcher _clipboard; + private readonly FolderWatcher _folder; + private readonly List _recent = new(); + private readonly ConcurrentDictionary _ignoredPaths = new(StringComparer.OrdinalIgnoreCase); + + public event Action? CaptureReceived; + + public bool Paused { get; set; } + + public static string? ScreenshotsFolder + { + get + { + string? path = NativeMethods.GetKnownFolderPath(NativeMethods.FOLDERID_Screenshots); + if (path != null) + { + return path; + } + + string pictures = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); + return pictures.Length == 0 ? null : Path.Combine(pictures, "Screenshots"); + } + } + + public CaptureCoordinator(Dispatcher dispatcher) + { + _clipboard = new ClipboardWatcher(); + _clipboard.ImageCaptured += OnImage; + + _folder = new FolderWatcher(dispatcher) { ShouldIgnore = IsIgnored }; + _folder.ImageCaptured += (image, _) => OnImage(image); + } + + public void ApplySettings(AppSettings settings) + { + _clipboard.Enabled = settings.WatchClipboard; + _clipboard.OnlyFromSnippingTool = settings.OnlyFromSnippingTool; + _folder.Enabled = settings.WatchScreenshotsFolder; + } + + /// Bestanden die kniip zelf opslaat niet opnieuw oppikken. + public void IgnorePath(string path) => _ignoredPaths[Path.GetFullPath(path)] = DateTime.UtcNow; + + private bool IsIgnored(string path) + { + DateTime now = DateTime.UtcNow; + foreach (KeyValuePair entry in _ignoredPaths) + { + if (now - entry.Value > TimeSpan.FromMinutes(2)) + { + _ignoredPaths.TryRemove(entry.Key, out _); + } + } + + return _ignoredPaths.ContainsKey(Path.GetFullPath(path)); + } + + private void OnImage(BitmapSource image) + { + if (Paused) + { + return; + } + + DateTime now = DateTime.UtcNow; + _recent.RemoveAll(r => now - r.Time > HashWindow); + + string hash = PixelUtil.ComputeHash(image); + foreach (RecentCapture recent in _recent) + { + bool sameContent = recent.Hash == hash; + bool sameSizeJustNow = recent.Width == image.PixelWidth && recent.Height == image.PixelHeight + && now - recent.Time < SameSizeWindow; + if (sameContent || sameSizeJustNow) + { + return; + } + } + + _recent.Add(new RecentCapture(hash, image.PixelWidth, image.PixelHeight, now)); + CaptureReceived?.Invoke(image); + } + + public void Dispose() + { + _clipboard.Dispose(); + _folder.Dispose(); + } + + private readonly record struct RecentCapture(string Hash, int Width, int Height, DateTime Time); +} diff --git a/src/Kniip/Capture/ClipboardImageReader.cs b/src/Kniip/Capture/ClipboardImageReader.cs new file mode 100644 index 0000000..0969a90 --- /dev/null +++ b/src/Kniip/Capture/ClipboardImageReader.cs @@ -0,0 +1,141 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Media.Imaging; +using Kniip.Infrastructure; + +namespace Kniip.Capture; + +/// +/// Leest afbeeldingen robuust van het klembord. van WPF gaat vaak mis +/// met 32-bit DIB's, dus eerst "PNG", dan zelf de DIB decoderen, en pas als laatste de standaard-API. +/// +internal static class ClipboardImageReader +{ + public const string ExportMarkerFormat = "Kniip.Export"; + + public static bool IsOwnExport() + { + try + { + return Clipboard.ContainsData(ExportMarkerFormat); + } + catch (COMException) + { + return false; + } + } + + private static readonly string[] ImageExtensions = { ".png", ".jpg", ".jpeg", ".bmp", ".gif", ".tif", ".tiff", ".ico", ".webp", ".heic" }; + + /// Ook een in Verkenner gekopieerd afbeeldingsbestand openen + /// (niet voor de klembordbewaking, anders opent elk gekopieerd bestand de editor). + public static BitmapSource? TryRead(bool includeFiles = false) + { + try + { + IDataObject? data = Clipboard.GetDataObject(); + if (data == null) + { + return null; + } + + if (includeFiles && TryReadFile(data) is { } fromFile) + { + return fromFile; + } + + if (data.GetDataPresent("PNG") && data.GetData("PNG") is MemoryStream png) + { + return PixelUtil.Decode(png); + } + + if (data.GetDataPresent(DataFormats.Dib) && data.GetData(DataFormats.Dib) is MemoryStream dib) + { + BitmapSource? fromDib = FromDib(dib.ToArray()); + if (fromDib != null) + { + return fromDib; + } + } + + if (Clipboard.ContainsImage()) + { + BitmapSource? image = Clipboard.GetImage(); + if (image != null) + { + var copy = PixelUtil.CreateBitmap(PixelUtil.ToOpaqueBgra(image), image.PixelWidth, image.PixelHeight); + return copy; + } + } + } + catch (Exception ex) when (ex is COMException or ExternalException or NotSupportedException or FileFormatException) + { + return null; + } + + return null; + } + + private static BitmapSource? TryReadFile(IDataObject data) + { + if (!data.GetDataPresent(DataFormats.FileDrop) || data.GetData(DataFormats.FileDrop) is not string[] files) + { + return null; + } + + foreach (string file in files) + { + if (!File.Exists(file) || Array.IndexOf(ImageExtensions, Path.GetExtension(file).ToLowerInvariant()) < 0) + { + continue; + } + + try + { + return PixelUtil.LoadFile(file); + } + catch (Exception) + { + // Onleesbaar bestand: volgende proberen. + } + } + + return null; + } + + private static BitmapSource? FromDib(byte[] dib) + { + if (dib.Length < 40) + { + return null; + } + + int headerSize = BitConverter.ToInt32(dib, 0); + int bitCount = BitConverter.ToInt16(dib, 14); + int compression = BitConverter.ToInt32(dib, 16); + int colorsUsed = BitConverter.ToInt32(dib, 32); + + const int BI_BITFIELDS = 3; + int masks = compression == BI_BITFIELDS && headerSize == 40 ? 12 : 0; + int colors = colorsUsed != 0 ? colorsUsed : bitCount <= 8 ? 1 << bitCount : 0; + int pixelOffset = 14 + headerSize + masks + colors * 4; + + var file = new byte[14 + dib.Length]; + file[0] = (byte)'B'; + file[1] = (byte)'M'; + BitConverter.GetBytes(file.Length).CopyTo(file, 2); + BitConverter.GetBytes(pixelOffset).CopyTo(file, 10); + Buffer.BlockCopy(dib, 0, file, 14, dib.Length); + + try + { + return PixelUtil.Decode(new MemoryStream(file)); + } + catch (Exception) + { + return null; + } + } +} diff --git a/src/Kniip/Capture/ClipboardWatcher.cs b/src/Kniip/Capture/ClipboardWatcher.cs new file mode 100644 index 0000000..660921e --- /dev/null +++ b/src/Kniip/Capture/ClipboardWatcher.cs @@ -0,0 +1,147 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; +using System.Windows.Interop; +using System.Windows.Media.Imaging; +using Kniip.Interop; + +namespace Kniip.Capture; + +/// +/// Luistert met een message-only venster naar WM_CLIPBOARDUPDATE en meldt nieuwe afbeeldingen. +/// +internal sealed class ClipboardWatcher : IDisposable +{ + private static readonly string[] SnippingToolProcesses = + { + "SnippingTool", "ScreenClippingHost", "ScreenSketch" + }; + + private readonly HwndSource _source; + private bool _listening; + + public event Action? ImageCaptured; + + public bool Enabled { get; set; } + + public bool OnlyFromSnippingTool { get; set; } = true; + + public ClipboardWatcher() + { + var parameters = new HwndSourceParameters("KniipClipboardWatcher") + { + ParentWindow = NativeMethods.HWND_MESSAGE, + WindowStyle = 0 + }; + _source = new HwndSource(parameters); + _source.AddHook(WndProc); + _listening = NativeMethods.AddClipboardFormatListener(_source.Handle); + } + + private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) + { + if (msg == NativeMethods.WM_CLIPBOARDUPDATE && Enabled) + { + OnClipboardChanged(); + } + + return IntPtr.Zero; + } + + private async void OnClipboardChanged() + { + string? owner = GetOwnerProcessName(out bool isOwnProcess); + if (isOwnProcess) + { + return; + } + + if (OnlyFromSnippingTool && !IsSnippingTool(owner)) + { + return; + } + + // Het Knipprogramma vult het klembord soms in stappen; even wachten en een paar keer proberen. + for (int attempt = 0; attempt < 6; attempt++) + { + await Task.Delay(attempt == 0 ? 120 : 200); + if (ClipboardImageReader.IsOwnExport()) + { + return; + } + + BitmapSource? image = ClipboardImageReader.TryRead(); + if (image != null) + { + ImageCaptured?.Invoke(image); + return; + } + } + } + + private static bool IsSnippingTool(string? processName) + { + if (processName == null) + { + return false; + } + + foreach (string name in SnippingToolProcesses) + { + if (string.Equals(processName, name, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + } + + private static string? GetOwnerProcessName(out bool isOwnProcess) + { + isOwnProcess = false; + IntPtr owner = NativeMethods.GetClipboardOwner(); + if (owner == IntPtr.Zero) + { + return null; + } + + NativeMethods.GetWindowThreadProcessId(owner, out uint pid); + if (pid == 0) + { + return null; + } + + if (pid == Environment.ProcessId) + { + isOwnProcess = true; + return null; + } + + try + { + using var process = Process.GetProcessById((int)pid); + return process.ProcessName; + } + catch (ArgumentException) + { + return null; + } + catch (InvalidOperationException) + { + return null; + } + } + + public void Dispose() + { + if (_listening) + { + NativeMethods.RemoveClipboardFormatListener(_source.Handle); + _listening = false; + } + + _source.RemoveHook(WndProc); + _source.Dispose(); + } +} diff --git a/src/Kniip/Capture/FolderWatcher.cs b/src/Kniip/Capture/FolderWatcher.cs new file mode 100644 index 0000000..7c64cc7 --- /dev/null +++ b/src/Kniip/Capture/FolderWatcher.cs @@ -0,0 +1,113 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using System.Windows.Media.Imaging; +using System.Windows.Threading; +using Kniip.Infrastructure; + +namespace Kniip.Capture; + +/// +/// Bewaakt de map Schermafbeeldingen, waar het Knipprogramma knipsels automatisch opslaat. +/// +internal sealed class FolderWatcher : IDisposable +{ + private readonly Dispatcher _dispatcher; + private FileSystemWatcher? _watcher; + + public event Action? ImageCaptured; + + public Func? ShouldIgnore { get; set; } + + public FolderWatcher(Dispatcher dispatcher) + { + _dispatcher = dispatcher; + } + + public bool Enabled + { + get => _watcher?.EnableRaisingEvents == true; + set + { + if (value) + { + Start(); + } + else if (_watcher != null) + { + _watcher.EnableRaisingEvents = false; + } + } + } + + private void Start() + { + if (_watcher != null) + { + _watcher.EnableRaisingEvents = true; + return; + } + + string? folder = CaptureCoordinator.ScreenshotsFolder; + if (folder == null || !Directory.Exists(folder)) + { + return; + } + + _watcher = new FileSystemWatcher(folder) + { + IncludeSubdirectories = false, + NotifyFilter = NotifyFilters.FileName + }; + _watcher.Created += (_, e) => OnFileAppeared(e.FullPath); + _watcher.Renamed += (_, e) => OnFileAppeared(e.FullPath); + _watcher.EnableRaisingEvents = true; + } + + private void OnFileAppeared(string path) + { + string ext = Path.GetExtension(path); + if (!ext.Equals(".png", StringComparison.OrdinalIgnoreCase) + && !ext.Equals(".jpg", StringComparison.OrdinalIgnoreCase) + && !ext.Equals(".jpeg", StringComparison.OrdinalIgnoreCase)) + { + return; + } + + if (ShouldIgnore?.Invoke(path) == true) + { + return; + } + + Task.Run(async () => + { + for (int attempt = 0; attempt < 25; attempt++) + { + await Task.Delay(200); + try + { + BitmapSource image = PixelUtil.LoadFile(path); + await _dispatcher.InvokeAsync(() => ImageCaptured?.Invoke(image, path)); + return; + } + catch (IOException) + { + // Bestand wordt nog geschreven. + } + catch (UnauthorizedAccessException) + { + } + catch (Exception) + { + // Nog onvolledig of geen geldige afbeelding; opnieuw proberen. + } + } + }); + } + + public void Dispose() + { + _watcher?.Dispose(); + _watcher = null; + } +} diff --git a/src/Kniip/Capture/RegionCaptureWindow.xaml b/src/Kniip/Capture/RegionCaptureWindow.xaml new file mode 100644 index 0000000..ac8ffd0 --- /dev/null +++ b/src/Kniip/Capture/RegionCaptureWindow.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/Kniip/Capture/RegionCaptureWindow.xaml.cs b/src/Kniip/Capture/RegionCaptureWindow.xaml.cs new file mode 100644 index 0000000..0b77d3a --- /dev/null +++ b/src/Kniip/Capture/RegionCaptureWindow.xaml.cs @@ -0,0 +1,231 @@ +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using Kniip.Recording; +using Rectangle = System.Drawing.Rectangle; +using Screen = System.Windows.Forms.Screen; + +namespace Kniip.Capture; + +/// +/// Bevroren beeld van één beeldscherm waarop je een rechthoek sleept. Er staat er één per scherm; +/// een knipsel ligt daardoor altijd binnen één scherm. +/// +public partial class RegionCaptureWindow : Window +{ + private const double DragThreshold = 3; + private const int MinimumSize = 3; + + private readonly Screen _screen; + private readonly BitmapSource _frozen; + private readonly IReadOnlyList? _windows; + private Point? _dragStart; + private bool _dragging; + private Rectangle? _hover; + + /// Het knipsel, of null bij annuleren. + internal event Action? Finished; + + /// Vensterrechthoeken van boven naar onder; gezet = venster aanklikken in plaats van slepen. + internal RegionCaptureWindow(Screen screen, BitmapSource frozen, IReadOnlyList? windows = null) + { + InitializeComponent(); + _screen = screen; + _frozen = frozen; + _windows = windows; + Frozen.Source = frozen; + if (windows != null) + { + Cursor = Cursors.Hand; + HintTitle.Text = "Knipsel: klik op een venster"; + MouseLeave += (_, _) => + { + _hover = null; + ShowSelection(null); + }; + } + + SourceInitialized += (_, _) => PhysicalWindow.Place(this, screen.Bounds); + Loaded += (_, _) => ShowSelection(null); + } + + private bool PicksWindow => _windows != null; + + public bool ContainsCursor(System.Drawing.Point cursor) => _screen.Bounds.Contains(cursor); + + public void Cancel() => Finished?.Invoke(null); + + public void SelectWholeScreen() => Finish(_screen.Bounds); + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + if (PicksWindow) + { + Rectangle? hover = FindWindowAt(ToPhysical(e.GetPosition(this))); + if (hover != _hover) + { + _hover = hover; + ShowSelection(hover); + } + + return; + } + + if (_dragStart is not Point start || e.LeftButton != MouseButtonState.Pressed) + { + return; + } + + Point position = e.GetPosition(this); + if (!_dragging && (position - start).Length >= DragThreshold) + { + _dragging = true; + Hint.Visibility = Visibility.Collapsed; + } + + if (_dragging) + { + ShowSelection(ToPhysical(new Rect(start, position))); + } + } + + protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) + { + base.OnMouseLeftButtonDown(e); + _dragStart = e.GetPosition(this); + _dragging = false; + CaptureMouse(); + } + + protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) + { + base.OnMouseLeftButtonUp(e); + ReleaseMouseCapture(); + if (_dragStart is not Point start) + { + return; + } + + if (PicksWindow) + { + _dragStart = null; + Finish(FindWindowAt(ToPhysical(e.GetPosition(this))) ?? _screen.Bounds); + return; + } + + _dragStart = null; + if (!_dragging) + { + return; + } + + _dragging = false; + Rectangle area = ToPhysical(new Rect(start, e.GetPosition(this))); + if (area.Width >= MinimumSize && area.Height >= MinimumSize) + { + Finish(area); + } + else + { + ShowSelection(null); + } + } + + protected override void OnMouseRightButtonUp(MouseButtonEventArgs e) + { + base.OnMouseRightButtonUp(e); + Cancel(); + } + + protected override void OnKeyDown(KeyEventArgs e) + { + base.OnKeyDown(e); + if (e.Key == Key.Escape) + { + Cancel(); + } + else if (e.Key == Key.Enter) + { + SelectWholeScreen(); + } + } + + private void Finish(Rectangle area) + { + Rectangle clipped = Rectangle.Intersect(area, _screen.Bounds); + if (clipped.Width <= 0 || clipped.Height <= 0) + { + Cancel(); + return; + } + + var relative = new Int32Rect(clipped.X - _screen.Bounds.X, clipped.Y - _screen.Bounds.Y, clipped.Width, clipped.Height); + Finished?.Invoke(ScreenGrabber.Crop(_frozen, relative)); + } + + private Rectangle? FindWindowAt(System.Drawing.Point point) + { + foreach (Rectangle window in _windows ?? Array.Empty()) + { + if (window.Contains(point)) + { + Rectangle clipped = Rectangle.Intersect(window, _screen.Bounds); + return clipped.IsEmpty ? null : clipped; + } + } + + return null; + } + + private double ScaleFactor => PhysicalWindow.Scale(this); + + private System.Drawing.Point ToPhysical(Point dip) => + new(_screen.Bounds.X + (int)Math.Round(dip.X * ScaleFactor), _screen.Bounds.Y + (int)Math.Round(dip.Y * ScaleFactor)); + + private Rectangle ToPhysical(Rect dip) + { + System.Drawing.Point topLeft = ToPhysical(dip.TopLeft); + System.Drawing.Point bottomRight = ToPhysical(dip.BottomRight); + return Rectangle.FromLTRB(topLeft.X, topLeft.Y, bottomRight.X, bottomRight.Y); + } + + private Rect ToDip(Rectangle physical) + { + double scale = ScaleFactor; + return new Rect((physical.X - _screen.Bounds.X) / scale, (physical.Y - _screen.Bounds.Y) / scale, + physical.Width / scale, physical.Height / scale); + } + + private void ShowSelection(Rectangle? physical) + { + var full = new Rect(0, 0, ActualWidth, ActualHeight); + if (physical is not Rectangle area || area.IsEmpty) + { + Dim.Data = new RectangleGeometry(full); + SelectionRect.Visibility = Visibility.Collapsed; + SizeBadge.Visibility = Visibility.Collapsed; + return; + } + + Rect rect = ToDip(area); + var geometry = new GeometryGroup { FillRule = FillRule.EvenOdd }; + geometry.Children.Add(new RectangleGeometry(full)); + geometry.Children.Add(new RectangleGeometry(rect)); + Dim.Data = geometry; + + SelectionRect.Margin = new Thickness(rect.X, rect.Y, 0, 0); + SelectionRect.Width = rect.Width; + SelectionRect.Height = rect.Height; + SelectionRect.Visibility = Visibility.Visible; + + SizeText.Text = $"{area.Width} × {area.Height}"; + SizeBadge.Visibility = Visibility.Visible; + SizeBadge.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); + double badgeTop = rect.Y - SizeBadge.DesiredSize.Height - 4; + SizeBadge.Margin = new Thickness(rect.X, badgeTop < 0 ? rect.Y + 4 : badgeTop, 0, 0); + } +} diff --git a/src/Kniip/Capture/ScreenGrabber.cs b/src/Kniip/Capture/ScreenGrabber.cs new file mode 100644 index 0000000..ced9d39 --- /dev/null +++ b/src/Kniip/Capture/ScreenGrabber.cs @@ -0,0 +1,52 @@ +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Media.Imaging; +using Kniip.Infrastructure; + +namespace Kniip.Capture; + +internal static class ScreenGrabber +{ + /// Schermpixels in fysieke bureaubladcoördinaten (de app is per-monitor DPI-bewust). + public static BitmapSource Capture(Rectangle bounds) + { + using var bitmap = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format32bppRgb); + using (Graphics graphics = Graphics.FromImage(bitmap)) + { + graphics.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy); + } + + BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bounds.Width, bounds.Height), ImageLockMode.ReadOnly, + PixelFormat.Format32bppRgb); + var pixels = new byte[bounds.Width * bounds.Height * 4]; + try + { + for (int y = 0; y < bounds.Height; y++) + { + Marshal.Copy(data.Scan0 + y * data.Stride, pixels, y * bounds.Width * 4, bounds.Width * 4); + } + } + finally + { + bitmap.UnlockBits(data); + } + + for (int i = 3; i < pixels.Length; i += 4) + { + pixels[i] = 255; + } + + return PixelUtil.CreateBitmap(pixels, bounds.Width, bounds.Height); + } + + /// Deel van een eerder vastgelegd scherm; is relatief aan dat scherm. + public static BitmapSource Crop(BitmapSource source, Int32Rect area) + { + int stride = area.Width * 4; + var pixels = new byte[stride * area.Height]; + source.CopyPixels(area, pixels, stride, 0); + return PixelUtil.CreateBitmap(pixels, area.Width, area.Height); + } +} diff --git a/src/Kniip/Editor/AnnotationSurface.cs b/src/Kniip/Editor/AnnotationSurface.cs new file mode 100644 index 0000000..e40e4c9 --- /dev/null +++ b/src/Kniip/Editor/AnnotationSurface.cs @@ -0,0 +1,103 @@ +using System.Collections.Generic; +using System.Windows; +using System.Windows.Media; +using Kniip.Editor.Annotations; + +namespace Kniip.Editor; + +/// +/// Tekent het knipsel met alle annotaties, plus de selectie en het bijsnijkader. +/// Het element is precies zo groot als de afbeelding in pixels; zoomen gebeurt met een LayoutTransform erboven. +/// +public sealed class AnnotationSurface : FrameworkElement +{ + private static readonly Brush AccentBrush = RenderHelpers.Freeze(new SolidColorBrush(Palette.Accent)); + private static readonly Brush CropShadeBrush = RenderHelpers.Freeze(new SolidColorBrush(Color.FromArgb(120, 0, 0, 0))); + + public EditorDocument? Document { get; set; } + + public Annotation? Selected { get; set; } + + public Rect? CropRect { get; set; } + + /// Schaal van de weergave (DIP per afbeeldingspixel), om grepen altijd even groot te tonen. + public double ViewScale { get; set; } = 1; + + public double HandleSize => 9 / ViewScale; + + public AnnotationSurface() + { + Focusable = true; + FocusVisualStyle = null; + ClipToBounds = true; + } + + protected override Size MeasureOverride(Size availableSize) => + Document == null ? new Size(0, 0) : new Size(Document.Width, Document.Height); + + protected override void OnRender(DrawingContext dc) + { + if (Document == null) + { + return; + } + + DocumentRenderer.Render(dc, Document); + + if (Selected != null && !Selected.IsHidden && Document.Items.Contains(Selected)) + { + DrawSelection(dc, Selected); + } + + if (CropRect is Rect crop) + { + var full = new RectangleGeometry(new Rect(0, 0, Document.Width, Document.Height)); + var shade = Geometry.Combine(full, new RectangleGeometry(crop), GeometryCombineMode.Exclude, null); + dc.DrawGeometry(CropShadeBrush, null, shade); + dc.DrawRectangle(null, CreateDashedPen(Brushes.White), crop); + dc.DrawRectangle(null, CreateDashedPen(AccentBrush, 4), crop); + } + } + + private void DrawSelection(DrawingContext dc, Annotation item) + { + Rect bounds = item.Bounds; + double pad = 3 / ViewScale; + bounds.Inflate(pad, pad); + dc.DrawRectangle(null, CreateDashedPen(AccentBrush), bounds); + + IReadOnlyList handles = item.GetHandles(); + if (handles.Count == 0) + { + return; + } + + double size = HandleSize; + var pen = new Pen(AccentBrush, 1.2 / ViewScale); + foreach (Point h in handles) + { + dc.DrawRoundedRectangle(Brushes.White, pen, new Rect(h.X - size / 2, h.Y - size / 2, size, size), + 1.5 / ViewScale, 1.5 / ViewScale); + } + } + + private Pen CreateDashedPen(Brush brush, double offset = 0) => new(brush, 1 / ViewScale) + { + DashStyle = new DashStyle(new[] { 4.0, 4.0 }, offset) + }; + + public int HitHandle(Annotation item, Point p) + { + IReadOnlyList handles = item.GetHandles(); + double tolerance = HandleSize / 2 + 2 / ViewScale; + for (int i = handles.Count - 1; i >= 0; i--) + { + if (System.Math.Abs(handles[i].X - p.X) <= tolerance && System.Math.Abs(handles[i].Y - p.Y) <= tolerance) + { + return i; + } + } + + return -1; + } +} diff --git a/src/Kniip/Editor/Annotations/Annotation.cs b/src/Kniip/Editor/Annotations/Annotation.cs new file mode 100644 index 0000000..48720b4 --- /dev/null +++ b/src/Kniip/Editor/Annotations/Annotation.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Media; + +namespace Kniip.Editor.Annotations; + +/// +/// Een bewerkbaar object op het knipsel. Coördinaten zijn in pixels van de afbeelding; +/// annotaties worden pas bij het exporteren "plat" gemaakt. +/// +public abstract class Annotation +{ + public StyleSet Style { get; set; } = new(); + + /// Tijdelijk verborgen, bijvoorbeeld terwijl een tekstkader wordt bewerkt. + public bool IsHidden { get; set; } + + public abstract ToolKind Kind { get; } + + public abstract Rect Bounds { get; } + + public abstract void Render(DrawingContext dc, EditorDocument document); + + public virtual bool HitTest(Point point, double tolerance) + { + Rect bounds = Bounds; + bounds.Inflate(tolerance, tolerance); + return bounds.Contains(point); + } + + public abstract void Move(Vector delta); + + public virtual IReadOnlyList GetHandles() => Array.Empty(); + + public virtual void BeginHandleDrag(int index) + { + } + + public virtual void MoveHandle(int index, Point point, bool constrain) + { + } + + /// Te klein om te bewaren na het tekenen (bijv. een losse klik met het rechthoek-gereedschap). + public virtual bool IsDegenerate => false; + + public virtual Annotation Clone() + { + var clone = (Annotation)MemberwiseClone(); + clone.Style = Style.Clone(); + clone.IsHidden = false; + return clone; + } +} diff --git a/src/Kniip/Editor/Annotations/BlurAnnotation.cs b/src/Kniip/Editor/Annotations/BlurAnnotation.cs new file mode 100644 index 0000000..0e8e770 --- /dev/null +++ b/src/Kniip/Editor/Annotations/BlurAnnotation.cs @@ -0,0 +1,44 @@ +using System; +using System.Windows; +using System.Windows.Media; +using System.Windows.Media.Imaging; + +namespace Kniip.Editor.Annotations; + +/// Vervaagt of pixeleert een gebied. Het effect wordt berekend op de onderliggende afbeelding. +public sealed class BlurAnnotation : RectAnnotation +{ + private BitmapSource? _cache; + private (Int32Rect Area, BlurMode Mode, int Strength, BitmapSource Source)? _cacheKey; + + public override ToolKind Kind => ToolKind.Blur; + + public override void Render(DrawingContext dc, EditorDocument document) + { + Int32Rect area = ToPixelArea(Rect, document.Width, document.Height); + if (area.Width < 1 || area.Height < 1) + { + return; + } + + var key = (area, Style.BlurMode, Style.BlurStrength, document.Image); + if (_cache == null || !_cacheKey.Equals(key)) + { + _cache = Style.BlurMode == BlurMode.Pixelate + ? ImageEffects.Pixelate(document, area, Math.Max(2, Style.BlurStrength * 2)) + : ImageEffects.Blur(document, area, Math.Max(1, Style.BlurStrength)); + _cacheKey = key; + } + + dc.DrawImage(_cache, new Rect(area.X, area.Y, area.Width, area.Height)); + } + + private static Int32Rect ToPixelArea(Rect r, int width, int height) + { + int left = Math.Clamp((int)Math.Floor(r.Left), 0, width); + int top = Math.Clamp((int)Math.Floor(r.Top), 0, height); + int right = Math.Clamp((int)Math.Ceiling(r.Right), 0, width); + int bottom = Math.Clamp((int)Math.Ceiling(r.Bottom), 0, height); + return new Int32Rect(left, top, Math.Max(0, right - left), Math.Max(0, bottom - top)); + } +} diff --git a/src/Kniip/Editor/Annotations/CursorAnnotation.cs b/src/Kniip/Editor/Annotations/CursorAnnotation.cs new file mode 100644 index 0000000..c5f5951 --- /dev/null +++ b/src/Kniip/Editor/Annotations/CursorAnnotation.cs @@ -0,0 +1,49 @@ +using System.Windows; +using System.Windows.Media; + +namespace Kniip.Editor.Annotations; + +/// Een muiscursor-stempel. is de "hotspot" (punt van de pijl of vinger). +public sealed class CursorAnnotation : Annotation +{ + private const double DesignSize = 24; + + public Point Position { get; set; } + + public override ToolKind Kind => ToolKind.Cursor; + + private double Scale => Style.Size / DesignSize; + + public override Rect Bounds + { + get + { + Rect r = CursorGeometries.For(Style.CursorKind).Bounds; + double s = Scale; + return new Rect(Position.X + r.X * s, Position.Y + r.Y * s, r.Width * s, r.Height * s); + } + } + + public override void Render(DrawingContext dc, EditorDocument document) + { + dc.PushTransform(new TranslateTransform(Position.X, Position.Y)); + dc.PushTransform(new ScaleTransform(Scale, Scale)); + + CursorGeometries.Parts parts = CursorGeometries.PartsFor(Style.CursorKind); + RenderHelpers.DrawWithShadow(dc, parts.Body, Brushes.White, CursorGeometries.OutlinePen, Style.Shadow); + if (parts.Details != null) + { + dc.DrawGeometry(null, CursorGeometries.DetailPen, parts.Details); + } + + if (parts.Rays != null) + { + dc.DrawGeometry(null, CursorGeometries.RayPen, parts.Rays); + } + + dc.Pop(); + dc.Pop(); + } + + public override void Move(Vector delta) => Position += delta; +} diff --git a/src/Kniip/Editor/Annotations/CursorGeometries.cs b/src/Kniip/Editor/Annotations/CursorGeometries.cs new file mode 100644 index 0000000..0def829 --- /dev/null +++ b/src/Kniip/Editor/Annotations/CursorGeometries.cs @@ -0,0 +1,70 @@ +using System.Windows; +using System.Windows.Media; + +namespace Kniip.Editor.Annotations; + +/// Vectorcursors in een 24-eenheden ontwerpraster, met de hotspot op (0,0). +internal static class CursorGeometries +{ + public sealed record Parts(Geometry Body, Geometry? Details, Geometry? Rays); + + public static readonly Pen OutlinePen = RenderHelpers.Freeze(new Pen(Brushes.Black, 1.2) { LineJoin = PenLineJoin.Round }); + public static readonly Pen DetailPen = RenderHelpers.Freeze(new Pen(Brushes.Black, 0.9) { StartLineCap = PenLineCap.Round, EndLineCap = PenLineCap.Round }); + public static readonly Pen RayPen = RenderHelpers.Freeze(new Pen(new SolidColorBrush(Palette.Red), 1.6) { StartLineCap = PenLineCap.Round, EndLineCap = PenLineCap.Round }); + + private static readonly Geometry ArrowBody = RenderHelpers.Freeze( + Geometry.Parse("M0,0 L0,19.5 L4.7,15.2 L7.8,22.2 L11,20.8 L7.9,14 L14,14 Z")); + + private static readonly Parts ArrowParts = new(ArrowBody, null, null); + + private static readonly Parts HandParts = CreateHand(); + + private static readonly Parts ClickParts = new(ArrowBody, null, RenderHelpers.Freeze( + Geometry.Parse("M-3,-3 L-6.5,-6.5 M0,-4.5 L0,-9 M3,-3 L6.5,-6.5 M-4.5,0 L-9,0"))); + + public static Parts PartsFor(CursorKind kind) => kind switch + { + CursorKind.Hand => HandParts, + CursorKind.Click => ClickParts, + _ => ArrowParts + }; + + public static Geometry For(CursorKind kind) + { + Parts parts = PartsFor(kind); + if (parts.Rays == null) + { + return parts.Body; + } + + var group = new GeometryGroup(); + group.Children.Add(parts.Body); + group.Children.Add(parts.Rays); + group.Freeze(); + return group; + } + + private static Parts CreateHand() + { + // Wijsvinger omhoog; hotspot op de vingertop. + Geometry hand = new RectangleGeometry(new Rect(5, 0, 4, 13), 2, 2); + hand = Union(hand, new RectangleGeometry(new Rect(9, 6.5, 3.6, 8), 1.8, 1.8)); + hand = Union(hand, new RectangleGeometry(new Rect(12.6, 7.5, 3.4, 8), 1.7, 1.7)); + hand = Union(hand, new RectangleGeometry(new Rect(16, 9, 3.2, 7), 1.6, 1.6)); + hand = Union(hand, new RectangleGeometry(new Rect(5, 11, 14.2, 11.5), 4, 4)); + var thumb = new RectangleGeometry(new Rect(0.5, 11.5, 8, 3.8), 1.9, 1.9) + { + Transform = new RotateTransform(45, 4.5, 13.4) + }; + + Geometry body = Geometry.Combine(hand, thumb, GeometryCombineMode.Union, new TranslateTransform(-7, 0)); + body.Freeze(); + + Geometry details = Geometry.Parse("M2,7.5 L2,12 M5.6,8.5 L5.6,12 M9,10 L9,12"); + details.Freeze(); + return new Parts(body, details, null); + } + + private static Geometry Union(Geometry a, Geometry b) => + Geometry.Combine(a, b, GeometryCombineMode.Union, null); +} diff --git a/src/Kniip/Editor/Annotations/EmojiAnnotation.cs b/src/Kniip/Editor/Annotations/EmojiAnnotation.cs new file mode 100644 index 0000000..2a4c74b --- /dev/null +++ b/src/Kniip/Editor/Annotations/EmojiAnnotation.cs @@ -0,0 +1,60 @@ +using System; +using System.Windows; +using System.Windows.Media; +using Kniip.Editor.Emoji; + +namespace Kniip.Editor.Annotations; + +/// Een Twemoji-stempel, gecentreerd op ; de breedte en hoogte zijn . +public sealed class EmojiAnnotation : Annotation +{ + private static readonly Brush ShadowFar = RenderHelpers.Freeze(new SolidColorBrush(Color.FromArgb(40, 0, 0, 0))); + private static readonly Brush ShadowNear = RenderHelpers.Freeze(new SolidColorBrush(Color.FromArgb(55, 0, 0, 0))); + + public Point Center { get; set; } + + public override ToolKind Kind => ToolKind.Emoji; + + public override Rect Bounds + { + get + { + double r = Style.Size / 2; + return new Rect(Center.X - r, Center.Y - r, Style.Size, Style.Size); + } + } + + public override void Render(DrawingContext dc, EditorDocument document) + { + ImageSource image = EmojiCatalog.Get(Style.Emoji, Style.SkinTone); + Rect bounds = Bounds; + + if (Style.Shadow) + { + double offset = Math.Max(2, Style.Size / 24); + var mask = RenderHelpers.Freeze(new ImageBrush(image)); + DrawShadowLayer(dc, mask, bounds, ShadowFar, offset * 1.6); + DrawShadowLayer(dc, mask, bounds, ShadowNear, offset); + } + + // De export tekent met NearestNeighbor; een geschaalde emoji moet toch vloeiend blijven. + var group = new DrawingGroup(); + RenderOptions.SetBitmapScalingMode(group, BitmapScalingMode.HighQuality); + using (DrawingContext gc = group.Open()) + { + gc.DrawImage(image, bounds); + } + + dc.DrawDrawing(group); + } + + private static void DrawShadowLayer(DrawingContext dc, Brush mask, Rect bounds, Brush brush, double offset) + { + bounds.Offset(offset, offset); + dc.PushOpacityMask(mask); + dc.DrawRectangle(brush, null, bounds); + dc.Pop(); + } + + public override void Move(Vector delta) => Center += delta; +} diff --git a/src/Kniip/Editor/Annotations/HighlightAnnotation.cs b/src/Kniip/Editor/Annotations/HighlightAnnotation.cs new file mode 100644 index 0000000..126a627 --- /dev/null +++ b/src/Kniip/Editor/Annotations/HighlightAnnotation.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows; +using System.Windows.Media; + +namespace Kniip.Editor.Annotations; + +/// Markeerstift: half-transparant, als rechte horizontale streep of uit de vrije hand. +public sealed class HighlightAnnotation : Annotation +{ + private const byte HighlightAlpha = 110; + + public List Points { get; set; } = new(); + + public bool Straight { get; set; } + + public override ToolKind Kind => ToolKind.Highlight; + + public override Rect Bounds + { + get + { + if (Points.Count == 0) + { + return Rect.Empty; + } + + double minX = Points.Min(p => p.X), maxX = Points.Max(p => p.X); + double minY = Points.Min(p => p.Y), maxY = Points.Max(p => p.Y); + var r = new Rect(new Point(minX, minY), new Point(maxX, maxY)); + r.Inflate(Style.Thickness / 2, Style.Thickness / 2); + return r; + } + } + + public override bool IsDegenerate + { + get + { + if (Points.Count < 2) + { + return true; + } + + Rect r = Bounds; + return r.Width - Style.Thickness < 3 && r.Height - Style.Thickness < 3; + } + } + + public override void Render(DrawingContext dc, EditorDocument document) + { + if (Points.Count < 2) + { + return; + } + + Color c = Style.Stroke; + var color = Color.FromArgb(HighlightAlpha, c.R, c.G, c.B); + Pen? pen = RenderHelpers.CreatePen(color, Style.Thickness, LineDash.Solid, + Straight ? PenLineCap.Square : PenLineCap.Round); + if (pen == null) + { + return; + } + + // Eén geometrie, zodat overlappende delen niet dubbel zo donker worden. + var geometry = new StreamGeometry(); + using (StreamGeometryContext ctx = geometry.Open()) + { + ctx.BeginFigure(Points[0], false, false); + ctx.PolyLineTo(Points.Skip(1).ToList(), true, true); + } + + geometry.Freeze(); + dc.DrawGeometry(null, pen, geometry); + } + + public override bool HitTest(Point point, double tolerance) + { + double limit = tolerance + Style.Thickness / 2; + for (int i = 1; i < Points.Count; i++) + { + if (RenderHelpers.DistanceToSegment(point, Points[i - 1], Points[i]) <= limit) + { + return true; + } + } + + return false; + } + + public override void Move(Vector delta) + { + for (int i = 0; i < Points.Count; i++) + { + Points[i] += delta; + } + } + + public override IReadOnlyList GetHandles() => + Straight && Points.Count == 2 ? new[] { Points[0], Points[1] } : Array.Empty(); + + public override void MoveHandle(int index, Point point, bool constrain) + { + if (!Straight || Points.Count != 2) + { + return; + } + + Points[index] = new Point(point.X, Points[1 - index].Y); + } + + public override Annotation Clone() + { + var clone = (HighlightAnnotation)base.Clone(); + clone.Points = new List(Points); + return clone; + } +} diff --git a/src/Kniip/Editor/Annotations/LineAnnotation.cs b/src/Kniip/Editor/Annotations/LineAnnotation.cs new file mode 100644 index 0000000..d307df6 --- /dev/null +++ b/src/Kniip/Editor/Annotations/LineAnnotation.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Media; + +namespace Kniip.Editor.Annotations; + +public sealed class LineAnnotation : Annotation +{ + public LineAnnotation(bool isArrow) + { + IsArrow = isArrow; + } + + public bool IsArrow { get; } + + public Point Start { get; set; } + + public Point End { get; set; } + + public override ToolKind Kind => IsArrow ? ToolKind.Arrow : ToolKind.Line; + + public override Rect Bounds + { + get + { + var r = new Rect(Start, End); + double pad = Style.Thickness / 2 + (IsArrow ? HeadLength / 2 : 0); + r.Inflate(pad, pad); + return r; + } + } + + public override bool IsDegenerate => (End - Start).Length < 4; + + private double HeadLength => Math.Max(12, Style.Thickness * 4); + + public override void Render(DrawingContext dc, EditorDocument document) + { + Vector v = End - Start; + double length = v.Length; + if (length < 1) + { + return; + } + + Pen? pen = RenderHelpers.CreatePen(Style.Stroke, Style.Thickness, Style.Dash); + if (pen == null) + { + return; + } + + var geometry = new GeometryGroup { FillRule = FillRule.Nonzero }; + Brush? headFill = null; + + if (IsArrow) + { + v.Normalize(); + double headLength = Math.Min(HeadLength, length); + double halfWidth = headLength * 0.45; + Point basePoint = End - v * headLength; + var normal = new Vector(-v.Y, v.X); + + geometry.Children.Add(new LineGeometry(Start, basePoint + v * Math.Min(2, headLength / 4))); + + var head = new StreamGeometry(); + using (StreamGeometryContext ctx = head.Open()) + { + ctx.BeginFigure(End, true, true); + ctx.LineTo(basePoint + normal * halfWidth, true, true); + ctx.LineTo(basePoint - normal * halfWidth, true, true); + } + + head.Freeze(); + headFill = RenderHelpers.BrushOrNull(Style.Stroke); + + // Lijn en punt apart tekenen zodat de punt gevuld en niet gestippeld wordt. + RenderHelpers.DrawWithShadow(dc, geometry, null, pen, Style.Shadow); + var headPen = RenderHelpers.CreatePen(Style.Stroke, Math.Max(1, Style.Thickness / 3), LineDash.Solid); + RenderHelpers.DrawWithShadow(dc, head, headFill, headPen, Style.Shadow); + return; + } + + geometry.Children.Add(new LineGeometry(Start, End)); + RenderHelpers.DrawWithShadow(dc, geometry, null, pen, Style.Shadow); + } + + public override bool HitTest(Point point, double tolerance) => + RenderHelpers.DistanceToSegment(point, Start, End) <= tolerance + Style.Thickness / 2 + (IsArrow ? 4 : 0); + + public override void Move(Vector delta) + { + Start += delta; + End += delta; + } + + public override IReadOnlyList GetHandles() => new[] { Start, End }; + + public override void MoveHandle(int index, Point point, bool constrain) + { + if (index == 0) + { + Start = constrain ? RenderHelpers.SnapAngle(End, point) : point; + } + else + { + End = constrain ? RenderHelpers.SnapAngle(Start, point) : point; + } + } +} diff --git a/src/Kniip/Editor/Annotations/RectAnnotation.cs b/src/Kniip/Editor/Annotations/RectAnnotation.cs new file mode 100644 index 0000000..238f05f --- /dev/null +++ b/src/Kniip/Editor/Annotations/RectAnnotation.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using System.Windows; + +namespace Kniip.Editor.Annotations; + +/// Basis voor annotaties die door een rechthoek worden beschreven, met 8 formaatgrepen. +public abstract class RectAnnotation : Annotation +{ + private Rect _dragOrigin; + + public Rect Rect { get; set; } + + public override Rect Bounds => Rect; + + public override bool IsDegenerate => Rect.Width < 3 || Rect.Height < 3; + + public override void Move(Vector delta) => Rect = Rect.Offset(Rect, delta); + + public override IReadOnlyList GetHandles() + { + Rect r = Rect; + double cx = r.Left + r.Width / 2; + double cy = r.Top + r.Height / 2; + return new[] + { + r.TopLeft, new Point(cx, r.Top), r.TopRight, new Point(r.Right, cy), + r.BottomRight, new Point(cx, r.Bottom), r.BottomLeft, new Point(r.Left, cy) + }; + } + + public override void BeginHandleDrag(int index) => _dragOrigin = Rect; + + public override void MoveHandle(int index, Point p, bool constrain) + { + Rect o = _dragOrigin; + Rect = index switch + { + 0 => FromAnchor(o.BottomRight, p, constrain), + 1 => new Rect(new Point(o.Left, p.Y), o.BottomRight), + 2 => FromAnchor(o.BottomLeft, p, constrain), + 3 => new Rect(o.TopLeft, new Point(p.X, o.Bottom)), + 4 => FromAnchor(o.TopLeft, p, constrain), + 5 => new Rect(o.TopLeft, new Point(o.Right, p.Y)), + 6 => FromAnchor(o.TopRight, p, constrain), + 7 => new Rect(new Point(p.X, o.Top), o.BottomRight), + _ => Rect + }; + } + + /// Rechthoek tussen een vast ankerpunt en de muis; met Shift een vierkant. + public static Rect FromAnchor(Point anchor, Point p, bool square) + { + if (square) + { + double size = System.Math.Max(System.Math.Abs(p.X - anchor.X), System.Math.Abs(p.Y - anchor.Y)); + p = new Point(anchor.X + (p.X >= anchor.X ? size : -size), anchor.Y + (p.Y >= anchor.Y ? size : -size)); + } + + return new Rect(anchor, p); + } +} diff --git a/src/Kniip/Editor/Annotations/RenderHelpers.cs b/src/Kniip/Editor/Annotations/RenderHelpers.cs new file mode 100644 index 0000000..cbffe77 --- /dev/null +++ b/src/Kniip/Editor/Annotations/RenderHelpers.cs @@ -0,0 +1,118 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Media; + +namespace Kniip.Editor.Annotations; + +internal static class RenderHelpers +{ + private static readonly FontFamily UiFont = new("Segoe UI"); + private static readonly Brush ShadowFar = Freeze(new SolidColorBrush(Color.FromArgb(40, 0, 0, 0))); + private static readonly Brush ShadowNear = Freeze(new SolidColorBrush(Color.FromArgb(55, 0, 0, 0))); + + public static T Freeze(T freezable) where T : Freezable + { + freezable.Freeze(); + return freezable; + } + + public static Brush? BrushOrNull(Color color) => + color.A == 0 ? null : Freeze(new SolidColorBrush(color)); + + public static Pen? CreatePen(Color color, double thickness, LineDash dash, PenLineCap cap = PenLineCap.Round) + { + if (thickness <= 0 || color.A == 0) + { + return null; + } + + var pen = new Pen(new SolidColorBrush(color), thickness) + { + LineJoin = PenLineJoin.Round, + StartLineCap = cap, + EndLineCap = cap + }; + + switch (dash) + { + case LineDash.Dash: + pen.DashStyle = new DashStyle(new[] { 3.0, 2.0 }, 0); + pen.DashCap = PenLineCap.Flat; + break; + case LineDash.Dot: + pen.DashStyle = new DashStyle(new[] { 0.0, 2.0 }, 0); + pen.DashCap = PenLineCap.Round; + break; + } + + return Freeze(pen); + } + + /// Tekent een geometrie met een zachte schaduw rechtsonder. + public static void DrawWithShadow(DrawingContext dc, Geometry geometry, Brush? fill, Pen? pen, bool shadow) + { + if (shadow) + { + double offset = Math.Max(2, (pen?.Thickness ?? 2) * 0.6); + DrawShadowLayer(dc, geometry, fill != null, pen, ShadowFar, offset * 1.6); + DrawShadowLayer(dc, geometry, fill != null, pen, ShadowNear, offset); + } + + dc.DrawGeometry(fill, pen, geometry); + } + + private static void DrawShadowLayer(DrawingContext dc, Geometry geometry, bool filled, Pen? pen, Brush brush, double offset) + { + Pen? shadowPen = null; + if (pen != null) + { + shadowPen = new Pen(brush, pen.Thickness) + { + LineJoin = pen.LineJoin, + StartLineCap = pen.StartLineCap, + EndLineCap = pen.EndLineCap, + DashStyle = pen.DashStyle, + DashCap = pen.DashCap + }; + shadowPen.Freeze(); + } + + dc.PushTransform(new TranslateTransform(offset, offset)); + dc.DrawGeometry(filled ? brush : null, shadowPen, geometry); + dc.Pop(); + } + + public static FormattedText FormatText(string text, double fontSize, Color color, bool bold) => + new(text, CultureInfo.CurrentUICulture, FlowDirection.LeftToRight, + new Typeface(UiFont, FontStyles.Normal, bold ? FontWeights.Bold : FontWeights.Normal, FontStretches.Normal), + fontSize, Freeze(new SolidColorBrush(color)), 1.0); + + public static double DistanceToSegment(Point p, Point a, Point b) + { + Vector ab = b - a; + double lengthSquared = ab.LengthSquared; + if (lengthSquared < 1e-9) + { + return (p - a).Length; + } + + double t = Math.Clamp(Vector.Multiply(p - a, ab) / lengthSquared, 0, 1); + return (p - (a + t * ab)).Length; + } + + public static Point SnapAngle(Point origin, Point target, double stepDegrees = 45) + { + Vector v = target - origin; + double length = v.Length; + if (length < 1e-6) + { + return target; + } + + double angle = Math.Atan2(v.Y, v.X); + double step = stepDegrees * Math.PI / 180; + angle = Math.Round(angle / step) * step; + return origin + new Vector(Math.Cos(angle) * length, Math.Sin(angle) * length); + } +} diff --git a/src/Kniip/Editor/Annotations/ShapeAnnotation.cs b/src/Kniip/Editor/Annotations/ShapeAnnotation.cs new file mode 100644 index 0000000..c46c3e4 --- /dev/null +++ b/src/Kniip/Editor/Annotations/ShapeAnnotation.cs @@ -0,0 +1,44 @@ +using System.Windows; +using System.Windows.Media; + +namespace Kniip.Editor.Annotations; + +public sealed class ShapeAnnotation : RectAnnotation +{ + public ShapeAnnotation(bool isEllipse) + { + IsEllipse = isEllipse; + } + + public bool IsEllipse { get; } + + public override ToolKind Kind => IsEllipse ? ToolKind.Ellipse : ToolKind.Rectangle; + + public override void Render(DrawingContext dc, EditorDocument document) + { + Rect r = Rect; + if (r.Width < 1 && r.Height < 1) + { + return; + } + + Geometry geometry = IsEllipse + ? new EllipseGeometry(r) + : new RectangleGeometry(r, Style.CornerRadius, Style.CornerRadius); + + RenderHelpers.DrawWithShadow(dc, geometry, RenderHelpers.BrushOrNull(Style.Fill), + RenderHelpers.CreatePen(Style.Stroke, Style.Thickness, Style.Dash), Style.Shadow); + } + + public override bool HitTest(Point point, double tolerance) + { + if (!IsEllipse) + { + return base.HitTest(point, tolerance); + } + + Rect r = Rect; + r.Inflate(tolerance + Style.Thickness / 2, tolerance + Style.Thickness / 2); + return new EllipseGeometry(r).FillContains(point); + } +} diff --git a/src/Kniip/Editor/Annotations/StepAnnotation.cs b/src/Kniip/Editor/Annotations/StepAnnotation.cs new file mode 100644 index 0000000..56ee79d --- /dev/null +++ b/src/Kniip/Editor/Annotations/StepAnnotation.cs @@ -0,0 +1,88 @@ +using System; +using System.Text; +using System.Windows; +using System.Windows.Media; + +namespace Kniip.Editor.Annotations; + +/// +/// Genummerde stap-badge. Het nummer volgt uit de volgorde van de stappen met dezelfde nummering, +/// dus na verwijderen of ongedaan maken loopt de reeks automatisch weer door. +/// +public sealed class StepAnnotation : Annotation +{ + public Point Center { get; set; } + + public override ToolKind Kind => ToolKind.Step; + + public override Rect Bounds + { + get + { + double r = Style.Size / 2; + return new Rect(Center.X - r, Center.Y - r, Style.Size, Style.Size); + } + } + + public override void Render(DrawingContext dc, EditorDocument document) + { + double radius = Style.Size / 2; + var circle = new EllipseGeometry(Center, radius, radius); + Color fillColor = Style.Fill.A == 0 ? Palette.Red : Style.Fill; + Pen? border = RenderHelpers.CreatePen(Style.Foreground, Math.Max(1.5, Style.Size / 16), LineDash.Solid); + RenderHelpers.DrawWithShadow(dc, circle, RenderHelpers.BrushOrNull(fillColor), border, Style.Shadow); + + string label = document.GetStepLabel(this); + double factor = label.Length switch { 1 => 0.55, 2 => 0.46, 3 => 0.36, _ => 0.3 }; + FormattedText ft = RenderHelpers.FormatText(label, Style.Size * factor, Style.Foreground, true); + dc.DrawText(ft, new Point(Center.X - ft.Width / 2, Center.Y - ft.Height / 2)); + } + + public override bool HitTest(Point point, double tolerance) => + (point - Center).Length <= Style.Size / 2 + tolerance; + + public override void Move(Vector delta) => Center += delta; + + public static string FormatLabel(int ordinal, StepNumbering numbering) => numbering switch + { + StepNumbering.LowerAlpha => Alpha(ordinal).ToLowerInvariant(), + StepNumbering.UpperAlpha => Alpha(ordinal), + StepNumbering.Roman => Roman(ordinal), + _ => ordinal.ToString() + }; + + private static string Alpha(int n) + { + var sb = new StringBuilder(); + while (n > 0) + { + n--; + sb.Insert(0, (char)('A' + n % 26)); + n /= 26; + } + + return sb.ToString(); + } + + private static string Roman(int n) + { + if (n <= 0 || n > 3999) + { + return n.ToString(); + } + + int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; + string[] symbols = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; + var sb = new StringBuilder(); + for (int i = 0; i < values.Length; i++) + { + while (n >= values[i]) + { + sb.Append(symbols[i]); + n -= values[i]; + } + } + + return sb.ToString(); + } +} diff --git a/src/Kniip/Editor/Annotations/TextAnnotation.cs b/src/Kniip/Editor/Annotations/TextAnnotation.cs new file mode 100644 index 0000000..3e2ca03 --- /dev/null +++ b/src/Kniip/Editor/Annotations/TextAnnotation.cs @@ -0,0 +1,61 @@ +using System; +using System.Windows; +using System.Windows.Media; + +namespace Kniip.Editor.Annotations; + +/// Tekst in een kader met achtergrond, rand en afgeronde hoeken. +public sealed class TextAnnotation : Annotation +{ + public Point Position { get; set; } + + public string Text { get; set; } = string.Empty; + + public override ToolKind Kind => ToolKind.Text; + + public double Padding => Math.Round(Math.Max(4, Style.FontSize * 0.4)) + Math.Max(0, Style.Thickness) / 2; + + public override Rect Bounds + { + get + { + FormattedText ft = Format(Text.Length == 0 ? " " : Text); + double pad = Padding; + return new Rect(Position, new Size(ft.WidthIncludingTrailingWhitespace + 2 * pad, ft.Height + 2 * pad)); + } + } + + public override bool IsDegenerate => string.IsNullOrWhiteSpace(Text); + + private FormattedText Format(string text) => + RenderHelpers.FormatText(text, Style.FontSize, Style.Foreground, Style.Bold); + + public override void Render(DrawingContext dc, EditorDocument document) + { + if (string.IsNullOrEmpty(Text)) + { + return; + } + + FormattedText ft = Format(Text); + double pad = Padding; + var box = new Rect(Position, new Size(ft.WidthIncludingTrailingWhitespace + 2 * pad, ft.Height + 2 * pad)); + + Brush? fill = RenderHelpers.BrushOrNull(Style.Fill); + Pen? pen = RenderHelpers.CreatePen(Style.Stroke, Style.Thickness, Style.Dash); + if (fill != null || pen != null) + { + RenderHelpers.DrawWithShadow(dc, new RectangleGeometry(box, Style.CornerRadius, Style.CornerRadius), + fill, pen, Style.Shadow); + } + else if (Style.Shadow) + { + FormattedText shadow = RenderHelpers.FormatText(Text, Style.FontSize, Color.FromArgb(90, 0, 0, 0), Style.Bold); + dc.DrawText(shadow, new Point(Position.X + pad + 1.5, Position.Y + pad + 1.5)); + } + + dc.DrawText(ft, new Point(Position.X + pad, Position.Y + pad)); + } + + public override void Move(Vector delta) => Position += delta; +} diff --git a/src/Kniip/Editor/ColorPickerButton.xaml b/src/Kniip/Editor/ColorPickerButton.xaml new file mode 100644 index 0000000..0db1955 --- /dev/null +++ b/src/Kniip/Editor/ColorPickerButton.xaml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Kniip/Editor/ColorPickerButton.xaml.cs b/src/Kniip/Editor/ColorPickerButton.xaml.cs new file mode 100644 index 0000000..3bf3947 --- /dev/null +++ b/src/Kniip/Editor/ColorPickerButton.xaml.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Shapes; + +namespace Kniip.Editor; + +public partial class ColorPickerButton : UserControl +{ + private Color _color = Colors.Red; + private bool _allowTransparent; + + public event Action? ColorChanged; + + public ColorPickerButton() + { + InitializeComponent(); + BuildSwatches(); + UpdateSwatch(); + } + + public bool AllowTransparent + { + get => _allowTransparent; + set + { + _allowTransparent = value; + BuildSwatches(); + } + } + + public Color SelectedColor + { + get => _color; + set + { + _color = value; + UpdateSwatch(); + } + } + + private void BuildSwatches() + { + SwatchGrid.Children.Clear(); + var colors = new List(Palette.Swatches); + if (_allowTransparent) + { + colors.Add(Colors.Transparent); + } + + foreach (Color color in colors) + { + var visual = new Border + { + Width = 22, + Height = 22, + CornerRadius = new CornerRadius(4), + BorderBrush = new SolidColorBrush(Color.FromArgb(40, 0, 0, 0)), + BorderThickness = new Thickness(1), + Background = color.A == 0 ? (Brush)FindResource("Checker") : new SolidColorBrush(color) + }; + + var button = new Button + { + Style = (Style)FindResource("FlatButton"), + MinWidth = 0, + MinHeight = 0, + Padding = new Thickness(3), + Margin = new Thickness(1), + Content = visual, + ToolTip = color.A == 0 ? "Geen (transparant)" : $"#{color.R:X2}{color.G:X2}{color.B:X2}" + }; + Color captured = color; + button.Click += (_, _) => Pick(captured); + SwatchGrid.Children.Add(button); + } + } + + private void Pick(Color color) + { + Toggle.IsChecked = false; + SelectedColor = color; + ColorChanged?.Invoke(color); + } + + private void MoreColors_Click(object sender, RoutedEventArgs e) + { + Toggle.IsChecked = false; + using var dialog = new System.Windows.Forms.ColorDialog + { + FullOpen = true, + AnyColor = true, + Color = System.Drawing.Color.FromArgb(255, _color.R, _color.G, _color.B) + }; + if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + Pick(Color.FromRgb(dialog.Color.R, dialog.Color.G, dialog.Color.B)); + } + } + + /// Toon de kleur als rand (vierkant met gat) in plaats van als vlak, zoals bij lijnkleur. + public bool ShowAsOutline + { + get => _showAsOutline; + set + { + _showAsOutline = value; + UpdateSwatch(); + } + } + + private bool _showAsOutline; + + /// Toon een "A" met een kleurbalk eronder, zoals bij tekstkleur. + public bool ShowAsText + { + get => _showAsText; + set + { + _showAsText = value; + UpdateSwatch(); + } + } + + private bool _showAsText; + + private void UpdateSwatch() + { + TextGlyph.Visibility = _showAsText ? Visibility.Visible : Visibility.Collapsed; + TextBar.Background = new SolidColorBrush(_color); + TextBar.BorderBrush = new SolidColorBrush(Color.FromArgb(50, 0, 0, 0)); + TextBar.BorderThickness = new Thickness(_color.R > 230 && _color.G > 230 && _color.B > 230 ? 1 : 0); + bool none = _color.A == 0; + CheckerBack.Visibility = none || _color.A < 255 ? Visibility.Visible : Visibility.Collapsed; + Swatch.Background = none ? Brushes.Transparent : new SolidColorBrush(_color); + Swatch.BorderBrush = new SolidColorBrush(Color.FromArgb(40, 0, 0, 0)); + Swatch.BorderThickness = new Thickness(none ? 1 : 0); + OutlineHole.Visibility = _showAsOutline && !none ? Visibility.Visible : Visibility.Collapsed; + } +} diff --git a/src/Kniip/Editor/CornerPreviewConverter.cs b/src/Kniip/Editor/CornerPreviewConverter.cs new file mode 100644 index 0000000..df5e70c --- /dev/null +++ b/src/Kniip/Editor/CornerPreviewConverter.cs @@ -0,0 +1,19 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace Kniip.Editor; + +/// Zet een hoekstraal om naar de linkerbovenhoek van het voorbeeldicoon in de hoekenkeuze. +public sealed class CornerPreviewConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + double radius = value is double d ? d : 0; + return new CornerRadius(Math.Min(14, radius * 0.7), 0, 0, 0); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => + throw new NotSupportedException(); +} diff --git a/src/Kniip/Editor/CursorIconConverter.cs b/src/Kniip/Editor/CursorIconConverter.cs new file mode 100644 index 0000000..4b12de5 --- /dev/null +++ b/src/Kniip/Editor/CursorIconConverter.cs @@ -0,0 +1,16 @@ +using System; +using System.Globalization; +using System.Windows.Data; +using Kniip.Editor.Annotations; + +namespace Kniip.Editor; + +/// Geeft de vectorvorm van een cursorsoort, voor het icoon in de cursorkeuze. +public sealed class CursorIconConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) => + CursorGeometries.For(value is CursorKind kind ? kind : CursorKind.Arrow); + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => + throw new NotSupportedException(); +} diff --git a/src/Kniip/Editor/DocumentRenderer.cs b/src/Kniip/Editor/DocumentRenderer.cs new file mode 100644 index 0000000..a13578c --- /dev/null +++ b/src/Kniip/Editor/DocumentRenderer.cs @@ -0,0 +1,40 @@ +using System.Windows; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using Kniip.Editor.Annotations; + +namespace Kniip.Editor; + +internal static class DocumentRenderer +{ + public static void Render(DrawingContext dc, EditorDocument document) + { + dc.DrawImage(document.Image, new Rect(0, 0, document.Width, document.Height)); + foreach (Annotation item in document.Items) + { + if (!item.IsHidden) + { + item.Render(dc, document); + } + } + } + + /// Maakt de annotaties plat op de originele resolutie van het knipsel. + public static BitmapSource Export(EditorDocument document) + { + var visual = new DrawingVisual(); + RenderOptions.SetBitmapScalingMode(visual, BitmapScalingMode.NearestNeighbor); + TextOptions.SetTextRenderingMode(visual, TextRenderingMode.Grayscale); + using (DrawingContext dc = visual.RenderOpen()) + { + dc.PushClip(new RectangleGeometry(new Rect(0, 0, document.Width, document.Height))); + Render(dc, document); + dc.Pop(); + } + + var bitmap = new RenderTargetBitmap(document.Width, document.Height, 96, 96, PixelFormats.Pbgra32); + bitmap.Render(visual); + bitmap.Freeze(); + return bitmap; + } +} diff --git a/src/Kniip/Editor/EditorDocument.cs b/src/Kniip/Editor/EditorDocument.cs new file mode 100644 index 0000000..a2aa417 --- /dev/null +++ b/src/Kniip/Editor/EditorDocument.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows; +using System.Windows.Media.Imaging; +using Kniip.Editor.Annotations; +using Kniip.Infrastructure; + +namespace Kniip.Editor; + +public sealed record DocumentState(BitmapSource Image, byte[] Pixels, List Items); + +/// Het knipsel (als Bgra32-pixels, 96 dpi zodat 1 DIP = 1 pixel) plus de annotaties erop. +public sealed class EditorDocument +{ + public EditorDocument(BitmapSource source) + { + SetPixels(PixelUtil.ToOpaqueBgra(source), source.PixelWidth, source.PixelHeight); + } + + public BitmapSource Image { get; private set; } = null!; + + public byte[] Pixels { get; private set; } = Array.Empty(); + + public int Width => Image.PixelWidth; + + public int Height => Image.PixelHeight; + + public List Items { get; private set; } = new(); + + private void SetPixels(byte[] pixels, int width, int height) + { + Image = PixelUtil.CreateBitmap(pixels, width, height); + Pixels = pixels; + } + + public DocumentState CaptureState() => new(Image, Pixels, Items.Select(i => i.Clone()).ToList()); + + public void Restore(DocumentState state) + { + Image = state.Image; + Pixels = state.Pixels; + Items = state.Items.Select(i => i.Clone()).ToList(); + } + + public void Crop(Int32Rect area) + { + var cropped = new byte[area.Width * area.Height * 4]; + for (int y = 0; y < area.Height; y++) + { + Buffer.BlockCopy(Pixels, ((area.Y + y) * Width + area.X) * 4, cropped, y * area.Width * 4, area.Width * 4); + } + + SetPixels(cropped, area.Width, area.Height); + var offset = new Vector(-area.X, -area.Y); + foreach (Annotation item in Items) + { + item.Move(offset); + } + } + + public string GetStepLabel(StepAnnotation step) + { + int ordinal = 0; + foreach (Annotation item in Items) + { + if (item is StepAnnotation s && s.Style.StepNumbering == step.Style.StepNumbering) + { + ordinal++; + if (ReferenceEquals(s, step)) + { + break; + } + } + } + + return StepAnnotation.FormatLabel(Math.Max(1, ordinal), step.Style.StepNumbering); + } +} diff --git a/src/Kniip/Editor/EditorWindow.xaml b/src/Kniip/Editor/EditorWindow.xaml new file mode 100644 index 0000000..d365cd8 --- /dev/null +++ b/src/Kniip/Editor/EditorWindow.xaml @@ -0,0 +1,443 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Kniip/Editor/EditorWindow.xaml.cs b/src/Kniip/Editor/EditorWindow.xaml.cs new file mode 100644 index 0000000..4ebafc9 --- /dev/null +++ b/src/Kniip/Editor/EditorWindow.xaml.cs @@ -0,0 +1,1860 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Threading; +using Kniip.Capture; +using Kniip.Editor.Annotations; +using Kniip.Editor.Emoji; +using Kniip.Infrastructure; +using Kniip.Settings; +using Kniip.Upload; + +namespace Kniip.Editor; + +public partial class EditorWindow : Window +{ + private enum DragMode { None, Creating, Moving, Handle, Cropping } + + private static readonly double[] ThicknessValues = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 20, 24, 32 }; + private static readonly double[] FontSizeValues = { 10, 12, 14, 16, 18, 20, 24, 28, 32, 40, 48, 64 }; + private static readonly double[] SizeValues = { 16, 20, 24, 28, 32, 40, 48, 56, 64, 80 }; + private static readonly double[] EmojiSizeValues = { 24, 32, 48, 64, 96, 128 }; + private static readonly double[] CornerValues = { 0, 4, 10, 20 }; + private static readonly LineDash[] DashValues = { LineDash.Solid, LineDash.Dash, LineDash.Dot }; + private static readonly StepNumbering[] NumberingValues = + { StepNumbering.Numbers, StepNumbering.LowerAlpha, StepNumbering.UpperAlpha, StepNumbering.Roman }; + private static readonly CursorKind[] CursorKindValues = { CursorKind.Arrow, CursorKind.Click, CursorKind.Hand }; + private static readonly BlurMode[] BlurModeValues = { BlurMode.Pixelate, BlurMode.Blur }; + + private readonly EditorDocument _doc; + private readonly UndoStack _undo = new(); + private readonly AppSettings _settings; + private readonly DispatcherTimer _hintResetTimer = new() { Interval = TimeSpan.FromSeconds(3) }; + private readonly List _defaultToolbarOrder = new(); + + private ToolKind _tool; + private Annotation? _selected; + + private DragMode _drag; + private Point _dragStart; + private Point _lastPoint; + private Annotation? _active; + private int _handleIndex = -1; + private bool _dragChanged; + private bool _createdOnDown; + private DocumentState? _pending; + private List? _strokePoints; + + private TextBox? _textEditor; + private TextAnnotation? _editingText; + private DocumentState? _textPending; + private string _textOriginal = string.Empty; + private bool _textIsNew; + + private bool _suppressStyleEvents = true; + private Annotation? _lastStyleTarget; + private string? _lastStyleProp; + private DateTime _lastStyleTime; + + private double _zoom = 1; + private bool _fitMode = true; + private bool _dirty; + private bool _discarding; + private bool _exported; + + public EditorWindow(BitmapSource image, AppSettings settings, bool isBlank = false) + { + InitializeComponent(); + _settings = settings; + _doc = new EditorDocument(image); + + Surface.Document = _doc; + ThicknessCombo.ItemsSource = ThicknessValues; + FontSizeCombo.ItemsSource = FontSizeValues; + SizeCombo.ItemsSource = SizeValues; + CornerCombo.ItemsSource = CornerValues; + DashCombo.ItemsSource = DashValues; + NumberingCombo.ItemsSource = NumberingValues; + CursorKindCombo.ItemsSource = CursorKindValues; + BlurModeCombo.ItemsSource = BlurModeValues; + + StrokePicker.ColorChanged += c => ChangeStyle("stroke", s => s.Stroke = c); + FillPicker.ColorChanged += c => ChangeStyle("fill", s => s.Fill = c); + ForegroundPicker.ColorChanged += c => ChangeStyle("foreground", s => s.Foreground = c); + EmojiPicker.Recent = settings.RecentEmoji; + EmojiPicker.EmojiPicked += emoji => ChangeStyle("emoji", s => s.Emoji = emoji); + EmojiPicker.SkinToneChanged += tone => ChangeStyle("skintone", s => s.SkinTone = tone); + + _undo.Changed += UpdateCommandStates; + _hintResetTimer.Tick += (_, _) => + { + _hintResetTimer.Stop(); + UpdateHint(); + }; + + Loaded += (_, _) => + { + ZoomToFit(); + Surface.Focus(); + }; + SizeChanged += (_, _) => + { + if (_fitMode) + { + ZoomToFit(); + } + }; + DpiChanged += (_, _) => ApplyZoom(); + PreviewKeyDown += OnPreviewKeyDown; + + InitializeToolbar(); + ApplySaveButton(); + _suppressStyleEvents = false; + SelectTool(settings.LastTool == ToolKind.Crop ? ToolKind.Rectangle : settings.LastTool); + UpdateCommandStates(); + UpdateInfo(); + if (isBlank) + { + HintText.Text = "Leeg canvas: teken direct, plak een afbeelding met Ctrl+V of open er een met Ctrl+O."; + } + } + + // ---------------------------------------------------------------- Werkbalk + + private void InitializeToolbar() + { + _defaultToolbarOrder.AddRange(ToolbarItems.Items.Select(ItemId)); + ApplyToolbarOrder(_settings.ToolbarOrder); + foreach (UIElement item in ToolbarItems.Items) + { + item.Visibility = _settings.ToolbarHidden.Contains(ItemId(item)) ? Visibility.Collapsed : Visibility.Visible; + } + + ApplyUploadButton(); + ApplyToolbarPosition(); + ApplyToolbarLock(); + } + + private static string ItemId(UIElement item) => ToolbarPanel.GetItemId(item) ?? string.Empty; + + private void ApplyToolbarOrder(IReadOnlyList saved) + { + Dictionary byId = ToolbarItems.Items.ToDictionary(ItemId); + List order = saved.Where(byId.ContainsKey).Distinct().ToList(); + + // Items die nog niet in de opgeslagen volgorde staan (zoals nieuwe knoppen) komen na hun standaardvoorganger. + for (int i = 0; i < _defaultToolbarOrder.Count; i++) + { + string id = _defaultToolbarOrder[i]; + if (!order.Contains(id)) + { + order.Insert(i == 0 ? 0 : order.IndexOf(_defaultToolbarOrder[i - 1]) + 1, id); + } + } + + ToolbarItems.Children.Clear(); + foreach (string id in order) + { + ToolbarItems.Children.Add(byId[id]); + } + } + + private void ApplyToolbarPosition() + { + Dock dock = _settings.ToolbarPosition; + bool vertical = dock is Dock.Left or Dock.Right; + DockPanel.SetDock(Toolbar, dock); + ToolbarItems.Orientation = vertical ? Orientation.Vertical : Orientation.Horizontal; + Toolbar.Padding = vertical ? new Thickness(6, 8, 6, 8) : new Thickness(8, 6, 8, 6); + Toolbar.BorderThickness = dock switch + { + Dock.Bottom => new Thickness(0, 1, 0, 0), + Dock.Left => new Thickness(0, 0, 1, 0), + Dock.Right => new Thickness(1, 0, 0, 0), + _ => new Thickness(0, 0, 0, 1) + }; + UpdateToolbarLayout(); + } + + private void ApplyToolbarLock() + { + bool locked = _settings.ToolbarLocked; + ToolbarItems.IsLocked = locked; + Toolbar.Background = locked ? (Brush)FindResource("ToolbarBrush") : new SolidColorBrush(Color.FromRgb(0xEA, 0xF2, 0xFB)); + UpdateHint(); + } + + private void Toolbar_SizeChanged(object sender, SizeChangedEventArgs e) + { + if (e.WidthChanged) + { + UpdateToolbarLayout(); + } + } + + // Labels alleen tonen als alles op één regel past; staat de werkbalk opzij, dan altijd alleen iconen. + private void UpdateToolbarLayout() + { + if (ToolbarItems.Orientation == Orientation.Vertical) + { + SetActionLabelsVisible(false); + return; + } + + double available = Toolbar.ActualWidth - Toolbar.Padding.Left - Toolbar.Padding.Right + - Toolbar.BorderThickness.Left - Toolbar.BorderThickness.Right; + SetActionLabelsVisible(true); + ToolbarItems.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); + SetActionLabelsVisible(ToolbarItems.SingleLineLength <= available); + } + + private void SetActionLabelsVisible(bool visible) + { + Visibility visibility = visible ? Visibility.Visible : Visibility.Collapsed; + foreach (TextBlock label in new[] { NewLabel, ClearLabel, ScreencastLabel, SaveLabel, UploadLabel, CopyLabel }) + { + label.Visibility = visibility; + + // Anders geeft een directe Measure() van het paneel nog de gecachete knopbreedtes terug. + for (DependencyObject? d = label; d != null && d != ToolbarItems; d = VisualTreeHelper.GetParent(d)) + { + (d as UIElement)?.InvalidateMeasure(); + } + } + + ToolbarItems.InvalidateMeasure(); + } + + private void ToolbarItems_OrderChanged(object? sender, EventArgs e) + { + _settings.ToolbarOrder = ToolbarItems.Items.Select(ItemId).ToList(); + UpdateToolbarLayout(); + } + + private void Toolbar_ContextMenuOpening(object sender, ContextMenuEventArgs e) + { + ToolbarMenu.Items.Clear(); + + var lockItem = new MenuItem { Header = "Werkbalk vergrendelen", IsCheckable = true, IsChecked = _settings.ToolbarLocked }; + lockItem.Click += (_, _) => SetToolbarLocked(lockItem.IsChecked); + ToolbarMenu.Items.Add(lockItem); + + var position = new MenuItem { Header = "Positie" }; + foreach ((Dock dock, string label) in new[] { (Dock.Top, "Boven"), (Dock.Bottom, "Onder"), (Dock.Left, "Links"), (Dock.Right, "Rechts") }) + { + var item = new MenuItem { Header = label, IsCheckable = true, IsChecked = _settings.ToolbarPosition == dock }; + item.Click += (_, _) => + { + _settings.ToolbarPosition = dock; + ApplyToolbarPosition(); + }; + position.Items.Add(item); + } + + ToolbarMenu.Items.Add(position); + + var swap = new MenuItem { Header = "Groepen omwisselen" }; + swap.Click += (_, _) => SwapToolbarGroups(); + ToolbarMenu.Items.Add(swap); + + var buttons = new MenuItem { Header = "Knoppen tonen" }; + foreach (UIElement element in ToolbarItems.Items) + { + if (ToolbarPanel.GetTitle(element) is not { } title || (element == UploadButton && !CanUpload)) + { + continue; + } + + var item = new MenuItem { Header = title, IsCheckable = true, IsChecked = element.Visibility == Visibility.Visible, StaysOpenOnClick = true }; + item.Click += (_, _) => SetToolbarItemVisible(element, item.IsChecked); + buttons.Items.Add(item); + } + + ToolbarMenu.Items.Add(buttons); + ToolbarMenu.Items.Add(new Separator()); + + var reset = new MenuItem { Header = "Standaard herstellen" }; + reset.Click += (_, _) => ResetToolbar(); + ToolbarMenu.Items.Add(reset); + } + + private void SetToolbarLocked(bool locked) + { + _settings.ToolbarLocked = locked; + ApplyToolbarLock(); + } + + private void SetToolbarItemVisible(UIElement element, bool visible) + { + element.Visibility = visible ? Visibility.Visible : Visibility.Collapsed; + string id = ItemId(element); + _settings.ToolbarHidden.Remove(id); + if (!visible) + { + _settings.ToolbarHidden.Add(id); + } + + UpdateToolbarLayout(); + } + + /// De groepen tussen de flexibele ruimtes in omgekeerde volgorde zetten; een middengroep blijft in het midden. + private void SwapToolbarGroups() + { + var groups = new List> { new() }; + var spacers = new List(); + foreach (UIElement item in ToolbarItems.Items) + { + if (item is ToolbarSpacer) + { + spacers.Add(ItemId(item)); + groups.Add(new List()); + } + else + { + groups[^1].Add(ItemId(item)); + } + } + + groups.Reverse(); + var order = new List(groups[0]); + for (int i = 0; i < spacers.Count; i++) + { + order.Add(spacers[i]); + order.AddRange(groups[i + 1]); + } + + ApplyToolbarOrder(order); + ToolbarItems_OrderChanged(this, EventArgs.Empty); + } + + private void ResetToolbar() + { + _settings.ToolbarOrder = new List(); + _settings.ToolbarHidden = new List(); + _settings.ToolbarPosition = Dock.Top; + _settings.ToolbarLocked = true; + ApplyToolbarOrder(_defaultToolbarOrder); + foreach (UIElement item in ToolbarItems.Items) + { + item.Visibility = Visibility.Visible; + } + + ApplyUploadButton(); + ApplyToolbarPosition(); + ApplyToolbarLock(); + } + + // ---------------------------------------------------------------- Gereedschappen + + private void SelectTool(ToolKind tool) + { + foreach (RadioButton button in ToolbarItems.Items.OfType()) + { + if ((string)button.Tag == tool.ToString()) + { + button.IsChecked = true; + return; + } + } + } + + private void Tool_Checked(object sender, RoutedEventArgs e) + { + if (sender is not RadioButton { Tag: string tag } || !Enum.TryParse(tag, out ToolKind tool)) + { + return; + } + + CommitTextEdit(); + CancelDrag(); + _tool = tool; + _settings.LastTool = tool; + if (tool != ToolKind.Select) + { + SetSelected(null); + } + + Surface.Cursor = CursorForTool(tool); + if (tool == ToolKind.Emoji) + { + EmojiCatalog.Preload(); + } + + UpdatePropsPanel(); + UpdateHint(); + } + + private static Cursor CursorForTool(ToolKind tool) => tool switch + { + ToolKind.Select => Cursors.Arrow, + ToolKind.Text => Cursors.IBeam, + ToolKind.Step or ToolKind.Cursor or ToolKind.Emoji => Cursors.Hand, + _ => Cursors.Cross + }; + + private StyleSet StyleFor(ToolKind tool) => _settings.StyleFor(tool); + + private Annotation? CreateAnnotation(ToolKind tool, Point p) + { + StyleSet style = StyleFor(tool).Clone(); + return tool switch + { + ToolKind.Rectangle => new ShapeAnnotation(false) { Rect = new Rect(p, p), Style = style }, + ToolKind.Ellipse => new ShapeAnnotation(true) { Rect = new Rect(p, p), Style = style }, + ToolKind.Line => new LineAnnotation(false) { Start = p, End = p, Style = style }, + ToolKind.Arrow => new LineAnnotation(true) { Start = p, End = p, Style = style }, + ToolKind.Highlight => new HighlightAnnotation { Points = { p, p }, Straight = _settings.StraightHighlight, Style = style }, + ToolKind.Blur => new BlurAnnotation { Rect = new Rect(p, p), Style = style }, + ToolKind.Step => new StepAnnotation { Center = p, Style = style }, + ToolKind.Cursor => new CursorAnnotation { Position = p, Style = style }, + ToolKind.Emoji => new EmojiAnnotation { Center = p, Style = style }, + _ => null + }; + } + + // ---------------------------------------------------------------- Muis + + private double HitTolerance => 4 / Surface.ViewScale; + + private Annotation? HitTest(Point p) + { + for (int i = _doc.Items.Count - 1; i >= 0; i--) + { + if (_doc.Items[i].HitTest(p, HitTolerance)) + { + return _doc.Items[i]; + } + } + + return null; + } + + private void Surface_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + CommitTextEdit(); + Surface.Focus(); + Point p = e.GetPosition(Surface); + _dragStart = _lastPoint = p; + _dragChanged = false; + _createdOnDown = false; + _pending = _doc.CaptureState(); + + if (_selected != null) + { + int handle = Surface.HitHandle(_selected, p); + if (handle >= 0) + { + _handleIndex = handle; + _selected.BeginHandleDrag(handle); + StartDrag(DragMode.Handle); + return; + } + } + + switch (_tool) + { + case ToolKind.Select: + { + Annotation? hit = HitTest(p); + SetSelected(hit); + if (hit is TextAnnotation text && e.ClickCount == 2) + { + BeginTextEdit(text, false, _pending); + return; + } + + if (hit != null) + { + StartDrag(DragMode.Moving); + } + + break; + } + + case ToolKind.Crop: + Surface.CropRect = new Rect(p, p); + StartDrag(DragMode.Cropping); + break; + + case ToolKind.Text: + { + if (HitTest(p) is TextAnnotation existing) + { + SetSelected(existing); + BeginTextEdit(existing, false, _pending); + return; + } + + var text = new TextAnnotation { Position = p, Style = StyleFor(ToolKind.Text).Clone() }; + _doc.Items.Add(text); + BeginTextEdit(text, true, _pending); + return; + } + + case ToolKind.Step: + case ToolKind.Cursor: + case ToolKind.Emoji: + { + Annotation? stamp = CreateAnnotation(_tool, p); + if (stamp == null) + { + return; + } + + _doc.Items.Add(stamp); + SetSelected(stamp); + _createdOnDown = true; + StartDrag(DragMode.Moving); + break; + } + + default: + { + _active = CreateAnnotation(_tool, p); + if (_active == null) + { + return; + } + + _strokePoints = new List { p }; + _doc.Items.Add(_active); + SetSelected(null); + StartDrag(DragMode.Creating); + break; + } + } + + Surface.InvalidateVisual(); + } + + private void StartDrag(DragMode mode) + { + _drag = mode; + Surface.CaptureMouse(); + } + + private void Surface_MouseMove(object sender, MouseEventArgs e) + { + Point p = e.GetPosition(Surface); + bool shift = Keyboard.Modifiers.HasFlag(ModifierKeys.Shift); + + switch (_drag) + { + case DragMode.None: + UpdateHoverCursor(p); + return; + + case DragMode.Creating when _active != null: + UpdateCreating(_active, p, shift); + break; + + case DragMode.Moving when _selected != null: + _selected.Move(p - _lastPoint); + break; + + case DragMode.Handle when _selected != null: + _selected.MoveHandle(_handleIndex, p, shift); + break; + + case DragMode.Cropping: + Surface.CropRect = ClampToImage(RectAnnotation.FromAnchor(_dragStart, p, shift)); + break; + } + + if ((p - _dragStart).Length > 0.5) + { + _dragChanged = true; + } + + _lastPoint = p; + Surface.InvalidateVisual(); + } + + private void UpdateCreating(Annotation item, Point p, bool shift) + { + switch (item) + { + case RectAnnotation rect: + rect.Rect = RectAnnotation.FromAnchor(_dragStart, p, shift); + break; + + case LineAnnotation line: + line.End = shift ? RenderHelpers.SnapAngle(line.Start, p) : p; + break; + + case HighlightAnnotation highlight: + _strokePoints?.Add(p); + bool straight = _settings.StraightHighlight ^ shift; + highlight.Straight = straight; + highlight.Points = straight + ? new List { _dragStart, new(p.X, _dragStart.Y) } + : new List(_strokePoints ?? new List { _dragStart, p }); + break; + } + } + + private void Surface_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + if (_drag == DragMode.None) + { + return; + } + + DragMode mode = _drag; + _drag = DragMode.None; + Surface.ReleaseMouseCapture(); + + switch (mode) + { + case DragMode.Creating when _active != null: + if (_active.IsDegenerate) + { + _doc.Items.Remove(_active); + } + else + { + Commit(_pending); + SetSelected(_active); + } + + _active = null; + _strokePoints = null; + break; + + case DragMode.Moving: + case DragMode.Handle: + if (_dragChanged || _createdOnDown) + { + Commit(_pending); + } + + break; + + case DragMode.Cropping: + ApplyCrop(); + break; + } + + _pending = null; + Surface.InvalidateVisual(); + UpdatePropsPanel(); + } + + private void Surface_LostMouseCapture(object sender, MouseEventArgs e) + { + if (_drag != DragMode.None && Mouse.LeftButton == MouseButtonState.Released) + { + Surface_MouseLeftButtonUp(sender, new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left)); + } + } + + private void CancelDrag() + { + if (_drag == DragMode.None) + { + return; + } + + _drag = DragMode.None; + Surface.ReleaseMouseCapture(); + if (_pending != null) + { + _doc.Restore(_pending); + } + + _active = null; + _pending = null; + Surface.CropRect = null; + SetSelected(null); + } + + private void UpdateHoverCursor(Point p) + { + if (_selected != null) + { + int handle = Surface.HitHandle(_selected, p); + if (handle >= 0) + { + Surface.Cursor = HandleCursor(_selected, handle); + return; + } + } + + if (_tool == ToolKind.Select) + { + Surface.Cursor = HitTest(p) != null ? Cursors.SizeAll : Cursors.Arrow; + } + else if (_tool == ToolKind.Text && HitTest(p) is TextAnnotation) + { + Surface.Cursor = Cursors.IBeam; + } + else + { + Surface.Cursor = CursorForTool(_tool); + } + } + + private static Cursor HandleCursor(Annotation item, int handle) + { + if (item is not RectAnnotation) + { + return Cursors.SizeAll; + } + + return handle switch + { + 0 or 4 => Cursors.SizeNWSE, + 2 or 6 => Cursors.SizeNESW, + 1 or 5 => Cursors.SizeNS, + _ => Cursors.SizeWE + }; + } + + private void Surface_MouseRightButtonUp(object sender, MouseButtonEventArgs e) + { + CommitTextEdit(); + Annotation? hit = HitTest(e.GetPosition(Surface)); + if (hit == null) + { + return; + } + + SetSelected(hit); + var menu = new ContextMenu { PlacementTarget = Surface }; + menu.Items.Add(MenuItem("Naar voren", () => Reorder(hit, toFront: true))); + menu.Items.Add(MenuItem("Naar achteren", () => Reorder(hit, toFront: false))); + menu.Items.Add(MenuItem("Dupliceren", () => Duplicate(hit))); + menu.Items.Add(new Separator()); + menu.Items.Add(MenuItem("Verwijderen", DeleteSelected)); + menu.IsOpen = true; + e.Handled = true; + } + + private static MenuItem MenuItem(string header, Action action) + { + var item = new MenuItem { Header = header }; + item.Click += (_, _) => action(); + return item; + } + + // ---------------------------------------------------------------- Bewerkingen + + private void Commit(DocumentState? stateBefore) + { + if (stateBefore != null) + { + _undo.Push(stateBefore); + } + + _dirty = true; + } + + private void SetSelected(Annotation? item) + { + _selected = item; + Surface.Selected = item; + _lastStyleTarget = null; + UpdatePropsPanel(); + UpdateCommandStates(); + Surface.InvalidateVisual(); + } + + private void DeleteSelected() + { + if (_selected == null) + { + return; + } + + Commit(_doc.CaptureState()); + _doc.Items.Remove(_selected); + SetSelected(null); + } + + private void Reorder(Annotation item, bool toFront) + { + Commit(_doc.CaptureState()); + _doc.Items.Remove(item); + if (toFront) + { + _doc.Items.Add(item); + } + else + { + _doc.Items.Insert(0, item); + } + + Surface.InvalidateVisual(); + } + + private void Duplicate(Annotation item) + { + Commit(_doc.CaptureState()); + Annotation copy = item.Clone(); + double offset = 12 / Surface.ViewScale; + copy.Move(new Vector(offset, offset)); + _doc.Items.Add(copy); + SetSelected(copy); + } + + private void Nudge(Vector delta) + { + if (_selected == null) + { + return; + } + + bool coalesce = _lastStyleTarget == _selected && _lastStyleProp == "nudge" + && DateTime.Now - _lastStyleTime < TimeSpan.FromSeconds(1.5); + if (!coalesce) + { + Commit(_doc.CaptureState()); + } + + _lastStyleTarget = _selected; + _lastStyleProp = "nudge"; + _lastStyleTime = DateTime.Now; + _selected.Move(delta); + Surface.InvalidateVisual(); + } + + private void Undo() + { + CommitTextEdit(); + CancelDrag(); + DocumentState? state = _undo.Undo(_doc.CaptureState()); + if (state != null) + { + RestoreState(state); + } + } + + private void Redo() + { + CommitTextEdit(); + CancelDrag(); + DocumentState? state = _undo.Redo(_doc.CaptureState()); + if (state != null) + { + RestoreState(state); + } + } + + private void RestoreState(DocumentState state) + { + bool sizeChanged = state.Image.PixelWidth != _doc.Width || state.Image.PixelHeight != _doc.Height; + _doc.Restore(state); + _dirty = true; + SetSelected(null); + if (sizeChanged) + { + OnDocumentSizeChanged(); + } + } + + private void ApplyCrop() + { + Rect? crop = Surface.CropRect; + Surface.CropRect = null; + if (crop is not Rect r) + { + return; + } + + var area = new Int32Rect((int)Math.Round(r.X), (int)Math.Round(r.Y), (int)Math.Round(r.Width), (int)Math.Round(r.Height)); + area.Width = Math.Min(area.Width, _doc.Width - area.X); + area.Height = Math.Min(area.Height, _doc.Height - area.Y); + if (area.Width < 4 || area.Height < 4) + { + return; + } + + Commit(_pending); + _doc.Crop(area); + SetSelected(null); + OnDocumentSizeChanged(); + ShowTemporaryHint("Bijgesneden. Ctrl+Z maakt dit ongedaan."); + } + + private Rect ClampToImage(Rect r) + { + r.Intersect(new Rect(0, 0, _doc.Width, _doc.Height)); + return r.IsEmpty ? new Rect(_dragStart, _dragStart) : r; + } + + private void OnDocumentSizeChanged() + { + Surface.InvalidateMeasure(); + if (_fitMode) + { + Dispatcher.BeginInvoke(ZoomToFit, DispatcherPriority.Loaded); + } + + UpdateInfo(); + } + + // ---------------------------------------------------------------- Tekst bewerken + + private void BeginTextEdit(TextAnnotation text, bool isNew, DocumentState? stateBefore) + { + _editingText = text; + _textIsNew = isNew; + _textPending = stateBefore; + _textOriginal = text.Text; + text.IsHidden = true; + SetSelected(text); + + var editor = new TextBox + { + Text = text.Text, + AcceptsReturn = true, + AcceptsTab = false, + TextWrapping = TextWrapping.NoWrap, + MinWidth = 40, + FontFamily = new FontFamily("Segoe UI") + }; + ApplyTextEditorStyle(editor, text); + Canvas.SetLeft(editor, text.Position.X); + Canvas.SetTop(editor, text.Position.Y); + editor.PreviewKeyDown += (_, e) => + { + if (e.Key == Key.Escape || (e.Key == Key.Enter && Keyboard.Modifiers.HasFlag(ModifierKeys.Control))) + { + CommitTextEdit(); + Surface.Focus(); + e.Handled = true; + } + }; + editor.LostKeyboardFocus += (_, e) => + { + // Naar een ander venster wisselen: blijven bewerken, WPF geeft de focus terug bij terugkeer. + if (e.NewFocus == null || !IsActive) + { + return; + } + + // Klikken in de eigenschappenbalk (kleur, lettergrootte) mag het bewerken niet afbreken. + if (e.NewFocus is DependencyObject target && IsInside(target, PropsPanel)) + { + return; + } + + if (e.NewFocus is Popup || (e.NewFocus is DependencyObject d && IsInsidePopup(d))) + { + return; + } + + CommitTextEdit(); + }; + + TextLayer.Children.Add(editor); + _textEditor = editor; + Dispatcher.BeginInvoke(() => + { + editor.Focus(); + editor.CaretIndex = editor.Text.Length; + editor.SelectAll(); + }, DispatcherPriority.Input); + + Surface.InvalidateVisual(); + UpdateHint(); + } + + private static bool IsInside(DependencyObject element, DependencyObject container) + { + DependencyObject? current = element; + while (current != null) + { + if (ReferenceEquals(current, container)) + { + return true; + } + + current = current is Visual or System.Windows.Media.Media3D.Visual3D + ? VisualTreeHelper.GetParent(current) ?? LogicalTreeHelper.GetParent(current) + : LogicalTreeHelper.GetParent(current); + } + + return false; + } + + private static bool IsInsidePopup(DependencyObject element) + { + DependencyObject? current = element; + while (current != null) + { + if (current is Popup || current.GetType().Name == "PopupRoot") + { + return true; + } + + current = current is Visual ? VisualTreeHelper.GetParent(current) ?? LogicalTreeHelper.GetParent(current) + : LogicalTreeHelper.GetParent(current); + } + + return false; + } + + private static void ApplyTextEditorStyle(TextBox editor, TextAnnotation text) + { + StyleSet s = text.Style; + double border = s.Thickness > 0 && s.Stroke.A > 0 ? s.Thickness : 1; + editor.FontSize = s.FontSize; + editor.FontWeight = s.Bold ? FontWeights.Bold : FontWeights.Normal; + editor.Foreground = new SolidColorBrush(s.Foreground); + editor.Background = s.Fill.A > 0 ? new SolidColorBrush(s.Fill) : new SolidColorBrush(Color.FromArgb(60, 255, 255, 255)); + editor.BorderBrush = s.Thickness > 0 && s.Stroke.A > 0 ? new SolidColorBrush(s.Stroke) : new SolidColorBrush(Palette.Accent); + editor.BorderThickness = new Thickness(border); + editor.CaretBrush = new SolidColorBrush(s.Foreground); + double pad = Math.Max(0, text.Padding - border - 2); + editor.Padding = new Thickness(pad, pad, pad, pad); + } + + private void CommitTextEdit() + { + if (_textEditor == null || _editingText == null) + { + return; + } + + TextBox editor = _textEditor; + TextAnnotation text = _editingText; + _textEditor = null; + _editingText = null; + TextLayer.Children.Remove(editor); + text.IsHidden = false; + + string value = editor.Text.TrimEnd(); + if (string.IsNullOrWhiteSpace(value)) + { + if (!_textIsNew) + { + Commit(_textPending); + } + + _doc.Items.Remove(text); + SetSelected(null); + } + else + { + text.Text = value; + if (_textIsNew || value != _textOriginal) + { + Commit(_textPending); + } + + SetSelected(text); + } + + _textPending = null; + Surface.InvalidateVisual(); + UpdateHint(); + } + + // ---------------------------------------------------------------- Eigenschappen + + private void UpdatePropsPanel() + { + ToolKind kind = _selected?.Kind ?? _tool; + StyleSet style = _selected?.Style ?? StyleFor(_tool); + StyleProps props = StyleSet.PropsFor(kind); + + SetVisible(StrokeGroup, props.HasFlag(StyleProps.Stroke)); + SetVisible(FillGroup, props.HasFlag(StyleProps.Fill)); + SetVisible(ForegroundGroup, props.HasFlag(StyleProps.Foreground)); + SetVisible(ThicknessGroup, props.HasFlag(StyleProps.Thickness)); + SetVisible(DashGroup, props.HasFlag(StyleProps.Dash)); + SetVisible(CornerGroup, props.HasFlag(StyleProps.Corner)); + SetVisible(FontGroup, props.HasFlag(StyleProps.Font)); + SetVisible(NumberingGroup, props.HasFlag(StyleProps.Numbering)); + SetVisible(CursorGroup, props.HasFlag(StyleProps.CursorKind)); + SetVisible(EmojiGroup, props.HasFlag(StyleProps.Emoji)); + SetVisible(SizeGroup, props.HasFlag(StyleProps.Size)); + SetVisible(BlurGroup, props.HasFlag(StyleProps.Blur)); + SetVisible(StraightGroup, props.HasFlag(StyleProps.Straight)); + SetVisible(ShadowGroup, props.HasFlag(StyleProps.Shadow)); + + NoPropsText.Text = kind switch + { + ToolKind.Crop => "Sleep een kader over het deel dat je wilt bewaren.", + ToolKind.Select => "Selecteer een object om de eigenschappen ervan te wijzigen.", + _ => string.Empty + }; + SetVisible(NoPropsText, props == StyleProps.None); + + bool strokeIsLine = kind is ToolKind.Line or ToolKind.Arrow or ToolKind.Highlight; + StrokePicker.ShowAsOutline = !strokeIsLine; + StrokePicker.ToolTip = strokeIsLine ? "Kleur" : "Randkleur"; + FillPicker.ToolTip = kind switch + { + ToolKind.Text => "Achtergrondkleur", + ToolKind.Step => "Kleur", + _ => "Vulkleur" + }; + ThicknessCombo.ToolTip = kind == ToolKind.Text ? "Randdikte" : "Dikte"; + + _suppressStyleEvents = true; + try + { + StrokePicker.SelectedColor = style.Stroke; + FillPicker.SelectedColor = style.Fill; + ForegroundPicker.SelectedColor = style.Foreground; + ThicknessCombo.SelectedItem = Nearest(ThicknessValues, style.Thickness); + FontSizeCombo.SelectedItem = Nearest(FontSizeValues, style.FontSize); + double[] sizes = kind == ToolKind.Emoji ? EmojiSizeValues : SizeValues; + if (SizeCombo.ItemsSource != sizes) + { + SizeCombo.ItemsSource = sizes; + } + + SizeCombo.SelectedItem = Nearest(sizes, style.Size); + EmojiPicker.Emoji = style.Emoji; + EmojiPicker.SkinTone = style.SkinTone; + DashCombo.SelectedItem = style.Dash; + CornerCombo.SelectedItem = Nearest(CornerValues, style.CornerRadius); + NumberingCombo.SelectedItem = style.StepNumbering; + CursorKindCombo.SelectedItem = style.CursorKind; + BlurModeCombo.SelectedItem = style.BlurMode; + BlurStrengthSlider.Value = style.BlurStrength; + BoldToggle.IsChecked = style.Bold; + ShadowCheck.IsChecked = style.Shadow; + StraightCheck.IsChecked = _settings.StraightHighlight; + } + finally + { + _suppressStyleEvents = false; + } + } + + private static void SetVisible(UIElement element, bool visible) => + element.Visibility = visible ? Visibility.Visible : Visibility.Collapsed; + + private static double Nearest(double[] values, double value) => + values.OrderBy(v => Math.Abs(v - value)).First(); + + /// + /// Past een stijl toe op het geselecteerde object (met undo) en onthoudt hem als standaard voor dat gereedschap. + /// Snel opeenvolgende wijzigingen van dezelfde eigenschap (slider) vormen samen één undo-stap. + /// + private void ChangeStyle(string prop, Action apply) + { + if (_suppressStyleEvents) + { + return; + } + + if (_selected != null) + { + bool editingNewText = _editingText != null && _textIsNew; + bool coalesce = _lastStyleTarget == _selected && _lastStyleProp == prop + && DateTime.Now - _lastStyleTime < TimeSpan.FromSeconds(1.5); + if (!coalesce && !editingNewText) + { + Commit(_doc.CaptureState()); + } + + _lastStyleTarget = _selected; + _lastStyleProp = prop; + _lastStyleTime = DateTime.Now; + apply(_selected.Style); + apply(StyleFor(_selected.Kind)); + _dirty = true; + + if (_textEditor != null && _editingText != null) + { + ApplyTextEditorStyle(_textEditor, _editingText); + } + } + else + { + apply(StyleFor(_tool)); + } + + Surface.InvalidateVisual(); + } + + private void Thickness_Changed(object sender, SelectionChangedEventArgs e) + { + if (ThicknessCombo.SelectedItem is double value) + { + ChangeStyle("thickness", s => s.Thickness = value); + } + } + + private void FontSize_Changed(object sender, SelectionChangedEventArgs e) + { + if (FontSizeCombo.SelectedItem is double value) + { + ChangeStyle("font", s => s.FontSize = value); + } + } + + private void Size_Changed(object sender, SelectionChangedEventArgs e) + { + if (SizeCombo.SelectedItem is double value) + { + ChangeStyle("size", s => s.Size = value); + } + } + + private void Dash_Changed(object sender, SelectionChangedEventArgs e) + { + if (DashCombo.SelectedItem is LineDash dash) + { + ChangeStyle("dash", s => s.Dash = dash); + } + } + + private void Corner_Changed(object sender, SelectionChangedEventArgs e) + { + if (CornerCombo.SelectedItem is double radius) + { + ChangeStyle("corner", s => s.CornerRadius = radius); + } + } + + private void Numbering_Changed(object sender, SelectionChangedEventArgs e) + { + if (NumberingCombo.SelectedItem is StepNumbering numbering) + { + ChangeStyle("numbering", s => s.StepNumbering = numbering); + } + } + + private void CursorKind_Changed(object sender, SelectionChangedEventArgs e) + { + if (CursorKindCombo.SelectedItem is CursorKind kind) + { + ChangeStyle("cursor", s => s.CursorKind = kind); + } + } + + private void BlurMode_Changed(object sender, SelectionChangedEventArgs e) + { + if (BlurModeCombo.SelectedItem is BlurMode mode) + { + ChangeStyle("blurmode", s => s.BlurMode = mode); + } + } + + private void BlurStrength_Changed(object sender, RoutedPropertyChangedEventArgs e) + { + int strength = (int)Math.Round(e.NewValue); + ChangeStyle("blurstrength", s => s.BlurStrength = strength); + } + + private void Bold_Changed(object sender, RoutedEventArgs e) + { + bool bold = BoldToggle.IsChecked == true; + ChangeStyle("bold", s => s.Bold = bold); + } + + private void Shadow_Changed(object sender, RoutedEventArgs e) + { + bool shadow = ShadowCheck.IsChecked == true; + ChangeStyle("shadow", s => s.Shadow = shadow); + } + + private void Straight_Changed(object sender, RoutedEventArgs e) + { + if (_suppressStyleEvents) + { + return; + } + + _settings.StraightHighlight = StraightCheck.IsChecked == true; + UpdateHint(); + } + + // ---------------------------------------------------------------- Zoom + + private double DpiScale => VisualTreeHelper.GetDpi(this).DpiScaleX; + + private void SetZoom(double zoom, bool fit = false) + { + _fitMode = fit; + _zoom = Math.Clamp(zoom, 0.05, 8); + ApplyZoom(); + } + + private void ApplyZoom() + { + double scale = _zoom / DpiScale; + ZoomTransform.ScaleX = scale; + ZoomTransform.ScaleY = scale; + Surface.ViewScale = scale; + RenderOptions.SetBitmapScalingMode(Surface, _zoom >= 1 ? BitmapScalingMode.NearestNeighbor : BitmapScalingMode.HighQuality); + ZoomText.Text = $"{Math.Round(_zoom * 100)}%"; + Surface.InvalidateVisual(); + UpdateInfo(); + } + + private void ZoomToFit() + { + double availableWidth = Scroller.ActualWidth - 64; + double availableHeight = Scroller.ActualHeight - 64; + if (availableWidth <= 0 || availableHeight <= 0 || _doc.Width == 0 || _doc.Height == 0) + { + return; + } + + double fit = Math.Min(availableWidth / _doc.Width, availableHeight / _doc.Height) * DpiScale; + SetZoom(Math.Min(1, fit), fit: true); + } + + private void ZoomBy(double factor) => SetZoom(_zoom * factor); + + private void Scroller_PreviewMouseWheel(object sender, MouseWheelEventArgs e) + { + if (!Keyboard.Modifiers.HasFlag(ModifierKeys.Control)) + { + return; + } + + ZoomBy(e.Delta > 0 ? 1.15 : 1 / 1.15); + e.Handled = true; + } + + private void ZoomIn_Click(object sender, RoutedEventArgs e) => ZoomBy(1.25); + + private void ZoomOut_Click(object sender, RoutedEventArgs e) => ZoomBy(1 / 1.25); + + private void ZoomReset_Click(object sender, RoutedEventArgs e) + { + if (_fitMode || Math.Abs(_zoom - 1) > 0.001) + { + SetZoom(1); + } + else + { + ZoomToFit(); + } + } + + // ---------------------------------------------------------------- Export + + private bool CopiesOnSave => _settings.SaveButton == SaveButtonChoice.SaveAndCopy; + + private void ApplySaveButton() + { + bool copy = CopiesOnSave; + string label = copy ? "Opslaan en kopiëren" : "Opslaan"; + if (SaveLabel.Text == label) + { + return; + } + + SaveLabel.Text = label; + ToolbarPanel.SetTitle(SaveButton, label); + SaveButton.ToolTip = copy + ? "Opslaan en naar het klembord kopiëren (Ctrl+S); Shift+klik of Ctrl+Shift+S = opslaan als" + : "Opslaan (Ctrl+S); Shift+klik of Ctrl+Shift+S = opslaan als"; + UpdateToolbarLayout(); + } + + protected override void OnActivated(EventArgs e) + { + base.OnActivated(e); + ApplySaveButton(); + ApplyUploadButton(); + } + + private bool CanUpload => _settings.Uploader is { IsConfigured: true }; + + private void ApplyUploadButton() + { + Visibility visibility = CanUpload && !_settings.ToolbarHidden.Contains(ItemId(UploadButton)) + ? Visibility.Visible + : Visibility.Collapsed; + if (UploadButton.Visibility != visibility) + { + UploadButton.Visibility = visibility; + UpdateToolbarLayout(); + } + } + + private async void Upload() + { + if (_settings.Uploader is not { IsConfigured: true } config || !UploadButton.IsEnabled) + { + return; + } + + CommitTextEdit(); + BitmapSource image = DocumentRenderer.Export(_doc); + UploadButton.IsEnabled = false; + ShowTemporaryHint($"Uploaden naar {config.DisplayName}..."); + try + { + using System.IO.MemoryStream png = ImageExporter.EncodePng(image); + string url = await ZiplineUploader.UploadAsync(config, png, $"Knipsel {DateTime.Now:yyyy-MM-dd HHmmss}.png", "image/png"); + _dirty = false; + _exported = true; + ShowTemporaryHint(ClipboardWriter.SetText(url) + ? $"Geüpload, link gekopieerd: {url}" + : $"Geüpload: {url}. Kopiëren mislukt: het klembord is bezet."); + } + catch (Exception ex) + { + ShowTemporaryHint("Uploaden mislukt."); + MessageBox.Show(this, $"Uploaden is mislukt.\n\n{ex.Message}", "kniip", MessageBoxButton.OK, MessageBoxImage.Warning); + } + finally + { + UploadButton.IsEnabled = true; + } + } + + private void Upload_Click(object sender, RoutedEventArgs e) => Upload(); + + private void CopyToClipboard() + { + CommitTextEdit(); + BitmapSource image = DocumentRenderer.Export(_doc); + if (ClipboardWriter.SetImage(image)) + { + _dirty = false; + _exported = true; + ShowTemporaryHint("Gekopieerd naar het klembord."); + } + else + { + ShowTemporaryHint("Kopiëren mislukt: het klembord is bezet. Probeer het opnieuw."); + } + } + + private bool Save() + { + if (_settings.SnipSaveFolder is not { Length: > 0 } target) + { + return SaveAs(); + } + + CommitTextEdit(); + string path; + try + { + System.IO.Directory.CreateDirectory(target); + path = SaveLocation.UniquePath(target, $"Knipsel {DateTime.Now:yyyy-MM-dd HHmmss}.png"); + } + catch (Exception ex) + { + MessageBox.Show(this, $"De opslagmap uit de instellingen is niet bruikbaar:\n{target}\n\n{ex.Message}\n\nKies zelf waar je het knipsel opslaat.", + "kniip", MessageBoxButton.OK, MessageBoxImage.Warning); + return SaveAs(); + } + + return WriteTo(path); + } + + private bool SaveAs() + { + CommitTextEdit(); + string folder = _settings.LastSaveFolder is { } last && System.IO.Directory.Exists(last) + ? last + : Environment.GetFolderPath(Environment.SpecialFolder.MyPictures); + var dialog = new Microsoft.Win32.SaveFileDialog + { + Title = "Knipsel opslaan", + Filter = "PNG-afbeelding (*.png)|*.png|JPEG-afbeelding (*.jpg)|*.jpg", + FileName = $"Knipsel {DateTime.Now:yyyy-MM-dd HHmmss}", + DefaultExt = ".png", + InitialDirectory = folder, + AddExtension = true + }; + if (dialog.ShowDialog(this) != true) + { + return false; + } + + if (!WriteTo(dialog.FileName)) + { + return false; + } + + _settings.LastSaveFolder = System.IO.Path.GetDirectoryName(dialog.FileName); + return true; + } + + private bool WriteTo(string path) + { + try + { + App.Instance.Capture.IgnorePath(path); + BitmapSource image = DocumentRenderer.Export(_doc); + ImageExporter.Save(image, path); + _dirty = false; + _exported = true; + string name = System.IO.Path.GetFileName(path); + if (CopiesOnSave) + { + ShowTemporaryHint(ClipboardWriter.SetImage(image, path) + ? $"Opgeslagen en gekopieerd: {name}." + : $"Opgeslagen als {name}. Kopiëren mislukt: het klembord is bezet."); + } + else + { + ShowTemporaryHint($"Opgeslagen als {name}."); + } + + return true; + } + catch (Exception ex) + { + MessageBox.Show(this, $"Opslaan is mislukt:\n\n{ex.Message}", "kniip", MessageBoxButton.OK, MessageBoxImage.Warning); + return false; + } + } + + private void Copy_Click(object sender, RoutedEventArgs e) => CopyToClipboard(); + + private void Save_Click(object sender, RoutedEventArgs e) + { + if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)) + { + SaveAs(); + } + else + { + Save(); + } + } + + private void Undo_Click(object sender, RoutedEventArgs e) => Undo(); + + private void Redo_Click(object sender, RoutedEventArgs e) => Redo(); + + private void Delete_Click(object sender, RoutedEventArgs e) => DeleteSelected(); + + private void Settings_Click(object sender, RoutedEventArgs e) => App.Instance.ShowSettings(); + + private void NewSnip_Click(object sender, RoutedEventArgs e) => DiscardAndStartNewSnip(); + + private void Clear_Click(object sender, RoutedEventArgs e) => DiscardAndStartBlank(); + + private void DiscardAndStartBlank() + { + if (!ConfirmDiscard("Wil je het knipsel weggooien en opnieuw beginnen met een leeg canvas?")) + { + return; + } + + _discarding = true; + App.Instance.IgnoreCurrentClipboard(); + App.Instance.OpenBlankEditor(this); + Close(); + } + + /// Editor wegzetten (aantekeningen blijven bewaard) zodat hij niet in de opname staat. + private void Screencast_Click(object sender, RoutedEventArgs e) + { + CommitTextEdit(); + CancelDrag(); + WindowState = WindowState.Minimized; + var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(300) }; + timer.Tick += (_, _) => + { + timer.Stop(); + App.Instance.StartRecording(); + }; + timer.Start(); + } + + private void DiscardAndStartNewSnip() + { + if (!ConfirmDiscard("Wil je doorgaan en een nieuw knipsel maken?")) + { + return; + } + + _discarding = true; + Close(); + App.Instance.StartNewSnip(); + } + + private void PasteImage() + { + BitmapSource? image = ClipboardImageReader.TryRead(includeFiles: true); + if (image == null) + { + ShowTemporaryHint("Er staat geen afbeelding op het klembord."); + return; + } + + ReplaceWith(image, "Wil je doorgaan en de afbeelding van het klembord openen?"); + } + + private void OpenImageFile() + { + CommitTextEdit(); + CancelDrag(); + if (App.Instance.PickImageFile(this) is not { } path) + { + return; + } + + BitmapSource image; + try + { + image = PixelUtil.LoadFile(path); + } + catch (Exception ex) + { + MessageBox.Show(this, $"Kan '{System.IO.Path.GetFileName(path)}' niet openen.\n\n{ex.Message}", "kniip", + MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + + ReplaceWith(image, "Wil je doorgaan en deze afbeelding openen?"); + } + + private void ReplaceWith(BitmapSource image, string question) + { + if (!ConfirmDiscard(question)) + { + return; + } + + _discarding = true; + App.Instance.OpenEditor(image); + Close(); + } + + private bool ConfirmDiscard(string question) + { + CommitTextEdit(); + CancelDrag(); + if (!_dirty || _doc.Items.Count == 0) + { + return true; + } + + return MessageBox.Show(this, $"Dit knipsel en je aantekeningen worden gewist.\n\n{question}", + "kniip", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK; + } + + protected override void OnClosing(CancelEventArgs e) + { + CommitTextEdit(); + if (!_discarding && _dirty && _doc.Items.Count > 0) + { + MessageBoxResult answer = MessageBox.Show(this, + "Je aantekeningen zijn nog niet gekopieerd of opgeslagen.\n\nWil je het resultaat naar het klembord kopiëren voordat je sluit?", + "kniip", MessageBoxButton.YesNoCancel, MessageBoxImage.Question); + if (answer == MessageBoxResult.Cancel) + { + e.Cancel = true; + return; + } + + if (answer == MessageBoxResult.Yes) + { + CopyToClipboard(); + } + } + + // Een gekopieerd of opgeslagen knipsel is af; bij de volgende start niet opnieuw van het klembord openen. + if (!_discarding && _exported) + { + App.Instance.IgnoreCurrentClipboard(); + } + + SettingsStore.Save(_settings); + base.OnClosing(e); + } + + // ---------------------------------------------------------------- Toetsenbord + + private void OnPreviewKeyDown(object sender, KeyEventArgs e) + { + if ((_textEditor != null && _textEditor.IsKeyboardFocusWithin) || EmojiPicker.IsOpen) + { + return; + } + + ModifierKeys mods = Keyboard.Modifiers; + bool ctrl = mods.HasFlag(ModifierKeys.Control); + bool shift = mods.HasFlag(ModifierKeys.Shift); + Key key = e.Key == Key.System ? e.SystemKey : e.Key; + + if (ctrl) + { + switch (key) + { + case Key.Z when shift: + case Key.Y: + Redo(); + break; + case Key.Z: + Undo(); + break; + case Key.C: + CopyToClipboard(); + break; + case Key.S when shift: + SaveAs(); + break; + case Key.S: + Save(); + break; + case Key.U when CanUpload: + Upload(); + break; + case Key.N: + DiscardAndStartNewSnip(); + break; + case Key.Delete: + DiscardAndStartBlank(); + break; + case Key.V: + PasteImage(); + break; + case Key.O: + OpenImageFile(); + break; + case Key.D when _selected != null: + Duplicate(_selected); + break; + case Key.D0: + case Key.NumPad0: + ZoomToFit(); + break; + case Key.D1: + case Key.NumPad1: + SetZoom(1); + break; + case Key.OemPlus: + case Key.Add: + ZoomBy(1.25); + break; + case Key.OemMinus: + case Key.Subtract: + ZoomBy(1 / 1.25); + break; + default: + return; + } + + e.Handled = true; + return; + } + + if (mods != ModifierKeys.None && mods != ModifierKeys.Shift) + { + return; + } + + double step = shift ? 10 : 1; + switch (key) + { + case Key.Delete: + case Key.Back: + DeleteSelected(); + break; + case Key.Escape: + if (_drag != DragMode.None) + { + CancelDrag(); + } + else + { + SetSelected(null); + } + + break; + case Key.Enter when _selected is TextAnnotation text: + BeginTextEdit(text, false, _doc.CaptureState()); + break; + case Key.Left when _selected != null: + Nudge(new Vector(-step, 0)); + break; + case Key.Right when _selected != null: + Nudge(new Vector(step, 0)); + break; + case Key.Up when _selected != null: + Nudge(new Vector(0, -step)); + break; + case Key.Down when _selected != null: + Nudge(new Vector(0, step)); + break; + case Key.V: SelectTool(ToolKind.Select); break; + case Key.R: SelectTool(ToolKind.Rectangle); break; + case Key.E: SelectTool(ToolKind.Ellipse); break; + case Key.L: SelectTool(ToolKind.Line); break; + case Key.A: SelectTool(ToolKind.Arrow); break; + case Key.T: SelectTool(ToolKind.Text); break; + case Key.S: SelectTool(ToolKind.Step); break; + case Key.C: SelectTool(ToolKind.Cursor); break; + case Key.J: SelectTool(ToolKind.Emoji); break; + case Key.H: SelectTool(ToolKind.Highlight); break; + case Key.B: SelectTool(ToolKind.Blur); break; + case Key.X: SelectTool(ToolKind.Crop); break; + default: + return; + } + + e.Handled = true; + } + + // ---------------------------------------------------------------- Status + + private void UpdateCommandStates() + { + UndoButton.IsEnabled = _undo.CanUndo; + RedoButton.IsEnabled = _undo.CanRedo; + DeleteButton.IsEnabled = _selected != null; + } + + private void UpdateInfo() + { + InfoText.Text = $"{_doc.Width} × {_doc.Height} px · {Math.Round(_zoom * 100)}%"; + } + + private void ShowTemporaryHint(string message) + { + HintText.Text = message; + _hintResetTimer.Stop(); + _hintResetTimer.Start(); + } + + private void UpdateHint() + { + if (_editingText != null) + { + HintText.Text = "Typ je tekst. Enter = nieuwe regel, Ctrl+Enter of Esc = klaar."; + return; + } + + if (!_settings.ToolbarLocked) + { + HintText.Text = "Werkbalk ontgrendeld: sleep knoppen naar een andere plek. Rechtsklik op de werkbalk om hem weer vast te zetten."; + return; + } + + HintText.Text = _tool switch + { + ToolKind.Select => "Klik om te selecteren, sleep om te verplaatsen. Dubbelklik op tekst om te bewerken. Pijltoetsen verschuiven.", + ToolKind.Rectangle => "Sleep om een rechthoek te tekenen. Shift = vierkant.", + ToolKind.Ellipse => "Sleep om een ellips te tekenen. Shift = cirkel.", + ToolKind.Line => "Sleep om een lijn te tekenen. Shift = hoeken van 45°.", + ToolKind.Arrow => "Sleep om een pijl te tekenen. Shift = hoeken van 45°.", + ToolKind.Text => "Klik om een tekstkader te plaatsen, of klik op bestaande tekst om die te bewerken.", + ToolKind.Step => "Klik om een genummerde stap te plaatsen. De nummering loopt automatisch door.", + ToolKind.Cursor => "Klik om een cursor te plaatsen; de punt komt precies op de klikplek.", + ToolKind.Emoji => "Klik om de gekozen emoji te plaatsen; kies een andere emoji in de balk eronder.", + ToolKind.Highlight => _settings.StraightHighlight + ? "Sleep om een rechte horizontale markering te zetten. Houd Shift ingedrukt voor uit de vrije hand." + : "Sleep om uit de vrije hand te markeren. Houd Shift ingedrukt voor een rechte horizontale streep.", + ToolKind.Blur => "Sleep over het gebied dat je wilt pixeleren of vervagen.", + ToolKind.Crop => "Sleep een kader over het deel dat je wilt bewaren. Esc annuleert.", + _ => string.Empty + }; + } +} diff --git a/src/Kniip/Editor/Emoji/EmojiCatalog.cs b/src/Kniip/Editor/Emoji/EmojiCatalog.cs new file mode 100644 index 0000000..91c1dfa --- /dev/null +++ b/src/Kniip/Editor/Emoji/EmojiCatalog.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Windows; +using System.Windows.Media; +using System.Windows.Media.Imaging; + +namespace Kniip.Editor.Emoji; + +public sealed record EmojiCategory(string Id, string Title, string IconEmoji); + +public sealed class EmojiInfo +{ + public required string Unified { get; init; } + public required string Name { get; init; } + public required string ShortName { get; init; } + public required string Category { get; init; } + public required string Keywords { get; init; } + public required int SheetX { get; init; } + public required int SheetY { get; init; } + public IReadOnlyDictionary? Skins { get; init; } + + public bool HasSkinTones => Skins != null; +} + +/// +/// De Twemoji-set uit emoji-datasource (zie tools/fetch-emoji.ps1): één spritesheet met cellen van 64 px +/// plus 1 px rand, en een compacte catalogus met Nederlandse en Engelse trefwoorden. +/// +public static class EmojiCatalog +{ + private const int CellSize = 64; + private const int CellStride = CellSize + 2; + private const string AssetRoot = "pack://application:,,,/Assets/Emoji/"; + + public static readonly IReadOnlyList Categories = new[] + { + new EmojiCategory("Smileys & Emotion", "Smileys en emotie", "1f600"), + new EmojiCategory("People & Body", "Mensen", "1f44b"), + new EmojiCategory("Animals & Nature", "Dieren en natuur", "1f43b"), + new EmojiCategory("Food & Drink", "Eten en drinken", "1f354"), + new EmojiCategory("Activities", "Activiteiten", "26bd"), + new EmojiCategory("Travel & Places", "Reizen en plaatsen", "1f697"), + new EmojiCategory("Objects", "Objecten", "1f4a1"), + new EmojiCategory("Symbols", "Symbolen", "2764-fe0f"), + new EmojiCategory("Flags", "Vlaggen", "1f3c1") + }; + + private static readonly Lazy SheetLoader = new(LoadSheet); + private static readonly Lazy DataLoader = new(LoadData); + private static readonly ConcurrentDictionary<(int, int), ImageSource> Cells = new(); + + private sealed record Data(IReadOnlyList All, IReadOnlyDictionary ByUnified); + + public static IReadOnlyList All => DataLoader.Value.All; + + /// Laadt de catalogus en het sheet alvast op de achtergrond, zodat de eerste keer kiezen niet hapert. + public static void Preload() => + System.Threading.Tasks.Task.Run(() => + { + _ = SheetLoader.Value; + _ = DataLoader.Value; + }); + + public static EmojiInfo? Find(string unified) => + DataLoader.Value.ByUnified.TryGetValue(unified, out EmojiInfo? info) ? info : null; + + public static ImageSource Get(string unified, SkinTone tone) + { + EmojiInfo? info = Find(unified) ?? Find("1f44d"); + return info == null ? Placeholder : Get(info, tone); + } + + public static ImageSource Get(EmojiInfo info, SkinTone tone) + { + (int x, int y) = tone != SkinTone.Default && info.Skins != null && info.Skins.TryGetValue(tone, out var skin) + ? (skin.X, skin.Y) + : (info.SheetX, info.SheetY); + return Cells.GetOrAdd((x, y), key => + { + var cell = new CroppedBitmap(SheetLoader.Value, + new Int32Rect(key.Item1 * CellStride + 1, key.Item2 * CellStride + 1, CellSize, CellSize)); + cell.Freeze(); + return cell; + }); + } + + /// Het emojiteken zelf (met huidskleur), bijvoorbeeld voor de tooltip. + public static string ToText(EmojiInfo info, SkinTone tone) + { + string unified = tone != SkinTone.Default && info.Skins != null && info.Skins.TryGetValue(tone, out var skin) + ? skin.Unified + : info.Unified; + return string.Concat(unified.Split('-').Select(cp => char.ConvertFromUtf32(Convert.ToInt32(cp, 16)))); + } + + /// + /// Alle woorden uit de zoekterm moeten voorkomen; emoji waarvan de naam of shortcode met de term begint, komen eerst. + /// + public static IReadOnlyList Search(string query) + { + string[] words = query.Trim().ToLowerInvariant().Split(' ', StringSplitOptions.RemoveEmptyEntries); + if (words.Length == 0) + { + return Array.Empty(); + } + + string first = words[0]; + return All + .Where(e => words.All(w => HasWordStartingWith(e, w))) + .Select(e => (Emoji: e, Rank: Rank(e, first))) + .OrderBy(r => r.Rank) + .Select(r => r.Emoji) + .ToList(); + } + + private static bool HasWordStartingWith(EmojiInfo e, string word) => + e.Keywords.Contains("|" + word, StringComparison.Ordinal) || e.Keywords.Contains(" " + word, StringComparison.Ordinal); + + private static int Rank(EmojiInfo e, string word) + { + if (e.ShortName.StartsWith(word, StringComparison.OrdinalIgnoreCase) || e.Name.StartsWith(word, StringComparison.OrdinalIgnoreCase)) + { + return 0; + } + + return e.Keywords.Contains("|" + word + "|", StringComparison.Ordinal) ? 1 : 2; + } + + private static readonly ImageSource Placeholder = CreatePlaceholder(); + + private static ImageSource CreatePlaceholder() + { + var image = new DrawingImage(new GeometryDrawing(Brushes.LightGray, null, new RectangleGeometry(new Rect(0, 0, CellSize, CellSize)))); + image.Freeze(); + return image; + } + + private static BitmapSource LoadSheet() + { + var sheet = new BitmapImage(); + sheet.BeginInit(); + sheet.UriSource = new Uri(AssetRoot + "twemoji-64.png"); + sheet.CacheOption = BitmapCacheOption.OnLoad; + sheet.CreateOptions = BitmapCreateOptions.IgnoreColorProfile; + sheet.EndInit(); + sheet.Freeze(); + return sheet; + } + + private static Data LoadData() + { + var all = new List(); + var byUnified = new Dictionary(StringComparer.OrdinalIgnoreCase); + + using (System.IO.Stream stream = Application.GetResourceStream(new Uri(AssetRoot + "emoji.json")).Stream) + using (JsonDocument doc = JsonDocument.Parse(stream)) + { + foreach (JsonElement e in doc.RootElement.EnumerateArray()) + { + Dictionary? skins = null; + if (e.TryGetProperty("t", out JsonElement t)) + { + skins = new Dictionary(); + foreach (JsonProperty p in t.EnumerateObject()) + { + skins[(SkinTone)int.Parse(p.Name)] = (p.Value[0].GetString()!, p.Value[1].GetInt32(), p.Value[2].GetInt32()); + } + } + + var info = new EmojiInfo + { + Unified = e.GetProperty("u").GetString()!, + Category = e.GetProperty("c").GetString()!, + SheetX = e.GetProperty("x").GetInt32(), + SheetY = e.GetProperty("y").GetInt32(), + ShortName = e.GetProperty("s").GetString()!, + Name = e.GetProperty("n").GetString()!, + Keywords = "|" + e.GetProperty("k").GetString()!, + Skins = skins + }; + all.Add(info); + byUnified[info.Unified] = info; + } + } + + return new Data(all, byUnified); + } +} diff --git a/src/Kniip/Editor/EmojiPickerButton.xaml b/src/Kniip/Editor/EmojiPickerButton.xaml new file mode 100644 index 0000000..08d9eec --- /dev/null +++ b/src/Kniip/Editor/EmojiPickerButton.xaml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Kniip/Editor/EmojiPickerButton.xaml.cs b/src/Kniip/Editor/EmojiPickerButton.xaml.cs new file mode 100644 index 0000000..cbb1010 --- /dev/null +++ b/src/Kniip/Editor/EmojiPickerButton.xaml.cs @@ -0,0 +1,395 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Threading; +using Kniip.Editor.Emoji; + +namespace Kniip.Editor; + +public sealed record EmojiHeaderRow(string Title); + +public sealed record EmojiCellRow(IReadOnlyList Cells); + +public sealed class EmojiCell +{ + private ImageSource? _image; + + public EmojiCell(EmojiInfo info, SkinTone tone) + { + Info = info; + Tone = tone; + } + + public EmojiInfo Info { get; } + public SkinTone Tone { get; } + + public ImageSource Image => _image ??= EmojiCatalog.Get(Info, Tone); +} + +/// Emoji-kiezer in de stijl van emoji-mart: zoeken, categorieën, huidskleur en recent gebruikt. +public partial class EmojiPickerButton : UserControl +{ + public const int MaxRecent = 18; + private const int Columns = 9; + private const string RecentId = "Recent"; + + private static readonly (SkinTone Tone, Color Color, string Name)[] Tones = + { + (SkinTone.Default, Color.FromRgb(0xFF, 0xC9, 0x3A), "Standaard"), + (SkinTone.Light, Color.FromRgb(0xFA, 0xDC, 0xBC), "Licht"), + (SkinTone.MediumLight, Color.FromRgb(0xE0, 0xBB, 0x95), "Middellicht"), + (SkinTone.Medium, Color.FromRgb(0xBF, 0x8F, 0x68), "Middel"), + (SkinTone.MediumDark, Color.FromRgb(0x9B, 0x64, 0x3D), "Middeldonker"), + (SkinTone.Dark, Color.FromRgb(0x59, 0x45, 0x39), "Donker") + }; + + private static readonly Brush AccentBrush = Annotations.RenderHelpers.Freeze(new SolidColorBrush(Palette.Accent)); + + private readonly List<(string Id, int RowIndex)> _sections = new(); + private readonly Dictionary _tabs = new(); + private string _emoji = "1f44d"; + private SkinTone _tone; + private ScrollViewer? _scroller; + private bool _syncingTabs; + + /// Er is een andere emoji gekozen (codepunten zonder huidskleur). + public event Action? EmojiPicked; + + public event Action? SkinToneChanged; + + public EmojiPickerButton() + { + InitializeComponent(); + BuildTones(); + IsVisibleChanged += (_, _) => UpdateFace(); + } + + /// Lijst met recent gekozen emoji, nieuwste eerst; wordt door de eigenaar bewaard. + public List? Recent { get; set; } + + public bool IsOpen => PopupPanel.IsOpen; + + public string Emoji + { + get => _emoji; + set + { + _emoji = value; + UpdateFace(); + } + } + + public SkinTone SkinTone + { + get => _tone; + set + { + _tone = value; + UpdateToneButtons(); + UpdateFace(); + } + } + + // Het sheet pas laden als de knop echt te zien is. + private void UpdateFace() + { + if (!IsVisible) + { + return; + } + + Face.Source = EmojiCatalog.Get(_emoji, _tone); + if (EmojiCatalog.Find(_emoji) is { } info) + { + Toggle.ToolTip = $"Emoji kiezen ({info.Name})"; + } + } + + // ---------------------------------------------------------------- Popup + + private void Popup_Opened(object? sender, EventArgs e) + { + BuildTabs(); + SearchBox.Text = string.Empty; + BuildRows(); + ShowPreview(EmojiCatalog.Find(_emoji)); + ScrollToRow(0); + Dispatcher.BeginInvoke(DispatcherPriority.Input, () => Keyboard.Focus(SearchBox)); + } + + private void Popup_PreviewKeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Escape) + { + Toggle.IsChecked = false; + e.Handled = true; + } + else if (e.Key == Key.Enter && SearchBox.IsKeyboardFocused + && EmojiList.Items.OfType().FirstOrDefault()?.Cells.FirstOrDefault() is { } first) + { + Pick(first.Info); + e.Handled = true; + } + } + + private void SearchBox_TextChanged(object sender, TextChangedEventArgs e) + { + SearchPlaceholder.Visibility = SearchBox.Text.Length == 0 ? Visibility.Visible : Visibility.Collapsed; + if (PopupPanel.IsOpen) + { + BuildRows(); + ScrollToRow(0); + } + } + + private void Cell_Click(object sender, RoutedEventArgs e) + { + if (sender is FrameworkElement { DataContext: EmojiCell cell }) + { + Pick(cell.Info); + } + } + + private void Cell_MouseEnter(object sender, MouseEventArgs e) + { + if (sender is FrameworkElement { DataContext: EmojiCell cell }) + { + ShowPreview(cell.Info); + } + } + + private void Pick(EmojiInfo info) + { + if (Recent != null) + { + Recent.Remove(info.Unified); + Recent.Insert(0, info.Unified); + if (Recent.Count > MaxRecent) + { + Recent.RemoveRange(MaxRecent, Recent.Count - MaxRecent); + } + } + + Toggle.IsChecked = false; + Emoji = info.Unified; + EmojiPicked?.Invoke(info.Unified); + } + + private void ShowPreview(EmojiInfo? info) + { + if (info == null) + { + PreviewImage.Source = null; + PreviewName.Text = PreviewCode.Text = string.Empty; + return; + } + + PreviewImage.Source = EmojiCatalog.Get(info, _tone); + PreviewName.Text = info.Name.Length > 0 ? char.ToUpper(info.Name[0]) + info.Name[1..] : info.Name; + PreviewCode.Text = $":{info.ShortName}:"; + } + + // ---------------------------------------------------------------- Raster + + private IEnumerable<(string Id, string Title, IEnumerable Items)> Sections() + { + string query = SearchBox.Text.Trim(); + if (query.Length > 0) + { + yield return ("Search", "Zoekresultaten", EmojiCatalog.Search(query)); + yield break; + } + + List recent = RecentEmoji(); + if (recent.Count > 0) + { + yield return (RecentId, "Recent gebruikt", recent); + } + + foreach (IGrouping group in EmojiCatalog.All.GroupBy(e => e.Category)) + { + if (EmojiCatalog.Categories.FirstOrDefault(c => c.Id == group.Key) is { } category) + { + yield return (category.Id, category.Title, group); + } + } + } + + private List RecentEmoji() => + (Recent ?? new List()).Select(EmojiCatalog.Find).OfType().ToList(); + + private void BuildRows() + { + var rows = new List(); + _sections.Clear(); + foreach ((string id, string title, IEnumerable items) in Sections()) + { + List cells = items.Select(info => new EmojiCell(info, _tone)).ToList(); + if (cells.Count == 0) + { + continue; + } + + _sections.Add((id, rows.Count)); + rows.Add(new EmojiHeaderRow(title)); + for (int i = 0; i < cells.Count; i += Columns) + { + rows.Add(new EmojiCellRow(cells.GetRange(i, Math.Min(Columns, cells.Count - i)))); + } + } + + EmojiList.ItemsSource = rows; + NoResultsText.Visibility = rows.Count == 0 ? Visibility.Visible : Visibility.Collapsed; + UpdateActiveTab(0); + } + + private ScrollViewer? Scroller + { + get + { + if (_scroller == null) + { + EmojiList.ApplyTemplate(); + _scroller = EmojiList.Template.FindName("PART_Scroller", EmojiList) as ScrollViewer; + if (_scroller != null) + { + _scroller.ScrollChanged += (_, _) => UpdateActiveTab((int)Math.Floor(_scroller.VerticalOffset)); + } + } + + return _scroller; + } + } + + // Met CanContentScroll schuift de ScrollViewer per rij, dus de offset is een rij-index. + private void ScrollToRow(int row) => Scroller?.ScrollToVerticalOffset(row); + + // ---------------------------------------------------------------- Tabs en huidskleur + + private void BuildTabs() + { + TabPanel.Children.Clear(); + _tabs.Clear(); + if (RecentEmoji().Count > 0) + { + AddTab(RecentId, "Recent gebruikt", new TextBlock { Text = "\uE81C", Style = (Style)FindResource("IconText") }); + } + + foreach (EmojiCategory category in EmojiCatalog.Categories) + { + var icon = new Image { Source = EmojiCatalog.Get(category.IconEmoji, SkinTone.Default), Width = 18, Height = 18 }; + RenderOptions.SetBitmapScalingMode(icon, BitmapScalingMode.HighQuality); + AddTab(category.Id, category.Title, icon); + } + } + + private void AddTab(string id, string title, UIElement content) + { + var tab = new ToggleButton + { + Style = (Style)FindResource("ToolToggle"), + MinWidth = 0, + MinHeight = 0, + Width = 35, + Height = 32, + Padding = new Thickness(2), + Margin = new Thickness(0), + ToolTip = title, + Content = content + }; + tab.Click += (_, _) => + { + if (SearchBox.Text.Length > 0) + { + SearchBox.Text = string.Empty; + } + + int index = _sections.FindIndex(s => s.Id == id); + if (index >= 0) + { + ScrollToRow(_sections[index].RowIndex); + } + + UpdateActiveTab(index >= 0 ? _sections[index].RowIndex : 0); + }; + _tabs[id] = tab; + TabPanel.Children.Add(tab); + } + + private void UpdateActiveTab(int firstVisibleRow) + { + if (_syncingTabs) + { + return; + } + + _syncingTabs = true; + string? active = _sections.LastOrDefault(s => s.RowIndex <= firstVisibleRow).Id; + foreach ((string id, ToggleButton tab) in _tabs) + { + tab.IsChecked = id == active; + } + + _syncingTabs = false; + } + + private void BuildTones() + { + foreach ((SkinTone tone, Color color, string name) in Tones) + { + var dot = new Border + { + Width = 16, + Height = 16, + CornerRadius = new CornerRadius(8), + Background = new SolidColorBrush(color), + BorderBrush = new SolidColorBrush(Color.FromArgb(40, 0, 0, 0)), + BorderThickness = new Thickness(1) + }; + var button = new Button + { + Style = (Style)FindResource("FlatButton"), + MinWidth = 0, + MinHeight = 0, + Padding = new Thickness(3), + Margin = new Thickness(0), + Content = dot, + Tag = tone, + ToolTip = $"Huidskleur: {name.ToLowerInvariant()}" + }; + button.Click += (_, _) => SetTone(tone); + TonePanel.Children.Add(button); + } + + UpdateToneButtons(); + } + + private void SetTone(SkinTone tone) + { + if (tone == _tone) + { + return; + } + + SkinTone = tone; + double offset = Scroller?.VerticalOffset ?? 0; + BuildRows(); + Scroller?.ScrollToVerticalOffset(offset); + ShowPreview(EmojiCatalog.Find(_emoji)); + SkinToneChanged?.Invoke(tone); + } + + private void UpdateToneButtons() + { + foreach (Button button in TonePanel.Children.OfType + + + + + + + + + + + + + + + + + + + + diff --git a/src/Kniip/Recording/RecordingToolbar.xaml.cs b/src/Kniip/Recording/RecordingToolbar.xaml.cs new file mode 100644 index 0000000..cf733b9 --- /dev/null +++ b/src/Kniip/Recording/RecordingToolbar.xaml.cs @@ -0,0 +1,143 @@ +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Input; +using System.Windows.Threading; +using Rectangle = System.Drawing.Rectangle; + +namespace Kniip.Recording; + +internal enum ToolbarState +{ + Ready, + Countdown, + Recording, + Paused, + Finishing +} + +/// Knoppenbalk naast het opnamegebied; hij is zelf onzichtbaar in de opname. +public partial class RecordingToolbar : Window +{ + private readonly Rectangle _region; + private readonly Rectangle _workArea; + private readonly Stopwatch _elapsed = new(); + private readonly DispatcherTimer _clock = new() { Interval = TimeSpan.FromMilliseconds(250) }; + + public event Action? RecordRequested; + public event Action? PauseRequested; + public event Action? StopRequested; + public event Action? CancelRequested; + + internal RecordingToolbar(Rectangle region, Rectangle workArea, bool systemAudio, bool microphone) + { + InitializeComponent(); + _region = region; + _workArea = workArea; + SystemAudioToggle.IsChecked = systemAudio; + MicrophoneToggle.IsChecked = microphone; + + _clock.Tick += (_, _) => UpdateClock(); + SourceInitialized += (_, _) => + { + PhysicalWindow.ExcludeFromCapture(this); + PhysicalWindow.Place(this, new Rectangle(region.X, region.Y, 0, 0), resize: false); + }; + ContentRendered += (_, _) => PlaceNearRegion(); + Closed += (_, _) => _clock.Stop(); + } + + public bool SystemAudio => SystemAudioToggle.IsChecked == true; + + public bool Microphone => MicrophoneToggle.IsChecked == true; + + internal void SetState(ToolbarState state) + { + bool active = state is ToolbarState.Recording or ToolbarState.Paused; + SystemAudioToggle.Visibility = Show(state is ToolbarState.Ready or ToolbarState.Countdown); + MicrophoneToggle.Visibility = SystemAudioToggle.Visibility; + RecordButton.Visibility = Show(state is ToolbarState.Ready or ToolbarState.Countdown); + RecordButton.ToolTip = state == ToolbarState.Countdown ? "Nu meteen starten" : "Opname starten"; + PauseButton.Visibility = Show(active); + StopButton.Visibility = Show(active); + TimePanel.Visibility = Show(active || state == ToolbarState.Finishing); + BusyText.Visibility = Show(state == ToolbarState.Finishing); + CancelButton.Visibility = Show(state != ToolbarState.Finishing); + + PauseIcon.Text = state == ToolbarState.Paused ? "\uE768" : "\uE769"; + PauseButton.ToolTip = state == ToolbarState.Paused ? "Hervatten" : "Pauzeren"; + RecordDot.Opacity = state == ToolbarState.Recording ? 1 : 0.35; + + if (state == ToolbarState.Ready) + { + RecordButtonDot.Visibility = Visibility.Visible; + RecordButtonText.Text = "Opnemen"; + } + + if (state == ToolbarState.Recording) + { + _elapsed.Start(); + _clock.Start(); + } + else + { + _elapsed.Stop(); + } + + UpdateClock(); + } + + internal void SetCountdown(int seconds) + { + RecordButtonDot.Visibility = Visibility.Collapsed; + RecordButtonText.Text = $"Start over {seconds}..."; + } + + private static Visibility Show(bool visible) => visible ? Visibility.Visible : Visibility.Collapsed; + + private void UpdateClock() + { + TimeSpan time = _elapsed.Elapsed; + TimeText.Text = time.TotalHours >= 1 ? time.ToString(@"h\:mm\:ss") : time.ToString(@"m\:ss"); + } + + /// Onder het gebied als daar plaats is, anders erboven, anders binnen de onderrand. + private void PlaceNearRegion() + { + Rectangle own = PhysicalWindow.GetBounds(this); + int x = _region.X + (_region.Width - own.Width) / 2; + x = Math.Clamp(x, _workArea.Left, Math.Max(_workArea.Left, _workArea.Right - own.Width)); + + int y; + if (_region.Bottom + own.Height <= _workArea.Bottom) + { + y = _region.Bottom; + } + else if (_region.Top - own.Height >= _workArea.Top) + { + y = _region.Top - own.Height; + } + else + { + y = Math.Max(_workArea.Top, _region.Bottom - own.Height); + } + + PhysicalWindow.Place(this, new Rectangle(x, y, own.Width, own.Height), resize: false); + } + + private void Background_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (e.ButtonState == MouseButtonState.Pressed) + { + DragMove(); + } + } + + private void Record_Click(object sender, RoutedEventArgs e) => RecordRequested?.Invoke(); + + private void Pause_Click(object sender, RoutedEventArgs e) => PauseRequested?.Invoke(); + + private void Stop_Click(object sender, RoutedEventArgs e) => StopRequested?.Invoke(); + + private void Cancel_Click(object sender, RoutedEventArgs e) => CancelRequested?.Invoke(); +} diff --git a/src/Kniip/Recording/RegionFrameWindow.cs b/src/Kniip/Recording/RegionFrameWindow.cs new file mode 100644 index 0000000..576ee84 --- /dev/null +++ b/src/Kniip/Recording/RegionFrameWindow.cs @@ -0,0 +1,62 @@ +using System; +using System.Windows; +using System.Windows.Media; +using Kniip.Interop; +using Rectangle = System.Drawing.Rectangle; +using Shape = System.Windows.Shapes.Rectangle; + +namespace Kniip.Recording; + +/// Rand net buiten het opnamegebied; klikken gaan erdoorheen en hij komt niet in de opname. +internal sealed class RegionFrameWindow : Window +{ + private const double ThicknessDip = 2; + + private static readonly Brush ReadyBrush = Freeze(new SolidColorBrush(Color.FromRgb(0x00, 0x67, 0xC0))); + private static readonly Brush RecordingBrush = Freeze(new SolidColorBrush(Color.FromRgb(0xE8, 0x11, 0x23))); + + private readonly Rectangle _region; + private readonly Shape _frame = new() { StrokeDashArray = new DoubleCollection { 4, 2 } }; + + public RegionFrameWindow(Rectangle region) + { + _region = region; + WindowStyle = WindowStyle.None; + AllowsTransparency = true; + Background = Brushes.Transparent; + ResizeMode = ResizeMode.NoResize; + ShowInTaskbar = false; + ShowActivated = false; + Topmost = true; + Content = _frame; + SetRecording(false); + + SourceInitialized += (_, _) => + { + IntPtr hwnd = PhysicalWindow.Handle(this); + NativeMethods.AddExtendedStyle(hwnd, + NativeMethods.WS_EX_TRANSPARENT | NativeMethods.WS_EX_TOOLWINDOW | NativeMethods.WS_EX_NOACTIVATE); + PhysicalWindow.ExcludeFromCapture(this); + UpdatePlacement(); + }; + DpiChanged += (_, _) => UpdatePlacement(); + } + + public void SetRecording(bool recording) => _frame.Stroke = recording ? RecordingBrush : ReadyBrush; + + private void UpdatePlacement() + { + double scale = PhysicalWindow.Scale(this); + int border = (int)Math.Ceiling(ThicknessDip * scale); + _frame.StrokeThickness = border / scale; + Rectangle outer = _region; + outer.Inflate(border, border); + PhysicalWindow.Place(this, outer); + } + + private static Brush Freeze(Brush brush) + { + brush.Freeze(); + return brush; + } +} diff --git a/src/Kniip/Recording/RegionSelectorWindow.xaml b/src/Kniip/Recording/RegionSelectorWindow.xaml new file mode 100644 index 0000000..615bd01 --- /dev/null +++ b/src/Kniip/Recording/RegionSelectorWindow.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/Kniip/Recording/RegionSelectorWindow.xaml.cs b/src/Kniip/Recording/RegionSelectorWindow.xaml.cs new file mode 100644 index 0000000..3b6590b --- /dev/null +++ b/src/Kniip/Recording/RegionSelectorWindow.xaml.cs @@ -0,0 +1,187 @@ +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Input; +using System.Windows.Media; +using Rectangle = System.Drawing.Rectangle; +using Screen = System.Windows.Forms.Screen; + +namespace Kniip.Recording; + +/// +/// Overlay over één beeldscherm om het opnamegebied te kiezen. Er staat er één per scherm; +/// een gebied ligt daardoor altijd binnen één scherm. +/// +public partial class RegionSelectorWindow : Window +{ + private const double DragThreshold = 4; + private const int MinimumSize = 16; + + private readonly Screen _screen; + private readonly IReadOnlyList _windows; + private Point? _dragStart; + private bool _dragging; + private Rectangle? _hover; + + /// Gekozen gebied, of null bij annuleren. + internal event Action? Finished; + + internal RegionSelectorWindow(Screen screen, IReadOnlyList windows) + { + InitializeComponent(); + _screen = screen; + _windows = windows; + SourceInitialized += (_, _) => PhysicalWindow.Place(this, screen.Bounds); + Loaded += (_, _) => ShowSelection(null); + MouseLeave += (_, _) => + { + if (!_dragging) + { + _hover = null; + ShowSelection(null); + } + }; + } + + public bool ContainsCursor(System.Drawing.Point cursor) => _screen.Bounds.Contains(cursor); + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + Point position = e.GetPosition(this); + if (_dragStart is Point start && e.LeftButton == MouseButtonState.Pressed) + { + if (!_dragging && (position - start).Length >= DragThreshold) + { + _dragging = true; + } + + if (_dragging) + { + ShowSelection(ToPhysical(new Rect(start, position))); + } + + return; + } + + _hover = FindWindowAt(ToPhysical(position)); + ShowSelection(_hover); + } + + protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) + { + base.OnMouseLeftButtonDown(e); + _dragStart = e.GetPosition(this); + _dragging = false; + CaptureMouse(); + } + + protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) + { + base.OnMouseLeftButtonUp(e); + ReleaseMouseCapture(); + if (_dragStart is not Point start) + { + return; + } + + _dragStart = null; + if (_dragging) + { + _dragging = false; + Rectangle area = ToPhysical(new Rect(start, e.GetPosition(this))); + if (area.Width >= MinimumSize && area.Height >= MinimumSize) + { + Finish(area); + } + + return; + } + + Finish(_hover ?? _screen.Bounds); + } + + protected override void OnMouseRightButtonUp(MouseButtonEventArgs e) + { + base.OnMouseRightButtonUp(e); + Finished?.Invoke(null); + } + + protected override void OnKeyDown(KeyEventArgs e) + { + base.OnKeyDown(e); + if (e.Key == Key.Escape) + { + Finished?.Invoke(null); + } + else if (e.Key == Key.Enter) + { + Finish(_screen.Bounds); + } + } + + private void Finish(Rectangle area) => + Finished?.Invoke(RecordingRegion.Create(_screen.DeviceName, area, _screen.Bounds)); + + private Rectangle? FindWindowAt(System.Drawing.Point point) + { + foreach (Rectangle window in _windows) + { + if (window.Contains(point)) + { + Rectangle clipped = Rectangle.Intersect(window, _screen.Bounds); + return clipped.IsEmpty ? null : clipped; + } + } + + return null; + } + + private double ScaleFactor => PhysicalWindow.Scale(this); + + private System.Drawing.Point ToPhysical(Point dip) => + new(_screen.Bounds.X + (int)Math.Round(dip.X * ScaleFactor), _screen.Bounds.Y + (int)Math.Round(dip.Y * ScaleFactor)); + + private Rectangle ToPhysical(Rect dip) + { + System.Drawing.Point topLeft = ToPhysical(dip.TopLeft); + System.Drawing.Point bottomRight = ToPhysical(dip.BottomRight); + return Rectangle.FromLTRB(topLeft.X, topLeft.Y, bottomRight.X, bottomRight.Y); + } + + private Rect ToDip(Rectangle physical) + { + double scale = ScaleFactor; + return new Rect((physical.X - _screen.Bounds.X) / scale, (physical.Y - _screen.Bounds.Y) / scale, + physical.Width / scale, physical.Height / scale); + } + + private void ShowSelection(Rectangle? physical) + { + var full = new Rect(0, 0, ActualWidth, ActualHeight); + if (physical is not Rectangle area || area.IsEmpty) + { + Dim.Data = new RectangleGeometry(full); + SelectionRect.Visibility = Visibility.Collapsed; + SizeBadge.Visibility = Visibility.Collapsed; + return; + } + + Rect rect = ToDip(area); + var geometry = new GeometryGroup { FillRule = FillRule.EvenOdd }; + geometry.Children.Add(new RectangleGeometry(full)); + geometry.Children.Add(new RectangleGeometry(rect)); + Dim.Data = geometry; + + SelectionRect.Margin = new Thickness(rect.X, rect.Y, 0, 0); + SelectionRect.Width = rect.Width; + SelectionRect.Height = rect.Height; + SelectionRect.Visibility = Visibility.Visible; + + SizeText.Text = $"{area.Width & ~1} × {area.Height & ~1}"; + SizeBadge.Visibility = Visibility.Visible; + SizeBadge.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); + double badgeTop = rect.Y - SizeBadge.DesiredSize.Height - 4; + SizeBadge.Margin = new Thickness(rect.X, badgeTop < 0 ? rect.Y + 4 : badgeTop, 0, 0); + } +} diff --git a/src/Kniip/Recording/ScreencastWindow.xaml b/src/Kniip/Recording/ScreencastWindow.xaml new file mode 100644 index 0000000..6e63165 --- /dev/null +++ b/src/Kniip/Recording/ScreencastWindow.xaml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Kniip/Recording/ScreencastWindow.xaml.cs b/src/Kniip/Recording/ScreencastWindow.xaml.cs new file mode 100644 index 0000000..bbba9cc --- /dev/null +++ b/src/Kniip/Recording/ScreencastWindow.xaml.cs @@ -0,0 +1,678 @@ +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Threading; +using Kniip.Editor; +using Kniip.Settings; +using Kniip.Upload; +using Microsoft.Win32; + +namespace Kniip.Recording; + +/// Nabewerking van een screencast: bekijken, begin en einde inkorten en opslaan als MP4 of GIF. +public partial class ScreencastWindow : Window +{ + private static readonly TimeSpan MinimumLength = TimeSpan.FromMilliseconds(200); + private static readonly int[] FpsChoices = { 5, 10, 15, 20, 25 }; + private static readonly int[] WidthChoices = { 0, 1920, 1280, 960, 800, 640, 480 }; + + private enum DragTarget + { + None, + Start, + End, + Playhead + } + + private readonly string _path; + private readonly AppSettings _settings; + private readonly DispatcherTimer _playTimer = new() { Interval = TimeSpan.FromMilliseconds(40) }; + private TimeSpan _duration; + private TimeSpan _start; + private TimeSpan _end; + private bool _playing; + private bool _loaded; + private DragTarget _drag; + private CancellationTokenSource? _export; + private bool _kept; + private string? _lastSaved; + + internal ScreencastWindow(string path, AppSettings settings, ScreencastFormat? format = null) + { + InitializeComponent(); + _path = path; + _settings = settings; + + int[] fpsChoices = FpsChoices.Contains(settings.GifFps) ? FpsChoices : FpsChoices.Append(settings.GifFps).Order().ToArray(); + foreach (int fps in fpsChoices) + { + AddChoice(FpsCombo, fps.ToString(CultureInfo.CurrentCulture), fps, fps == settings.GifFps); + } + + int[] widths = WidthChoices.Contains(settings.GifMaxWidth) + ? WidthChoices + : WidthChoices.Append(settings.GifMaxWidth).OrderByDescending(w => w == 0 ? int.MaxValue : w).ToArray(); + foreach (int width in widths) + { + AddChoice(WidthCombo, width == 0 ? "Origineel" : $"{width} px", width, width == settings.GifMaxWidth); + } + + FpsCombo.SelectionChanged += (_, _) => UpdateInfo(); + WidthCombo.SelectionChanged += (_, _) => UpdateInfo(); + SetFormat(format ?? settings.LastScreencastFormat); + + _playTimer.Tick += (_, _) => OnPlayTick(); + Player.Source = new Uri(path); + Player.Play(); + } + + private static void AddChoice(ComboBox combo, string text, int value, bool selected) + { + var item = new ComboBoxItem { Content = text, Tag = value }; + combo.Items.Add(item); + if (selected) + { + combo.SelectedItem = item; + } + } + + private ScreencastFormat Format => GifToggle.IsChecked == true ? ScreencastFormat.Gif : ScreencastFormat.Mp4; + + private int GifFps => FpsCombo.SelectedItem is ComboBoxItem { Tag: int fps } ? fps : 10; + + private int GifWidth => WidthCombo.SelectedItem is ComboBoxItem { Tag: int width } ? width : 800; + + private bool IsBusy => _export != null; + + // ---------- Afspelen ---------- + + private void Player_MediaOpened(object sender, RoutedEventArgs e) + { + Player.Pause(); + _duration = Player.NaturalDuration.HasTimeSpan ? Player.NaturalDuration.TimeSpan : TimeSpan.Zero; + _start = TimeSpan.Zero; + _end = _duration; + _loaded = true; + Player.Position = TimeSpan.Zero; + PlayerMessage.Visibility = Visibility.Collapsed; + UpdateTrim(); + UpdateInfo(); + } + + private void Player_MediaFailed(object? sender, ExceptionRoutedEventArgs e) + { + PlayerMessage.Text = "Het voorbeeld kan niet worden afgespeeld (" + e.ErrorException.Message + ").\n" + + "Opslaan werkt wel; inkorten is dan niet mogelijk."; + PlayerMessage.Visibility = Visibility.Visible; + _loaded = false; + using var reader = TryOpenReader(); + _duration = reader?.Duration ?? TimeSpan.Zero; + _start = TimeSpan.Zero; + _end = _duration; + UpdateTrim(); + UpdateInfo(); + } + + private VideoFrameReader? TryOpenReader() + { + try + { + return new VideoFrameReader(_path); + } + catch (Exception) + { + return null; + } + } + + private void Player_MediaEnded(object sender, RoutedEventArgs e) => SetPlaying(false); + + private void Play_Click(object sender, RoutedEventArgs e) => TogglePlay(); + + private void Video_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) => TogglePlay(); + + protected override void OnPreviewKeyDown(KeyEventArgs e) + { + base.OnPreviewKeyDown(e); + if (e.Key == Key.Space && Keyboard.FocusedElement is not ComboBox) + { + TogglePlay(); + e.Handled = true; + } + } + + private void TogglePlay() + { + if (!_loaded) + { + return; + } + + if (_playing) + { + SetPlaying(false); + return; + } + + TimeSpan position = Player.Position; + if (position < _start || position >= _end - TimeSpan.FromMilliseconds(50)) + { + Player.Position = _start; + } + + SetPlaying(true); + } + + private void SetPlaying(bool playing) + { + _playing = playing; + if (playing) + { + Player.Play(); + _playTimer.Start(); + } + else + { + Player.Pause(); + _playTimer.Stop(); + } + + PlayIcon.Text = playing ? "\uE769" : "\uE768"; + UpdatePlayhead(); + } + + private void OnPlayTick() + { + if (Player.Position >= _end) + { + SetPlaying(false); + Player.Position = _end; + } + + UpdatePlayhead(); + } + + private void Seek(TimeSpan time) + { + Player.Position = Clamp(time, TimeSpan.Zero, _duration); + UpdatePlayhead(); + } + + // ---------- Inkortbalk ---------- + + private double HandleWidth => StartHandle.Width; + + private double TrackWidth => Math.Max(1, TrimArea.ActualWidth - 2 * HandleWidth); + + private double ToX(TimeSpan time) => + HandleWidth + (_duration.Ticks == 0 ? 0 : TrackWidth * time.Ticks / _duration.Ticks); + + private TimeSpan ToTime(double x) => + _duration.Ticks == 0 ? TimeSpan.Zero : TimeSpan.FromTicks((long)(Math.Clamp((x - HandleWidth) / TrackWidth, 0, 1) * _duration.Ticks)); + + private void TrimArea_SizeChanged(object sender, SizeChangedEventArgs e) => UpdateTrim(); + + private void TrimArea_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (_duration == TimeSpan.Zero || IsBusy) + { + return; + } + + double x = e.GetPosition(TrimArea).X; + double startX = ToX(_start) - HandleWidth / 2; + double endX = ToX(_end) + HandleWidth / 2; + if (Math.Abs(x - startX) <= HandleWidth) + { + _drag = DragTarget.Start; + } + else if (Math.Abs(x - endX) <= HandleWidth) + { + _drag = DragTarget.End; + } + else + { + _drag = DragTarget.Playhead; + } + + if (_drag != DragTarget.Playhead) + { + SetPlaying(false); + } + + TrimArea.CaptureMouse(); + ApplyDrag(x); + e.Handled = true; + } + + private void TrimArea_MouseMove(object sender, MouseEventArgs e) + { + if (_drag != DragTarget.None) + { + ApplyDrag(e.GetPosition(TrimArea).X); + } + } + + private void TrimArea_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + _drag = DragTarget.None; + TrimArea.ReleaseMouseCapture(); + } + + private void ApplyDrag(double x) + { + switch (_drag) + { + case DragTarget.Start: + _start = Clamp(ToTime(x + HandleWidth / 2), TimeSpan.Zero, _end - MinimumLength); + Seek(_start); + break; + case DragTarget.End: + _end = Clamp(ToTime(x - HandleWidth / 2), _start + MinimumLength, _duration); + Seek(_end); + break; + case DragTarget.Playhead: + Seek(ToTime(x)); + break; + } + + UpdateTrim(); + } + + private void SetStart_Click(object sender, RoutedEventArgs e) + { + _start = Clamp(Player.Position, TimeSpan.Zero, _end - MinimumLength); + UpdateTrim(); + } + + private void SetEnd_Click(object sender, RoutedEventArgs e) + { + _end = Clamp(Player.Position, _start + MinimumLength, _duration); + UpdateTrim(); + } + + private static TimeSpan Clamp(TimeSpan value, TimeSpan min, TimeSpan max) => + max < min ? min : value < min ? min : value > max ? max : value; + + private void UpdateTrim() + { + double height = TrimArea.ActualHeight; + TrackBorder.Width = Math.Max(0, TrimArea.ActualWidth); + TrackBorder.Height = height; + + double startX = ToX(_start); + double endX = ToX(_end); + Canvas.SetLeft(StartHandle, startX - HandleWidth); + Canvas.SetLeft(EndHandle, endX); + Canvas.SetLeft(SelectionBorder, startX); + SelectionBorder.Width = Math.Max(0, endX - startX); + + SelectionText.Text = $"Selectie {FormatTime(_start)} – {FormatTime(_end)} · {(_end - _start).TotalSeconds:0.0} s"; + UpdatePlayhead(); + UpdateInfo(); + } + + private void UpdatePlayhead() + { + TimeSpan position = _loaded ? Player.Position : TimeSpan.Zero; + Canvas.SetLeft(Playhead, ToX(position) - Playhead.Width / 2); + PositionText.Text = $"{FormatTime(position)} / {FormatTime(_duration)}"; + } + + private static string FormatTime(TimeSpan time) => + time.TotalHours >= 1 + ? time.ToString(@"h\:mm\:ss\.f", CultureInfo.InvariantCulture) + : time.ToString(@"m\:ss\.f", CultureInfo.InvariantCulture); + + // ---------- Formaat en opslaan ---------- + + private void Format_Click(object sender, RoutedEventArgs e) => + SetFormat(ReferenceEquals(sender, GifToggle) ? ScreencastFormat.Gif : ScreencastFormat.Mp4); + + private void SetFormat(ScreencastFormat format) + { + Mp4Toggle.IsChecked = format == ScreencastFormat.Mp4; + GifToggle.IsChecked = format == ScreencastFormat.Gif; + GifOptions.Visibility = format == ScreencastFormat.Gif ? Visibility.Visible : Visibility.Collapsed; + bool copy = _settings.SaveButton == SaveButtonChoice.SaveAndCopy; + string ellipsis = string.IsNullOrEmpty(_settings.VideoSaveFolder) ? "..." : string.Empty; + string action = copy ? "Opslaan en kopiëren als " : "Opslaan als "; + SaveText.Text = action + (format == ScreencastFormat.Gif ? "GIF" : "MP4") + ellipsis; + SaveButton.ToolTip = copy + ? "Slaat op en kopieert het bestand naar het klembord. Shift+klik = altijd vragen waar je opslaat." + : "Shift+klik = altijd vragen waar je opslaat"; + UploadButton.Visibility = _settings.Uploader is { IsConfigured: true } ? Visibility.Visible : Visibility.Collapsed; + UpdateInfo(); + } + + protected override void OnActivated(EventArgs e) + { + base.OnActivated(e); + SetFormat(Format); + } + + private void UpdateInfo() + { + int width = _loaded ? Player.NaturalVideoWidth : 0; + int height = _loaded ? Player.NaturalVideoHeight : 0; + string size = width > 0 ? $"{width} × {height} px" : string.Empty; + if (Format == ScreencastFormat.Gif) + { + int gifWidth = GifWidth; + if (width > 0 && gifWidth > 0 && gifWidth < width) + { + size = $"{gifWidth} × {(int)Math.Round(height * (double)gifWidth / width)} px"; + } + + string warning = (_end - _start).TotalSeconds > 30 ? " · lange GIF's worden groot; overweeg MP4" : string.Empty; + InfoText.Text = $"{size} · GIF bevat geen geluid{warning}"; + } + else + { + string audio = _loaded ? (Player.HasAudio ? "met geluid" : "zonder geluid") : string.Empty; + InfoText.Text = string.Join(" · ", new[] { size, audio }.Where(s => s.Length > 0)); + } + } + + private string DefaultFileName => + $"Screencast {DateTime.Now:yyyy-MM-dd HHmmss}{(Format == ScreencastFormat.Gif ? ".gif" : ".mp4")}"; + + private static string DefaultFolder => + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos), "kniip"); + + private async void Save_Click(object sender, RoutedEventArgs e) + { + if (IsBusy) + { + return; + } + + SetPlaying(false); + bool ask = Keyboard.Modifiers.HasFlag(ModifierKeys.Shift); + string? target = ask ? null : FixedTarget(); + if (target is null) + { + target = AskTarget(); + if (target is null) + { + return; + } + + _settings.LastVideoFolder = Path.GetDirectoryName(target); + } + + if (await ExportAsync(target)) + { + _kept = true; + RememberChoices(); + bool copy = _settings.SaveButton == SaveButtonChoice.SaveAndCopy; + bool copied = !copy || ClipboardWriter.SetFile(target); + App.Instance.ShowBalloon(copy && copied ? "Screencast opgeslagen en gekopieerd" : "Screencast opgeslagen", target); + if (!copied) + { + MessageBox.Show(this, "Het bestand is opgeslagen, maar kopiëren naar het klembord is mislukt. Het klembord is bezet.", + "kniip", MessageBoxButton.OK, MessageBoxImage.Warning); + } + + Close(); + } + } + + private string? FixedTarget() + { + if (_settings.VideoSaveFolder is not { Length: > 0 } folder) + { + return null; + } + + try + { + Directory.CreateDirectory(folder); + return SaveLocation.UniquePath(folder, DefaultFileName); + } + catch (Exception ex) + { + MessageBox.Show(this, $"De opslagmap uit de instellingen is niet bruikbaar:\n{folder}\n\n{ex.Message}\n\nKies zelf waar je de screencast opslaat.", + "kniip", MessageBoxButton.OK, MessageBoxImage.Warning); + return null; + } + } + + private string? AskTarget() + { + string folder = _settings.LastVideoFolder is { } last && Directory.Exists(last) ? last : DefaultFolder; + Directory.CreateDirectory(folder); + bool gif = Format == ScreencastFormat.Gif; + var dialog = new SaveFileDialog + { + Title = "Screencast opslaan", + Filter = gif ? "GIF-animatie (*.gif)|*.gif" : "MP4-video (*.mp4)|*.mp4", + FileName = DefaultFileName, + InitialDirectory = folder, + AddExtension = true + }; + return dialog.ShowDialog(this) == true ? dialog.FileName : null; + } + + private async void Copy_Click(object sender, RoutedEventArgs e) + { + if (IsBusy) + { + return; + } + + SetPlaying(false); + string folder = Path.Combine(RecordingSession.TempFolder, "Kopieën", Guid.NewGuid().ToString("N")[..8]); + string target = Path.Combine(folder, DefaultFileName); + if (await ExportAsync(target)) + { + if (!ClipboardWriter.SetFile(target)) + { + MessageBox.Show(this, "Kopiëren is mislukt: het klembord is bezet. Probeer het opnieuw.", + "kniip", MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + + _kept = true; + RememberChoices(); + SavedRun.Text = $"{Path.GetFileName(target)} staat op het klembord; plak het waar je wilt. "; + OpenRun.Text = "Map openen"; + _lastSaved = target; + SavedText.Visibility = Visibility.Visible; + } + } + + private async void Upload_Click(object sender, RoutedEventArgs e) + { + if (IsBusy || _settings.Uploader is not { IsConfigured: true } config) + { + return; + } + + SetPlaying(false); + string folder = Path.Combine(RecordingSession.TempFolder, "Uploads", Guid.NewGuid().ToString("N")[..8]); + string target = Path.Combine(folder, DefaultFileName); + if (!await ExportAsync(target)) + { + return; + } + + _export = new CancellationTokenSource(); + SetBusy(true); + var progress = new Progress(value => Progress.Value = value * 100); + try + { + string url; + await using (FileStream stream = File.OpenRead(target)) + { + string contentType = Format == ScreencastFormat.Gif ? "image/gif" : "video/mp4"; + url = await ZiplineUploader.UploadAsync(config, stream, Path.GetFileName(target), contentType, progress, _export.Token); + } + + _kept = true; + RememberChoices(); + bool copied = ClipboardWriter.SetText(url); + SavedRun.Text = copied ? $"Geüpload; de link staat op het klembord: {url} " : $"Geüpload: {url} "; + OpenRun.Text = "Link openen"; + _lastSaved = url; + SavedText.Visibility = Visibility.Visible; + } + catch (OperationCanceledException) + { + } + catch (Exception ex) + { + MessageBox.Show(this, $"Uploaden is mislukt.\n\n{ex.Message}", "kniip", MessageBoxButton.OK, MessageBoxImage.Warning); + } + finally + { + _export.Dispose(); + _export = null; + SetBusy(false); + try + { + Directory.Delete(folder, recursive: true); + } + catch (Exception) + { + // Blijft in de tijdelijke map staan; die wordt bij de volgende start opgeruimd. + } + } + } + + private void RememberChoices() + { + _settings.LastScreencastFormat = Format; + _settings.GifFps = GifFps; + _settings.GifMaxWidth = GifWidth; + SettingsStore.Save(_settings); + } + + private async Task ExportAsync(string target) + { + _export = new CancellationTokenSource(); + SetBusy(true); + var progress = new Progress(value => Progress.Value = value * 100); + try + { + if (Format == ScreencastFormat.Gif) + { + await GifExporter.ExportAsync(_path, target, _start, _end, GifFps, GifWidth, progress, _export.Token); + } + else + { + await VideoExporter.TrimMp4Async(_path, target, _start, _end, _duration, progress, _export.Token); + } + + return true; + } + catch (OperationCanceledException) + { + return false; + } + catch (Exception ex) + { + MessageBox.Show(this, $"Opslaan is mislukt.\n\n{ex.Message}", "kniip", MessageBoxButton.OK, MessageBoxImage.Warning); + return false; + } + finally + { + _export.Dispose(); + _export = null; + SetBusy(false); + } + } + + private void SetBusy(bool busy) + { + BusyPanel.Visibility = busy ? Visibility.Visible : Visibility.Collapsed; + Progress.Value = 0; + SaveButton.IsEnabled = !busy; + CopyButton.IsEnabled = !busy; + UploadButton.IsEnabled = !busy; + Mp4Toggle.IsEnabled = !busy; + GifToggle.IsEnabled = !busy; + GifOptions.IsEnabled = !busy; + Cursor = busy ? Cursors.AppStarting : null; + } + + private void CancelExport_Click(object sender, RoutedEventArgs e) => _export?.Cancel(); + + private void OpenFolder_Click(object sender, RoutedEventArgs e) + { + if (_lastSaved == null) + { + return; + } + + try + { + ProcessStartInfo info = Uri.TryCreate(_lastSaved, UriKind.Absolute, out Uri? uri) && uri.Scheme.StartsWith("http", StringComparison.Ordinal) + ? new ProcessStartInfo(uri.AbsoluteUri) { UseShellExecute = true } + : new ProcessStartInfo("explorer.exe", $"/select,\"{_lastSaved}\"") { UseShellExecute = true }; + Process.Start(info); + } + catch (Exception) + { + // Verkenner openen is een extraatje. + } + } + + // ---------- Sluiten ---------- + + protected override void OnClosing(CancelEventArgs e) + { + base.OnClosing(e); + if (IsBusy) + { + _export?.Cancel(); + e.Cancel = true; + return; + } + + if (!_kept && MessageBox.Show(this, "Deze opname is nog niet opgeslagen of gekopieerd. Weggooien?", "kniip", + MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) != MessageBoxResult.Yes) + { + e.Cancel = true; + } + } + + protected override void OnClosed(EventArgs e) + { + base.OnClosed(e); + _playTimer.Stop(); + Player.Close(); + DeleteLater(_path, attempts: 5); + } + + /// De mediaspeler laat het bestand soms nog even vast; daarom een paar keer proberen. + private static void DeleteLater(string path, int attempts) + { + try + { + File.Delete(path); + } + catch (IOException) when (attempts > 1) + { + var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; + timer.Tick += (_, _) => + { + timer.Stop(); + DeleteLater(path, attempts - 1); + }; + timer.Start(); + } + catch (Exception) + { + // Blijft in de tijdelijke map staan; die wordt bij de volgende start opgeruimd. + } + } +} diff --git a/src/Kniip/Recording/VideoExporter.cs b/src/Kniip/Recording/VideoExporter.cs new file mode 100644 index 0000000..32638eb --- /dev/null +++ b/src/Kniip/Recording/VideoExporter.cs @@ -0,0 +1,71 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Windows.Media.Editing; +using Windows.Media.MediaProperties; +using Windows.Media.Transcoding; +using Windows.Storage; + +namespace Kniip.Recording; + +/// MP4 inkorten via Windows.Media.Editing (zelfde resolutie, codec en geluid als de opname). +internal static class VideoExporter +{ + public static async Task TrimMp4Async(string source, string target, TimeSpan start, TimeSpan end, TimeSpan duration, + IProgress? progress, CancellationToken cancellationToken) + { + string folderPath = Path.GetDirectoryName(Path.GetFullPath(target))!; + Directory.CreateDirectory(folderPath); + + bool fullRange = start <= TimeSpan.FromMilliseconds(50) && end >= duration - TimeSpan.FromMilliseconds(50); + if (fullRange) + { + await Task.Run(() => File.Copy(source, target, overwrite: true), cancellationToken); + progress?.Report(1); + return; + } + + StorageFile input = await StorageFile.GetFileFromPathAsync(source); + MediaClip clip = await MediaClip.CreateFromFileAsync(input); + clip.TrimTimeFromStart = start; + clip.TrimTimeFromEnd = clip.OriginalDuration > end ? clip.OriginalDuration - end : TimeSpan.Zero; + var composition = new MediaComposition(); + composition.Clips.Add(clip); + + MediaEncodingProfile profile = await MediaEncodingProfile.CreateFromFileAsync(input); + if (profile.Video is { } video) + { + // Een opname van een stilstaand scherm heeft een lage gemiddelde bitrate; die zou beweging wazig maken. + uint minimum = (uint)Math.Min(20_000_000, video.Width * video.Height * 3L); + video.Bitrate = Math.Max(video.Bitrate, minimum); + } + + StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(folderPath); + StorageFile output = await folder.CreateFileAsync(Path.GetFileName(target), CreationCollisionOption.ReplaceExisting); + var percent = new Progress(value => progress?.Report(value / 100)); + try + { + TranscodeFailureReason result = await composition + .RenderToFileAsync(output, MediaTrimmingPreference.Precise, profile) + .AsTask(cancellationToken, percent); + if (result != TranscodeFailureReason.None) + { + throw new InvalidOperationException($"Windows kon de video niet opslaan ({result})."); + } + } + catch + { + try + { + File.Delete(target); + } + catch (Exception) + { + // Half bestand laten staan is beter dan de oorspronkelijke fout verbergen. + } + + throw; + } + } +} diff --git a/src/Kniip/Recording/VideoFrameReader.cs b/src/Kniip/Recording/VideoFrameReader.cs new file mode 100644 index 0000000..a4902a1 --- /dev/null +++ b/src/Kniip/Recording/VideoFrameReader.cs @@ -0,0 +1,325 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Threading; + +namespace Kniip.Recording; + +/// Een gedecodeerd videoframe in BGRA (32 bits per pixel, van boven naar onder). +internal sealed record VideoFrame(byte[] Pixels, int Width, int Height, TimeSpan Time); + +/// +/// Leest frames verliesvrij uit een video via de Media Foundation Source Reader +/// (met de ingebouwde omzetting naar RGB32). +/// +internal sealed class VideoFrameReader : IDisposable +{ + private const uint MfVersion = 0x00020070; + private const int FirstVideoStream = unchecked((int)0xFFFFFFFC); + private const int AllStreams = unchecked((int)0xFFFFFFFE); + private const int MediaSource = unchecked((int)0xFFFFFFFF); + private const int EndOfStream = 0x2; + private const ushort VtI8 = 20; + + private static readonly Guid MfSourceReaderEnableAdvancedVideoProcessing = new("0f81da2c-b537-4672-a8b2-a681b17307a3"); + private static readonly Guid MfMtMajorType = new("48eba18e-f8c9-4687-bf11-0a74c9f96a8f"); + private static readonly Guid MfMtSubtype = new("f7e34c9a-42e8-4714-b74b-cb29d72c35e5"); + private static readonly Guid MfMtFrameSize = new("1652c33d-d6b2-4012-b834-72030849a37d"); + private static readonly Guid MfMtDefaultStride = new("644b4e48-1e02-4516-b0eb-c01ca9d49ac6"); + private static readonly Guid MfMtMinimumDisplayAperture = new("d7388766-18fe-48c6-a177-ee894867c8c4"); + private static readonly Guid MfPdDuration = new("6c990d33-bb8e-477a-8598-0d5d96fcd88a"); + private static readonly Guid MfMediaTypeVideo = new("73646976-0000-0010-8000-00AA00389B71"); + private static readonly Guid MfVideoFormatRgb32 = new("00000016-0000-0010-8000-00AA00389B71"); + + private readonly IMFSourceReader _reader; + private readonly int _bufferWidth; + private readonly int _bufferHeight; + private readonly int _stride; + private readonly int _cropX; + private readonly int _cropY; + + public VideoFrameReader(string path) + { + Check(MFStartup(MfVersion, 0)); + Check(MFCreateAttributes(out IMFAttributes attributes, 1)); + try + { + Guid key = MfSourceReaderEnableAdvancedVideoProcessing; + attributes.SetUINT32(ref key, 1); + Check(MFCreateSourceReaderFromURL(path, attributes, out _reader)); + } + finally + { + Marshal.ReleaseComObject(attributes); + } + + _reader.SetStreamSelection(AllStreams, false); + _reader.SetStreamSelection(FirstVideoStream, true); + + _reader.GetNativeMediaType(FirstVideoStream, 0, out IMFMediaType native); + (int apertureX, int apertureY, int apertureWidth, int apertureHeight)? aperture = ReadAperture(native); + Marshal.ReleaseComObject(native); + + Check(MFCreateMediaType(out IMFMediaType requested)); + try + { + Guid major = MfMtMajorType, video = MfMediaTypeVideo, subtype = MfMtSubtype, rgb32 = MfVideoFormatRgb32; + requested.SetGUID(ref major, ref video); + requested.SetGUID(ref subtype, ref rgb32); + _reader.SetCurrentMediaType(FirstVideoStream, IntPtr.Zero, requested); + } + finally + { + Marshal.ReleaseComObject(requested); + } + + _reader.GetCurrentMediaType(FirstVideoStream, out IMFMediaType current); + try + { + Guid frameSize = MfMtFrameSize; + current.GetUINT64(ref frameSize, out long packed); + _bufferWidth = (int)(packed >> 32); + _bufferHeight = (int)(packed & 0xFFFFFFFF); + + Guid strideKey = MfMtDefaultStride; + _stride = current.GetUINT32(ref strideKey, out int stride) == 0 ? stride : _bufferWidth * 4; + aperture ??= ReadAperture(current); + } + finally + { + Marshal.ReleaseComObject(current); + } + + Width = _bufferWidth; + Height = _bufferHeight; + if (aperture is var (x, y, w, h) && w > 0 && h > 0 && x + w <= _bufferWidth && y + h <= _bufferHeight) + { + _cropX = x; + _cropY = y; + Width = w; + Height = h; + } + + var key2 = MfPdDuration; + if (_reader.GetPresentationAttribute(MediaSource, ref key2, out PropVariant duration) == 0) + { + Duration = TimeSpan.FromTicks(duration.Value); + } + } + + public int Width { get; } + + public int Height { get; } + + public TimeSpan Duration { get; } + + /// Alle frames vanaf (ongeveer) ; het eerste frame kan iets eerder liggen. + public IEnumerable ReadFrames(TimeSpan from, CancellationToken cancellationToken) + { + var position = new PropVariant { Type = VtI8, Value = Math.Max(0, from.Ticks) }; + Guid timeFormat = Guid.Empty; + _reader.SetCurrentPosition(ref timeFormat, ref position); + + while (true) + { + cancellationToken.ThrowIfCancellationRequested(); + _reader.ReadSample(FirstVideoStream, 0, out _, out int flags, out long timestamp, out IMFSample? sample); + if (sample == null) + { + if ((flags & EndOfStream) != 0) + { + yield break; + } + + continue; + } + + byte[] pixels; + try + { + pixels = CopyPixels(sample); + } + finally + { + Marshal.ReleaseComObject(sample); + } + + yield return new VideoFrame(pixels, Width, Height, TimeSpan.FromTicks(timestamp)); + if ((flags & EndOfStream) != 0) + { + yield break; + } + } + } + + private byte[] CopyPixels(IMFSample sample) + { + sample.ConvertToContiguousBuffer(out IMFMediaBuffer buffer); + try + { + buffer.Lock(out IntPtr data, out _, out int length); + try + { + int stride = Math.Abs(_stride); + bool bottomUp = _stride < 0; + int rowBytes = Width * 4; + var pixels = new byte[rowBytes * Height]; + for (int row = 0; row < Height; row++) + { + int sourceRow = _cropY + row; + if (bottomUp) + { + sourceRow = _bufferHeight - 1 - sourceRow; + } + + long offset = (long)sourceRow * stride + _cropX * 4; + if (offset + rowBytes > length) + { + break; + } + + Marshal.Copy(data + (int)offset, pixels, row * rowBytes, rowBytes); + } + + return pixels; + } + finally + { + buffer.Unlock(); + } + } + finally + { + Marshal.ReleaseComObject(buffer); + } + } + + private static (int, int, int, int)? ReadAperture(IMFMediaType type) + { + Guid key = MfMtMinimumDisplayAperture; + var blob = new byte[16]; + if (type.GetBlob(ref key, blob, blob.Length, out int size) != 0 || size < 16) + { + return null; + } + + // MFVideoArea: twee MFOffset's (fract ushort + value short) en een SIZE. + int x = BitConverter.ToInt16(blob, 2); + int y = BitConverter.ToInt16(blob, 6); + int width = BitConverter.ToInt32(blob, 8); + int height = BitConverter.ToInt32(blob, 12); + return (x, y, width, height); + } + + private static void Check(int hr) + { + if (hr < 0) + { + Marshal.ThrowExceptionForHR(hr); + } + } + + public void Dispose() + { + Marshal.ReleaseComObject(_reader); + MFShutdown(); + } + + [DllImport("mfplat.dll")] + private static extern int MFStartup(uint version, uint flags); + + [DllImport("mfplat.dll")] + private static extern int MFShutdown(); + + [DllImport("mfplat.dll")] + private static extern int MFCreateAttributes(out IMFAttributes attributes, uint initialSize); + + [DllImport("mfplat.dll")] + private static extern int MFCreateMediaType(out IMFMediaType mediaType); + + [DllImport("mfreadwrite.dll")] + private static extern int MFCreateSourceReaderFromURL([MarshalAs(UnmanagedType.LPWStr)] string url, + IMFAttributes attributes, out IMFSourceReader reader); + + [StructLayout(LayoutKind.Explicit, Size = 24)] + private struct PropVariant + { + [FieldOffset(0)] public ushort Type; + [FieldOffset(8)] public long Value; + } + + // De COM-interfaces hieronder volgen de vtable-volgorde van de Windows SDK; methoden die kniip niet + // gebruikt staan er als lege plaatshouder in zodat de volgorde klopt. + + [ComImport, Guid("2cd2d921-c447-44a7-a13c-4adabfc247e3"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IMFAttributes + { + void GetItem(); void GetItemType(); void CompareItem(); void Compare(); + [PreserveSig] int GetUINT32(ref Guid key, out int value); + [PreserveSig] int GetUINT64(ref Guid key, out long value); + void GetDouble(); void GetGUID(); void GetStringLength(); void GetString(); void GetAllocatedString(); + void GetBlobSize(); + [PreserveSig] int GetBlob(ref Guid key, [Out] byte[] buffer, int bufferSize, out int blobSize); + void GetAllocatedBlob(); void GetUnknown(); void SetItem(); void DeleteItem(); void DeleteAllItems(); + void SetUINT32(ref Guid key, int value); + void SetUINT64(); void SetDouble(); + void SetGUID(ref Guid key, ref Guid value); + void SetString(); void SetBlob(); void SetUnknown(); void LockStore(); void UnlockStore(); + void GetCount(); void GetItemByIndex(); void CopyAllItems(); + } + + [ComImport, Guid("44ae0fa8-ea31-4109-8d2e-4cae4997c555"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IMFMediaType + { + void GetItem(); void GetItemType(); void CompareItem(); void Compare(); + [PreserveSig] int GetUINT32(ref Guid key, out int value); + void GetUINT64(ref Guid key, out long value); + void GetDouble(); void GetGUID(); void GetStringLength(); void GetString(); void GetAllocatedString(); + void GetBlobSize(); + [PreserveSig] int GetBlob(ref Guid key, [Out] byte[] buffer, int bufferSize, out int blobSize); + void GetAllocatedBlob(); void GetUnknown(); void SetItem(); void DeleteItem(); void DeleteAllItems(); + void SetUINT32(ref Guid key, int value); + void SetUINT64(); void SetDouble(); + void SetGUID(ref Guid key, ref Guid value); + void SetString(); void SetBlob(); void SetUnknown(); void LockStore(); void UnlockStore(); + void GetCount(); void GetItemByIndex(); void CopyAllItems(); + void GetMajorType(); void IsCompressedFormat(); void IsEqual(); void GetRepresentation(); void FreeRepresentation(); + } + + [ComImport, Guid("c40a00f2-b93a-4d80-ae8c-5a1c634f58e4"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IMFSample + { + void GetItem(); void GetItemType(); void CompareItem(); void Compare(); void GetUINT32(); void GetUINT64(); + void GetDouble(); void GetGUID(); void GetStringLength(); void GetString(); void GetAllocatedString(); + void GetBlobSize(); void GetBlob(); void GetAllocatedBlob(); void GetUnknown(); void SetItem(); void DeleteItem(); + void DeleteAllItems(); void SetUINT32(); void SetUINT64(); void SetDouble(); void SetGUID(); void SetString(); + void SetBlob(); void SetUnknown(); void LockStore(); void UnlockStore(); void GetCount(); void GetItemByIndex(); + void CopyAllItems(); + void GetSampleFlags(); void SetSampleFlags(); void GetSampleTime(); void SetSampleTime(); void GetSampleDuration(); + void SetSampleDuration(); void GetBufferCount(); void GetBufferByIndex(); + void ConvertToContiguousBuffer(out IMFMediaBuffer buffer); + } + + [ComImport, Guid("045FA593-8799-42b8-BC8D-8968C6453507"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IMFMediaBuffer + { + void Lock(out IntPtr buffer, out int maxLength, out int currentLength); + void Unlock(); + } + + [ComImport, Guid("70ae66f2-c809-4e4f-8915-bdcb406b7993"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IMFSourceReader + { + void GetStreamSelection(); + void SetStreamSelection(int streamIndex, [MarshalAs(UnmanagedType.Bool)] bool selected); + void GetNativeMediaType(int streamIndex, int mediaTypeIndex, out IMFMediaType mediaType); + void GetCurrentMediaType(int streamIndex, out IMFMediaType mediaType); + void SetCurrentMediaType(int streamIndex, IntPtr reserved, IMFMediaType mediaType); + void SetCurrentPosition(ref Guid timeFormat, ref PropVariant position); + void ReadSample(int streamIndex, int controlFlags, out int actualStreamIndex, out int streamFlags, + out long timestamp, out IMFSample? sample); + void Flush(); + void GetServiceForStream(); + [PreserveSig] int GetPresentationAttribute(int streamIndex, ref Guid key, out PropVariant value); + } +} diff --git a/src/Kniip/Settings/AppSettings.cs b/src/Kniip/Settings/AppSettings.cs new file mode 100644 index 0000000..90afe46 --- /dev/null +++ b/src/Kniip/Settings/AppSettings.cs @@ -0,0 +1,103 @@ +using System.Collections.Generic; +using System.Windows.Controls; +using Kniip.Editor; +using Kniip.Upload; + +namespace Kniip.Settings; + +public enum CaptureAction +{ + /// Melding rechtsonder tonen; klikken opent de editor. + Notify, + + /// Editor direct openen. + OpenEditor, + + /// Niets doen (alleen handmatig openen via tray of "Openen met"). + Nothing +} + +public enum ScreencastFormat +{ + Mp4, + Gif +} + +public enum SaveButtonChoice +{ + /// Alleen het bestand opslaan. + SaveOnly, + + /// Bestand opslaan en naar het klembord kopiëren. + SaveAndCopy +} + +public sealed class AppSettings +{ + public bool WatchClipboard { get; set; } = true; + public bool WatchScreenshotsFolder { get; set; } = true; + public bool OnlyFromSnippingTool { get; set; } = true; + public CaptureAction Action { get; set; } = CaptureAction.Notify; + public bool StraightHighlight { get; set; } = true; + public ToolKind LastTool { get; set; } = ToolKind.Rectangle; + public string? LastSaveFolder { get; set; } + + /// Map waarin knipsels zonder te vragen worden opgeslagen; leeg betekent elke keer vragen. + public string? SnipSaveFolder { get; set; } + public Dictionary ToolStyles { get; set; } = new(); + + /// Recent gekozen emoji (codepunten), nieuwste eerst. + public List RecentEmoji { get; set; } = new(); + + /// Sneltoets voor een eigen rechthoekknipsel (zie HotkeyGesture); leeg betekent geen sneltoets. + public string SnipHotkey { get; set; } = "PrintScreen"; + + /// Sneltoets om een venster aan te klikken en te knippen. + public string WindowHotkey { get; set; } = "Alt+PrintScreen"; + + /// Sneltoets voor een screencast die als MP4 wordt aangeboden. + public string RecordHotkey { get; set; } = "Ctrl+Shift+R"; + + /// Sneltoets voor een screencast die als GIF wordt aangeboden. + public string GifHotkey { get; set; } = "Ctrl+Shift+G"; + public bool RecordSystemAudio { get; set; } = true; + public bool RecordMicrophone { get; set; } + public bool RecordShowCursor { get; set; } = true; + public bool RecordHighlightClicks { get; set; } = true; + public int RecordFps { get; set; } = 30; + public int GifFps { get; set; } = 10; + public int GifMaxWidth { get; set; } = 800; + public ScreencastFormat LastScreencastFormat { get; set; } = ScreencastFormat.Mp4; + public string? LastVideoFolder { get; set; } + + /// Map waarin screencasts zonder te vragen worden opgeslagen; leeg betekent elke keer vragen. + public string? VideoSaveFolder { get; set; } + + /// Gedrag van de knop Opslaan in de editor en de screencast. + public SaveButtonChoice SaveButton { get; set; } = SaveButtonChoice.SaveOnly; + + /// Rand van het editorvenster waar de werkbalk staat. + public Dock ToolbarPosition { get; set; } = Dock.Top; + + /// Vergrendeld: knoppen werken gewoon. Ontgrendeld: knoppen kunnen versleept worden. + public bool ToolbarLocked { get; set; } = true; + + /// Volgorde van de werkbalkitems (ItemId's); leeg betekent de standaardvolgorde. + public List ToolbarOrder { get; set; } = new(); + + public List ToolbarHidden { get; set; } = new(); + + /// Zipline-server waar Uploaden naartoe gaat; leeg betekent geen uploadknop. + public UploaderConfig? Uploader { get; set; } + + public StyleSet StyleFor(ToolKind tool) + { + if (!ToolStyles.TryGetValue(tool, out StyleSet? style)) + { + style = StyleSet.DefaultFor(tool); + ToolStyles[tool] = style; + } + + return style; + } +} diff --git a/src/Kniip/Settings/SaveLocation.cs b/src/Kniip/Settings/SaveLocation.cs new file mode 100644 index 0000000..58a9ec1 --- /dev/null +++ b/src/Kniip/Settings/SaveLocation.cs @@ -0,0 +1,20 @@ +using System.IO; + +namespace Kniip.Settings; + +public static class SaveLocation +{ + /// Pad in de map dat nog niet bestaat: "naam.png", anders "naam (2).png", "naam (3).png", ... + public static string UniquePath(string folder, string fileName) + { + string name = Path.GetFileNameWithoutExtension(fileName); + string extension = Path.GetExtension(fileName); + string path = Path.Combine(folder, fileName); + for (int i = 2; File.Exists(path); i++) + { + path = Path.Combine(folder, $"{name} ({i}){extension}"); + } + + return path; + } +} diff --git a/src/Kniip/Settings/SettingsStore.cs b/src/Kniip/Settings/SettingsStore.cs new file mode 100644 index 0000000..76f3465 --- /dev/null +++ b/src/Kniip/Settings/SettingsStore.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Windows.Media; + +namespace Kniip.Settings; + +public static class SettingsStore +{ + public static string Folder { get; } = + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Kniip"); + + private static string FilePath => Path.Combine(Folder, "settings.json"); + + /// Instellingen van voor de hernoeming van Knip+ naar kniip. + private static string LegacyFilePath => + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "KnipPlus", "settings.json"); + + private static readonly JsonSerializerOptions Options = new() + { + WriteIndented = true, + Converters = { new JsonStringEnumConverter(), new ColorJsonConverter() } + }; + + public static AppSettings Load() + { + try + { + if (!File.Exists(FilePath) && File.Exists(LegacyFilePath)) + { + Directory.CreateDirectory(Folder); + File.Copy(LegacyFilePath, FilePath); + } + + if (File.Exists(FilePath)) + { + return JsonSerializer.Deserialize(File.ReadAllText(FilePath), Options) ?? new AppSettings(); + } + } + catch (Exception) + { + // Beschadigd bestand: met standaardwaarden verder. + } + + return new AppSettings(); + } + + public static void Save(AppSettings settings) + { + try + { + Directory.CreateDirectory(Folder); + File.WriteAllText(FilePath, JsonSerializer.Serialize(settings, Options)); + } + catch (Exception) + { + // Instellingen opslaan mag de app nooit laten crashen. + } + } + + /// + /// Slaat de uploadheaders (met de token) met DPAPI versleuteld op, alleen leesbaar voor deze Windows-gebruiker. + /// + public sealed class ProtectedHeadersConverter : JsonConverter> + { + private static readonly byte[] Entropy = Encoding.UTF8.GetBytes("kniip-uploader"); + + public override Dictionary Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var result = new Dictionary(StringComparer.OrdinalIgnoreCase); + if (reader.TokenType != JsonTokenType.String) + { + reader.Skip(); + return result; + } + + try + { + byte[] plain = ProtectedData.Unprotect(Convert.FromBase64String(reader.GetString() ?? string.Empty), Entropy, + DataProtectionScope.CurrentUser); + if (JsonSerializer.Deserialize>(plain) is { } headers) + { + foreach ((string name, string value) in headers) + { + result[name] = value; + } + } + } + catch (Exception) + { + // Van een andere gebruiker of pc: de uploader moet opnieuw worden geïmporteerd. + } + + return result; + } + + public override void Write(Utf8JsonWriter writer, Dictionary value, JsonSerializerOptions options) + { + byte[] plain = JsonSerializer.SerializeToUtf8Bytes(value); + writer.WriteStringValue(Convert.ToBase64String(ProtectedData.Protect(plain, Entropy, DataProtectionScope.CurrentUser))); + } + } + + private sealed class ColorJsonConverter : JsonConverter + { + public override Color Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + string? text = reader.GetString(); + if (text is { Length: 9 } && text[0] == '#' + && uint.TryParse(text.AsSpan(1), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out uint argb)) + { + return Color.FromArgb((byte)(argb >> 24), (byte)(argb >> 16), (byte)(argb >> 8), (byte)argb); + } + + return Colors.Transparent; + } + + public override void Write(Utf8JsonWriter writer, Color value, JsonSerializerOptions options) => + writer.WriteStringValue($"#{value.A:X2}{value.R:X2}{value.G:X2}{value.B:X2}"); + } +} diff --git a/src/Kniip/Settings/SettingsWindow.xaml b/src/Kniip/Settings/SettingsWindow.xaml new file mode 100644 index 0000000..47e6fee --- /dev/null +++ b/src/Kniip/Settings/SettingsWindow.xaml @@ -0,0 +1,243 @@ + + + + + + + + + + + + +