Java tutorial
package com.kohmiho.mpsr; import com.kohmiho.vaadin.component.PercentCompleteSlider; import com.vaadin.annotations.AutoGenerated; import com.vaadin.data.fieldgroup.FieldGroup; import com.vaadin.server.Resource; import com.vaadin.ui.AbsoluteLayout; import com.vaadin.ui.ComboBox; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.Label; import com.vaadin.ui.TextArea; @SuppressWarnings("serial") public class Form_1_2_1 extends CustomComponent { /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ @AutoGenerated private AbsoluteLayout mainLayout; @AutoGenerated private PercentCompleteSlider withdrawPercentComplete; @AutoGenerated private TextArea withdrawComment; @AutoGenerated private ComboBox withdrawTrend; @AutoGenerated private ComboBox withdrawStatus; @AutoGenerated private Label withdrawLabel; @AutoGenerated private PercentCompleteSlider salvPercentComplete; @AutoGenerated private TextArea salvComment; @AutoGenerated private ComboBox salvTrend; @AutoGenerated private ComboBox salvStatus; @AutoGenerated private Label salvLabel; @AutoGenerated private PercentCompleteSlider envPercentComplete; @AutoGenerated private TextArea envComment; @AutoGenerated private ComboBox envTrend; @AutoGenerated private ComboBox envStatus; @AutoGenerated private Label envLabel; @AutoGenerated private PercentCompleteSlider constructPercentComplete; @AutoGenerated private TextArea constructComment; @AutoGenerated private ComboBox constructTrend; @AutoGenerated private ComboBox constructStatus; @AutoGenerated private Label constructLabel; @AutoGenerated private PercentCompleteSlider procurePercentComplete; @AutoGenerated private TextArea procureComment; @AutoGenerated private ComboBox procureTrend; @AutoGenerated private ComboBox procureStatus; @AutoGenerated private Label procureLabel; @AutoGenerated private PercentCompleteSlider outreachPercentComplete; @AutoGenerated private TextArea outreachComment; @AutoGenerated private ComboBox outreachTrend; @AutoGenerated private ComboBox outreachStatus; @AutoGenerated private Label outreachLabel; @AutoGenerated private PercentCompleteSlider ipdePercentComplete; @AutoGenerated private TextArea ipdeComment; @AutoGenerated private ComboBox ipdeTrend; @AutoGenerated private ComboBox ipdeStatus; @AutoGenerated private Label ipdeLabel; @AutoGenerated private PercentCompleteSlider corpPercentComplete; @AutoGenerated private TextArea corpComment; @AutoGenerated private ComboBox corpTrend; @AutoGenerated private ComboBox corpStatus; @AutoGenerated private Label corpLabel; @AutoGenerated private PercentCompleteSlider licensePercentComplete; @AutoGenerated private TextArea licenseComment; @AutoGenerated private ComboBox licenseTrend; @AutoGenerated private ComboBox licenseStatus; @AutoGenerated private Label licenseLabel; @AutoGenerated private PercentCompleteSlider safetyPercentComplete; @AutoGenerated private TextArea safetyComment; @AutoGenerated private ComboBox safetyTrend; @AutoGenerated private ComboBox safetyStatus; @AutoGenerated private Label safetyLabel; @AutoGenerated private PercentCompleteSlider targetBudgetPercentComplete; @AutoGenerated private TextArea targetBudgetComment; @AutoGenerated private ComboBox targetBudgetTrend; @AutoGenerated private ComboBox targetBudgetStatus; @AutoGenerated private Label targetBudgetLabel; @AutoGenerated private PercentCompleteSlider projPercentComplete; @AutoGenerated private TextArea projComment; @AutoGenerated private ComboBox projTrend; @AutoGenerated private ComboBox projStatus; @AutoGenerated private Label projLabel; @AutoGenerated private Label labelPrototype; FieldGroup fieldGroup = new FieldGroup(); /** * The constructor should first build the main layout, set the composition * root and then do any custom initialization. * * The constructor will not be automatically regenerated by the visual * editor. */ public Form_1_2_1() { buildMainLayout(); setCompositionRoot(mainLayout); initFields(); } private void initFields() { mainLayout.addStyleName("form-1-2-1"); labelPrototype.setValue("Prototype"); PercentCompleteSlider[] sliders = { projPercentComplete, targetBudgetPercentComplete, safetyPercentComplete, licensePercentComplete, corpPercentComplete, ipdePercentComplete, outreachPercentComplete, procurePercentComplete, constructPercentComplete, envPercentComplete, salvPercentComplete, withdrawPercentComplete }; String[] pctIds = { "PROJ_PCT", "TARGET_BUDGET_PCT", "SAFETY_PCT", "LICEN_PCT", "CORP_PCT", "IPDE_PCT", "OUTREACH_PCT", "PROCU_PCT", "CONST_PCT", "ENV_PCT", "SALV_PCT", "WITHDRAW_PCT" }; for (int i = 0; i < sliders.length; i++) { fieldGroup.bind(sliders[i].slider, pctIds[i]); } TextArea[] commentFields = { projComment, targetBudgetComment, safetyComment, licenseComment, corpComment, ipdeComment, outreachComment, procureComment, constructComment, envComment, salvComment, withdrawComment }; String[] commentsIds = { "PROJ_COMMENT", "TARGET_BUDGET_COMMENT", "SAFETY_COMMENT", "LICEN_COMMENT", "CORP_COMMENT", "IPDE_COMMENT", "OUTREACH_COMMENT", "PROCU_COMMENT", "CONST_COMMENT", "ENV_COMMENT", "SALV_COMMENT", "WITHDRAW_COMMENT" }; for (int i = 0; i < commentFields.length; i++) { commentFields[i].setNullRepresentation(""); fieldGroup.bind(commentFields[i], commentsIds[i]); } String[] trends = { "Up", "Down", "Even" }; Resource[] trendIcons = { MPSRUI.ICON_ARROW_UP, MPSRUI.ICON_ARROW_DOWN, MPSRUI.ICON_ARROW_EVEN }; ComboBox[] trendFields = { projTrend, targetBudgetTrend, safetyTrend, licenseTrend, corpTrend, ipdeTrend, outreachTrend, procureTrend, constructTrend, envTrend, salvTrend, withdrawTrend }; String[] trendIds = { "PROJ_TREND", "TARGET_BUDGET_TREND", "SAFETY_TREND", "LICEN_TREND", "CORP_TREND", "IPDE_TREND", "OUTREACH_TREND", "PROCU_TREND", "CONST_TREND", "ENV_TREND", "SALV_TREND", "WITHDRAW_TREND" }; for (int i = 0; i < trendFields.length; i++) { fieldGroup.bind(trendFields[i], trendIds[i]); for (int j = 0; j < trends.length; j++) { trendFields[i].addItem(trends[j]); trendFields[i].setItemIcon(trends[j], trendIcons[j]); } } String[] colors = { "Green", "Yellow", "Red" }; Resource[] colorIcons = { MPSRUI.ICON_CIRCLE_GREEN, MPSRUI.ICON_CIRCLE_YELLOW, MPSRUI.ICON_CIRCLE_RED }; ComboBox[] statusFields = { projStatus, targetBudgetStatus, safetyStatus, licenseStatus, corpStatus, ipdeStatus, outreachStatus, procureStatus, constructStatus, envStatus, salvStatus, withdrawStatus }; String[] statusIds = { "PROJ_STATUS", "TARGET_BUDGET_STATUS", "SAFETY_STATUS", "LICEN_STATUS", "CORP_STATUS", "IPDE_STATUS", "OUTREACH_STATUS", "PROCU_STATUS", "CONST_STATUS", "ENV_STATUS", "SALV_STATUS", "WITHDRAW_STATUS" }; for (int i = 0; i < statusFields.length; i++) { fieldGroup.bind(statusFields[i], statusIds[i]); for (int j = 0; j < colors.length; j++) { statusFields[i].addItem(colors[j]); statusFields[i].setItemIcon(colors[j], colorIcons[j]); } } fieldGroup.setBuffered(false); } @AutoGenerated private AbsoluteLayout buildMainLayout() { // common part: create layout mainLayout = new AbsoluteLayout(); mainLayout.setImmediate(false); mainLayout.setWidth("800px"); mainLayout.setHeight("540px"); // top-level component properties setWidth("800px"); setHeight("540px"); // labelPrototype labelPrototype = new Label(); labelPrototype.setStyleName("prototype2"); labelPrototype.setImmediate(false); labelPrototype.setWidth("-1px"); labelPrototype.setHeight("-1px"); labelPrototype.setValue("Label"); mainLayout.addComponent(labelPrototype, "top:0.0px;right:29.0px;"); // projLabel projLabel = new Label(); projLabel.setImmediate(false); projLabel.setWidth("210px"); projLabel.setHeight("-1px"); projLabel.setValue("Project"); mainLayout.addComponent(projLabel, "top:40.0px;left:0.0px;"); // projStatus projStatus = new ComboBox(); projStatus.setCaption("Current Status"); projStatus.setImmediate(false); projStatus.setWidth("80px"); projStatus.setHeight("24px"); mainLayout.addComponent(projStatus, "top:40.0px;left:220.0px;"); // projTrend projTrend = new ComboBox(); projTrend.setCaption("Trend"); projTrend.setImmediate(false); projTrend.setWidth("90px"); projTrend.setHeight("24px"); mainLayout.addComponent(projTrend, "top:40.0px;left:310.0px;"); // projComment projComment = new TextArea(); projComment.setCaption("Comments"); projComment.setImmediate(false); projComment.setWidth("240px"); projComment.setHeight("40px"); mainLayout.addComponent(projComment, "top:40.0px;left:410.0px;"); // projPercentComplete projPercentComplete = new PercentCompleteSlider(); projPercentComplete.setCaption("% Completed"); projPercentComplete.setImmediate(false); projPercentComplete.setWidth("120px"); projPercentComplete.setHeight("40px"); mainLayout.addComponent(projPercentComplete, "top:40.0px;left:660.0px;"); // targetBudgetLabel targetBudgetLabel = new Label(); targetBudgetLabel.setImmediate(false); targetBudgetLabel.setWidth("210px"); targetBudgetLabel.setHeight("-1px"); targetBudgetLabel.setValue("Target Budget"); mainLayout.addComponent(targetBudgetLabel, "top:80.0px;left:0.0px;"); // targetBudgetStatus targetBudgetStatus = new ComboBox(); targetBudgetStatus.setImmediate(false); targetBudgetStatus.setWidth("80px"); targetBudgetStatus.setHeight("24px"); mainLayout.addComponent(targetBudgetStatus, "top:80.0px;left:220.0px;"); // targetBudgetTrend targetBudgetTrend = new ComboBox(); targetBudgetTrend.setImmediate(false); targetBudgetTrend.setWidth("90px"); targetBudgetTrend.setHeight("24px"); mainLayout.addComponent(targetBudgetTrend, "top:80.0px;left:310.0px;"); // targetBudgetComment targetBudgetComment = new TextArea(); targetBudgetComment.setImmediate(false); targetBudgetComment.setWidth("240px"); targetBudgetComment.setHeight("40px"); mainLayout.addComponent(targetBudgetComment, "top:80.0px;left:410.0px;"); // targetBudgetPercentComplete targetBudgetPercentComplete = new PercentCompleteSlider(); targetBudgetPercentComplete.setEnabled(false); targetBudgetPercentComplete.setImmediate(false); targetBudgetPercentComplete.setVisible(false); targetBudgetPercentComplete.setWidth("120px"); targetBudgetPercentComplete.setHeight("40px"); mainLayout.addComponent(targetBudgetPercentComplete, "top:80.0px;left:660.0px;"); // safetyLabel safetyLabel = new Label(); safetyLabel.setImmediate(false); safetyLabel.setWidth("210px"); safetyLabel.setHeight("-1px"); safetyLabel.setValue("Safety"); mainLayout.addComponent(safetyLabel, "top:120.0px;left:0.0px;"); // safetyStatus safetyStatus = new ComboBox(); safetyStatus.setImmediate(false); safetyStatus.setWidth("80px"); safetyStatus.setHeight("24px"); mainLayout.addComponent(safetyStatus, "top:120.0px;left:220.0px;"); // safetyTrend safetyTrend = new ComboBox(); safetyTrend.setImmediate(false); safetyTrend.setWidth("90px"); safetyTrend.setHeight("24px"); mainLayout.addComponent(safetyTrend, "top:120.0px;left:310.0px;"); // safetyComment safetyComment = new TextArea(); safetyComment.setImmediate(false); safetyComment.setWidth("240px"); safetyComment.setHeight("40px"); mainLayout.addComponent(safetyComment, "top:120.0px;left:410.0px;"); // safetyPercentComplete safetyPercentComplete = new PercentCompleteSlider(); safetyPercentComplete.setImmediate(false); safetyPercentComplete.setWidth("120px"); safetyPercentComplete.setHeight("40px"); mainLayout.addComponent(safetyPercentComplete, "top:120.0px;left:660.0px;"); // licenseLabel licenseLabel = new Label(); licenseLabel.setImmediate(false); licenseLabel.setWidth("210px"); licenseLabel.setHeight("-1px"); licenseLabel.setValue("Licensing & Permitting"); mainLayout.addComponent(licenseLabel, "top:160.0px;left:0.0px;"); // licenseStatus licenseStatus = new ComboBox(); licenseStatus.setImmediate(false); licenseStatus.setWidth("80px"); licenseStatus.setHeight("24px"); mainLayout.addComponent(licenseStatus, "top:160.0px;left:220.0px;"); // licenseTrend licenseTrend = new ComboBox(); licenseTrend.setImmediate(false); licenseTrend.setWidth("90px"); licenseTrend.setHeight("24px"); mainLayout.addComponent(licenseTrend, "top:160.0px;left:310.0px;"); // licenseComment licenseComment = new TextArea(); licenseComment.setImmediate(false); licenseComment.setWidth("240px"); licenseComment.setHeight("40px"); mainLayout.addComponent(licenseComment, "top:160.0px;left:410.0px;"); // licensePercentComplete licensePercentComplete = new PercentCompleteSlider(); licensePercentComplete.setImmediate(false); licensePercentComplete.setWidth("120px"); licensePercentComplete.setHeight("40px"); mainLayout.addComponent(licensePercentComplete, "top:160.0px;left:660.0px;"); // corpLabel corpLabel = new Label(); corpLabel.setImmediate(false); corpLabel.setWidth("210px"); corpLabel.setHeight("-1px"); corpLabel.setValue("Corporate Properties"); mainLayout.addComponent(corpLabel, "top:200.0px;left:0.0px;"); // corpStatus corpStatus = new ComboBox(); corpStatus.setImmediate(false); corpStatus.setWidth("80px"); corpStatus.setHeight("24px"); mainLayout.addComponent(corpStatus, "top:200.0px;left:220.0px;"); // corpTrend corpTrend = new ComboBox(); corpTrend.setImmediate(false); corpTrend.setWidth("90px"); corpTrend.setHeight("24px"); mainLayout.addComponent(corpTrend, "top:200.0px;left:310.0px;"); // corpComment corpComment = new TextArea(); corpComment.setImmediate(false); corpComment.setWidth("240px"); corpComment.setHeight("40px"); mainLayout.addComponent(corpComment, "top:200.0px;left:410.0px;"); // corpPercentComplete corpPercentComplete = new PercentCompleteSlider(); corpPercentComplete.setImmediate(false); corpPercentComplete.setWidth("120px"); corpPercentComplete.setHeight("40px"); mainLayout.addComponent(corpPercentComplete, "top:200.0px;left:660.0px;"); // ipdeLabel ipdeLabel = new Label(); ipdeLabel.setImmediate(false); ipdeLabel.setWidth("210px"); ipdeLabel.setHeight("-1px"); ipdeLabel.setValue("Inside Plant Design & Engineering"); mainLayout.addComponent(ipdeLabel, "top:240.0px;left:0.0px;"); // ipdeStatus ipdeStatus = new ComboBox(); ipdeStatus.setImmediate(false); ipdeStatus.setWidth("80px"); ipdeStatus.setHeight("24px"); mainLayout.addComponent(ipdeStatus, "top:240.0px;left:220.0px;"); // ipdeTrend ipdeTrend = new ComboBox(); ipdeTrend.setImmediate(false); ipdeTrend.setWidth("90px"); ipdeTrend.setHeight("24px"); mainLayout.addComponent(ipdeTrend, "top:240.0px;left:310.0px;"); // ipdeComment ipdeComment = new TextArea(); ipdeComment.setImmediate(false); ipdeComment.setWidth("240px"); ipdeComment.setHeight("40px"); mainLayout.addComponent(ipdeComment, "top:240.0px;left:410.0px;"); // ipdePercentComplete ipdePercentComplete = new PercentCompleteSlider(); ipdePercentComplete.setImmediate(false); ipdePercentComplete.setWidth("120px"); ipdePercentComplete.setHeight("40px"); mainLayout.addComponent(ipdePercentComplete, "top:240.0px;left:660.0px;"); // outreachLabel outreachLabel = new Label(); outreachLabel.setImmediate(false); outreachLabel.setWidth("210px"); outreachLabel.setHeight("-1px"); outreachLabel.setValue("Public Outreach"); mainLayout.addComponent(outreachLabel, "top:280.0px;left:0.0px;"); // outreachStatus outreachStatus = new ComboBox(); outreachStatus.setImmediate(false); outreachStatus.setWidth("80px"); outreachStatus.setHeight("24px"); mainLayout.addComponent(outreachStatus, "top:280.0px;left:220.0px;"); // outreachTrend outreachTrend = new ComboBox(); outreachTrend.setImmediate(false); outreachTrend.setWidth("90px"); outreachTrend.setHeight("24px"); mainLayout.addComponent(outreachTrend, "top:280.0px;left:310.0px;"); // outreachComment outreachComment = new TextArea(); outreachComment.setImmediate(false); outreachComment.setWidth("240px"); outreachComment.setHeight("40px"); mainLayout.addComponent(outreachComment, "top:280.0px;left:410.0px;"); // outreachPercentComplete outreachPercentComplete = new PercentCompleteSlider(); outreachPercentComplete.setImmediate(false); outreachPercentComplete.setWidth("120px"); outreachPercentComplete.setHeight("40px"); mainLayout.addComponent(outreachPercentComplete, "top:280.0px;left:660.0px;"); // procureLabel procureLabel = new Label(); procureLabel.setImmediate(false); procureLabel.setWidth("210px"); procureLabel.setHeight("-1px"); procureLabel.setValue("Procurement"); mainLayout.addComponent(procureLabel, "top:320.0px;left:0.0px;"); // procureStatus procureStatus = new ComboBox(); procureStatus.setImmediate(false); procureStatus.setWidth("80px"); procureStatus.setHeight("24px"); mainLayout.addComponent(procureStatus, "top:320.0px;left:220.0px;"); // procureTrend procureTrend = new ComboBox(); procureTrend.setImmediate(false); procureTrend.setWidth("90px"); procureTrend.setHeight("24px"); mainLayout.addComponent(procureTrend, "top:320.0px;left:310.0px;"); // procureComment procureComment = new TextArea(); procureComment.setImmediate(false); procureComment.setWidth("240px"); procureComment.setHeight("40px"); mainLayout.addComponent(procureComment, "top:320.0px;left:410.0px;"); // procurePercentComplete procurePercentComplete = new PercentCompleteSlider(); procurePercentComplete.setImmediate(false); procurePercentComplete.setWidth("120px"); procurePercentComplete.setHeight("40px"); mainLayout.addComponent(procurePercentComplete, "top:320.0px;left:660.0px;"); // constructLabel constructLabel = new Label(); constructLabel.setImmediate(false); constructLabel.setWidth("210px"); constructLabel.setHeight("-1px"); constructLabel.setValue("Construction"); mainLayout.addComponent(constructLabel, "top:360.0px;left:0.0px;"); // constructStatus constructStatus = new ComboBox(); constructStatus.setImmediate(false); constructStatus.setWidth("80px"); constructStatus.setHeight("24px"); mainLayout.addComponent(constructStatus, "top:360.0px;left:220.0px;"); // constructTrend constructTrend = new ComboBox(); constructTrend.setImmediate(false); constructTrend.setWidth("90px"); constructTrend.setHeight("24px"); mainLayout.addComponent(constructTrend, "top:360.0px;left:310.0px;"); // constructComment constructComment = new TextArea(); constructComment.setImmediate(false); constructComment.setWidth("240px"); constructComment.setHeight("40px"); mainLayout.addComponent(constructComment, "top:360.0px;left:410.0px;"); // constructPercentComplete constructPercentComplete = new PercentCompleteSlider(); constructPercentComplete.setImmediate(false); constructPercentComplete.setWidth("120px"); constructPercentComplete.setHeight("40px"); mainLayout.addComponent(constructPercentComplete, "top:360.0px;left:660.0px;"); // envLabel envLabel = new Label(); envLabel.setImmediate(false); envLabel.setWidth("210px"); envLabel.setHeight("-1px"); envLabel.setValue("Environmental - Resource Recovery"); mainLayout.addComponent(envLabel, "top:400.0px;left:0.0px;"); // envStatus envStatus = new ComboBox(); envStatus.setImmediate(false); envStatus.setWidth("80px"); envStatus.setHeight("24px"); mainLayout.addComponent(envStatus, "top:400.0px;left:220.0px;"); // envTrend envTrend = new ComboBox(); envTrend.setImmediate(false); envTrend.setWidth("90px"); envTrend.setHeight("24px"); mainLayout.addComponent(envTrend, "top:400.0px;left:310.0px;"); // envComment envComment = new TextArea(); envComment.setImmediate(false); envComment.setWidth("240px"); envComment.setHeight("40px"); mainLayout.addComponent(envComment, "top:400.0px;left:410.0px;"); // envPercentComplete envPercentComplete = new PercentCompleteSlider(); envPercentComplete.setImmediate(false); envPercentComplete.setWidth("120px"); envPercentComplete.setHeight("40px"); mainLayout.addComponent(envPercentComplete, "top:400.0px;left:660.0px;"); // salvLabel salvLabel = new Label(); salvLabel.setImmediate(false); salvLabel.setWidth("210px"); salvLabel.setHeight("-1px"); salvLabel.setValue("Salvage"); mainLayout.addComponent(salvLabel, "top:440.0px;left:0.0px;"); // salvStatus salvStatus = new ComboBox(); salvStatus.setImmediate(false); salvStatus.setWidth("80px"); salvStatus.setHeight("24px"); mainLayout.addComponent(salvStatus, "top:440.0px;left:220.0px;"); // salvTrend salvTrend = new ComboBox(); salvTrend.setImmediate(false); salvTrend.setWidth("90px"); salvTrend.setHeight("24px"); mainLayout.addComponent(salvTrend, "top:440.0px;left:310.0px;"); // salvComment salvComment = new TextArea(); salvComment.setImmediate(false); salvComment.setWidth("240px"); salvComment.setHeight("40px"); mainLayout.addComponent(salvComment, "top:440.0px;left:410.0px;"); // salvPercentComplete salvPercentComplete = new PercentCompleteSlider(); salvPercentComplete.setImmediate(false); salvPercentComplete.setWidth("120px"); salvPercentComplete.setHeight("40px"); mainLayout.addComponent(salvPercentComplete, "top:440.0px;left:660.0px;"); // withdrawLabel withdrawLabel = new Label(); withdrawLabel.setImmediate(false); withdrawLabel.setWidth("210px"); withdrawLabel.setHeight("-1px"); withdrawLabel.setValue("Withdrawal"); mainLayout.addComponent(withdrawLabel, "top:480.0px;left:0.0px;"); // withdrawStatus withdrawStatus = new ComboBox(); withdrawStatus.setImmediate(false); withdrawStatus.setWidth("80px"); withdrawStatus.setHeight("24px"); mainLayout.addComponent(withdrawStatus, "top:480.0px;left:220.0px;"); // withdrawTrend withdrawTrend = new ComboBox(); withdrawTrend.setImmediate(false); withdrawTrend.setWidth("90px"); withdrawTrend.setHeight("24px"); mainLayout.addComponent(withdrawTrend, "top:480.0px;left:310.0px;"); // withdrawComment withdrawComment = new TextArea(); withdrawComment.setImmediate(false); withdrawComment.setWidth("240px"); withdrawComment.setHeight("40px"); mainLayout.addComponent(withdrawComment, "top:480.0px;left:410.0px;"); // withdrawPercentComplete withdrawPercentComplete = new PercentCompleteSlider(); withdrawPercentComplete.setImmediate(false); withdrawPercentComplete.setWidth("120px"); withdrawPercentComplete.setHeight("40px"); mainLayout.addComponent(withdrawPercentComplete, "top:480.0px;left:660.0px;"); return mainLayout; } }