/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 *
 * generated by Xtext 2.11.0
 *
 */

package org.eclipse.osbp.ecview.dsl.serializer;

import com.google.inject.Inject;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess;
import org.eclipse.osbp.ecview.semantic.uimodel.UiAddToTableCommand;
import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanReferenceField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot;
import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanValidationValidator;
import org.eclipse.osbp.ecview.semantic.uimodel.UiBinding;
import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAlias;
import org.eclipse.osbp.ecview.semantic.uimodel.UiBindingEndpointAssignment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiBrowser;
import org.eclipse.osbp.ecview.semantic.uimodel.UiButton;
import org.eclipse.osbp.ecview.semantic.uimodel.UiChangeTrigger;
import org.eclipse.osbp.ecview.semantic.uimodel.UiCheckBox;
import org.eclipse.osbp.ecview.semantic.uimodel.UiColumn;
import org.eclipse.osbp.ecview.semantic.uimodel.UiColumnsAssignment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiComboBox;
import org.eclipse.osbp.ecview.semantic.uimodel.UiCommandBindableDef;
import org.eclipse.osbp.ecview.semantic.uimodel.UiDateField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiDecimalField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiDialog;
import org.eclipse.osbp.ecview.semantic.uimodel.UiDialogAssignment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiDialogSearchFieldAssignment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiDisplayView;
import org.eclipse.osbp.ecview.semantic.uimodel.UiErrorCode;
import org.eclipse.osbp.ecview.semantic.uimodel.UiExposedAction;
import org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayout;
import org.eclipse.osbp.ecview.semantic.uimodel.UiFormLayoutAssigment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayout;
import org.eclipse.osbp.ecview.semantic.uimodel.UiGridLayoutAssigment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroup;
import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalButtonGroupAssigment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayout;
import org.eclipse.osbp.ecview.semantic.uimodel.UiHorizontalLayoutAssigment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiI18nInfo;
import org.eclipse.osbp.ecview.semantic.uimodel.UiIDEView;
import org.eclipse.osbp.ecview.semantic.uimodel.UiImage;
import org.eclipse.osbp.ecview.semantic.uimodel.UiLabel;
import org.eclipse.osbp.ecview.semantic.uimodel.UiList;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedDecimalField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedNumericField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMaskedTextField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMaxLengthValidator;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMinLengthValidator;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavBarAction;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationButton;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationCommand;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPage;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationPageAssignment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationRoot;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileNavigationRootAssigment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileSearchPanel;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabAssignment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileTabSheet;
import org.eclipse.osbp.ecview.semantic.uimodel.UiMobileView;
import org.eclipse.osbp.ecview.semantic.uimodel.UiModel;
import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage;
import org.eclipse.osbp.ecview.semantic.uimodel.UiNestedProperty;
import org.eclipse.osbp.ecview.semantic.uimodel.UiNumericField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiOpenDialogCommand;
import org.eclipse.osbp.ecview.semantic.uimodel.UiOptionsGroup;
import org.eclipse.osbp.ecview.semantic.uimodel.UiPanel;
import org.eclipse.osbp.ecview.semantic.uimodel.UiPasswordField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiPathSegment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiPoint;
import org.eclipse.osbp.ecview.semantic.uimodel.UiPrefixedMaskedTextField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiProgressBar;
import org.eclipse.osbp.ecview.semantic.uimodel.UiRawBindablePathSegment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiRegexpValidator;
import org.eclipse.osbp.ecview.semantic.uimodel.UiRemoveFromTableCommand;
import org.eclipse.osbp.ecview.semantic.uimodel.UiRichTextArea;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSearchDialog;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSearchField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSearchPanel;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSearchWithDialogCommand;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSendEventCommand;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSetNewInstanceCommand;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrder;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSortOrderAssignment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanel;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSplitpanelAssigment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSuggestTextField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiSwitch;
import org.eclipse.osbp.ecview.semantic.uimodel.UiTabAssignment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiTabSheet;
import org.eclipse.osbp.ecview.semantic.uimodel.UiTable;
import org.eclipse.osbp.ecview.semantic.uimodel.UiTextArea;
import org.eclipse.osbp.ecview.semantic.uimodel.UiTextField;
import org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableDef;
import org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableRawType;
import org.eclipse.osbp.ecview.semantic.uimodel.UiTypedBindableRawTypeAlias;
import org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAlias;
import org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorAssignment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiValidatorDef;
import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroup;
import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalComponentGroupAssigment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayout;
import org.eclipse.osbp.ecview.semantic.uimodel.UiVerticalLayoutAssigment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiViewSet;
import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessor;
import org.eclipse.osbp.ecview.semantic.uimodel.UiVisibilityProcessorAssignment;
import org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseValidator;
import org.eclipse.osbp.ecview.semantic.uimodel.UiXbaseVisibilityRule;
import org.eclipse.osbp.xtext.oxtype.oxtype.OXImportDeclaration;
import org.eclipse.osbp.xtext.oxtype.oxtype.OXtypePackage;
import org.eclipse.osbp.xtext.oxtype.serializer.OXtypeSemanticSequencer;
import org.eclipse.xtext.Action;
import org.eclipse.xtext.Parameter;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.common.types.JvmFormalParameter;
import org.eclipse.xtext.common.types.JvmGenericArrayTypeReference;
import org.eclipse.xtext.common.types.JvmInnerTypeReference;
import org.eclipse.xtext.common.types.JvmLowerBound;
import org.eclipse.xtext.common.types.JvmParameterizedTypeReference;
import org.eclipse.xtext.common.types.JvmTypeParameter;
import org.eclipse.xtext.common.types.JvmUpperBound;
import org.eclipse.xtext.common.types.JvmWildcardTypeReference;
import org.eclipse.xtext.common.types.TypesPackage;
import org.eclipse.xtext.serializer.ISerializationContext;
import org.eclipse.xtext.serializer.acceptor.SequenceFeeder;
import org.eclipse.xtext.serializer.sequencer.ITransientValueService.ValueTransient;
import org.eclipse.xtext.xbase.XAssignment;
import org.eclipse.xtext.xbase.XBasicForLoopExpression;
import org.eclipse.xtext.xbase.XBinaryOperation;
import org.eclipse.xtext.xbase.XBlockExpression;
import org.eclipse.xtext.xbase.XBooleanLiteral;
import org.eclipse.xtext.xbase.XCasePart;
import org.eclipse.xtext.xbase.XCastedExpression;
import org.eclipse.xtext.xbase.XCatchClause;
import org.eclipse.xtext.xbase.XClosure;
import org.eclipse.xtext.xbase.XConstructorCall;
import org.eclipse.xtext.xbase.XDoWhileExpression;
import org.eclipse.xtext.xbase.XFeatureCall;
import org.eclipse.xtext.xbase.XForLoopExpression;
import org.eclipse.xtext.xbase.XIfExpression;
import org.eclipse.xtext.xbase.XInstanceOfExpression;
import org.eclipse.xtext.xbase.XListLiteral;
import org.eclipse.xtext.xbase.XMemberFeatureCall;
import org.eclipse.xtext.xbase.XNullLiteral;
import org.eclipse.xtext.xbase.XNumberLiteral;
import org.eclipse.xtext.xbase.XPostfixOperation;
import org.eclipse.xtext.xbase.XReturnExpression;
import org.eclipse.xtext.xbase.XSetLiteral;
import org.eclipse.xtext.xbase.XStringLiteral;
import org.eclipse.xtext.xbase.XSwitchExpression;
import org.eclipse.xtext.xbase.XSynchronizedExpression;
import org.eclipse.xtext.xbase.XThrowExpression;
import org.eclipse.xtext.xbase.XTryCatchFinallyExpression;
import org.eclipse.xtext.xbase.XTypeLiteral;
import org.eclipse.xtext.xbase.XUnaryOperation;
import org.eclipse.xtext.xbase.XVariableDeclaration;
import org.eclipse.xtext.xbase.XWhileExpression;
import org.eclipse.xtext.xbase.XbasePackage;
import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotation;
import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationElementValuePair;
import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationsPackage;
import org.eclipse.xtext.xtype.XFunctionTypeRef;
import org.eclipse.xtext.xtype.XImportSection;
import org.eclipse.xtext.xtype.XtypePackage;

@SuppressWarnings("all")
public class UIGrammarSemanticSequencer extends OXtypeSemanticSequencer {

	@Inject
	private UIGrammarGrammarAccess grammarAccess;
	
