Commit 7fa0cd71c013c3122e5576299720eb0b6a5e6239
Committed by
Geoffrey PREUD'HOMME
1 parent
3b818f18
Les Transactions
Showing
1 changed file
with
195 additions
and
24 deletions
Show diff stats
api.raml
@@ -3,28 +3,7 @@ title: API d'Etunicorn | @@ -3,28 +3,7 @@ title: API d'Etunicorn | ||
3 | baseUri: https://etunicorn.plil.net/{version}/ | 3 | baseUri: https://etunicorn.plil.net/{version}/ |
4 | version: v1 | 4 | version: v1 |
5 | 5 | ||
6 | -securitySchemes: | ||
7 | - - oauth_2_0: | ||
8 | - description: Il faut un token OAuth 2.0 pour utiliser cette API | ||
9 | - type: OAuth 2.0 | ||
10 | - describedBy: | ||
11 | - headers: | ||
12 | - Authorization: | ||
13 | - description: | | ||
14 | - Utilisé pour envoyer un token d'accès OAuth 2. Ne pas envoyer en même temps que le paramètre de requête "access_token" | ||
15 | - type: string | ||
16 | - queryParameters: | ||
17 | - access_token: | ||
18 | - description: | | ||
19 | - Utilisé pour envoyer un token d'accès OAuth 2. Ne pas envoyer en même temps que le header "Authorization" | ||
20 | - type: string | ||
21 | - responses: | ||
22 | - 401: | ||
23 | - description: Token expiré ou invalide. Reconnectez-vous | ||
24 | - 403: | ||
25 | - description: Permission refusée. Se re-connecter ne changera rien | ||
26 | - | ||
27 | -# Les codes 400 sont implicites | 6 | +# Les codes 400 et 403 sont implicites |
28 | /login: | 7 | /login: |
29 | post: | 8 | post: |
30 | description: Instancie une nouvelle connexion | 9 | description: Instancie une nouvelle connexion |
@@ -65,10 +44,11 @@ securitySchemes: | @@ -65,10 +44,11 @@ securitySchemes: | ||
65 | 204: | 44 | 204: |
66 | description: Déconnecté avec succès | 45 | description: Déconnecté avec succès |
67 | 404: | 46 | 404: |
68 | - description: Jeton invalide ou expiré. À priori, vous êtes déjà déconnecté | 47 | + description: Jeton non trouvé |
69 | /personne: | 48 | /personne: |
70 | get: | 49 | get: |
71 | <<<<<<< HEAD | 50 | <<<<<<< HEAD |
51 | +<<<<<<< HEAD | ||
72 | securedBy: [oauth_2_0] | 52 | securedBy: [oauth_2_0] |
73 | <<<<<<< HEAD | 53 | <<<<<<< HEAD |
74 | description: Obtenir la liste des persones | 54 | description: Obtenir la liste des persones |
@@ -81,6 +61,10 @@ securitySchemes: | @@ -81,6 +61,10 @@ securitySchemes: | ||
81 | description: Obtenir la liste des persones. Nécessite COMPTE_ADMIN | 61 | description: Obtenir la liste des persones. Nécessite COMPTE_ADMIN |
82 | responses: | 62 | responses: |
83 | >>>>>>> f177050... Ajout des permissions | 63 | >>>>>>> f177050... Ajout des permissions |
64 | +======= | ||
65 | + description: Obtenir la liste des persones | ||
66 | + responses: | ||
67 | +>>>>>>> e551d2a... Les Transactions | ||
84 | 200: | 68 | 200: |
85 | body: | 69 | body: |
86 | application/json: | 70 | application/json: |
@@ -97,8 +81,12 @@ securitySchemes: | @@ -97,8 +81,12 @@ securitySchemes: | ||
97 | ] | 81 | ] |
98 | /{idPersonne}: | 82 | /{idPersonne}: |
99 | get: | 83 | get: |
84 | +<<<<<<< HEAD | ||
100 | securedBy: [oauth_2_0] | 85 | securedBy: [oauth_2_0] |
101 | description: Obtenir les infos sur une personne. Nécessite COMPTE_ADMIN | 86 | description: Obtenir les infos sur une personne. Nécessite COMPTE_ADMIN |
87 | +======= | ||
88 | + description: Obtenir les infos sur une personne | ||
89 | +>>>>>>> e551d2a... Les Transactions | ||
102 | responses: | 90 | responses: |
103 | 200: | 91 | 200: |
104 | description: Utilisateur récupéré | 92 | description: Utilisateur récupéré |
@@ -116,8 +104,12 @@ securitySchemes: | @@ -116,8 +104,12 @@ securitySchemes: | ||
116 | 404: | 104 | 404: |
117 | description: Utilisateur non trouvé | 105 | description: Utilisateur non trouvé |
118 | put: | 106 | put: |
107 | +<<<<<<< HEAD | ||
119 | securedBy: [oauth_2_0] | 108 | securedBy: [oauth_2_0] |
120 | description: Modifer les infos d'une personne. Nécessite COMPTE_ADMIN | 109 | description: Modifer les infos d'une personne. Nécessite COMPTE_ADMIN |
110 | +======= | ||
111 | + description: Modifer les infos d'une personne | ||
112 | +>>>>>>> e551d2a... Les Transactions | ||
121 | queryParameters: | 113 | queryParameters: |
122 | carte: | 114 | carte: |
123 | displayName: ID de la carte NFC | 115 | displayName: ID de la carte NFC |
@@ -148,15 +140,18 @@ securitySchemes: | @@ -148,15 +140,18 @@ securitySchemes: | ||
148 | 404: | 140 | 404: |
149 | description: Utilisateur non trouvé | 141 | description: Utilisateur non trouvé |
150 | delete: | 142 | delete: |
143 | +<<<<<<< HEAD | ||
151 | securedBy: [oauth_2_0] | 144 | securedBy: [oauth_2_0] |
152 | description: Obtenir les infos sur une personne. Nécessite COMPTE_ADMIN | 145 | description: Obtenir les infos sur une personne. Nécessite COMPTE_ADMIN |
146 | +======= | ||
147 | + description: Obtenir les infos sur une personne | ||
148 | +>>>>>>> e551d2a... Les Transactions | ||
153 | responses: | 149 | responses: |
154 | 204: | 150 | 204: |
155 | description: Utilisateur supprimé | 151 | description: Utilisateur supprimé |
156 | 404: | 152 | 404: |
157 | description: Utilisateur non trouvé | 153 | description: Utilisateur non trouvé |
158 | post: | 154 | post: |
159 | - securedBy: [oauth_2_0] | ||
160 | description: Ajoute une nouvelle personne | 155 | description: Ajoute une nouvelle personne |
161 | queryParameters: | 156 | queryParameters: |
162 | carte: | 157 | carte: |
@@ -194,8 +189,12 @@ securitySchemes: | @@ -194,8 +189,12 @@ securitySchemes: | ||
194 | } | 189 | } |
195 | /role: | 190 | /role: |
196 | get: | 191 | get: |
192 | +<<<<<<< HEAD | ||
197 | securedBy: [oauth_2_0] | 193 | securedBy: [oauth_2_0] |
198 | description: Liste les rôles. Nécessite ROLE_ADMIN | 194 | description: Liste les rôles. Nécessite ROLE_ADMIN |
195 | +======= | ||
196 | + description: Liste les rôles | ||
197 | +>>>>>>> e551d2a... Les Transactions | ||
199 | responses: | 198 | responses: |
200 | 200: | 199 | 200: |
201 | body: | 200 | body: |
@@ -219,8 +218,12 @@ securitySchemes: | @@ -219,8 +218,12 @@ securitySchemes: | ||
219 | } | 218 | } |
220 | ] | 219 | ] |
221 | post: | 220 | post: |
221 | +<<<<<<< HEAD | ||
222 | securedBy: [oauth_2_0] | 222 | securedBy: [oauth_2_0] |
223 | description: Ajoute un nouveau rôle. Nécessite ROLE_ADMIN | 223 | description: Ajoute un nouveau rôle. Nécessite ROLE_ADMIN |
224 | +======= | ||
225 | + description: Ajoute un nouveau rôle | ||
226 | +>>>>>>> e551d2a... Les Transactions | ||
224 | queryParameters: | 227 | queryParameters: |
225 | nom: | 228 | nom: |
226 | type: string | 229 | type: string |
@@ -234,16 +237,24 @@ securitySchemes: | @@ -234,16 +237,24 @@ securitySchemes: | ||
234 | description: Un rôle avec le même nom existe déjà | 237 | description: Un rôle avec le même nom existe déjà |
235 | /{nomRole}: | 238 | /{nomRole}: |
236 | delete: | 239 | delete: |
240 | +<<<<<<< HEAD | ||
237 | securedBy: [oauth_2_0] | 241 | securedBy: [oauth_2_0] |
238 | description: Supprime un rôle. Nécessite ROLE_ADMIN | 242 | description: Supprime un rôle. Nécessite ROLE_ADMIN |
243 | +======= | ||
244 | + description: Supprime un rôle | ||
245 | +>>>>>>> e551d2a... Les Transactions | ||
239 | responses: | 246 | responses: |
240 | 204: | 247 | 204: |
241 | description: Rôle supprimé | 248 | description: Rôle supprimé |
242 | 404: | 249 | 404: |
243 | description: Rôle inconnu | 250 | description: Rôle inconnu |
244 | post: | 251 | post: |
252 | +<<<<<<< HEAD | ||
245 | securedBy: [oauth_2_0] | 253 | securedBy: [oauth_2_0] |
246 | description: Ajoute une permission à un rôle. Nécessite ROLE_ADMIN | 254 | description: Ajoute une permission à un rôle. Nécessite ROLE_ADMIN |
255 | +======= | ||
256 | + description: Ajoute une permission à un rôle | ||
257 | +>>>>>>> e551d2a... Les Transactions | ||
247 | queryParameters: | 258 | queryParameters: |
248 | nom: | 259 | nom: |
249 | type: string | 260 | type: string |
@@ -256,8 +267,12 @@ securitySchemes: | @@ -256,8 +267,12 @@ securitySchemes: | ||
256 | description: Permission ou rôle inconnu | 267 | description: Permission ou rôle inconnu |
257 | /{nomPermission}: | 268 | /{nomPermission}: |
258 | delete: | 269 | delete: |
270 | +<<<<<<< HEAD | ||
259 | securedBy: [oauth_2_0] | 271 | securedBy: [oauth_2_0] |
260 | description: Enlève la permission du rôle. Nécessite ROLE_ADMIN | 272 | description: Enlève la permission du rôle. Nécessite ROLE_ADMIN |
273 | +======= | ||
274 | + description: Enlève la permission du rôle | ||
275 | +>>>>>>> e551d2a... Les Transactions | ||
261 | responses: | 276 | responses: |
262 | 204: | 277 | 204: |
263 | description: Permission enlevée avec succès | 278 | description: Permission enlevée avec succès |
@@ -265,8 +280,12 @@ securitySchemes: | @@ -265,8 +280,12 @@ securitySchemes: | ||
265 | description: Permission ou rôle inconnu | 280 | description: Permission ou rôle inconnu |
266 | /permission: | 281 | /permission: |
267 | get: | 282 | get: |
283 | +<<<<<<< HEAD | ||
268 | securedBy: [oauth_2_0] | 284 | securedBy: [oauth_2_0] |
269 | description: Liste les permissions. Nécessite ROLE_ADMIN | 285 | description: Liste les permissions. Nécessite ROLE_ADMIN |
286 | +======= | ||
287 | + description: Liste les permissions | ||
288 | +>>>>>>> e551d2a... Les Transactions | ||
270 | responses: | 289 | responses: |
271 | 200: | 290 | 200: |
272 | body: | 291 | body: |
@@ -283,8 +302,12 @@ securitySchemes: | @@ -283,8 +302,12 @@ securitySchemes: | ||
283 | 302 | ||
284 | /evenement: | 303 | /evenement: |
285 | get: | 304 | get: |
305 | +<<<<<<< HEAD | ||
286 | securedBy: [oauth_2_0] | 306 | securedBy: [oauth_2_0] |
287 | description: Obtenir la liste de tout les evenements. Nécessite EVNMT_ADMIN ou EVNMT_ACHETER ou EVNMT_REMBOURSER | 307 | description: Obtenir la liste de tout les evenements. Nécessite EVNMT_ADMIN ou EVNMT_ACHETER ou EVNMT_REMBOURSER |
308 | +======= | ||
309 | + description: Obtenir la liste de tout les evenements | ||
310 | +>>>>>>> e551d2a... Les Transactions | ||
288 | responses: | 311 | responses: |
289 | 200: | 312 | 200: |
290 | body: | 313 | body: |
@@ -305,8 +328,12 @@ securitySchemes: | @@ -305,8 +328,12 @@ securitySchemes: | ||
305 | } | 328 | } |
306 | ] | 329 | ] |
307 | post: | 330 | post: |
331 | +<<<<<<< HEAD | ||
308 | securedBy: [oauth_2_0] | 332 | securedBy: [oauth_2_0] |
309 | description: Permet de creer un nouvel evenement. Nécessite EVNMT_ADMIN | 333 | description: Permet de creer un nouvel evenement. Nécessite EVNMT_ADMIN |
334 | +======= | ||
335 | + description: Permet de creer un nouvel evenement | ||
336 | +>>>>>>> e551d2a... Les Transactions | ||
310 | queryParameters: | 337 | queryParameters: |
311 | nomEvenement: | 338 | nomEvenement: |
312 | description: Le nom de l'evenement | 339 | description: Le nom de l'evenement |
@@ -325,8 +352,11 @@ securitySchemes: | @@ -325,8 +352,11 @@ securitySchemes: | ||
325 | 352 | ||
326 | /{evenementId}: | 353 | /{evenementId}: |
327 | put: | 354 | put: |
355 | +<<<<<<< HEAD | ||
328 | description: Permet de modifier un évènement existant. Nécessite EVNMT_ADMIN | 356 | description: Permet de modifier un évènement existant. Nécessite EVNMT_ADMIN |
329 | securedBy: [oauth_2_0] | 357 | securedBy: [oauth_2_0] |
358 | +======= | ||
359 | +>>>>>>> e551d2a... Les Transactions | ||
330 | queryParameters: | 360 | queryParameters: |
331 | nomEvenement: | 361 | nomEvenement: |
332 | description: Le nom de l'evenement | 362 | description: Le nom de l'evenement |
@@ -346,8 +376,12 @@ securitySchemes: | @@ -346,8 +376,12 @@ securitySchemes: | ||
346 | 404: | 376 | 404: |
347 | description: L'evenement n'existe pas | 377 | description: L'evenement n'existe pas |
348 | get: | 378 | get: |
379 | +<<<<<<< HEAD | ||
349 | securedBy: [oauth_2_0] | 380 | securedBy: [oauth_2_0] |
350 | description: Obtenir l'evenement {evenementId}. Nécessite EVNMT_ADMIN ou EVNMT_ACHETER ou EVNMT_REMBOURSER | 381 | description: Obtenir l'evenement {evenementId}. Nécessite EVNMT_ADMIN ou EVNMT_ACHETER ou EVNMT_REMBOURSER |
382 | +======= | ||
383 | + description: Obtenir l'evenement {evenementId} | ||
384 | +>>>>>>> e551d2a... Les Transactions | ||
351 | responses: | 385 | responses: |
352 | 200: | 386 | 200: |
353 | body: | 387 | body: |
@@ -364,8 +398,12 @@ securitySchemes: | @@ -364,8 +398,12 @@ securitySchemes: | ||
364 | 404: | 398 | 404: |
365 | description: Evenement non existant | 399 | description: Evenement non existant |
366 | delete: | 400 | delete: |
401 | +<<<<<<< HEAD | ||
367 | securedBy: [oauth_2_0] | 402 | securedBy: [oauth_2_0] |
368 | description: Permet de supprimer l'evenement {evenementId}. Nécessite EVNMT_ADMIN | 403 | description: Permet de supprimer l'evenement {evenementId}. Nécessite EVNMT_ADMIN |
404 | +======= | ||
405 | + description: Permet de supprimer l'evenement {evenementId} | ||
406 | +>>>>>>> e551d2a... Les Transactions | ||
369 | responses: | 407 | responses: |
370 | 200: | 408 | 200: |
371 | description: L'evenement a été bien supprimé | 409 | description: L'evenement a été bien supprimé |
@@ -375,8 +413,12 @@ securitySchemes: | @@ -375,8 +413,12 @@ securitySchemes: | ||
375 | 413 | ||
376 | /consomation: | 414 | /consomation: |
377 | get: | 415 | get: |
416 | +<<<<<<< HEAD | ||
378 | securedBy: [oauth_2_0] | 417 | securedBy: [oauth_2_0] |
379 | description: Obtenir la liste de toutes les consomations. Nécessite CONSO_ADMIN ou CONSO_ACHETER ou CONSO_REMBOURSER | 418 | description: Obtenir la liste de toutes les consomations. Nécessite CONSO_ADMIN ou CONSO_ACHETER ou CONSO_REMBOURSER |
419 | +======= | ||
420 | + description: Obtenir la liste de tout les consomations | ||
421 | +>>>>>>> e551d2a... Les Transactions | ||
380 | responses: | 422 | responses: |
381 | 200: | 423 | 200: |
382 | body: | 424 | body: |
@@ -395,8 +437,12 @@ securitySchemes: | @@ -395,8 +437,12 @@ securitySchemes: | ||
395 | } | 437 | } |
396 | ] | 438 | ] |
397 | post: | 439 | post: |
440 | +<<<<<<< HEAD | ||
398 | securedBy: [oauth_2_0] | 441 | securedBy: [oauth_2_0] |
399 | description: Permet de creer une nouvelle consomation. Nécessite CONSO_ADMIN | 442 | description: Permet de creer une nouvelle consomation. Nécessite CONSO_ADMIN |
443 | +======= | ||
444 | + description: Permet de creer un nouvel evenement | ||
445 | +>>>>>>> e551d2a... Les Transactions | ||
400 | queryParameters: | 446 | queryParameters: |
401 | nomConsomation: | 447 | nomConsomation: |
402 | description: Le nom de la Consomation | 448 | description: Le nom de la Consomation |
@@ -411,8 +457,11 @@ securitySchemes: | @@ -411,8 +457,11 @@ securitySchemes: | ||
411 | 457 | ||
412 | /{consomationId}: | 458 | /{consomationId}: |
413 | put: | 459 | put: |
460 | +<<<<<<< HEAD | ||
414 | securedBy: [oauth_2_0] | 461 | securedBy: [oauth_2_0] |
415 | description: Permet de modifier une consommation. Nécessite CONSO_ADMIN | 462 | description: Permet de modifier une consommation. Nécessite CONSO_ADMIN |
463 | +======= | ||
464 | +>>>>>>> e551d2a... Les Transactions | ||
416 | queryParameters: | 465 | queryParameters: |
417 | nomEvenement: | 466 | nomEvenement: |
418 | description: Le nom de la Consomation | 467 | description: Le nom de la Consomation |
@@ -428,8 +477,12 @@ securitySchemes: | @@ -428,8 +477,12 @@ securitySchemes: | ||
428 | 404: | 477 | 404: |
429 | description: L'evenement n'existe pas | 478 | description: L'evenement n'existe pas |
430 | get: | 479 | get: |
480 | +<<<<<<< HEAD | ||
431 | securedBy: [oauth_2_0] | 481 | securedBy: [oauth_2_0] |
432 | description: Obtenir la Consomation {consomationId}. Nécessite CONSO_ADMIN ou CONSO_ACHETER ou CONSO_REMBOURSER | 482 | description: Obtenir la Consomation {consomationId}. Nécessite CONSO_ADMIN ou CONSO_ACHETER ou CONSO_REMBOURSER |
483 | +======= | ||
484 | + description: Obtenir la Consomation {consomationId} | ||
485 | +>>>>>>> e551d2a... Les Transactions | ||
433 | responses: | 486 | responses: |
434 | 200: | 487 | 200: |
435 | body: | 488 | body: |
@@ -446,8 +499,126 @@ securitySchemes: | @@ -446,8 +499,126 @@ securitySchemes: | ||
446 | 404: | 499 | 404: |
447 | description: Consomation non existante | 500 | description: Consomation non existante |
448 | delete: | 501 | delete: |
502 | +<<<<<<< HEAD | ||
449 | securedBy: [oauth_2_0] | 503 | securedBy: [oauth_2_0] |
450 | description: Permet de supprimer la consomation {consomationId}. Nécessite CONSO_ADMIN | 504 | description: Permet de supprimer la consomation {consomationId}. Nécessite CONSO_ADMIN |
505 | +======= | ||
506 | + description: Permet de supprimer la consomation {consomationId} | ||
507 | +>>>>>>> e551d2a... Les Transactions | ||
451 | responses: | 508 | responses: |
452 | 200: | 509 | 200: |
453 | description: La consomation a été bien supprime | 510 | description: La consomation a été bien supprime |
511 | +/participe: | ||
512 | + post: | ||
513 | + description: Permet d'ajouter une personne a un evenement | ||
514 | + queryParameters: | ||
515 | + idPersonne: | ||
516 | + type: integer | ||
517 | + required: true | ||
518 | + description: l'identifiant unique de l'utilisateur | ||
519 | + idEvenement: | ||
520 | + type: integer | ||
521 | + required: true | ||
522 | + description: l'identifiant unique d'un evenement | ||
523 | + responses: | ||
524 | + 201: | ||
525 | + description: La personne est bien inscrite a cet evenement | ||
526 | + get: | ||
527 | + description: Permet de savoir si une personne participe a un evenement | ||
528 | + queryParameters: | ||
529 | + idPersonne: | ||
530 | + type: integer | ||
531 | + required: true | ||
532 | + description: l'identifiant unique de l'utilisateur | ||
533 | + idEvenement: | ||
534 | + type: integer | ||
535 | + required: true | ||
536 | + description: l'identifiant unique d'un evenement | ||
537 | + responses: | ||
538 | + 200: | ||
539 | + description: La personne est bien inscrite à l'evenement | ||
540 | + 404: | ||
541 | + description: La personne n'est pas inscrite à l'evenement | ||
542 | + | ||
543 | + | ||
544 | +/transaction: | ||
545 | + get: | ||
546 | + description: Permet de recuperer la liste des transaction | ||
547 | + responses: | ||
548 | + 200: | ||
549 | + description: On recupere la liste des transactions | ||
550 | + body: | ||
551 | + application/json: | ||
552 | + example: | | ||
553 | + [ | ||
554 | + { | ||
555 | + "participant": 1, | ||
556 | + "acteur": 18, | ||
557 | + "idTransaction": 42, | ||
558 | + "type": true, | ||
559 | + "date": "2003-12-01", | ||
560 | + "prix": 25.23 | ||
561 | + }, | ||
562 | + { | ||
563 | + "participant": 5, | ||
564 | + "acteur": 1, | ||
565 | + "idTransaction": 43, | ||
566 | + "type": true, | ||
567 | + "date": "2003-12-01", | ||
568 | + "prix": -25.23 | ||
569 | + } | ||
570 | + ] | ||
571 | + /participant/{idPersonne}: | ||
572 | + get: | ||
573 | + description: Permet de recuperer la liste des transaction d'une personne | ||
574 | + responses: | ||
575 | + 200: | ||
576 | + description: On recupere la liste des transactions | ||
577 | + body: | ||
578 | + application/json: | ||
579 | + example: | | ||
580 | + [ | ||
581 | + { | ||
582 | + "participant": 1, | ||
583 | + "acteur": 18, | ||
584 | + "idTransaction": 42, | ||
585 | + "type": true, | ||
586 | + "date": "2003-12-01", | ||
587 | + "prix": 25.23 | ||
588 | + }, | ||
589 | + { | ||
590 | + "participant": 1, | ||
591 | + "acteur": 12, | ||
592 | + "idTransaction": 43, | ||
593 | + "type": true, | ||
594 | + "date": "2003-12-01", | ||
595 | + "prix": -25.23 | ||
596 | + } | ||
597 | + ] | ||
598 | + /acteur/{idPersonne}: | ||
599 | + get: | ||
600 | + description: Permet de recuperer la liste des transaction d'une personne | ||
601 | + responses: | ||
602 | + 200: | ||
603 | + description: On recupere la liste des transactions | ||
604 | + body: | ||
605 | + application/json: | ||
606 | + example: | | ||
607 | + [ | ||
608 | + { | ||
609 | + "participant": 1, | ||
610 | + "acteur": 18, | ||
611 | + "idTransaction": 42, | ||
612 | + "type": true, | ||
613 | + "date": "2003-12-01", | ||
614 | + "prix": 25.23 | ||
615 | + }, | ||
616 | + { | ||
617 | + "participant": 1, | ||
618 | + "acteur": 12, | ||
619 | + "idTransaction": 43, | ||
620 | + "type": true, | ||
621 | + "date": "2003-12-01", | ||
622 | + "prix": -25.23 | ||
623 | + } | ||
624 | + ] |