Subversion Repositories eFlore/Applications.coel

Rev

Rev 741 | Rev 758 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
219 aurelien 1
package org.tela_botanica.client.vues;
2
 
227 aurelien 3
import java.util.ArrayList;
4
import java.util.Iterator;
365 jp_milcent 5
import java.util.List;
227 aurelien 6
import java.util.Set;
7
 
219 aurelien 8
import org.tela_botanica.client.Mediateur;
9
import org.tela_botanica.client.RegistreId;
10
import org.tela_botanica.client.interfaces.Rafraichissable;
705 aurelien 11
import org.tela_botanica.client.modeles.Information;
239 aurelien 12
import org.tela_botanica.client.modeles.Personne;
227 aurelien 13
import org.tela_botanica.client.modeles.PersonneListe;
219 aurelien 14
import org.tela_botanica.client.modeles.Publication;
749 aurelien 15
import org.tela_botanica.client.modeles.PublicationAPersonne;
16
import org.tela_botanica.client.modeles.PublicationAPersonneListe;
705 aurelien 17
import org.tela_botanica.client.modeles.PublicationListe;
219 aurelien 18
import org.tela_botanica.client.modeles.Structure;
227 aurelien 19
import org.tela_botanica.client.modeles.StructureListe;
219 aurelien 20
 
21
import com.extjs.gxt.ui.client.Registry;
22
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
705 aurelien 23
import com.extjs.gxt.ui.client.event.BaseEvent;
505 jp_milcent 24
import com.extjs.gxt.ui.client.event.ButtonEvent;
705 aurelien 25
import com.extjs.gxt.ui.client.event.Events;
26
import com.extjs.gxt.ui.client.event.Listener;
219 aurelien 27
import com.extjs.gxt.ui.client.event.SelectionListener;
28
import com.extjs.gxt.ui.client.store.ListStore;
227 aurelien 29
import com.extjs.gxt.ui.client.widget.HorizontalPanel;
219 aurelien 30
import com.extjs.gxt.ui.client.widget.LayoutContainer;
705 aurelien 31
import com.extjs.gxt.ui.client.widget.MessageBox;
219 aurelien 32
import com.extjs.gxt.ui.client.widget.button.Button;
33
import com.extjs.gxt.ui.client.widget.form.ComboBox;
34
import com.extjs.gxt.ui.client.widget.form.DateField;
35
import com.extjs.gxt.ui.client.widget.form.FieldSet;
36
import com.extjs.gxt.ui.client.widget.form.FormPanel;
37
import com.extjs.gxt.ui.client.widget.form.TextField;
38
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
39
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
40
import com.extjs.gxt.ui.client.widget.layout.FlowLayout;
41
import com.extjs.gxt.ui.client.widget.layout.FormData;
42
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
705 aurelien 43
import com.google.gwt.core.client.GWT;
44
import com.google.gwt.user.client.Window;
227 aurelien 45
import com.google.gwt.user.client.ui.HTML;
705 aurelien 46
import com.google.gwt.user.client.ui.Label;
219 aurelien 47
 