	@Override
	public void sequence(ISerializationContext context, EObject semanticObject) {
		EPackage epackage = semanticObject.eClass().getEPackage();
		ParserRule rule = context.getParserRule();
		Action action = context.getAssignedAction();
		Set<Parameter> parameters = context.getEnabledBooleanParameters();
		if (epackage == OXtypePackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case OXtypePackage.OX_IMPORT_DECLARATION:
				sequence_XImportDeclaration(context, (OXImportDeclaration) semanticObject); 
				return; 
			}
		else if (epackage == TypesPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case TypesPackage.JVM_FORMAL_PARAMETER:
				if (rule == grammarAccess.getFullJvmFormalParameterRule()) {
					sequence_FullJvmFormalParameter(context, (JvmFormalParameter) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmFormalParameterRule()) {
					sequence_JvmFormalParameter(context, (JvmFormalParameter) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_GENERIC_ARRAY_TYPE_REFERENCE:
				sequence_JvmTypeReference(context, (JvmGenericArrayTypeReference) semanticObject); 
				return; 
			case TypesPackage.JVM_INNER_TYPE_REFERENCE:
				sequence_JvmParameterizedTypeReference(context, (JvmInnerTypeReference) semanticObject); 
				return; 
			case TypesPackage.JVM_LOWER_BOUND:
				if (rule == grammarAccess.getJvmLowerBoundAndedRule()) {
					sequence_JvmLowerBoundAnded(context, (JvmLowerBound) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmLowerBoundRule()) {
					sequence_JvmLowerBound(context, (JvmLowerBound) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_PARAMETERIZED_TYPE_REFERENCE:
				if (action == grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()) {
					sequence_JvmParameterizedTypeReference_JvmInnerTypeReference_1_4_0_0_0(context, (JvmParameterizedTypeReference) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmTypeReferenceRule()
						|| action == grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()
						|| rule == grammarAccess.getJvmParameterizedTypeReferenceRule()
						|| rule == grammarAccess.getJvmArgumentTypeReferenceRule()) {
					sequence_JvmParameterizedTypeReference(context, (JvmParameterizedTypeReference) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_TYPE_PARAMETER:
				sequence_JvmTypeParameter(context, (JvmTypeParameter) semanticObject); 
				return; 
			case TypesPackage.JVM_UPPER_BOUND:
				if (rule == grammarAccess.getJvmUpperBoundAndedRule()) {
					sequence_JvmUpperBoundAnded(context, (JvmUpperBound) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmUpperBoundRule()) {
					sequence_JvmUpperBound(context, (JvmUpperBound) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_WILDCARD_TYPE_REFERENCE:
				sequence_JvmWildcardTypeReference(context, (JvmWildcardTypeReference) semanticObject); 
				return; 
			}
		else if (epackage == UiModelPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case UiModelPackage.UI_ADD_TO_TABLE_COMMAND:
				sequence_UiAddToTableCommand(context, (UiAddToTableCommand) semanticObject); 
				return; 
			case UiModelPackage.UI_BEAN_REFERENCE_FIELD:
				sequence_UiBeanReferenceField(context, (UiBeanReferenceField) semanticObject); 
				return; 
			case UiModelPackage.UI_BEAN_SLOT:
				sequence_UiBeanSlot(context, (UiBeanSlot) semanticObject); 
				return; 
			case UiModelPackage.UI_BEAN_VALIDATION_VALIDATOR:
				sequence_UiBeanValidationValidator(context, (UiBeanValidationValidator) semanticObject); 
				return; 
			case UiModelPackage.UI_BINDING:
				sequence_UiBinding(context, (UiBinding) semanticObject); 
				return; 
			case UiModelPackage.UI_BINDING_ENDPOINT_ALIAS:
				sequence_UiBindingEndpointAlias(context, (UiBindingEndpointAlias) semanticObject); 
				return; 
			case UiModelPackage.UI_BINDING_ENDPOINT_ASSIGNMENT:
				sequence_UiBindingEndpointAssignment(context, (UiBindingEndpointAssignment) semanticObject); 
				return; 
			case UiModelPackage.UI_BROWSER:
				sequence_UiBrowser(context, (UiBrowser) semanticObject); 
				return; 
			case UiModelPackage.UI_BUTTON:
				sequence_UiButton(context, (UiButton) semanticObject); 
				return; 
			case UiModelPackage.UI_CHANGE_TRIGGER:
				sequence_UiChangeTrigger(context, (UiChangeTrigger) semanticObject); 
				return; 
			case UiModelPackage.UI_CHECK_BOX:
				sequence_UiCheckBox(context, (UiCheckBox) semanticObject); 
				return; 
			case UiModelPackage.UI_COLUMN:
				sequence_UiColumn(context, (UiColumn) semanticObject); 
				return; 
			case UiModelPackage.UI_COLUMNS_ASSIGNMENT:
				sequence_UiColumnsAssignment(context, (UiColumnsAssignment) semanticObject); 
				return; 
			case UiModelPackage.UI_COMBO_BOX:
				sequence_UiComboBox(context, (UiComboBox) semanticObject); 
				return; 
			case UiModelPackage.UI_COMMAND_BINDABLE_DEF:
				sequence_UiCommandBindableDef(context, (UiCommandBindableDef) semanticObject); 
				return; 
			case UiModelPackage.UI_DATE_FIELD:
				sequence_UiDateField(context, (UiDateField) semanticObject); 
				return; 
			case UiModelPackage.UI_DECIMAL_FIELD:
				sequence_UiDecimalField(context, (UiDecimalField) semanticObject); 
				return; 
			case UiModelPackage.UI_DIALOG:
				sequence_UiDialog(context, (UiDialog) semanticObject); 
				return; 
			case UiModelPackage.UI_DIALOG_ASSIGNMENT:
				sequence_UiDialogAssignment(context, (UiDialogAssignment) semanticObject); 
				return; 
			case UiModelPackage.UI_DIALOG_SEARCH_FIELD_ASSIGNMENT:
				sequence_UiDialogSearchFieldAssignment(context, (UiDialogSearchFieldAssignment) semanticObject); 
				return; 
			case UiModelPackage.UI_DISPLAY_VIEW:
				sequence_UiDisplayView(context, (UiDisplayView) semanticObject); 
				return; 
			case UiModelPackage.UI_ERROR_CODE:
				sequence_UiErrorCode(context, (UiErrorCode) semanticObject); 
				return; 
			case UiModelPackage.UI_EXPOSED_ACTION:
				sequence_UiExposedAction(context, (UiExposedAction) semanticObject); 
				return; 
			case UiModelPackage.UI_FORM_LAYOUT:
				sequence_UiFormLayout(context, (UiFormLayout) semanticObject); 
				return; 
			case UiModelPackage.UI_FORM_LAYOUT_ASSIGMENT:
				sequence_UiFormLayoutAssigment(context, (UiFormLayoutAssigment) semanticObject); 
				return; 
			case UiModelPackage.UI_GRID_LAYOUT:
				sequence_UiGridLayout(context, (UiGridLayout) semanticObject); 
				return; 
			case UiModelPackage.UI_GRID_LAYOUT_ASSIGMENT:
				sequence_UiGridLayoutAssigment(context, (UiGridLayoutAssigment) semanticObject); 
				return; 
			case UiModelPackage.UI_HORIZONTAL_BUTTON_GROUP:
				sequence_UiMobileHorizontalButtonGroup(context, (UiHorizontalButtonGroup) semanticObject); 
				return; 
			case UiModelPackage.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT:
				sequence_UiMobileHorizontalButtonGroupAssigment(context, (UiHorizontalButtonGroupAssigment) semanticObject); 
				return; 
			case UiModelPackage.UI_HORIZONTAL_LAYOUT:
				if (rule == grammarAccess.getUiHorizontalLayoutRule()
						|| rule == grammarAccess.getUiEmbeddableRule()
						|| rule == grammarAccess.getUiLayoutRule()) {
					sequence_UiHorizontalLayout(context, (UiHorizontalLayout) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getUiMobileHorizontalLayoutRule()
						|| rule == grammarAccess.getUiMobileEmbeddableRule()
						|| rule == grammarAccess.getUiMobileLayoutRule()) {
					sequence_UiMobileHorizontalLayout(context, (UiHorizontalLayout) semanticObject); 
					return; 
				}
				else break;
			case UiModelPackage.UI_HORIZONTAL_LAYOUT_ASSIGMENT:
				if (rule == grammarAccess.getUiHorizontalLayoutAssigmentRule()) {
					sequence_UiHorizontalLayoutAssigment(context, (UiHorizontalLayoutAssigment) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getUiMobileHorizontalLayoutAssigmentRule()) {
					sequence_UiMobileHorizontalLayoutAssigment(context, (UiHorizontalLayoutAssigment) semanticObject); 
					return; 
				}
				else break;
			case UiModelPackage.UI_I1_8N_INFO:
				sequence_UiI18nInfo(context, (UiI18nInfo) semanticObject); 
				return; 
			case UiModelPackage.UI_IDE_VIEW:
				sequence_UiIDEView(context, (UiIDEView) semanticObject); 
				return; 
			case UiModelPackage.UI_IMAGE:
				sequence_UiImage(context, (UiImage) semanticObject); 
				return; 
			case UiModelPackage.UI_LABEL:
				sequence_UiLabel(context, (UiLabel) semanticObject); 
				return; 
			case UiModelPackage.UI_LIST:
				sequence_UiList(context, (UiList) semanticObject); 
				return; 
			case UiModelPackage.UI_MASKED_DECIMAL_FIELD:
				sequence_UiMaskedDecimalField(context, (UiMaskedDecimalField) semanticObject); 
				return; 
			case UiModelPackage.UI_MASKED_NUMERIC_FIELD:
				sequence_UiMaskedNumericField(context, (UiMaskedNumericField) semanticObject); 
				return; 
			case UiModelPackage.UI_MASKED_TEXT_FIELD:
				sequence_UiMaskedTextField(context, (UiMaskedTextField) semanticObject); 
				return; 
			case UiModelPackage.UI_MAX_LENGTH_VALIDATOR:
				sequence_UiMaxLengthValidator(context, (UiMaxLengthValidator) semanticObject); 
				return; 
			case UiModelPackage.UI_MIN_LENGTH_VALIDATOR:
				sequence_UiMinLengthValidator(context, (UiMinLengthValidator) semanticObject); 
				return; 
			case UiModelPackage.UI_MOBILE_NAV_BAR_ACTION:
				sequence_UiMobileNavBarAction(context, (UiMobileNavBarAction) semanticObject); 
				return; 
			case UiModelPackage.UI_MOBILE_NAVIGATION_BUTTON:
				sequence_UiMobileNavigationButton(context, (UiMobileNavigationButton) semanticObject); 
				return; 
			case UiModelPackage.UI_MOBILE_NAVIGATION_COMMAND:
				sequence_UiMobileNavigationCommand(context, (UiMobileNavigationCommand) semanticObject); 
				return; 
			case UiModelPackage.UI_MOBILE_NAVIGATION_PAGE:
				sequence_UiMobileNavigationPage(context, (UiMobileNavigationPage) semanticObject); 
				return; 
			case UiModelPackage.UI_MOBILE_NAVIGATION_PAGE_ASSIGNMENT:
				sequence_UiMobileNavigationPageAssignment(context, (UiMobileNavigationPageAssignment) semanticObject); 
				return; 
			case UiModelPackage.UI_MOBILE_NAVIGATION_ROOT:
				sequence_UiMobileNavigationRoot(context, (UiMobileNavigationRoot) semanticObject); 
				return; 
			case UiModelPackage.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT:
				sequence_UiMobileNavigationRootAssigment(context, (UiMobileNavigationRootAssigment) semanticObject); 
				return; 
			case UiModelPackage.UI_MOBILE_SEARCH_PANEL:
				sequence_UiMobileSearchPanel(context, (UiMobileSearchPanel) semanticObject); 
				return; 
			case UiModelPackage.UI_MOBILE_TAB_ASSIGNMENT:
				sequence_UiMobileTabAssignment(context, (UiMobileTabAssignment) semanticObject); 
				return; 
			case UiModelPackage.UI_MOBILE_TAB_SHEET:
				sequence_UiMobileTabSheet(context, (UiMobileTabSheet) semanticObject); 
				return; 
			case UiModelPackage.UI_MOBILE_VIEW:
				sequence_UiMobileView(context, (UiMobileView) semanticObject); 
				return; 
			case UiModelPackage.UI_MODEL:
				sequence_UiModel(context, (UiModel) semanticObject); 
				return; 
			case UiModelPackage.UI_NESTED_PROPERTY:
				sequence_UiNestedProperty(context, (UiNestedProperty) semanticObject); 
				return; 
			case UiModelPackage.UI_NUMERIC_FIELD:
				sequence_UiNumericField(context, (UiNumericField) semanticObject); 
				return; 
			case UiModelPackage.UI_OPEN_DIALOG_COMMAND:
				sequence_UiOpenDialogCommand(context, (UiOpenDialogCommand) semanticObject); 
				return; 
			case UiModelPackage.UI_OPTIONS_GROUP:
				sequence_UiOptionsGroup(context, (UiOptionsGroup) semanticObject); 
				return; 
			case UiModelPackage.UI_PANEL:
				sequence_UiPanel(context, (UiPanel) semanticObject); 
				return; 
			case UiModelPackage.UI_PASSWORD_FIELD:
				sequence_UiPasswordField(context, (UiPasswordField) semanticObject); 
				return; 
			case UiModelPackage.UI_PATH_SEGMENT:
				sequence_UiPathSegment(context, (UiPathSegment) semanticObject); 
				return; 
			case UiModelPackage.UI_POINT:
				sequence_UiPoint(context, (UiPoint) semanticObject); 
				return; 
			case UiModelPackage.UI_PREFIX_TO_MASK_MAP_ENTRY:
				sequence_UiPrefixToMaskMapEntry(context, (Map.Entry) semanticObject); 
				return; 
			case UiModelPackage.UI_PREFIXED_MASKED_TEXT_FIELD:
				sequence_UiPrefixedMaskedTextField(context, (UiPrefixedMaskedTextField) semanticObject); 
				return; 
			case UiModelPackage.UI_PROGRESS_BAR:
				sequence_UiProgressBar(context, (UiProgressBar) semanticObject); 
				return; 
			case UiModelPackage.UI_RAW_BINDABLE_PATH_SEGMENT:
				sequence_UiRawBindablePathSegment(context, (UiRawBindablePathSegment) semanticObject); 
				return; 
			case UiModelPackage.UI_REGEXP_VALIDATOR:
				sequence_UiRegexpValidator(context, (UiRegexpValidator) semanticObject); 
				return; 
			case UiModelPackage.UI_REMOVE_FROM_TABLE_COMMAND:
				sequence_UiRemoveFromTableCommand(context, (UiRemoveFromTableCommand) semanticObject); 
				return; 
			case UiModelPackage.UI_RICH_TEXT_AREA:
				sequence_UiRichTextArea(context, (UiRichTextArea) semanticObject); 
				return; 
			case UiModelPackage.UI_SEARCH_DIALOG:
				sequence_UiSearchDialog(context, (UiSearchDialog) semanticObject); 
				return; 
			case UiModelPackage.UI_SEARCH_FIELD:
				sequence_UiSearchField(context, (UiSearchField) semanticObject); 
				return; 
			case UiModelPackage.UI_SEARCH_PANEL:
				sequence_UiSearchPanel(context, (UiSearchPanel) semanticObject); 
				return; 
			case UiModelPackage.UI_SEARCH_WITH_DIALOG_COMMAND:
				sequence_UiSearchWithDialogCommand(context, (UiSearchWithDialogCommand) semanticObject); 
				return; 
			case UiModelPackage.UI_SEND_EVENT_COMMAND:
				sequence_UiSendEventCommand(context, (UiSendEventCommand) semanticObject); 
				return; 
			case UiModelPackage.UI_SET_NEW_INSTANCE_COMMAND:
				sequence_UiSetNewInstanceCommand(context, (UiSetNewInstanceCommand) semanticObject); 
				return; 
			case UiModelPackage.UI_SORT_ORDER:
				sequence_UiSortOrder(context, (UiSortOrder) semanticObject); 
				return; 
			case UiModelPackage.UI_SORT_ORDER_ASSIGNMENT:
				sequence_UiSortOrderAssignment(context, (UiSortOrderAssignment) semanticObject); 
				return; 
			case UiModelPackage.UI_SPLITPANEL:
				sequence_UiSplitpanel(context, (UiSplitpanel) semanticObject); 
				return; 
			case UiModelPackage.UI_SPLITPANEL_ASSIGMENT:
				sequence_UiSplitpanelAssigment(context, (UiSplitpanelAssigment) semanticObject); 
				return; 
			case UiModelPackage.UI_SUGGEST_TEXT_FIELD:
				sequence_UiSuggestTextField(context, (UiSuggestTextField) semanticObject); 
				return; 
			case UiModelPackage.UI_SWITCH:
				sequence_UiMobileSwitch(context, (UiSwitch) semanticObject); 
				return; 
			case UiModelPackage.UI_TAB_ASSIGNMENT:
				sequence_UiTabAssignment(context, (UiTabAssignment) semanticObject); 
				return; 
			case UiModelPackage.UI_TAB_SHEET:
				sequence_UiTabSheet(context, (UiTabSheet) semanticObject); 
				return; 
			case UiModelPackage.UI_TABLE:
				sequence_UiTable(context, (UiTable) semanticObject); 
				return; 
			case UiModelPackage.UI_TEXT_AREA:
				sequence_UiTextArea(context, (UiTextArea) semanticObject); 
				return; 
			case UiModelPackage.UI_TEXT_FIELD:
				sequence_UiTextField(context, (UiTextField) semanticObject); 
				return; 
			case UiModelPackage.UI_TYPED_BINDABLE_DEF:
				sequence_UiTypedBindableDef(context, (UiTypedBindableDef) semanticObject); 
				return; 
			case UiModelPackage.UI_TYPED_BINDABLE_RAW_TYPE:
				sequence_UiTypedBindableRawType(context, (UiTypedBindableRawType) semanticObject); 
				return; 
			case UiModelPackage.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS:
				sequence_UiTypedBindableRawTypeAlias(context, (UiTypedBindableRawTypeAlias) semanticObject); 
				return; 
			case UiModelPackage.UI_VALIDATOR_ALIAS:
				sequence_UiValidatorAlias(context, (UiValidatorAlias) semanticObject); 
				return; 
			case UiModelPackage.UI_VALIDATOR_ASSIGNMENT:
				sequence_UiValidatorAssignment(context, (UiValidatorAssignment) semanticObject); 
				return; 
			case UiModelPackage.UI_VALIDATOR_DEF:
				sequence_UiValidatorDef(context, (UiValidatorDef) semanticObject); 
				return; 
			case UiModelPackage.UI_VERTICAL_COMPONENT_GROUP:
				sequence_UiMobileVerticalComponentGroup(context, (UiVerticalComponentGroup) semanticObject); 
				return; 
			case UiModelPackage.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT:
				sequence_UiMobileVerticalComponentGroupAssigment(context, (UiVerticalComponentGroupAssigment) semanticObject); 
				return; 
			case UiModelPackage.UI_VERTICAL_LAYOUT:
				if (rule == grammarAccess.getUiMobileVerticalLayoutRule()
						|| rule == grammarAccess.getUiMobileEmbeddableRule()
						|| rule == grammarAccess.getUiMobileLayoutRule()) {
					sequence_UiMobileVerticalLayout(context, (UiVerticalLayout) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getUiVerticalLayoutRule()
						|| rule == grammarAccess.getUiEmbeddableRule()
						|| rule == grammarAccess.getUiLayoutRule()) {
					sequence_UiVerticalLayout(context, (UiVerticalLayout) semanticObject); 
					return; 
				}
				else break;
			case UiModelPackage.UI_VERTICAL_LAYOUT_ASSIGMENT:
				if (rule == grammarAccess.getUiMobileVerticalLayoutAssigmentRule()) {
					sequence_UiMobileVerticalLayoutAssigment(context, (UiVerticalLayoutAssigment) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getUiVerticalLayoutAssigmentRule()) {
					sequence_UiVerticalLayoutAssigment(context, (UiVerticalLayoutAssigment) semanticObject); 
					return; 
				}
				else break;
			case UiModelPackage.UI_VIEW_SET:
				sequence_UiViewSet(context, (UiViewSet) semanticObject); 
				return; 
			case UiModelPackage.UI_VISIBILITY_PROCESSOR:
				sequence_UiVisibilityProcessor(context, (UiVisibilityProcessor) semanticObject); 
				return; 
			case UiModelPackage.UI_VISIBILITY_PROCESSOR_ASSIGNMENT:
				sequence_UiVisibilityProcessorAssignment(context, (UiVisibilityProcessorAssignment) semanticObject); 
				return; 
			case UiModelPackage.UI_XBASE_VALIDATOR:
				sequence_UiXbaseValidator(context, (UiXbaseValidator) semanticObject); 
				return; 
			case UiModelPackage.UI_XBASE_VISIBILITY_RULE:
				sequence_UiXbaseVisibilityRule(context, (UiXbaseVisibilityRule) semanticObject); 
				return; 
			}
		else if (epackage == XAnnotationsPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case XAnnotationsPackage.XANNOTATION:
				sequence_XAnnotation(context, (XAnnotation) semanticObject); 
				return; 
			case XAnnotationsPackage.XANNOTATION_ELEMENT_VALUE_PAIR:
				sequence_XAnnotationElementValuePair(context, (XAnnotationElementValuePair) semanticObject); 
				return; 
			}
		else if (epackage == XbasePackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case XbasePackage.XASSIGNMENT:
				sequence_XAssignment_XMemberFeatureCall(context, (XAssignment) semanticObject); 
				return; 
			case XbasePackage.XBASIC_FOR_LOOP_EXPRESSION:
				sequence_XBasicForLoopExpression(context, (XBasicForLoopExpression) semanticObject); 
				return; 
			case XbasePackage.XBINARY_OPERATION:
				sequence_XAdditiveExpression_XAndExpression_XAssignment_XEqualityExpression_XMultiplicativeExpression_XOrExpression_XOtherOperatorExpression_XRelationalExpression(context, (XBinaryOperation) semanticObject); 
				return; 
			case XbasePackage.XBLOCK_EXPRESSION:
				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()
						|| action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
						|| rule == grammarAccess.getXAnnotationElementValueRule()
						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
						|| rule == grammarAccess.getXExpressionRule()
						|| rule == grammarAccess.getXAssignmentRule()
						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOrExpressionRule()
						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAndExpressionRule()
						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXEqualityExpressionRule()
						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXRelationalExpressionRule()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAdditiveExpressionRule()
						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXUnaryOperationRule()
						|| rule == grammarAccess.getXCastedExpressionRule()
						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
						|| rule == grammarAccess.getXPostfixOperationRule()
						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
						|| rule == grammarAccess.getXMemberFeatureCallRule()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
						|| rule == grammarAccess.getXPrimaryExpressionRule()
						|| rule == grammarAccess.getXParenthesizedExpressionRule()
						|| rule == grammarAccess.getXBlockExpressionRule()
						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
					sequence_XBlockExpression(context, (XBlockExpression) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getXExpressionInClosureRule()) {
					sequence_XExpressionInClosure(context, (XBlockExpression) semanticObject); 
					return; 
				}
				else break;
			case XbasePackage.XBOOLEAN_LITERAL:
				sequence_XBooleanLiteral(context, (XBooleanLiteral) semanticObject); 
				return; 
			case XbasePackage.XCASE_PART:
				sequence_XCasePart(context, (XCasePart) semanticObject); 
				return; 
			case XbasePackage.XCASTED_EXPRESSION:
				sequence_XCastedExpression(context, (XCastedExpression) semanticObject); 
				return; 
			case XbasePackage.XCATCH_CLAUSE:
				sequence_XCatchClause(context, (XCatchClause) semanticObject); 
				return; 
			case XbasePackage.XCLOSURE:
				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()
						|| action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
						|| rule == grammarAccess.getXAnnotationElementValueRule()
						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
						|| rule == grammarAccess.getXExpressionRule()
						|| rule == grammarAccess.getXAssignmentRule()
						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOrExpressionRule()
						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAndExpressionRule()
						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXEqualityExpressionRule()
						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXRelationalExpressionRule()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAdditiveExpressionRule()
						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXUnaryOperationRule()
						|| rule == grammarAccess.getXCastedExpressionRule()
						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
						|| rule == grammarAccess.getXPostfixOperationRule()
						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
						|| rule == grammarAccess.getXMemberFeatureCallRule()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
						|| rule == grammarAccess.getXPrimaryExpressionRule()
						|| rule == grammarAccess.getXLiteralRule()
						|| rule == grammarAccess.getXClosureRule()
						|| rule == grammarAccess.getXParenthesizedExpressionRule()
						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
					sequence_XClosure(context, (XClosure) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getXShortClosureRule()) {
					sequence_XShortClosure(context, (XClosure) semanticObject); 
					return; 
				}
				else break;
			case XbasePackage.XCONSTRUCTOR_CALL:
				sequence_XConstructorCall(context, (XConstructorCall) semanticObject); 
				return; 
			case XbasePackage.XDO_WHILE_EXPRESSION:
				sequence_XDoWhileExpression(context, (XDoWhileExpression) semanticObject); 
				return; 
			case XbasePackage.XFEATURE_CALL:
				sequence_XFeatureCall(context, (XFeatureCall) semanticObject); 
				return; 
			case XbasePackage.XFOR_LOOP_EXPRESSION:
				sequence_XForLoopExpression(context, (XForLoopExpression) semanticObject); 
				return; 
			case XbasePackage.XIF_EXPRESSION:
				sequence_XIfExpression(context, (XIfExpression) semanticObject); 
				return; 
			case XbasePackage.XINSTANCE_OF_EXPRESSION:
				sequence_XRelationalExpression(context, (XInstanceOfExpression) semanticObject); 
				return; 
			case XbasePackage.XLIST_LITERAL:
				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()) {
					sequence_XAnnotationElementValueOrCommaList_XListLiteral(context, (XListLiteral) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getXAnnotationElementValueRule()) {
					sequence_XAnnotationElementValue_XListLiteral(context, (XListLiteral) semanticObject); 
					return; 
				}
				else if (action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
						|| rule == grammarAccess.getXExpressionRule()
						|| rule == grammarAccess.getXAssignmentRule()
						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOrExpressionRule()
						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAndExpressionRule()
						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXEqualityExpressionRule()
						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXRelationalExpressionRule()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAdditiveExpressionRule()
						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXUnaryOperationRule()
						|| rule == grammarAccess.getXCastedExpressionRule()
						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
						|| rule == grammarAccess.getXPostfixOperationRule()
						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
						|| rule == grammarAccess.getXMemberFeatureCallRule()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
						|| rule == grammarAccess.getXPrimaryExpressionRule()
						|| rule == grammarAccess.getXLiteralRule()
						|| rule == grammarAccess.getXCollectionLiteralRule()
						|| rule == grammarAccess.getXListLiteralRule()
						|| rule == grammarAccess.getXParenthesizedExpressionRule()
						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
					sequence_XListLiteral(context, (XListLiteral) semanticObject); 
					return; 
				}
				else break;
			case XbasePackage.XMEMBER_FEATURE_CALL:
				sequence_XMemberFeatureCall(context, (XMemberFeatureCall) semanticObject); 
				return; 
			case XbasePackage.XNULL_LITERAL:
				sequence_XNullLiteral(context, (XNullLiteral) semanticObject); 
				return; 
			case XbasePackage.XNUMBER_LITERAL:
				sequence_XNumberLiteral(context, (XNumberLiteral) semanticObject); 
				return; 
			case XbasePackage.XPOSTFIX_OPERATION:
				sequence_XPostfixOperation(context, (XPostfixOperation) semanticObject); 
				return; 
			case XbasePackage.XRETURN_EXPRESSION:
				sequence_XReturnExpression(context, (XReturnExpression) semanticObject); 
				return; 
			case XbasePackage.XSET_LITERAL:
				sequence_XSetLiteral(context, (XSetLiteral) semanticObject); 
				return; 
			case XbasePackage.XSTRING_LITERAL:
				sequence_XStringLiteral(context, (XStringLiteral) semanticObject); 
				return; 
			case XbasePackage.XSWITCH_EXPRESSION:
				sequence_XSwitchExpression(context, (XSwitchExpression) semanticObject); 
				return; 
			case XbasePackage.XSYNCHRONIZED_EXPRESSION:
				sequence_XSynchronizedExpression(context, (XSynchronizedExpression) semanticObject); 
				return; 
			case XbasePackage.XTHROW_EXPRESSION:
				sequence_XThrowExpression(context, (XThrowExpression) semanticObject); 
				return; 
			case XbasePackage.XTRY_CATCH_FINALLY_EXPRESSION:
				sequence_XTryCatchFinallyExpression(context, (XTryCatchFinallyExpression) semanticObject); 
				return; 
			case XbasePackage.XTYPE_LITERAL:
				sequence_XTypeLiteral(context, (XTypeLiteral) semanticObject); 
				return; 
			case XbasePackage.XUNARY_OPERATION:
				sequence_XUnaryOperation(context, (XUnaryOperation) semanticObject); 
				return; 
			case XbasePackage.XVARIABLE_DECLARATION:
				sequence_XVariableDeclaration(context, (XVariableDeclaration) semanticObject); 
				return; 
			case XbasePackage.XWHILE_EXPRESSION:
				sequence_XWhileExpression(context, (XWhileExpression) semanticObject); 
				return; 
			}
		else if (epackage == XtypePackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case XtypePackage.XFUNCTION_TYPE_REF:
				sequence_XFunctionTypeRef(context, (XFunctionTypeRef) semanticObject); 
				return; 
			case XtypePackage.XIMPORT_SECTION:
				sequence_XImportSection(context, (XImportSection) semanticObject); 
				return; 
			}
		if (errorAcceptor != null)
			errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
	}
	
	/**
	 * Contexts:
	 *     UiCommand returns UiAddToTableCommand
	 *     UiAddToTableCommand returns UiAddToTableCommand
	 *
	 * Constraint:
	 *     table=[UiTable|ID]
	 */
	protected void sequence_UiAddToTableCommand(ISerializationContext context, UiAddToTableCommand semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_ADD_TO_TABLE_COMMAND__TABLE) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_ADD_TO_TABLE_COMMAND__TABLE));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiAddToTableCommandAccess().getTableUiTableIDTerminalRuleCall_2_0_1(), semanticObject.eGet(UiModelPackage.Literals.UI_ADD_TO_TABLE_COMMAND__TABLE, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiBeanReferenceField returns UiBeanReferenceField
	 *     UiEmbeddable returns UiBeanReferenceField
	 *     UiField returns UiBeanReferenceField
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         jvmType=JvmTypeReference? 
	 *         (
	 *             (
	 *                 (referenceSourceJvmType=JvmTypeReference referenceSourceField=[JvmField|ID]) | 
	 *                 captionProperty=UiNestedProperty | 
	 *                 descriptionProperty=UiNestedProperty | 
	 *                 imageProperty=UiNestedProperty | 
	 *                 inMemoryBeanProvider=JvmTypeReference
	 *             )? 
	 *             jvmType=JvmTypeReference?
	 *         )* 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiBeanReferenceField(ISerializationContext context, UiBeanReferenceField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiBeanSlot returns UiBeanSlot
	 *
	 * Constraint:
	 *     (name=ID jvmType=JvmTypeReference eventTopic=STRING?)
	 */
	protected void sequence_UiBeanSlot(ISerializationContext context, UiBeanSlot semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiValidator returns UiBeanValidationValidator
	 *     UiBeanValidationValidator returns UiBeanValidationValidator
	 *
	 * Constraint:
	 *     name=ID?
	 */
	protected void sequence_UiBeanValidationValidator(ISerializationContext context, UiBeanValidationValidator semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiBindingEndpointAlias returns UiBindingEndpointAlias
	 *
	 * Constraint:
	 *     (endpoint=UiBindingEndpointAssignment alias=ID)
	 */
	protected void sequence_UiBindingEndpointAlias(ISerializationContext context, UiBindingEndpointAlias semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_BINDING_ENDPOINT_ALIAS__ENDPOINT) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_BINDING_ENDPOINT_ALIAS__ENDPOINT));
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_BINDING_ENDPOINT_ALIAS__ALIAS) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_BINDING_ENDPOINT_ALIAS__ALIAS));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiBindingEndpointAliasAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_BINDING_ENDPOINT_ALIAS__ENDPOINT, false));
		feeder.accept(grammarAccess.getUiBindingEndpointAliasAccess().getAliasIDTerminalRuleCall_3_0(), semanticObject.getAlias());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiBindingEndpointAssignment returns UiBindingEndpointAssignment
	 *
	 * Constraint:
	 *     (
	 *         (typedBindableDef=UiBindingEndpointAssignment_UiBindingEndpointAssignment_0_1 path=UiPathSegment?) | 
	 *         typedBindableDef=UiBindingEndpointAssignment_UiBindingEndpointAssignment_1_1 | 
	 *         (typedBindableAlias=[UiTypedBindable|ID] path=UiPathSegment?)
	 *     )
	 */
	protected void sequence_UiBindingEndpointAssignment(ISerializationContext context, UiBindingEndpointAssignment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiBinding returns UiBinding
	 *
	 * Constraint:
	 *     (listBinding?='list'? source=UiBindingEndpointAssignment targetToSource?='<'? sourceToTarget?='>'? target=UiBindingEndpointAssignment)
	 */
	protected void sequence_UiBinding(ISerializationContext context, UiBinding semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiBrowser returns UiBrowser
	 *     UiEmbeddable returns UiBrowser
	 *     UiMobileEmbeddable returns UiBrowser
	 *     UiMobileField returns UiBrowser
	 *     UiField returns UiBrowser
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiBrowser(ISerializationContext context, UiBrowser semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiButton returns UiButton
	 *     UiEmbeddable returns UiButton
	 *     UiMobileEmbeddable returns UiButton
	 *     UiAction returns UiButton
	 *     UiMobileAction returns UiButton
	 *
	 * Constraint:
	 *     ((i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* name=TRANSLATABLEID?)
	 */
	protected void sequence_UiButton(ISerializationContext context, UiButton semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiChangeTrigger returns UiChangeTrigger
	 *
	 * Constraint:
	 *     (endpoint=UiBindingEndpointAssignment alias=ID)
	 */
	protected void sequence_UiChangeTrigger(ISerializationContext context, UiChangeTrigger semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_CHANGE_TRIGGER__ENDPOINT) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_CHANGE_TRIGGER__ENDPOINT));
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_CHANGE_TRIGGER__ALIAS) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_CHANGE_TRIGGER__ALIAS));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiChangeTriggerAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_CHANGE_TRIGGER__ENDPOINT, false));
		feeder.accept(grammarAccess.getUiChangeTriggerAccess().getAliasIDTerminalRuleCall_3_0(), semanticObject.getAlias());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiEmbeddable returns UiCheckBox
	 *     UiField returns UiCheckBox
	 *     UiCheckBox returns UiCheckBox
	 *
	 * Constraint:
	 *     (
	 *         i18nInfo=UiI18nInfo? 
	 *         ((readonly?='readonly' | styles=STRING)? i18nInfo=UiI18nInfo?)* 
	 *         name=TRANSLATABLEID? 
	 *         (validators+=UiValidator | bindings+=UiBinding)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiCheckBox(ISerializationContext context, UiCheckBox semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiColumn returns UiColumn
	 *
	 * Constraint:
	 *     (property=UiNestedProperty iconName=STRING?)
	 */
	protected void sequence_UiColumn(ISerializationContext context, UiColumn semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiColumnsAssignment returns UiColumnsAssignment
	 *
	 * Constraint:
	 *     columns+=UiColumn*
	 */
	protected void sequence_UiColumnsAssignment(ISerializationContext context, UiColumnsAssignment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiComboBox returns UiComboBox
	 *     UiEmbeddable returns UiComboBox
	 *     UiMobileEmbeddable returns UiComboBox
	 *     UiMobileField returns UiComboBox
	 *     UiField returns UiComboBox
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         jvmType=JvmTypeReference? 
	 *         (
	 *             (
	 *                 itemCaptionProperty=[JvmOperation|ID] | 
	 *                 descriptionProperty=UiNestedProperty | 
	 *                 itemImageProperty=[JvmOperation|ID] | 
	 *                 consumeBeanService?='useBeanService' | 
	 *                 readonly?='readonly'
	 *             )? 
	 *             jvmType=JvmTypeReference?
	 *         )* 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiComboBox(ISerializationContext context, UiComboBox semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiBindingEndpointAssignment.UiBindingEndpointAssignment_1_1 returns UiCommandBindableDef
	 *     UiCommandBindableDef returns UiCommandBindableDef
	 *
	 * Constraint:
	 *     command=UiCommand
	 */
	protected void sequence_UiCommandBindableDef(ISerializationContext context, UiCommandBindableDef semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_COMMAND_BINDABLE_DEF__COMMAND) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_COMMAND_BINDABLE_DEF__COMMAND));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiCommandBindableDefAccess().getCommandUiCommandParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_COMMAND_BINDABLE_DEF__COMMAND, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiDateField returns UiDateField
	 *     UiEmbeddable returns UiDateField
	 *     UiMobileEmbeddable returns UiDateField
	 *     UiMobileField returns UiDateField
	 *     UiField returns UiDateField
	 *
	 * Constraint:
	 *     (
	 *         (dateFormat=UiDateFormat | resolution=UiDateTimeResolution | styles=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')* 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiDateField(ISerializationContext context, UiDateField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiDecimalField returns UiDecimalField
	 *     UiEmbeddable returns UiDecimalField
	 *     UiMobileEmbeddable returns UiDecimalField
	 *     UiMobileField returns UiDecimalField
	 *     UiField returns UiDecimalField
	 *
	 * Constraint:
	 *     (
	 *         (
	 *             noGrouping?='noGrouping' | 
	 *             noMarkNegative?='noMarkNegative' | 
	 *             styles=STRING | 
	 *             precision=INT | 
	 *             i18nInfo=UiI18nInfo | 
	 *             readonly?='readonly'
	 *         )* 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiDecimalField(ISerializationContext context, UiDecimalField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiDialogAssignment returns UiDialogAssignment
	 *
	 * Constraint:
	 *     element=UiEmbeddable
	 */
	protected void sequence_UiDialogAssignment(ISerializationContext context, UiDialogAssignment semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiDialogAssignmentAccess().getElementUiEmbeddableParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_DIALOG_ASSIGNMENT__ELEMENT, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiDialogSearchFieldAssignment returns UiDialogSearchFieldAssignment
	 *
	 * Constraint:
	 *     element=UiSearchField
	 */
	protected void sequence_UiDialogSearchFieldAssignment(ISerializationContext context, UiDialogSearchFieldAssignment semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_DIALOG_SEARCH_FIELD_ASSIGNMENT__ELEMENT) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_DIALOG_SEARCH_FIELD_ASSIGNMENT__ELEMENT));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiDialogSearchFieldAssignmentAccess().getElementUiSearchFieldParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_DIALOG_SEARCH_FIELD_ASSIGNMENT__ELEMENT, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiDialog returns UiDialog
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         jvmType=JvmTypeReference? 
	 *         content=UiDialogAssignment? 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiDialog(ISerializationContext context, UiDialog semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiRootElements returns UiDisplayView
	 *     UiDisplayView returns UiDisplayView
	 *
	 * Constraint:
	 *     (
	 *         name=ID 
	 *         jvmType=JvmTypeReference 
	 *         (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)* 
	 *         content=UiEmbeddable 
	 *         contentAlignment=UiAlignment? 
	 *         (
	 *             bindingEndpointAlias+=UiBindingEndpointAlias | 
	 *             bindings+=UiBinding | 
	 *             validatorAssignments+=UiValidatorAssignment | 
	 *             processorAssignments+=UiVisibilityProcessorAssignment
	 *         )*
	 *     )
	 */
	protected void sequence_UiDisplayView(ISerializationContext context, UiDisplayView semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiErrorCode returns UiErrorCode
	 *
	 * Constraint:
	 *     (name=ID defaultMessage=STRING?)
	 */
	protected void sequence_UiErrorCode(ISerializationContext context, UiErrorCode semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiExposedAction returns UiExposedAction
	 *
	 * Constraint:
	 *     (name=ID iconName=STRING? (actionReference=[UxAction|QualifiedName] | actionID=STRING) checkDirty?='checkDirty'? externalCommandId=STRING?)
	 */
	protected void sequence_UiExposedAction(ISerializationContext context, UiExposedAction semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiFormLayoutAssigment returns UiFormLayoutAssigment
	 *
	 * Constraint:
	 *     element=UiEmbeddable
	 */
	protected void sequence_UiFormLayoutAssigment(ISerializationContext context, UiFormLayoutAssigment semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiFormLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_FORM_LAYOUT_ASSIGMENT__ELEMENT, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiFormLayout returns UiFormLayout
	 *     UiEmbeddable returns UiFormLayout
	 *     UiLayout returns UiFormLayout
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
	 *         name=ID? 
	 *         contents+=UiFormLayoutAssigment* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiFormLayout(ISerializationContext context, UiFormLayout semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiGridLayoutAssigment returns UiGridLayoutAssigment
	 *
	 * Constraint:
	 *     (element=UiEmbeddable alignment=UiAlignment?)
	 */
	protected void sequence_UiGridLayoutAssigment(ISerializationContext context, UiGridLayoutAssigment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiGridLayout returns UiGridLayout
	 *     UiEmbeddable returns UiGridLayout
	 *     UiLayout returns UiGridLayout
	 *
	 * Constraint:
	 *     (
	 *         (columns=INT | i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
	 *         name=ID? 
	 *         contents+=UiGridLayoutAssigment* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiGridLayout(ISerializationContext context, UiGridLayout semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiHorizontalLayoutAssigment returns UiHorizontalLayoutAssigment
	 *
	 * Constraint:
	 *     (element=UiEmbeddable alignment=UiAlignment?)
	 */
	protected void sequence_UiHorizontalLayoutAssigment(ISerializationContext context, UiHorizontalLayoutAssigment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiHorizontalLayout returns UiHorizontalLayout
	 *     UiEmbeddable returns UiHorizontalLayout
	 *     UiLayout returns UiHorizontalLayout
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
	 *         name=ID? 
	 *         contents+=UiHorizontalLayoutAssigment* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiHorizontalLayout(ISerializationContext context, UiHorizontalLayout semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiI18nInfo returns UiI18nInfo
	 *
	 * Constraint:
	 *     (noCaption?='noCaption' | key=STRING)
	 */
	protected void sequence_UiI18nInfo(ISerializationContext context, UiI18nInfo semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiRootElements returns UiIDEView
	 *     UiView returns UiIDEView
	 *     UiIDEView returns UiIDEView
	 *
	 * Constraint:
	 *     (
	 *         name=ID 
	 *         sharedStateGroup=STRING? 
	 *         ((viewCategory=[UxViewCategory|QualifiedName] | jvmType=JvmTypeReference | exposedActions+=UiExposedAction)? sharedStateGroup=STRING?)* 
	 *         (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)* 
	 *         content=UiEmbeddable 
	 *         contentAlignment=UiAlignment? 
	 *         (
	 *             bindingEndpointAlias+=UiBindingEndpointAlias | 
	 *             bindings+=UiBinding | 
	 *             validatorAssignments+=UiValidatorAssignment | 
	 *             processorAssignments+=UiVisibilityProcessorAssignment
	 *         )*
	 *     )
	 */
	protected void sequence_UiIDEView(ISerializationContext context, UiIDEView semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiImage returns UiImage
	 *     UiEmbeddable returns UiImage
	 *     UiMobileEmbeddable returns UiImage
	 *     UiMobileField returns UiImage
	 *     UiField returns UiImage
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         value=STRING? 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiImage(ISerializationContext context, UiImage semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiLabel returns UiLabel
	 *     UiEmbeddable returns UiLabel
	 *     UiMobileEmbeddable returns UiLabel
	 *     UiMobileField returns UiLabel
	 *     UiField returns UiLabel
	 *
	 * Constraint:
	 *     ((i18nInfo=UiI18nInfo | styles=STRING)* name=TRANSLATABLEID? processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding*)
	 */
	protected void sequence_UiLabel(ISerializationContext context, UiLabel semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiList returns UiList
	 *     UiEmbeddable returns UiList
	 *     UiField returns UiList
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         jvmType=JvmTypeReference? 
	 *         (
	 *             (
	 *                 selectionType=UiSelectionType | 
	 *                 itemCaptionProperty=[JvmOperation|ID] | 
	 *                 descriptionProperty=UiNestedProperty | 
	 *                 itemImageProperty=[JvmOperation|ID] | 
	 *                 consumeBeanService?='useBeanService' | 
	 *                 readonly?='readonly'
	 *             )? 
	 *             jvmType=JvmTypeReference?
	 *         )* 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiList(ISerializationContext context, UiList semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMaskedDecimalField returns UiMaskedDecimalField
	 *     UiEmbeddable returns UiMaskedDecimalField
	 *     UiMobileEmbeddable returns UiMaskedDecimalField
	 *     UiMobileField returns UiMaskedDecimalField
	 *     UiField returns UiMaskedDecimalField
	 *
	 * Constraint:
	 *     (
	 *         (styles=STRING | mask=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')* 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiMaskedDecimalField(ISerializationContext context, UiMaskedDecimalField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMaskedNumericField returns UiMaskedNumericField
	 *     UiEmbeddable returns UiMaskedNumericField
	 *     UiMobileEmbeddable returns UiMaskedNumericField
	 *     UiMobileField returns UiMaskedNumericField
	 *     UiField returns UiMaskedNumericField
	 *
	 * Constraint:
	 *     (
	 *         (styles=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')* 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiMaskedNumericField(ISerializationContext context, UiMaskedNumericField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMaskedTextField returns UiMaskedTextField
	 *     UiEmbeddable returns UiMaskedTextField
	 *     UiMobileEmbeddable returns UiMaskedTextField
	 *     UiMobileField returns UiMaskedTextField
	 *     UiField returns UiMaskedTextField
	 *
	 * Constraint:
	 *     (
	 *         (styles=STRING | mask=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')* 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiMaskedTextField(ISerializationContext context, UiMaskedTextField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiValidator returns UiMaxLengthValidator
	 *     UiMaxLengthValidator returns UiMaxLengthValidator
	 *
	 * Constraint:
	 *     (name=ID? maxLength=INT errorCode=UiErrorCode?)
	 */
	protected void sequence_UiMaxLengthValidator(ISerializationContext context, UiMaxLengthValidator semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiValidator returns UiMinLengthValidator
	 *     UiMinLengthValidator returns UiMinLengthValidator
	 *
	 * Constraint:
	 *     (name=ID? minLength=INT errorCode=UiErrorCode?)
	 */
	protected void sequence_UiMinLengthValidator(ISerializationContext context, UiMinLengthValidator semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileHorizontalButtonGroupAssigment returns UiHorizontalButtonGroupAssigment
	 *
	 * Constraint:
	 *     element=UiMobileEmbeddable
	 */
	protected void sequence_UiMobileHorizontalButtonGroupAssigment(ISerializationContext context, UiHorizontalButtonGroupAssigment semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_HORIZONTAL_BUTTON_GROUP_ASSIGMENT__ELEMENT, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileHorizontalButtonGroup returns UiHorizontalButtonGroup
	 *     UiMobileEmbeddable returns UiHorizontalButtonGroup
	 *     UiMobileLayout returns UiHorizontalButtonGroup
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
	 *         name=TRANSLATABLEID? 
	 *         contents+=UiMobileHorizontalButtonGroupAssigment* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiMobileHorizontalButtonGroup(ISerializationContext context, UiHorizontalButtonGroup semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileHorizontalLayoutAssigment returns UiHorizontalLayoutAssigment
	 *
	 * Constraint:
	 *     (element=UiMobileEmbeddable alignment=UiAlignment?)
	 */
	protected void sequence_UiMobileHorizontalLayoutAssigment(ISerializationContext context, UiHorizontalLayoutAssigment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileHorizontalLayout returns UiHorizontalLayout
	 *     UiMobileEmbeddable returns UiHorizontalLayout
	 *     UiMobileLayout returns UiHorizontalLayout
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
	 *         name=ID? 
	 *         contents+=UiMobileHorizontalLayoutAssigment* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiMobileHorizontalLayout(ISerializationContext context, UiHorizontalLayout semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileNavBarAction returns UiMobileNavBarAction
	 *
	 * Constraint:
	 *     (name=ID iconName=STRING? (actionReference=[UxAction|QualifiedName] | actionID=STRING))
	 */
	protected void sequence_UiMobileNavBarAction(ISerializationContext context, UiMobileNavBarAction semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileNavigationButton returns UiMobileNavigationButton
	 *     UiMobileEmbeddable returns UiMobileNavigationButton
	 *     UiMobileAction returns UiMobileNavigationButton
	 *
	 * Constraint:
	 *     (
	 *         i18nInfo=UiI18nInfo? 
	 *         ((readonly?='readonly' | styles=STRING)? i18nInfo=UiI18nInfo?)* 
	 *         name=TRANSLATABLEID? 
	 *         (targetPage=UiMobileNavigationPage | targetPageAlias=[UiMobileNavigationPage|ID])
	 *     )
	 */
	protected void sequence_UiMobileNavigationButton(ISerializationContext context, UiMobileNavigationButton semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiCommand returns UiMobileNavigationCommand
	 *     UiMobileNavigationCommand returns UiMobileNavigationCommand
	 *
	 * Constraint:
	 *     targetPage=UiMobileNavigationPage
	 */
	protected void sequence_UiMobileNavigationCommand(ISerializationContext context, UiMobileNavigationCommand semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_MOBILE_NAVIGATION_COMMAND__TARGET_PAGE) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_MOBILE_NAVIGATION_COMMAND__TARGET_PAGE));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiMobileNavigationCommandAccess().getTargetPageUiMobileNavigationPageParserRuleCall_2_0(), semanticObject.eGet(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_COMMAND__TARGET_PAGE, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileNavigationPageAssignment returns UiMobileNavigationPageAssignment
	 *
	 * Constraint:
	 *     (element=UiMobileEmbeddable alignment=UiAlignment?)
	 */
	protected void sequence_UiMobileNavigationPageAssignment(ISerializationContext context, UiMobileNavigationPageAssignment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileNavigationPage returns UiMobileNavigationPage
	 *     UiMobileEmbeddable returns UiMobileNavigationPage
	 *     UiMobileLayout returns UiMobileNavigationPage
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=ID? 
	 *         jvmType=JvmTypeReference? 
	 *         barActions+=UiMobileNavBarAction* 
	 *         contents+=UiMobileNavigationPageAssignment* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiMobileNavigationPage(ISerializationContext context, UiMobileNavigationPage semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileNavigationRootAssigment returns UiMobileNavigationRootAssigment
	 *
	 * Constraint:
	 *     element=UiMobileNavigationPage
	 */
	protected void sequence_UiMobileNavigationRootAssigment(ISerializationContext context, UiMobileNavigationRootAssigment semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiMobileNavigationRootAssigmentAccess().getElementUiMobileNavigationPageParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_MOBILE_NAVIGATION_ROOT_ASSIGMENT__ELEMENT, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileNavigationRoot returns UiMobileNavigationRoot
	 *     UiMobileEmbeddable returns UiMobileNavigationRoot
	 *     UiMobileLayout returns UiMobileNavigationRoot
	 *
	 * Constraint:
	 *     (name=ID? contents+=UiMobileNavigationRootAssigment)
	 */
	protected void sequence_UiMobileNavigationRoot(ISerializationContext context, UiMobileNavigationRoot semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileSearchPanel returns UiMobileSearchPanel
	 *     UiMobileEmbeddable returns UiMobileSearchPanel
	 *     UiMobileLayout returns UiMobileSearchPanel
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         jvmType=JvmTypeReference 
	 *         contents+=UiSearchField* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiMobileSearchPanel(ISerializationContext context, UiMobileSearchPanel semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileSwitch returns UiSwitch
	 *     UiMobileEmbeddable returns UiSwitch
	 *     UiMobileField returns UiSwitch
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         processorAssignments+=UiVisibilityProcessorAssignment* 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)*
	 *     )
	 */
	protected void sequence_UiMobileSwitch(ISerializationContext context, UiSwitch semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileTabAssignment returns UiMobileTabAssignment
	 *
	 * Constraint:
	 *     (name=TRANSLATABLEID? element=UiMobileEmbeddable)
	 */
	protected void sequence_UiMobileTabAssignment(ISerializationContext context, UiMobileTabAssignment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileTabSheet returns UiMobileTabSheet
	 *     UiMobileEmbeddable returns UiMobileTabSheet
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=ID? 
	 *         tabs+=UiMobileTabAssignment* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiMobileTabSheet(ISerializationContext context, UiMobileTabSheet semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileVerticalComponentGroupAssigment returns UiVerticalComponentGroupAssigment
	 *
	 * Constraint:
	 *     element=UiMobileEmbeddable
	 */
	protected void sequence_UiMobileVerticalComponentGroupAssigment(ISerializationContext context, UiVerticalComponentGroupAssigment semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiMobileVerticalComponentGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_VERTICAL_COMPONENT_GROUP_ASSIGMENT__ELEMENT, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileVerticalComponentGroup returns UiVerticalComponentGroup
	 *     UiMobileEmbeddable returns UiVerticalComponentGroup
	 *     UiMobileLayout returns UiVerticalComponentGroup
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
	 *         name=ID? 
	 *         contents+=UiMobileVerticalComponentGroupAssigment* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiMobileVerticalComponentGroup(ISerializationContext context, UiVerticalComponentGroup semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileVerticalLayoutAssigment returns UiVerticalLayoutAssigment
	 *
	 * Constraint:
	 *     (element=UiMobileEmbeddable alignment=UiAlignment?)
	 */
	protected void sequence_UiMobileVerticalLayoutAssigment(ISerializationContext context, UiVerticalLayoutAssigment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiMobileVerticalLayout returns UiVerticalLayout
	 *     UiMobileEmbeddable returns UiVerticalLayout
	 *     UiMobileLayout returns UiVerticalLayout
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
	 *         name=ID? 
	 *         contents+=UiMobileVerticalLayoutAssigment* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiMobileVerticalLayout(ISerializationContext context, UiVerticalLayout semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiRootElements returns UiMobileView
	 *     UiMobileView returns UiMobileView
	 *
	 * Constraint:
	 *     (
	 *         name=ID 
	 *         jvmType=JvmTypeReference? 
	 *         (sharedStateGroup=STRING? jvmType=JvmTypeReference?)* 
	 *         (beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)* 
	 *         content=UiMobileEmbeddable 
	 *         contentAlignment=UiAlignment? 
	 *         (
	 *             bindingEndpointAlias+=UiBindingEndpointAlias | 
	 *             bindings+=UiBinding | 
	 *             validatorAssignments+=UiValidatorAssignment | 
	 *             processorAssignments+=UiVisibilityProcessorAssignment
	 *         )*
	 *     )
	 */
	protected void sequence_UiMobileView(ISerializationContext context, UiMobileView semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiModel returns UiModel
	 *
	 * Constraint:
	 *     (packageName=QualifiedName importSection=XImportSection? roots+=UiRootElements*)
	 */
	protected void sequence_UiModel(ISerializationContext context, UiModel semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiNestedProperty returns UiNestedProperty
	 *
	 * Constraint:
	 *     (getter=[JvmOperation|ID] path=UiPathSegment?)
	 */
	protected void sequence_UiNestedProperty(ISerializationContext context, UiNestedProperty semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiEmbeddable returns UiNumericField
	 *     UiMobileEmbeddable returns UiNumericField
	 *     UiMobileField returns UiNumericField
	 *     UiField returns UiNumericField
	 *     UiNumericField returns UiNumericField
	 *
	 * Constraint:
	 *     (
	 *         readonly?='readonly'? 
	 *         ((noGrouping?='noGrouping' | styles=STRING | noMarkNegative?='noMarkNegative' | i18nInfo=UiI18nInfo)? readonly?='readonly'?)* 
	 *         name=TRANSLATABLEID? 
	 *         (validators+=UiValidator | bindings+=UiBinding)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiNumericField(ISerializationContext context, UiNumericField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiCommand returns UiOpenDialogCommand
	 *     UiOpenDialogCommand returns UiOpenDialogCommand
	 *
	 * Constraint:
	 *     dialog=UiDialog
	 */
	protected void sequence_UiOpenDialogCommand(ISerializationContext context, UiOpenDialogCommand semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_OPEN_DIALOG_COMMAND__DIALOG) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_OPEN_DIALOG_COMMAND__DIALOG));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiOpenDialogCommandAccess().getDialogUiDialogParserRuleCall_2_0(), semanticObject.eGet(UiModelPackage.Literals.UI_OPEN_DIALOG_COMMAND__DIALOG, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiOptionsGroup returns UiOptionsGroup
	 *     UiEmbeddable returns UiOptionsGroup
	 *     UiMobileEmbeddable returns UiOptionsGroup
	 *     UiMobileField returns UiOptionsGroup
	 *     UiField returns UiOptionsGroup
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         jvmType=JvmTypeReference? 
	 *         (
	 *             (
	 *                 selectionType=UiSelectionType | 
	 *                 itemCaptionProperty=[JvmOperation|ID] | 
	 *                 descriptionProperty=UiNestedProperty | 
	 *                 itemImageProperty=[JvmOperation|ID] | 
	 *                 consumeBeanService?='useBeanService' | 
	 *                 readonly?='readonly'
	 *             )? 
	 *             jvmType=JvmTypeReference?
	 *         )* 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiOptionsGroup(ISerializationContext context, UiOptionsGroup semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiPanel returns UiPanel
	 *     UiEmbeddable returns UiPanel
	 *     UiLayout returns UiPanel
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
	 *         name=TRANSLATABLEID 
	 *         content=UiEmbeddable 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiPanel(ISerializationContext context, UiPanel semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiPasswordField returns UiPasswordField
	 *     UiEmbeddable returns UiPasswordField
	 *     UiMobileEmbeddable returns UiPasswordField
	 *     UiMobileField returns UiPasswordField
	 *     UiField returns UiPasswordField
	 *
	 * Constraint:
	 *     (
	 *         (styles=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')* 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiPasswordField(ISerializationContext context, UiPasswordField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiPathSegment returns UiPathSegment
	 *
	 * Constraint:
	 *     (getter=[JvmOperation|ID] path=UiPathSegment?)
	 */
	protected void sequence_UiPathSegment(ISerializationContext context, UiPathSegment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiPoint returns UiPoint
	 *
	 * Constraint:
	 *     (x=INT y=INT)
	 */
	protected void sequence_UiPoint(ISerializationContext context, UiPoint semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_POINT__X) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_POINT__X));
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_POINT__Y) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_POINT__Y));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiPointAccess().getXINTTerminalRuleCall_0_0(), semanticObject.getX());
		feeder.accept(grammarAccess.getUiPointAccess().getYINTTerminalRuleCall_2_0(), semanticObject.getY());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiPrefixToMaskMapEntry returns UiPrefixToMaskMapEntry
	 *
	 * Constraint:
	 *     (key=STRING value=STRING)
	 */
	protected void sequence_UiPrefixToMaskMapEntry(ISerializationContext context, Map.Entry semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient((EObject) semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__KEY) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing((EObject) semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__KEY));
			if (transientValues.isValueTransient((EObject) semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__VALUE) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing((EObject) semanticObject, UiModelPackage.Literals.UI_PREFIX_TO_MASK_MAP_ENTRY__VALUE));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, (EObject) semanticObject);
		feeder.accept(grammarAccess.getUiPrefixToMaskMapEntryAccess().getKeySTRINGTerminalRuleCall_2_0(), semanticObject.getKey());
		feeder.accept(grammarAccess.getUiPrefixToMaskMapEntryAccess().getValueSTRINGTerminalRuleCall_4_0(), semanticObject.getValue());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiPrefixedMaskedTextField returns UiPrefixedMaskedTextField
	 *     UiEmbeddable returns UiPrefixedMaskedTextField
	 *     UiMobileEmbeddable returns UiPrefixedMaskedTextField
	 *     UiMobileField returns UiPrefixedMaskedTextField
	 *     UiField returns UiPrefixedMaskedTextField
	 *
	 * Constraint:
	 *     (
	 *         (
	 *             (styles=STRING | mask=STRING | i18nInfo=UiI18nInfo | readonly?='readonly')? 
	 *             (prefixMasks+=UiPrefixToMaskMapEntry prefixMasks+=UiPrefixToMaskMapEntry*)?
	 *         )+ 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiPrefixedMaskedTextField(ISerializationContext context, UiPrefixedMaskedTextField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiProgressBar returns UiProgressBar
	 *     UiEmbeddable returns UiProgressBar
	 *     UiMobileEmbeddable returns UiProgressBar
	 *     UiMobileField returns UiProgressBar
	 *     UiField returns UiProgressBar
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiProgressBar(ISerializationContext context, UiProgressBar semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiRawBindablePathSegment returns UiRawBindablePathSegment
	 *
	 * Constraint:
	 *     (toParent?='..'? rawBindable=[UiRawBindable|ID] path=UiRawBindablePathSegment?)
	 */
	protected void sequence_UiRawBindablePathSegment(ISerializationContext context, UiRawBindablePathSegment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiValidator returns UiRegexpValidator
	 *     UiRegexpValidator returns UiRegexpValidator
	 *
	 * Constraint:
	 *     (name=ID? regExpression=STRING errorCode=UiErrorCode?)
	 */
	protected void sequence_UiRegexpValidator(ISerializationContext context, UiRegexpValidator semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiCommand returns UiRemoveFromTableCommand
	 *     UiRemoveFromTableCommand returns UiRemoveFromTableCommand
	 *
	 * Constraint:
	 *     table=[UiTable|ID]
	 */
	protected void sequence_UiRemoveFromTableCommand(ISerializationContext context, UiRemoveFromTableCommand semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_REMOVE_FROM_TABLE_COMMAND__TABLE) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_REMOVE_FROM_TABLE_COMMAND__TABLE));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiRemoveFromTableCommandAccess().getTableUiTableIDTerminalRuleCall_2_0_1(), semanticObject.eGet(UiModelPackage.Literals.UI_REMOVE_FROM_TABLE_COMMAND__TABLE, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiRichTextArea returns UiRichTextArea
	 *     UiEmbeddable returns UiRichTextArea
	 *     UiMobileEmbeddable returns UiRichTextArea
	 *     UiMobileField returns UiRichTextArea
	 *     UiField returns UiRichTextArea
	 *
	 * Constraint:
	 *     (
	 *         (styles=STRING | i18nInfo=UiI18nInfo | asBlob?='asBlob' | readonly?='readonly')* 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiRichTextArea(ISerializationContext context, UiRichTextArea semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiSearchDialog returns UiSearchDialog
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         jvmType=JvmTypeReference? 
	 *         searchFields+=UiDialogSearchFieldAssignment* 
	 *         content=UiDialogAssignment? 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiSearchDialog(ISerializationContext context, UiSearchDialog semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiSearchField returns UiSearchField
	 *     UiEmbeddable returns UiSearchField
	 *     UiMobileEmbeddable returns UiSearchField
	 *     UiMobileField returns UiSearchField
	 *     UiField returns UiSearchField
	 *
	 * Constraint:
	 *     ((i18nInfo=UiI18nInfo | styles=STRING)* property=UiNestedProperty)
	 */
	protected void sequence_UiSearchField(ISerializationContext context, UiSearchField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiSearchPanel returns UiSearchPanel
	 *     UiEmbeddable returns UiSearchPanel
	 *     UiLayout returns UiSearchPanel
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         jvmType=JvmTypeReference 
	 *         contents+=UiSearchField* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiSearchPanel(ISerializationContext context, UiSearchPanel semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiCommand returns UiSearchWithDialogCommand
	 *     UiSearchWithDialogCommand returns UiSearchWithDialogCommand
	 *
	 * Constraint:
	 *     dialog=UiSearchDialog
	 */
	protected void sequence_UiSearchWithDialogCommand(ISerializationContext context, UiSearchWithDialogCommand semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_SEARCH_WITH_DIALOG_COMMAND__DIALOG) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_SEARCH_WITH_DIALOG_COMMAND__DIALOG));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiSearchWithDialogCommandAccess().getDialogUiSearchDialogParserRuleCall_2_0(), semanticObject.eGet(UiModelPackage.Literals.UI_SEARCH_WITH_DIALOG_COMMAND__DIALOG, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiCommand returns UiSendEventCommand
	 *     UiSendEventCommand returns UiSendEventCommand
	 *
	 * Constraint:
	 *     (noAutoTrigger?='noAutoTrigger'? eventTopic=STRING)
	 */
	protected void sequence_UiSendEventCommand(ISerializationContext context, UiSendEventCommand semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiCommand returns UiSetNewInstanceCommand
	 *     UiSetNewInstanceCommand returns UiSetNewInstanceCommand
	 *
	 * Constraint:
	 *     (jvmType=JvmTypeReference? target=UiBindingEndpointAssignment)
	 */
	protected void sequence_UiSetNewInstanceCommand(ISerializationContext context, UiSetNewInstanceCommand semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiSortOrderAssignment returns UiSortOrderAssignment
	 *
	 * Constraint:
	 *     columns+=UiSortOrder*
	 */
	protected void sequence_UiSortOrderAssignment(ISerializationContext context, UiSortOrderAssignment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiSortOrder returns UiSortOrder
	 *
	 * Constraint:
	 *     (property=UiNestedProperty asc?='asc'?)
	 */
	protected void sequence_UiSortOrder(ISerializationContext context, UiSortOrder semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiSplitpanelAssigment returns UiSplitpanelAssigment
	 *
	 * Constraint:
	 *     element=UiEmbeddable
	 */
	protected void sequence_UiSplitpanelAssigment(ISerializationContext context, UiSplitpanelAssigment semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiSplitpanelAssigmentAccess().getElementUiEmbeddableParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_SPLITPANEL_ASSIGMENT__ELEMENT, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiSplitpanel returns UiSplitpanel
	 *     UiEmbeddable returns UiSplitpanel
	 *     UiLayout returns UiSplitpanel
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=ID 
	 *         (firstContent=UiSplitpanelAssigment | secondContent=UiSplitpanelAssigment | splitPosition=INT | readonly?='readonly')* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiSplitpanel(ISerializationContext context, UiSplitpanel semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiSuggestTextField returns UiSuggestTextField
	 *     UiEmbeddable returns UiSuggestTextField
	 *     UiMobileEmbeddable returns UiSuggestTextField
	 *     UiMobileField returns UiSuggestTextField
	 *     UiField returns UiSuggestTextField
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         jvmType=JvmTypeReference? 
	 *         (
	 *             (
	 *                 itemCaptionProperty=[JvmOperation|ID] | 
	 *                 itemFilterProperty=[JvmOperation|ID] | 
	 *                 itemUUIDProperty=[JvmOperation|ID] | 
	 *                 autoHidePopup?='autoHidePopup' | 
	 *                 readonly?='readonly'
	 *             )? 
	 *             jvmType=JvmTypeReference?
	 *         )* 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiSuggestTextField(ISerializationContext context, UiSuggestTextField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiTabAssignment returns UiTabAssignment
	 *
	 * Constraint:
	 *     (name=TRANSLATABLEID? element=UiEmbeddable)
	 */
	protected void sequence_UiTabAssignment(ISerializationContext context, UiTabAssignment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiTabSheet returns UiTabSheet
	 *     UiEmbeddable returns UiTabSheet
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=ID? 
	 *         tabs+=UiTabAssignment* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiTabSheet(ISerializationContext context, UiTabSheet semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiTable returns UiTable
	 *     UiEmbeddable returns UiTable
	 *     UiMobileEmbeddable returns UiTable
	 *     UiMobileField returns UiTable
	 *     UiField returns UiTable
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         jvmType=JvmTypeReference? 
	 *         (
	 *             (
	 *                 selectionType=UiSelectionType | 
	 *                 itemImageProperty=[JvmOperation|ID] | 
	 *                 consumeBeanService?='useBeanService' | 
	 *                 scrollToBottom?='scrollToBottom' | 
	 *                 readonly?='readonly'
	 *             )? 
	 *             jvmType=JvmTypeReference?
	 *         )* 
	 *         columnAssignment=UiColumnsAssignment? 
	 *         sortOrderAssignment=UiSortOrderAssignment? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiTable(ISerializationContext context, UiTable semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiTextArea returns UiTextArea
	 *     UiEmbeddable returns UiTextArea
	 *     UiMobileEmbeddable returns UiTextArea
	 *     UiMobileField returns UiTextArea
	 *     UiField returns UiTextArea
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | readonly?='readonly' | styles=STRING)* 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiTextArea(ISerializationContext context, UiTextArea semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiTextField returns UiTextField
	 *     UiEmbeddable returns UiTextField
	 *     UiMobileEmbeddable returns UiTextField
	 *     UiMobileField returns UiTextField
	 *     UiField returns UiTextField
	 *
	 * Constraint:
	 *     (
	 *         (
	 *             maxLength=INT | 
	 *             minLength=INT | 
	 *             regex=STRING | 
	 *             styles=STRING | 
	 *             i18nInfo=UiI18nInfo | 
	 *             readonly?='readonly'
	 *         )* 
	 *         name=TRANSLATABLEID? 
	 *         validators+=UiValidator? 
	 *         (bindings+=UiBinding? validators+=UiValidator?)* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiTextField(ISerializationContext context, UiTextField semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiBindingEndpointAssignment.UiBindingEndpointAssignment_0_1 returns UiTypedBindableDef
	 *     UiTypedBindableDef returns UiTypedBindableDef
	 *
	 * Constraint:
	 *     (rawBindable=[UiRawBindable|ID] rawBindablePath=UiRawBindablePathSegment? method=[UxEndpointDef|ID])
	 */
	protected void sequence_UiTypedBindableDef(ISerializationContext context, UiTypedBindableDef semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiTypedBindableRawTypeAlias returns UiTypedBindableRawTypeAlias
	 *
	 * Constraint:
	 *     (type=UiTypedBindableRawType alias=ID)
	 */
	protected void sequence_UiTypedBindableRawTypeAlias(ISerializationContext context, UiTypedBindableRawTypeAlias semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS__TYPE) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS__TYPE));
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS__ALIAS) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS__ALIAS));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getTypeUiTypedBindableRawTypeParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_TYPED_BINDABLE_RAW_TYPE_ALIAS__TYPE, false));
		feeder.accept(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAliasIDTerminalRuleCall_3_0(), semanticObject.getAlias());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiTypedBindableRawType returns UiTypedBindableRawType
	 *
	 * Constraint:
	 *     (rawBindable=[UiRawBindable|ID] rawBindablePath=UiRawBindablePathSegment?)
	 */
	protected void sequence_UiTypedBindableRawType(ISerializationContext context, UiTypedBindableRawType semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiRootElements returns UiValidatorAlias
	 *     UiValidatorAlias returns UiValidatorAlias
	 *
	 * Constraint:
	 *     (validator=UiValidator alias=ID)
	 */
	protected void sequence_UiValidatorAlias(ISerializationContext context, UiValidatorAlias semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_ALIAS__VALIDATOR) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_ALIAS__VALIDATOR));
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_ALIAS__ALIAS) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_ALIAS__ALIAS));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiValidatorAliasAccess().getValidatorUiValidatorParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_VALIDATOR_ALIAS__VALIDATOR, false));
		feeder.accept(grammarAccess.getUiValidatorAliasAccess().getAliasIDTerminalRuleCall_3_0(), semanticObject.getAlias());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiValidatorAssignment returns UiValidatorAssignment
	 *
	 * Constraint:
	 *     (field=[UiField|ID] (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]))
	 */
	protected void sequence_UiValidatorAssignment(ISerializationContext context, UiValidatorAssignment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiValidatorDef returns UiValidatorDef
	 *
	 * Constraint:
	 *     validator=UiValidator
	 */
	protected void sequence_UiValidatorDef(ISerializationContext context, UiValidatorDef semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_DEF__VALIDATOR) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_VALIDATOR_DEF__VALIDATOR));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiValidatorDefAccess().getValidatorUiValidatorParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_VALIDATOR_DEF__VALIDATOR, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiVerticalLayoutAssigment returns UiVerticalLayoutAssigment
	 *
	 * Constraint:
	 *     (element=UiEmbeddable alignment=UiAlignment?)
	 */
	protected void sequence_UiVerticalLayoutAssigment(ISerializationContext context, UiVerticalLayoutAssigment semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiVerticalLayout returns UiVerticalLayout
	 *     UiEmbeddable returns UiVerticalLayout
	 *     UiLayout returns UiVerticalLayout
	 *
	 * Constraint:
	 *     (
	 *         (i18nInfo=UiI18nInfo | styles=STRING | readonly?='readonly')* 
	 *         name=ID? 
	 *         contents+=UiVerticalLayoutAssigment* 
	 *         bindings+=UiBinding* 
	 *         processorAssignments+=UiVisibilityProcessorAssignment*
	 *     )
	 */
	protected void sequence_UiVerticalLayout(ISerializationContext context, UiVerticalLayout semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiRootElements returns UiViewSet
	 *     UiViewSet returns UiViewSet
	 *
	 * Constraint:
	 *     (name=ID beanSlots+=UiBeanSlot* bindingEndpointAlias+=UiBindingEndpointAlias*)
	 */
	protected void sequence_UiViewSet(ISerializationContext context, UiViewSet semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiVisibilityProcessorAssignment returns UiVisibilityProcessorAssignment
	 *
	 * Constraint:
	 *     processor=UiVisibilityProcessor
	 */
	protected void sequence_UiVisibilityProcessorAssignment(ISerializationContext context, UiVisibilityProcessorAssignment semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_VISIBILITY_PROCESSOR_ASSIGNMENT__PROCESSOR) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_VISIBILITY_PROCESSOR_ASSIGNMENT__PROCESSOR));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getProcessorUiVisibilityProcessorParserRuleCall_1_0(), semanticObject.eGet(UiModelPackage.Literals.UI_VISIBILITY_PROCESSOR_ASSIGNMENT__PROCESSOR, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     UiVisibilityProcessor returns UiVisibilityProcessor
	 *
	 * Constraint:
	 *     (
	 *         name=ID 
	 *         (dataUsed+=UiBindingEndpointAlias | changeTriggers+=UiChangeTrigger | importedElements+=UiTypedBindableRawTypeAlias)* 
	 *         rule=UiXbaseVisibilityRule?
	 *     )
	 */
	protected void sequence_UiVisibilityProcessor(ISerializationContext context, UiVisibilityProcessor semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiValidator returns UiXbaseValidator
	 *     UiXbaseValidator returns UiXbaseValidator
	 *
	 * Constraint:
	 *     (name=ID jvmType=JvmTypeReference errorCodes+=UiErrorCode* expression=XBlockExpression?)
	 */
	protected void sequence_UiXbaseValidator(ISerializationContext context, UiXbaseValidator semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     UiXbaseVisibilityRule returns UiXbaseVisibilityRule
	 *
	 * Constraint:
	 *     expression=XBlockExpression
	 */
	protected void sequence_UiXbaseVisibilityRule(ISerializationContext context, UiXbaseVisibilityRule semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, UiModelPackage.Literals.UI_XBASE_VISIBILITY_RULE__EXPRESSION) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, UiModelPackage.Literals.UI_XBASE_VISIBILITY_RULE__EXPRESSION));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getUiXbaseVisibilityRuleAccess().getExpressionXBlockExpressionParserRuleCall_0(), semanticObject.eGet(UiModelPackage.Literals.UI_XBASE_VISIBILITY_RULE__EXPRESSION, false));
		feeder.finish();
	}
	
	
}
