diff --git a/Customizations/JSON/LayerConfig.ts b/Customizations/JSON/LayerConfig.ts index 6e14be6..e1b2a64 100644 --- a/Customizations/JSON/LayerConfig.ts +++ b/Customizations/JSON/LayerConfig.ts @@ -100,7 +100,7 @@ export default class LayerConfig { } this.tagRenderings = trs(json.tagRenderings).concat(roamingRenderings); - this.titleIcons = trs(json.titleIcons ?? ["wikipedialink","osmlink"]); + this.titleIcons = trs(json.titleIcons ?? ["wikipedialink","osmlink", "sharelink"]); function tr(key, deflt) { diff --git a/Customizations/SharedLayers.ts b/Customizations/SharedLayers.ts index 4beaa3e..7203faa 100644 --- a/Customizations/SharedLayers.ts +++ b/Customizations/SharedLayers.ts @@ -15,6 +15,8 @@ import * as maps from "../assets/layers/maps/maps.json" import * as information_boards from "../assets/layers/information_board/information_board.json" import * as direction from "../assets/layers/direction/direction.json" import * as surveillance_camera from "../assets/layers/surveillance_cameras/surveillance_cameras.json" +import * as toilets from "../assets/layers/toilets/toilets.json" + import LayerConfig from "./JSON/LayerConfig"; export default class SharedLayers { @@ -41,6 +43,7 @@ export default class SharedLayers { new LayerConfig(maps,[], "shared_layers"), new LayerConfig(direction,[], "shared_layers"), new LayerConfig(information_boards,[], "shared_layers"), + new LayerConfig(toilets,[], "shared_layers"), new LayerConfig(surveillance_camera,[], "shared_layers") ]; diff --git a/Customizations/SharedTagRenderings.ts b/Customizations/SharedTagRenderings.ts index 9cd62ee..1b5c281 100644 --- a/Customizations/SharedTagRenderings.ts +++ b/Customizations/SharedTagRenderings.ts @@ -1,5 +1,6 @@ -import * as questions from "../assets/questions/questions.json"; import TagRenderingConfig from "./JSON/TagRenderingConfig"; +import * as questions from "../assets/tagRenderings/questions.json"; +import * as icons from "../assets/tagRenderings/icons.json"; export default class SharedTagRenderings { @@ -7,13 +8,24 @@ export default class SharedTagRenderings { private static generatedSharedFields() { const dict = {} - for (const key in questions) { + + + function add(key, store){ try { - dict[key] = new TagRenderingConfig(questions[key]) + dict[key] = new TagRenderingConfig(store[key]) } catch (e) { - console.error("COULD NOT PARSE", key, " FROM QUESTIONS:", e) + console.error("BUG: could not parse", key, " from questions.json or icons.json", e) } } + + + for (const key in questions) { + add(key, questions); + } + for (const key in icons) { + add(key, icons); + } + return dict; } diff --git a/README.md b/README.md index f5393a6..8e2f015 100644 --- a/README.md +++ b/README.md @@ -260,3 +260,6 @@ Shower icon (used in 'bike_cleaning.svg'): https://commons.wikimedia.org/wiki/File:Shower_symbol.svg Bench icons from StreetComplete: https://github.com/westnordost/StreetComplete/tree/v25.0-beta1/res/graphics/quest%20icons, GPLv3.0 + + +Urinal icon: https://thenounproject.com/term/urinal/1307984/ \ No newline at end of file diff --git a/State.ts b/State.ts index ec61047..d60d4c1 100644 --- a/State.ts +++ b/State.ts @@ -23,7 +23,7 @@ export default class State { // The singleton of the global state public static state: State; - public static vNumber = "0.2.0"; + public static vNumber = "0.2.1d"; // The user journey states thresholds when a new feature gets unlocked public static userJourney = { diff --git a/UI/SpecialVisualizations.ts b/UI/SpecialVisualizations.ts index a20a1bf..b88cff2 100644 --- a/UI/SpecialVisualizations.ts +++ b/UI/SpecialVisualizations.ts @@ -9,6 +9,7 @@ import {FixedUiElement} from "./Base/FixedUiElement"; import Locale from "../UI/i18n/Locale"; import {ImageUploadFlow} from "./Image/ImageUploadFlow"; import {Translation} from "./i18n/Translation"; +import State from "../State"; export class SubstitutedTranslation extends UIElement { private readonly tags: UIEventSource; @@ -183,7 +184,41 @@ export default class SpecialVisualizations { return new VariableUiElement(source.map(data => data[neededValue] ?? "Loading...")); } }, + { + funcName: "share_link", + docs: "Creates a link that (attempts to) open the native 'share'-screen", + example: "{share_link()} to share the current page, {share_link()} to share the given url", + args: [ + { + name: "url", + doc: "The url to share", + defaultValue: "{current_url()}" + } + ], + constr: (tagSource: UIEventSource, args) => { + if (navigator.share !== undefined) { + return new FixedUiElement("").onClick(() => { + + let name = tagSource["name"] + let title= State.state.layoutToUse.data.title.txt + if(name === undefined){ + name = title + }else{ + name = `${name} (${title})` + } + + navigator.share({ + url: args[0] ?? window.location.href, + title: name, + text: State.state.layoutToUse.data.shortDescription.txt + }) + }) + } else { + return new FixedUiElement("") + } + } + } ] static HelpMessage: UIElement = SpecialVisualizations.GenHelpMessage(); diff --git a/assets/layers/toilets/toilets.json b/assets/layers/toilets/toilets.json index 7a73a41..7770573 100644 --- a/assets/layers/toilets/toilets.json +++ b/assets/layers/toilets/toilets.json @@ -1,2 +1,305 @@ { + "id": "toilets", + "name": { + "en": "Toilets", + "de": "Toiletten", + "fr": "Toilettes" + }, + "overpassTags": "amenity=toilets", + "title": { + "render": { + "en": "Toilet", + "de": "Toilette", + "fr": "Toilettes" + } + }, + "icon": { + "render": "./assets/layers/toilets/toilets.svg", + "mappings": [ + { + "if": "wheelchair=yes", + "then": "./assets/layers/toilets/wheelchair.svg" + }, + { + "if": "toilets:position=urinals", + "then": "./assets/layers/toilets/urinal.svg" + } + ] + }, + "color": { + "render": "#0000ff" + }, + "minzoom": 12, + "wayHandling": 2, + "presets": [ + { + "title": { + "en": "Toilet", + "de": "Toilette", + "fr": "Toilettes" + }, + "tags": [ + "amenity=toilets" + ], + "description": { + "en": "A publicly accessible toilet or restroom", + "de": "Eine öffentlich zugängliche Toilette", + "fr": "Des toilettes" + } + }, + { + "title": { + "en": "Toilets with wheelchair accessible toilet", + "de": "Toiletten mit rollstuhlgerechter Toilette", + "fr": "Toilettes accessible aux personnes à mobilité réduite" + }, + "tags": [ + "amenity=toilets", + "wheelchair=yes" + ], + "description": { + "en": "A restroom which has at least one wheelchair-accessible toilet", + "de": "Eine Toilettenanlage mit mindestens einer rollstuhlgerechten Toilette", + "fr": "Toilettes avec au moins un WC accessible aux personnes à mobilité réduite" + } + } + ], + "tagRenderings": [ + "images", + { + "question": { + "en": "Are these toilets publicly accessible?", + "de": "Sind diese Toiletten öffentlich zugänglich?", + "fr": "Ces toilettes sont-elles accessibles publiquement ?" + }, + "render": { + "en": "Access is {access}", + "de": "Zugang ist {access}", + "fr": "L'accès est {access}" + }, + "freeform": { + "key": "access", + "addExtraTags": [ + "fixme=the tag access was filled out by the user and might need refinement" + ] + }, + "mappings": [ + { + "if": "access=yes", + "then": { + "en": "Public access", + "de": "Öffentlicher Zugang", + "fr": "Accès publique" + } + }, + { + "if": "access=customers", + "then": { + "en": "Only access to customers", + "de": "Nur Zugang für Kunden", + "fr": "Accès réservé aux clients" + } + }, + { + "if": "access=no", + "then": { + "en": "Not accessible", + "de": "Nicht zugänglich", + "fr": "WC privés" + } + }, + { + "if": "access=key", + "then": { + "en": "Accessible, but one has to ask a key to enter", + "de": "Zugänglich, aber man muss einen Schlüssel für die Eingabe verlangen", + "fr": "Accessible, mais vous devez demander la clé" + } + } + ] + }, + { + "question": { + "en": "Are these toilets free to use?", + "de": "Können diese Toiletten kostenlos benutzt werden?", + "fr": "Ces toilettes sont-elles payantes" + }, + "mappings": [ + { + "then": { + "en": "These are paid toilets", + "de": "Dies sind bezahlte Toiletten", + "fr": "Toilettes payantes" + }, + "if": "fee=yes" + }, + { + "if": "fee=no", + "then": { + "en": "Free to use", + "de": "Kostenlose Nutzung", + "fr": "Toilettes gratuites" + } + } + ] + }, + { + "question": { + "en": "How much does one have to pay for these toilets?", + "de": "Wie viel muss man für diese Toiletten bezahlen?", + "fr": "Quel est le prix d'accès de ces toilettes ?" + }, + "render": { + "en": "The fee is {charge}", + "de": "Die Gebühr beträgt {charge}", + "fr": "Le prix est {charge}" + }, + "condition": "fee=yes", + "freeform": { + "key": "charge", + "type": "string" + } + }, + { + "question": { + "en": "Is there a dedicated toilet for wheelchair users", + "de": "Gibt es eine Toilette für Rollstuhlfahrer?", + "fr": "Un WC réservé aux personnes à mobilité réduite est-il présent ?" + }, + "mappings": [ + { + "then": { + "en": "There is a dedicated toilet for wheelchair users", + "de": "Es gibt eine Toilette für Rollstuhlfahrer", + "fr": "Il y a un WC réservé pour les personnes à mobilité réduite" + }, + "if": "wheelchair=yes" + }, + { + "if": "wheelchair=no", + "then": { + "en": "No wheelchair access", + "de": "Kein Zugang für Rollstuhlfahrer", + "fr": "Non accessible aux personnes à mobilité réduite" + } + } + ] + }, + { + "question": { + "en": "Which kind of toilets are this?", + "de": "Welche Art von Toiletten sind das?", + "fr": "De quel type sont ces toilettes ?" + }, + "mappings": [ + { + "if": "toilets:position=seated", + "then": { + "en": "There are only seated toilets", + "de": "Es gibt nur Sitztoiletten", + "fr": "Il y a uniquement des WC assis" + } + }, + { + "if": "toilets:position=urinals", + "then": { + "en": "There are only urinals here", + "de": "Hier gibt es nur Pissoirs", + "fr": "Il y a uniquement des urinoirs" + } + }, + { + "if": "toilets:position=squat", + "then": { + "en": "There are only squat toilets here", + "de": "Es gibt hier nur Hocktoiletten.", + "fr": "Il y a uniquement des WC turques" + } + }, + { + "if": "toilets:position=seated;urinals", + "then": { + "en": "Both seated toilets and urinals are available here", + "de": "Sowohl Sitztoiletten als auch Pissoirs sind hier verfügbar", + "fr": "Il y a des WC assis et des urinoirs" + } + } + ] + }, + { + "question": { + "en": "Is a changing table (to change diapers) available?", + "de": "Ist ein Wickeltisch (zum Wechseln der Windeln) vorhanden?", + "fr": "Ces WC disposent-ils d'une table à langer ?" + }, + "mappings": [ + { + "then": { + "en": "A changing table is available", + "de": "Ein Wickeltisch ist verfügbar", + "fr": "Une table à langer est disponible" + }, + "if": "changing_table=yes" + }, + { + "if": "changing_table=no", + "then": { + "en": "No changing table is available", + "de": "Es ist kein Wickeltisch verfügbar", + "fr": "Aucune table à langer" + } + } + ] + }, + { + "question": { + "en": "Where is the changing table located?", + "de": "Wo befindet sich der Wickeltisch?", + "fr": "Où se situe la table à langer ?" + }, + "render": { + "en": "The changing table is located at {changing_table:location}", + "de": "Die Wickeltabelle befindet sich in {changing_table:location}", + "fr": "Emplacement de la table à langer : {changing_table:location}" + }, + "condition": "changing_table=yes", + "freeform": { + "key": "changing_table:location" + }, + "mappings": [ + { + "then": { + "en": "The changing table is in the toilet for women. ", + "de": "Der Wickeltisch befindet sich in der Damentoilette. ", + "fr": "La table à langer se situe dans les WC pour femmes. " + }, + "if": "changing_table:location=female_toilet" + }, + { + "then": { + "en": "The changing table is in the toilet for men. ", + "de": "Der Wickeltisch befindet sich in der Herrentoilette. ", + "fr": "La table à langer se situe dans les WC pour hommes. " + }, + "if": "changing_table:location=male_toilet" + }, + { + "if": "changing_table:location=wheelchair_toilet", + "then": { + "en": "The changing table is in the toilet for wheelchair users. ", + "de": "Der Wickeltisch befindet sich in der Toilette für Rollstuhlfahrer. ", + "fr": "La table à langer se situe dans les WC pour personnes à mobilité réduite. " + } + }, + { + "if": "changing_table:location=dedicated_room", + "then": { + "en": "The changing table is in a dedicated room. ", + "de": "Der Wickeltisch befindet sich in einem eigenen Raum. ", + "fr": "La table à langer se situe dans un espace dédié. " + } + } + ] + } + ] } \ No newline at end of file diff --git a/assets/layers/toilets/urinal.svg b/assets/layers/toilets/urinal.svg index 29bcfb3..cecba0c 100644 --- a/assets/layers/toilets/urinal.svg +++ b/assets/layers/toilets/urinal.svg @@ -5,84 +5,49 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - x="0px" - y="0px" - viewBox="0 0 100.18594 100.18594" - enable-background="new 0 0 100 100" - xml:space="preserve" - id="svg22" - sodipodi:docname="noun_Urinal_1307984.svg" - width="100.18594" height="100.18594" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)">image/svg+xml \ No newline at end of file + d="m 68.240384,43.32148 v 15.764528 c -3.446517,5.459344 -5.76619,4.074036 -10.247903,5.133803 1.652985,11.916006 8.426597,10.425906 10.341535,21.124208 v 0.06209 c 2.338689,-0.4811 6.021132,0.919057 6.10748,-2.71532 L 74.347864,43.32148 Z" + id="path14" /> diff --git a/assets/tagRenderings/icons.json b/assets/tagRenderings/icons.json index 7a73a41..de7de5b 100644 --- a/assets/tagRenderings/icons.json +++ b/assets/tagRenderings/icons.json @@ -1,2 +1,19 @@ { + "osmlink": { + "render": "", + "mappings": [ + { + "if": "id~=-", + "then": "Uploading..." + } + ] + }, + "wikipedialink": { + "render": "WP", + "condition": "wikipedia~*" + }, + + "sharelink": { + "render": "{share_link()}" + } } \ No newline at end of file diff --git a/assets/tagRenderings/questions.json b/assets/tagRenderings/questions.json index 32662cd..3ffefa6 100644 --- a/assets/tagRenderings/questions.json +++ b/assets/tagRenderings/questions.json @@ -2,20 +2,6 @@ "images": { "render": "{image_carousel()}{image_upload()}" }, - - "osmlink": { - "render": "", - "mappings":[{ - "if": "id~=-", - "then": "Uploading..." - }] - }, - - "wikipedialink": { - "render": "WP", - "condition": "wikipedia~*" - }, - "phone": { "question": { "en": "What is the phone number of {name}?", @@ -27,7 +13,6 @@ "type": "phone" } }, - "email": { "render": "{email}", "freeform": { @@ -35,7 +20,6 @@ "type": "email" } }, - "website": { "question": { "en": "What is the website of {name}?", @@ -49,7 +33,6 @@ "type": "url" } }, - "opening_hours": { "question": { "en": "What are the opening hours of {name}?", diff --git a/assets/themes/cyclestreets/cyclestreets.json b/assets/themes/cyclestreets/cyclestreets.json index 6c61bb6..0026d01 100644 --- a/assets/themes/cyclestreets/cyclestreets.json +++ b/assets/themes/cyclestreets/cyclestreets.json @@ -166,7 +166,7 @@ } ] }, - "icon": "./assets/pencil.svg", + "icon": "./assets/svg/pencil.svg", "width": "5", "color": { "render": "#aaaaaa", diff --git a/assets/themes/toilets/toilets.json b/assets/themes/toilets/toilets.json index 31dcdc1..f5c38a4 100644 --- a/assets/themes/toilets/toilets.json +++ b/assets/themes/toilets/toilets.json @@ -23,306 +23,6 @@ "widenFactor": 0.05, "icon": "./assets/themes/toilets/toilets.svg", "layers": [ - { - "id": "Toilet", - "name": { - "en": "Toilets", - "de": "Toiletten", - "fr": "Toilettes" - }, - "overpassTags": "amenity=toilets", - "title": { - "render": { - "en": "Toilet", - "de": "Toilette", - "fr": "Toilettes" - } - }, - "icon": { - "render": "./assets/themes/toilets/toilets.svg", - "mappings": [ - { - "if": "wheelchair=yes", - "then": "./assets/themes/toilets/wheelchair.svg" - } - ] - }, - "color": { - "render": "#0000ff" - }, - "minzoom": 12, - "wayHandling": 2, - "presets": [ - { - "title": { - "en": "Toilet", - "de": "Toilette", - "fr": "Toilettes" - }, - "tags": [ - "amenity=toilets" - ], - "description": { - "en": "A publicly accessible toilet or restroom", - "de": "Eine öffentlich zugängliche Toilette", - "fr": "Des toilettes" - } - }, - { - "title": { - "en": "Toilets with wheelchair accessible toilet", - "de": "Toiletten mit rollstuhlgerechter Toilette", - "fr": "Toilettes accessible aux personnes à mobilité réduite" - }, - "tags": [ - "amenity=toilets", - "wheelchair=yes" - ], - "description": { - "en": "A restroom which has at least one wheelchair-accessible toilet", - "de": "Eine Toilettenanlage mit mindestens einer rollstuhlgerechten Toilette", - "fr": "Toilettes avec au moins un WC accessible aux personnes à mobilité réduite" - } - } - ], - "tagRenderings": [ - "images", - { - "question": { - "en": "Are these toilets publicly accessible?", - "de": "Sind diese Toiletten öffentlich zugänglich?", - "fr": "Ces toilettes sont-elles accessibles publiquement ?" - }, - "render": { - "en": "Access is {access}", - "de": "Zugang ist {access}", - "fr": "L'accès est {access}" - }, - "freeform": { - "key": "access", - "addExtraTags": [ - "fixme=the tag access was filled out by the user and might need refinement" - ] - }, - "mappings": [ - { - "if": "access=yes", - "then": { - "en": "Public access", - "de": "Öffentlicher Zugang", - "fr": "Accès publique" - } - }, - { - "if": "access=customers", - "then": { - "en": "Only access to customers", - "de": "Nur Zugang für Kunden", - "fr": "Accès réservé aux clients" - } - }, - { - "if": "access=no", - "then": { - "en": "Not accessible", - "de": "Nicht zugänglich", - "fr": "WC privés" - } - }, - { - "if": "access=key", - "then": { - "en": "Accessible, but one has to ask a key to enter", - "de": "Zugänglich, aber man muss einen Schlüssel für die Eingabe verlangen", - "fr": "Accessible, mais vous devez demander la clé" - } - } - ] - }, - { - "question": { - "en": "Are these toilets free to use?", - "de": "Können diese Toiletten kostenlos benutzt werden?", - "fr": "Ces toilettes sont-elles payantes" - }, - "mappings": [ - { - "then": { - "en": "These are paid toilets", - "de": "Dies sind bezahlte Toiletten", - "fr": "Toilettes payantes" - }, - "if": "fee=yes" - }, - { - "if": "fee=no", - "then": { - "en": "Free to use", - "de": "Kostenlose Nutzung", - "fr": "Toilettes gratuites" - } - } - ] - }, - { - "question": { - "en": "How much does one have to pay for these toilets?", - "de": "Wie viel muss man für diese Toiletten bezahlen?", - "fr": "Quel est le prix d'accès de ces toilettes ?" - }, - "render": { - "en": "The fee is {charge}", - "de": "Die Gebühr beträgt {charge}", - "fr": "Le prix est {charge}" - }, - "condition": "fee=yes", - "freeform": { - "key": "charge", - "type": "string" - } - }, - { - "question": { - "en": "Is there a dedicated toilet for wheelchair users", - "de": "Gibt es eine Toilette für Rollstuhlfahrer?", - "fr": "Un WC réservé aux personnes à mobilité réduite est-il présent ?" - }, - "mappings": [ - { - "then": { - "en": "There is a dedicated toilet for wheelchair users", - "de": "Es gibt eine Toilette für Rollstuhlfahrer", - "fr": "Il y a un WC réservé pour les personnes à mobilité réduite" - }, - "if": "wheelchair=yes" - }, - { - "if": "wheelchair=no", - "then": { - "en": "No wheelchair access", - "de": "Kein Zugang für Rollstuhlfahrer", - "fr": "Non accessible aux personnes à mobilité réduite" - } - } - ] - }, - { - "question": { - "en": "Which kind of toilets are this?", - "de": "Welche Art von Toiletten sind das?", - "fr": "De quel type sont ces toilettes ?" - }, - "mappings": [ - { - "if": "toilets:position=seated", - "then": { - "en": "There are only seated toilets", - "de": "Es gibt nur Sitztoiletten", - "fr": "Il y a uniquement des WC assis" - } - }, - { - "if": "toilets:position=urinals", - "then": { - "en": "There are only urinals here", - "de": "Hier gibt es nur Pissoirs", - "fr": "Il y a uniquement des urinoirs" - } - }, - { - "if": "toilets:position=squat", - "then": { - "en": "There are only squat toilets here", - "de": "Es gibt hier nur Hocktoiletten.", - "fr": "Il y a uniquement des WC turques" - } - }, - { - "if": "toilets:position=seated;urinals", - "then": { - "en": "Both seated toilets and urinals are available here", - "de": "Sowohl Sitztoiletten als auch Pissoirs sind hier verfügbar", - "fr": "Il y a des WC assis et des urinoirs" - } - } - ] - }, - { - "question": { - "en": "Is a changing table (to change diapers) available?", - "de": "Ist ein Wickeltisch (zum Wechseln der Windeln) vorhanden?", - "fr": "Ces WC disposent-ils d'une table à langer ?" - }, - "mappings": [ - { - "then": { - "en": "A changing table is available", - "de": "Ein Wickeltisch ist verfügbar", - "fr": "Une table à langer est disponible" - }, - "if": "changing_table=yes" - }, - { - "if": "changing_table=no", - "then": { - "en": "No changing table is available", - "de": "Es ist kein Wickeltisch verfügbar", - "fr": "Aucune table à langer" - } - } - ] - }, - { - "question": { - "en": "Where is the changing table located?", - "de": "Wo befindet sich der Wickeltisch?", - "fr": "Où se situe la table à langer ?" - }, - "render": { - "en": "The changing table is located at {changing_table:location}", - "de": "Die Wickeltabelle befindet sich in {changing_table:location}", - "fr": "Emplacement de la table à langer : {changing_table:location}" - }, - "condition": "changing_table=yes", - "freeform": { - "key": "changing_table:location" - }, - "mappings": [ - { - "then": { - "en": "The changing table is in the toilet for women. ", - "de": "Der Wickeltisch befindet sich in der Damentoilette. ", - "fr": "La table à langer se situe dans les WC pour femmes. " - }, - "if": "changing_table:location=female_toilet" - }, - { - "then": { - "en": "The changing table is in the toilet for men. ", - "de": "Der Wickeltisch befindet sich in der Herrentoilette. ", - "fr": "La table à langer se situe dans les WC pour hommes. " - }, - "if": "changing_table:location=male_toilet" - }, - { - "if": "changing_table:location=wheelchair_toilet", - "then": { - "en": "The changing table is in the toilet for wheelchair users. ", - "de": "Der Wickeltisch befindet sich in der Toilette für Rollstuhlfahrer. ", - "fr": "La table à langer se situe dans les WC pour personnes à mobilité réduite. " - } - }, - { - "if": "changing_table:location=dedicated_room", - "then": { - "en": "The changing table is in a dedicated room. ", - "de": "Der Wickeltisch befindet sich in einem eigenen Raum. ", - "fr": "La table à langer se situe dans un espace dédié. " - } - } - ] - } - ] - } + "toilets" ] } \ No newline at end of file