444 jp_milcent 48
public class PublicationForm extends LayoutContainer implements Rafraichissable {
219 aurelien 49
 
50
	private Mediateur mediateur = null;
51
 
505 jp_milcent 52
	FormPanel panel = null;
219 aurelien 53
 
505 jp_milcent 54
	private String idStructureEdition = "";
55
	private String idPublication = "";
56
	private String idProjet = "";
219 aurelien 57
 
505 jp_milcent 58
	private PersonneListe listePersonneAuteur = null;
749 aurelien 59
	private PublicationAPersonneListe pubAPersonneListeAuteur = null;
505 jp_milcent 60
	private ListStore<Personne> storeAuteurs = null;
239 aurelien 61
	private ArrayList<ComboBox<Personne>> listeAuteurs = null;
716 aurelien 62
	private String idAuteurs = "";
227 aurelien 63
 
219 aurelien 64
	private TextField<String> nomArticle = null;
65
	private TextField<String> intituleCollPub = null;
66
	private TextField<String> uriPub = null;
67
 
68
	private ComboBox<Structure> comboListeEditeurs = null;
69
	private ListStore<Structure> storeEditeurs = null;
725 aurelien 70
	private TextField<String> datePub = null;
219 aurelien 71
	private TextField<String> tomPub = null;
72
	private TextField<String> fasciculePub = null;
73
	private TextField<String> pagesPub = null;
74
	private String mode = "AJOUT";
75
 
705 aurelien 76
	private boolean formValide = false;
77
	private boolean validationPublication = false;
78
	private boolean validationAuteurs = false;
79
 
505 jp_milcent 80
	FieldSet fieldSetAuteurs = null;
239 aurelien 81
 
82
	private Publication publi;
219 aurelien 83
 
705 aurelien 84
	protected boolean listeAuteurInitialisee = false;
749 aurelien 85
	protected boolean listeAuteurPublicationInitialisee = false;
705 aurelien 86
 
87
	private LayoutContainer conteneurChamps;
88
 
89
	private Button annulerBtn;
90
 
91
	private Button validerBtn;
92
 
444 jp_milcent 93
	public PublicationForm() {
705 aurelien 94
 
95
		setId("x-form-pub");
219 aurelien 96
		setLayout(new FitLayout());
97
		mediateur = Registry.get(RegistreId.MEDIATEUR);
98
 
239 aurelien 99
		storeAuteurs = new ListStore<Personne>();
100
		listePersonneAuteur = new PersonneListe();
101
 
219 aurelien 102
		// Création de la disposition : FIELDSET
103
		FormLayout layoutFieldset = new FormLayout();
104
		layoutFieldset.setLabelWidth(200);
505 jp_milcent 105
		//layoutFieldset.setPadding(4);
219 aurelien 106
 
107
		//+-----------------------------------------------------------------------------------------------------------+
108
		// Création du panneau Formulaire
705 aurelien 109
		panel = new FormPanel();
219 aurelien 110
		panel.setFrame(true);
111
		panel.setIconStyle("icone-form-ajouter");
112
		panel.setCollapsible(false);
113
		panel.setHeading("Ajout d'une publication");
114
		panel.setButtonAlign(HorizontalAlignment.CENTER);
115
		panel.setLayout(new FlowLayout());
116
 
117
		add(panel);
118
 
119
		// Fieldset Auteur
227 aurelien 120
		fieldSetAuteurs = new FieldSet();
219 aurelien 121
		fieldSetAuteurs.setHeading("Auteur(s)");
122
		fieldSetAuteurs.setCollapsible(true);
123
		fieldSetAuteurs.setLayout(layoutFieldset);
124
 
125
		panel.add(fieldSetAuteurs);
126
 
505 jp_milcent 127
		genererChampsAuteur("", false);
219 aurelien 128
 
129
		// Création de la disposition : FIELDSET
130
		FormLayout layoutFieldset2 = new FormLayout();
131
		layoutFieldset.setLabelWidth(200);
505 jp_milcent 132
		//layoutFieldset.setPadding(4);
219 aurelien 133
 
134
		// Fieldset Infos Générales
135
		FieldSet fieldSetInfosGen = new FieldSet();
136
		fieldSetInfosGen.setHeading("Informations générales");
137
		fieldSetInfosGen.setCollapsible(true);
138
		fieldSetInfosGen.setLayout(layoutFieldset2);
139
 
140
		panel.add(fieldSetInfosGen);
141
 
142
		nomArticle = new TextField<String>();
143
		nomArticle.setName("cpu");
144
		nomArticle.setFieldLabel("Titre de l'article ou de l'ouvrage");
145
 
146
		intituleCollPub = new TextField<String>();
147
		intituleCollPub.setFieldLabel("Intitulé de la collection ou de la revue");
148
 
149
		uriPub = new TextField<String>();
150
		uriPub.setFieldLabel("URI de la publication");
151
 
152
		fieldSetInfosGen.add(nomArticle);
153
		fieldSetInfosGen.add(intituleCollPub);
154
		fieldSetInfosGen.add(uriPub);
155
 
156
		// Création de la disposition : FIELDSET
157
		FormLayout layoutFieldset3 = new FormLayout();
505 jp_milcent 158
		//layoutFieldset.setPadding(4);
219 aurelien 159
 
160
		// Fieldset Edition
161
		FieldSet fieldSetEdition = new FieldSet();
162
		fieldSetEdition.setHeading("Edition");
163
		fieldSetEdition.setCollapsible(true);
164
		fieldSetEdition.setLayout(layoutFieldset3);
165
 
166
		panel.add(fieldSetEdition);
167
 
168
		storeEditeurs = new ListStore<Structure>();
169
		comboListeEditeurs = new ComboBox<Structure>();
170
		comboListeEditeurs.setEmptyText("Sélectionner un editeur...");
171
		comboListeEditeurs.setFieldLabel("Editeur de la publication");
172
		comboListeEditeurs.setDisplayField("nom");
173
		comboListeEditeurs.setStore(storeEditeurs);
174
		comboListeEditeurs.setEditable(true);
175
		comboListeEditeurs.setTypeAhead(true);
227 aurelien 176
		comboListeEditeurs.setTriggerAction(TriggerAction.QUERY);
219 aurelien 177
 
725 aurelien 178
		datePub = new TextField<String>();
734 aurelien 179
		datePub.setMaxLength(4);
180
		datePub.setMinLength(4);
181
		datePub.setFieldLabel("Année de publication");
219 aurelien 182
 
183
		tomPub = new TextField<String>();
184
		tomPub.setFieldLabel("Tome");
185
 
186
		fasciculePub = new TextField<String>();
187
		fasciculePub.setFieldLabel("Fascicule");
188
 
189
		pagesPub = new TextField<String>();
190
		pagesPub.setFieldLabel("Pages");
191
 
505 jp_milcent 192
		fieldSetEdition.add(comboListeEditeurs, new FormData(500, 20));
741 aurelien 193
		fieldSetEdition.add(datePub, new FormData(40, 20));
735 aurelien 194
		fieldSetEdition.add(tomPub, new FormData(75, 20));
195
		fieldSetEdition.add(fasciculePub, new FormData(75, 20));
505 jp_milcent 196
		fieldSetEdition.add(pagesPub, new FormData(100, 20));
219 aurelien 197
 
198
		// Ajout des boutons au panneau formulaire
705 aurelien 199
		annulerBtn = new Button("Annuler");
505 jp_milcent 200
		annulerBtn.addSelectionListener(new SelectionListener<ButtonEvent>() {
219 aurelien 201
			@Override
505 jp_milcent 202
			public void componentSelected(ButtonEvent be) {
219 aurelien 203
				mediateur.clicMenu("Publications");
204
			}
205
		});
206
		panel.addButton(annulerBtn);
705 aurelien 207
 
208
		validerBtn = new Button("Valider");
505 jp_milcent 209
		validerBtn.addSelectionListener(new SelectionListener<ButtonEvent>() {
219 aurelien 210
			@Override
505 jp_milcent 211
			public void componentSelected(ButtonEvent be) {
219 aurelien 212
				soumettreFormulaire();
213
			}
214
		});
705 aurelien 215
 
219 aurelien 216
		panel.addButton(validerBtn);
217
 
705 aurelien 218
		mediateur.clicObtenirListeEditeurs(this);
239 aurelien 219
		mediateur.clicObtenirListeAuteurs(this);
219 aurelien 220
	}
221
 
705 aurelien 222
	public void rafraichir(Object nouvellesDonnees) {
227 aurelien 223
 
224
		// Si on a reçu les details d'une publication
705 aurelien 225
		if (nouvellesDonnees instanceof Publication) {
227 aurelien 226
			mode = "MODIF" ;
749 aurelien 227
 
705 aurelien 228
			publi = (Publication) nouvellesDonnees;
749 aurelien 229
			mediateur.selectionnerAuteurAPublication(this,publi.getId());
705 aurelien 230
			mediateur.clicObtenirListeAuteurs(this);
219 aurelien 231
			nomArticle.setValue(publi.getTitre());
232
			intituleCollPub.setValue(publi.getCollection());
233
			uriPub.setValue(publi.getURI());
234
			datePub.setRawValue(publi.getDateParution());
235
			tomPub.setValue(publi.getIndicationNvt());
236
			fasciculePub.setValue(publi.getFascicule());
237
			pagesPub.setValue(publi.getPages());
238
 
229 aurelien 239
			idPublication = publi.getId();
227 aurelien 240
			idStructureEdition = publi.getEditeur();
229 aurelien 241
			idProjet = publi.getProjet() ;
227 aurelien 242
 
219 aurelien 243
			panel.setHeading("Modification d'une publication");
227 aurelien 244
		}
245
 
246
		// Si on a reçu une liste des editeurs
705 aurelien 247
		if(nouvellesDonnees instanceof StructureListe) {
227 aurelien 248
			storeEditeurs.removeAll();
705 aurelien 249
			StructureListe listeStructure = (StructureListe) nouvellesDonnees;
365 jp_milcent 250
			storeEditeurs.add((List<Structure>) listeStructure.toList());
219 aurelien 251
 
505 jp_milcent 252
			if (mode.equals("MODIF")) {
365 jp_milcent 253
				comboListeEditeurs.setValue((Structure) listeStructure.get(idStructureEdition));
227 aurelien 254
			}
255
			comboListeEditeurs.expand();
219 aurelien 256
		}
239 aurelien 257
 
749 aurelien 258
		if(nouvellesDonnees instanceof PublicationAPersonneListe) {
259
			pubAPersonneListeAuteur = (PublicationAPersonneListe)nouvellesDonnees;
260
			listeAuteurPublicationInitialisee = true;
261
 
262
			if(listeAuteurInitialisee) {
263
				Iterator<String> itap = pubAPersonneListeAuteur.keySet().iterator();
264
				for(;itap.hasNext();){
265
					creerTextFieldEtBouton(pubAPersonneListeAuteur.get(itap.next()).getIdAuteur());
266
				}
267
			}
268
		}
269
 
705 aurelien 270
		if (nouvellesDonnees instanceof Information) {
271
			Information nouvellesInfos = (Information)nouvellesDonnees;
272
 
273
			if(nouvellesInfos.getType().equals("liste_personne")) {
274
				listePersonneAuteur = (PersonneListe)nouvellesInfos.getDonnee(0);
275
				storeAuteurs.removeAll();
276
				for (Iterator<String> it = listePersonneAuteur.keySet().iterator(); it.hasNext();) {
277
					Personne p = listePersonneAuteur.get(it.next());
278
					storeAuteurs.add(p);
279
				}
280
 
749 aurelien 281
				listeAuteurInitialisee = true;
282
 
283
				if(listeAuteurPublicationInitialisee && mode.equals("MODIF")) {
284
					Iterator<String> itap = pubAPersonneListeAuteur.keySet().iterator();
285
					for(;itap.hasNext();){
286
						creerTextFieldEtBouton(pubAPersonneListeAuteur.get(itap.next()).getIdAuteur());
287
					}
705 aurelien 288
				}
239 aurelien 289
			}
290
 
705 aurelien 291
			if (nouvellesInfos.getType().equals("publication_valide")) {
716 aurelien 292
				validationPublication = true;
734 aurelien 293
				idPublication = ""+nouvellesInfos.getDonnee(0);
741 aurelien 294
 
295
				if(mode.equals("AJOUT")) {
296
					mediateur.ajouterAuteurPublication(this,idAuteurs,"2360",idPublication);
297
				}
298
 
299
				if(mode.equals("MODIF")) {
300
					mediateur.modifierAuteurPublication(this,idAuteurs,idPublication);
301
				}
239 aurelien 302
			}
705 aurelien 303
 
734 aurelien 304
			if (nouvellesInfos.getType().equals("auteur_valide")) {
705 aurelien 305
				validationAuteurs = true;
734 aurelien 306
			}
705 aurelien 307
 
308
			if(formValide && validationPublication && validationAuteurs) {
309
				mediateur.rechargerListePublication();
310
			}
239 aurelien 311
		}
219 aurelien 312
	}
313
 
314
	private void soumettreFormulaire() {
505 jp_milcent 315
		String auteur = "";
705 aurelien 316
		String idAuteur = "";
505 jp_milcent 317
		for (int i = 0; i < listeAuteurs.size(); i++) {
705 aurelien 318
			if(listeAuteurs.get(i).getValue() != null) {
319
				idAuteur += listeAuteurs.get(i).getValue().getId();
320
				auteur += listeAuteurs.get(i).getValue().getNom()+ " "+listeAuteurs.get(i).getValue().getPrenom();
321
				if (i != listeAuteurs.size() -1) {
322
					auteur += "|";
734 aurelien 323
					idAuteur += ",";
705 aurelien 324
				}
227 aurelien 325
			}
326
		}
705 aurelien 327
 
328
		String erreurs = "";
329
 
330
		if(idAuteur == null || idAuteur.equals("")) {
331
			erreurs += "Veuillez entrer au moins un auteur ! ";
716 aurelien 332
		} else {
333
			idAuteurs = idAuteur;
705 aurelien 334
		}
335
 
219 aurelien 336
		String nomArt = nomArticle.getValue();
705 aurelien 337
		if(nomArt == null || nomArt.equals("")) {
338
			erreurs += "Veuillez entrer le nom de l'article ! ";
339
		}
340
 
219 aurelien 341
		String collPub = intituleCollPub.getValue();
705 aurelien 342
 
343
		String pub = nomArticle.getValue()+" "+intituleCollPub.getValue();
344
 
219 aurelien 345
		String uri = uriPub.getValue();
705 aurelien 346
 
347
		String editeur = "";
348
 
349
		if(comboListeEditeurs.getValue() == null) {
717 aurelien 350
			//erreurs += "Veuillez sélectionner un éditeur ! ";
705 aurelien 351
		} else {
352
			editeur = comboListeEditeurs.getValue().getId();
353
			if(editeur == null || editeur.equals("")) {
354
				erreurs += "Veuillez sélectionner un éditeur ! ";
355
			}
356
		}
357
 
219 aurelien 358
		String datePar = datePub.getRawValue();
705 aurelien 359
		if(datePar == null || datePar.equals("")) {
360
			erreurs += "Veuillez entrer une date ! ";
725 aurelien 361
		} else {
362
			String resDate = analyserDate(datePar);
363
			if(resDate.equals("")) {
364
				datePar = datePar+"-00-00";
365
			} else {
366
				erreurs += resDate;
367
			}
705 aurelien 368
		}
219 aurelien 369
		String tome = tomPub.getValue();
717 aurelien 370
 
219 aurelien 371
		String fascicule = fasciculePub.getValue();
717 aurelien 372
 
219 aurelien 373
		String pages = pagesPub.getValue();
374
 
705 aurelien 375
		if(erreurs.length() > 0) {
376
			MessageBox.alert("Erreur dans la saisie des champs", erreurs, null);
377
			return;
378
		}
379
 
380
		formValide = true;
381
		this.setEnabled(false);
382
		mediateur.afficherPopinChargement();
383
 
219 aurelien 384
		if (mode.equals("AJOUT")) {
749 aurelien 385
			Publication publi = new Publication(pub,uri,auteur, collPub,nomArt,editeur,datePar,tome,fascicule,pages);
219 aurelien 386
			mediateur.ajouterPublication(this, publi);
387
		} else if (mode.equals("MODIF")) {
749 aurelien 388
			Publication publi = new Publication(idPublication,idProjet,pub,uri,auteur, collPub,nomArt,editeur,datePar,tome,fascicule,pages);
219 aurelien 389
			mediateur.modifierPublication(this, publi);
390
		}
391
	}
227 aurelien 392
 
725 aurelien 393
	private String analyserDate(String datePar) {
394
 
395
		if(datePar.matches("^[0-2][0-9]{3}$")) {
396
			return "";
397
		} else {
398
			return "Format de date incorrect ";
399
		}
400
	}
401
 
227 aurelien 402
	private void genererChampsAuteur(String auteursStr, boolean ajouter) {
705 aurelien 403
		String[] auteurs = auteursStr.split("|");
741 aurelien 404
 
405
		Window.alert("les auteurs sont : "+auteursStr);
705 aurelien 406
		conteneurChamps = new LayoutContainer();
227 aurelien 407
 
505 jp_milcent 408
		if (auteurs.length != 0) {
239 aurelien 409
			listeAuteurs = new ArrayList<ComboBox<Personne>>(auteurs.length);
505 jp_milcent 410
		} else {
239 aurelien 411
			listeAuteurs = new ArrayList<ComboBox<Personne>>(1);
227 aurelien 412
			ajouter = true ;
413
		}
414
 
415
		fieldSetAuteurs.removeAll();
416
		int i = 0;
417
 
505 jp_milcent 418
		for (i = 0; i < auteurs.length; i++) {
227 aurelien 419
			conteneurChamps.add(creerTextFieldEtBouton(auteurs[i]));
420
		}
421
 
505 jp_milcent 422
		if (ajouter) {
227 aurelien 423
			conteneurChamps.add(creerTextFieldEtBouton(null));
424
		}
425
 
426
		Button ajoutAuteurBtn = new Button("Ajouter un auteur");
505 jp_milcent 427
		ajoutAuteurBtn.addSelectionListener(new SelectionListener<ButtonEvent>() {
227 aurelien 428
 
429
			@Override
505 jp_milcent 430
			public void componentSelected(ButtonEvent be) {
705 aurelien 431
				creerTextFieldEtBouton("");
432
				int nbAuteurs = 1;
433
				for(Iterator<ComboBox<Personne>> it = listeAuteurs.iterator(); it.hasNext();) {
434
					if(listeAuteurs.size() > 1) {
435
						it.next().setFieldLabel("Auteur "+nbAuteurs);
436
						nbAuteurs++;
239 aurelien 437
					}
227 aurelien 438
				}
705 aurelien 439
				fieldSetAuteurs.layout(true);
227 aurelien 440
			}
441
 
442
		});
443
 
444
		fieldSetAuteurs.add(conteneurChamps);
445
		fieldSetAuteurs.add(ajoutAuteurBtn);
705 aurelien 446
		fieldSetAuteurs.layout(true);
227 aurelien 447
	}
448
 
449
	public HorizontalPanel creerTextFieldEtBouton(String valeurDefaut) {
705 aurelien 450
		final HorizontalPanel p = new HorizontalPanel();
227 aurelien 451
 
452
		// Création de la disposition : FIELDSET
453
		FormLayout layoutPanelTF = new FormLayout();
454
		p.setLayout(layoutPanelTF);
455
 
505 jp_milcent 456
		final ComboBox<Personne> tf = new ComboBox<Personne>();
239 aurelien 457
		tf.setDisplayField("fmt_nom_complet");
458
		tf.setStore(storeAuteurs);
705 aurelien 459
		tf.setEmptyText("Selectionnez un auteur...");
460
		String label = "Auteur ";
461
		tf.setFieldLabel(label);
239 aurelien 462
		if(valeurDefaut != null && !valeurDefaut.equals("") ) {
705 aurelien 463
			Personne auteur = listePersonneAuteur.get(valeurDefaut);
239 aurelien 464
			tf.setValue(auteur);
227 aurelien 465
		}
466
		listeAuteurs.add(tf);
467
 
705 aurelien 468
		tf.setSize(200, 20);
469
		LayoutContainer lc = new LayoutContainer();
470
		lc.setLayout(new FormLayout());
471
		lc.add(tf);
472
 
227 aurelien 473
		Button supp = new Button("-");
505 jp_milcent 474
		supp.addSelectionListener(new SelectionListener<ButtonEvent>() {
227 aurelien 475
			@Override
505 jp_milcent 476
			public void componentSelected(ButtonEvent be) {
705 aurelien 477
				int nbAuteurs = 1;
478
				if(listeAuteurs.size() != 1) {
479
					for(Iterator<ComboBox<Personne>> it = listeAuteurs.iterator(); it.hasNext();) {
480
							it.next().setFieldLabel("Auteur "+nbAuteurs);
481
							nbAuteurs++;
239 aurelien 482
					}
227 aurelien 483
				}
705 aurelien 484
				listeAuteurs.remove(tf);
485
				conteneurChamps.remove(p);
486
				fieldSetAuteurs.layout(true);
227 aurelien 487
			}
488
 
489
		});
705 aurelien 490
		p.add(lc);
227 aurelien 491
		p.add(supp);
705 aurelien 492
		conteneurChamps.add(p);
493
		fieldSetAuteurs.layout(true);
227 aurelien 494
 
505 jp_milcent 495
		return p;
227 aurelien 496
	}
705 aurelien 497
 
498
	public void obtenirListeAuteurs() {
499
		mediateur.clicObtenirListeAuteurs(this);
500
	}
501
 
505 jp_milcent 502
}