/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *  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 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.entitymock;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;

import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;

/**
 * <!-- begin-user-doc -->
 * The <b>Package</b> for the model.
 * It contains accessors for the meta objects to represent
 * <ul>
 *   <li>each class,</li>
 *   <li>each feature of each class,</li>
 *   <li>each operation of each class,</li>
 *   <li>each enum,</li>
 *   <li>and each data type</li>
 * </ul>
 * <!-- end-user-doc -->
 * <!-- begin-model-doc -->
 * *
 * 
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 
 *  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:
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * <!-- end-model-doc -->
 * @see org.eclipse.osbp.xtext.entitymock.EntityMockDSLFactory
 * @model kind="package"
 *        annotation="http://www.eclipse.org/emf/2002/GenModel fileExtensions='entitymock' modelName='EntityMockDSL' prefix='EntityMockDSL' updateClasspath='false' loadInitialization='false' literalsInterface='true' copyrightText='Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)\r\n All rights reserved. This program and the accompanying materials \r\n are made available under the terms of the Eclipse Public License 2.0  \r\n which accompanies this distribution, and is available at \r\n https://www.eclipse.org/legal/epl-2.0/ \r\n \r\n SPDX-License-Identifier: EPL-2.0 \r\n\r\n Based on ideas from Xtext, Xtend, Xcore\r\n  \r\n Contributors:  \r\n \t\tChristophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation \r\n ' basePackage='org.eclipse.osbp.xtext'"
 *        annotation="http://www.eclipse.org/emf/2002/Ecore rootPackage='entitymockdsl'"
 * @generated
 */
public interface EntityMockDSLPackage extends EPackage {
	/**
	 * The package name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNAME = "entitymock";

	/**
	 * The package namespace URI.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNS_URI = "http://osbp.eclipse.org/xtext/entitymock/EntityMockDSL";

	/**
	 * The package namespace name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNS_PREFIX = "entitymockdsl";

	/**
	 * The singleton instance of the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	EntityMockDSLPackage eINSTANCE = org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl.init();

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockModelImpl <em>Entity Mock Model</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockModelImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockModel()
	 * @generated
	 */
	int ENTITY_MOCK_MODEL = 0;

	/**
	 * The feature id for the '<em><b>Import Section</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_MODEL__IMPORT_SECTION = 0;

	/**
	 * The feature id for the '<em><b>Packages</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_MODEL__PACKAGES = 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Model</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_MODEL_FEATURE_COUNT = 2;

	/**
	 * The number of operations of the '<em>Entity Mock Model</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_MODEL_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl <em>Entity Mock Lazy Resolver</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockLazyResolver()
	 * @generated
	 */
	int ENTITY_MOCK_LAZY_RESOLVER = 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Lazy Resolver</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT = 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT = 0;

	/**
	 * The number of operations of the '<em>Entity Mock Lazy Resolver</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT = 1;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl <em>Entity Mock Package</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockPackage()
	 * @generated
	 */
	int ENTITY_MOCK_PACKAGE = 2;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_PACKAGE__NAME = OSBPTypesPackage.LPACKAGE__NAME;

	/**
	 * The feature id for the '<em><b>Mocks</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_PACKAGE__MOCKS = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Entity Mock Package</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_PACKAGE_FEATURE_COUNT = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_PACKAGE___ERESOLVE_PROXY__INTERNALEOBJECT = OSBPTypesPackage.LPACKAGE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Package</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_PACKAGE_OPERATION_COUNT = OSBPTypesPackage.LPACKAGE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl <em>Entity Mock</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMock()
	 * @generated
	 */
	int ENTITY_MOCK = 3;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK__NAME = 0;

	/**
	 * The feature id for the '<em><b>Description</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK__DESCRIPTION = 1;

	/**
	 * The feature id for the '<em><b>Description Value</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK__DESCRIPTION_VALUE = 2;

	/**
	 * The feature id for the '<em><b>Run Priority</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK__RUN_PRIORITY = 3;

	/**
	 * The feature id for the '<em><b>Datainterchanges</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK__DATAINTERCHANGES = 4;

	/**
	 * The feature id for the '<em><b>Resources</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK__RESOURCES = 5;

	/**
	 * The feature id for the '<em><b>Objects</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK__OBJECTS = 6;

	/**
	 * The feature id for the '<em><b>Entities</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK__ENTITIES = 7;

	/**
	 * The number of structural features of the '<em>Entity Mock</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_FEATURE_COUNT = 8;

	/**
	 * The number of operations of the '<em>Entity Mock</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangesImpl <em>Running Data Interchanges</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangesImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getRunningDataInterchanges()
	 * @generated
	 */
	int RUNNING_DATA_INTERCHANGES = 4;

	/**
	 * The feature id for the '<em><b>Datainterchanges</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNING_DATA_INTERCHANGES__DATAINTERCHANGES = 0;

	/**
	 * The number of structural features of the '<em>Running Data Interchanges</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNING_DATA_INTERCHANGES_FEATURE_COUNT = 1;

	/**
	 * The number of operations of the '<em>Running Data Interchanges</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNING_DATA_INTERCHANGES_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangeImpl <em>Running Data Interchange</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getRunningDataInterchange()
	 * @generated
	 */
	int RUNNING_DATA_INTERCHANGE = 5;

	/**
	 * The feature id for the '<em><b>Datainterchange Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF = 0;

	/**
	 * The feature id for the '<em><b>File URL</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNING_DATA_INTERCHANGE__FILE_URL = 1;

	/**
	 * The number of structural features of the '<em>Running Data Interchange</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNING_DATA_INTERCHANGE_FEATURE_COUNT = 2;

	/**
	 * The number of operations of the '<em>Running Data Interchange</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNING_DATA_INTERCHANGE_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourcesImpl <em>Entity Mock Resources</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourcesImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResources()
	 * @generated
	 */
	int ENTITY_MOCK_RESOURCES = 6;

	/**
	 * The feature id for the '<em><b>Resources</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCES__RESOURCES = 0;

	/**
	 * The number of structural features of the '<em>Entity Mock Resources</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCES_FEATURE_COUNT = 1;

	/**
	 * The number of operations of the '<em>Entity Mock Resources</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCES_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceImpl <em>Entity Mock Resource</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResource()
	 * @generated
	 */
	int ENTITY_MOCK_RESOURCE = 7;

	/**
	 * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE__ANNOTATIONS = OSBPTypesPackage.LENUM__ANNOTATIONS;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE__NAME = OSBPTypesPackage.LENUM__NAME;

	/**
	 * The feature id for the '<em><b>Annotation Info</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE__ANNOTATION_INFO = OSBPTypesPackage.LENUM__ANNOTATION_INFO;

	/**
	 * The feature id for the '<em><b>Literals</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE__LITERALS = OSBPTypesPackage.LENUM__LITERALS;

	/**
	 * The feature id for the '<em><b>Attributes</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE__ATTRIBUTES = OSBPTypesPackage.LENUM_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Datarows</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE__DATAROWS = OSBPTypesPackage.LENUM_FEATURE_COUNT + 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Resource</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_FEATURE_COUNT = OSBPTypesPackage.LENUM_FEATURE_COUNT + 2;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE___ERESOLVE_PROXY__INTERNALEOBJECT = OSBPTypesPackage.LENUM___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The operation id for the '<em>Get Resolved Annotations</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE___GET_RESOLVED_ANNOTATIONS = OSBPTypesPackage.LENUM___GET_RESOLVED_ANNOTATIONS;

	/**
	 * The number of operations of the '<em>Entity Mock Resource</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_OPERATION_COUNT = OSBPTypesPackage.LENUM_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceAttributeImpl <em>Entity Mock Resource Attribute</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceAttributeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResourceAttribute()
	 * @generated
	 */
	int ENTITY_MOCK_RESOURCE_ATTRIBUTE = 8;

	/**
	 * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_ATTRIBUTE__ANNOTATIONS = OSBPTypesPackage.LENUM__ANNOTATIONS;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_ATTRIBUTE__NAME = OSBPTypesPackage.LENUM__NAME;

	/**
	 * The feature id for the '<em><b>Annotation Info</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_ATTRIBUTE__ANNOTATION_INFO = OSBPTypesPackage.LENUM__ANNOTATION_INFO;

	/**
	 * The feature id for the '<em><b>Literals</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_ATTRIBUTE__LITERALS = OSBPTypesPackage.LENUM__LITERALS;

	/**
	 * The number of structural features of the '<em>Entity Mock Resource Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_ATTRIBUTE_FEATURE_COUNT = OSBPTypesPackage.LENUM_FEATURE_COUNT + 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT = OSBPTypesPackage.LENUM___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The operation id for the '<em>Get Resolved Annotations</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_ATTRIBUTE___GET_RESOLVED_ANNOTATIONS = OSBPTypesPackage.LENUM___GET_RESOLVED_ANNOTATIONS;

	/**
	 * The number of operations of the '<em>Entity Mock Resource Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_ATTRIBUTE_OPERATION_COUNT = OSBPTypesPackage.LENUM_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceDataRowImpl <em>Entity Mock Resource Data Row</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceDataRowImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResourceDataRow()
	 * @generated
	 */
	int ENTITY_MOCK_RESOURCE_DATA_ROW = 9;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_DATA_ROW__NAME = OSBPTypesPackage.LENUM_LITERAL__NAME;

	/**
	 * The feature id for the '<em><b>Default</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_DATA_ROW__DEFAULT = OSBPTypesPackage.LENUM_LITERAL__DEFAULT;

	/**
	 * The feature id for the '<em><b>Null</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_DATA_ROW__NULL = OSBPTypesPackage.LENUM_LITERAL__NULL;

	/**
	 * The feature id for the '<em><b>Value</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_DATA_ROW__VALUE = OSBPTypesPackage.LENUM_LITERAL__VALUE;

	/**
	 * The feature id for the '<em><b>String Value</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_DATA_ROW__STRING_VALUE = OSBPTypesPackage.LENUM_LITERAL__STRING_VALUE;

	/**
	 * The feature id for the '<em><b>Values</b></em>' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_DATA_ROW__VALUES = OSBPTypesPackage.LENUM_LITERAL_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Entity Mock Resource Data Row</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_DATA_ROW_FEATURE_COUNT = OSBPTypesPackage.LENUM_LITERAL_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_DATA_ROW___ERESOLVE_PROXY__INTERNALEOBJECT = OSBPTypesPackage.LENUM_LITERAL___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Resource Data Row</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_RESOURCE_DATA_ROW_OPERATION_COUNT = OSBPTypesPackage.LENUM_LITERAL_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectsImpl <em>Entity Mock Objects</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectsImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjects()
	 * @generated
	 */
	int ENTITY_MOCK_OBJECTS = 10;

	/**
	 * The feature id for the '<em><b>Objects</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECTS__OBJECTS = 0;

	/**
	 * The number of structural features of the '<em>Entity Mock Objects</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECTS_FEATURE_COUNT = 1;

	/**
	 * The number of operations of the '<em>Entity Mock Objects</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECTS_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectImpl <em>Entity Mock Object</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObject()
	 * @generated
	 */
	int ENTITY_MOCK_OBJECT = 11;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT__NAME = 0;

	/**
	 * The feature id for the '<em><b>Enumerations</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT__ENUMERATIONS = 1;

	/**
	 * The feature id for the '<em><b>Attributes</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT__ATTRIBUTES = 2;

	/**
	 * The feature id for the '<em><b>Calculations</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT__CALCULATIONS = 3;

	/**
	 * The number of structural features of the '<em>Entity Mock Object</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FEATURE_COUNT = 4;

	/**
	 * The number of operations of the '<em>Entity Mock Object</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IEntityMockObjectUsableImpl <em>IEntity Mock Object Usable</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.IEntityMockObjectUsableImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockObjectUsable()
	 * @generated
	 */
	int IENTITY_MOCK_OBJECT_USABLE = 52;

	/**
	 * The number of structural features of the '<em>IEntity Mock Object Usable</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_OBJECT_USABLE_FEATURE_COUNT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_OBJECT_USABLE___ERESOLVE_PROXY__INTERNALEOBJECT = ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>IEntity Mock Object Usable</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_OBJECT_USABLE_OPERATION_COUNT = ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectEnumImpl <em>Entity Mock Object Enum</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectEnumImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectEnum()
	 * @generated
	 */
	int ENTITY_MOCK_OBJECT_ENUM = 12;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ENUM__NAME = IENTITY_MOCK_OBJECT_USABLE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Using Resource</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ENUM__USING_RESOURCE = IENTITY_MOCK_OBJECT_USABLE_FEATURE_COUNT + 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Object Enum</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ENUM_FEATURE_COUNT = IENTITY_MOCK_OBJECT_USABLE_FEATURE_COUNT + 2;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ENUM___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_OBJECT_USABLE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Object Enum</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ENUM_OPERATION_COUNT = IENTITY_MOCK_OBJECT_USABLE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IEntityMockObjectAttributeImpl <em>IEntity Mock Object Attribute</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.IEntityMockObjectAttributeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockObjectAttribute()
	 * @generated
	 */
	int IENTITY_MOCK_OBJECT_ATTRIBUTE = 13;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>IEntity Mock Object Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_OBJECT_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT = ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>IEntity Mock Object Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_OBJECT_ATTRIBUTE_OPERATION_COUNT = ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectPlainValueImpl <em>Entity Mock Object Plain Value</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectPlainValueImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectPlainValue()
	 * @generated
	 */
	int ENTITY_MOCK_OBJECT_PLAIN_VALUE = 14;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_PLAIN_VALUE__NAME = IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME;

	/**
	 * The feature id for the '<em><b>Values</b></em>' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_PLAIN_VALUE__VALUES = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Entity Mock Object Plain Value</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_PLAIN_VALUE_FEATURE_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_PLAIN_VALUE___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_OBJECT_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Object Plain Value</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_PLAIN_VALUE_OPERATION_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectResourceValueImpl <em>Entity Mock Object Resource Value</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectResourceValueImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectResourceValue()
	 * @generated
	 */
	int ENTITY_MOCK_OBJECT_RESOURCE_VALUE = 15;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_RESOURCE_VALUE__NAME = IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME;

	/**
	 * The feature id for the '<em><b>Resource Enum</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_RESOURCE_VALUE__RESOURCE_ENUM = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Resource Attribute</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_RESOURCE_VALUE__RESOURCE_ATTRIBUTE = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Object Resource Value</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_RESOURCE_VALUE_FEATURE_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 2;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_RESOURCE_VALUE___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_OBJECT_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Object Resource Value</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_RESOURCE_VALUE_OPERATION_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectArrayValueImpl <em>Entity Mock Object Array Value</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectArrayValueImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectArrayValue()
	 * @generated
	 */
	int ENTITY_MOCK_OBJECT_ARRAY_VALUE = 16;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ARRAY_VALUE__NAME = IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME;

	/**
	 * The feature id for the '<em><b>Enumeration</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Items</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ARRAY_VALUE__ITEMS = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Object Array Value</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ARRAY_VALUE_FEATURE_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 2;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ARRAY_VALUE___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_OBJECT_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Object Array Value</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ARRAY_VALUE_OPERATION_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectItemValueImpl <em>Entity Mock Object Item Value</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectItemValueImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectItemValue()
	 * @generated
	 */
	int ENTITY_MOCK_OBJECT_ITEM_VALUE = 17;

	/**
	 * The feature id for the '<em><b>Datarow</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ITEM_VALUE__DATAROW = 0;

	/**
	 * The feature id for the '<em><b>Values</b></em>' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ITEM_VALUE__VALUES = 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Object Item Value</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ITEM_VALUE_FEATURE_COUNT = 2;

	/**
	 * The number of operations of the '<em>Entity Mock Object Item Value</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_ITEM_VALUE_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectEmbedImpl <em>Entity Mock Object Embed</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectEmbedImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectEmbed()
	 * @generated
	 */
	int ENTITY_MOCK_OBJECT_EMBED = 18;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_EMBED__NAME = IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME;

	/**
	 * The feature id for the '<em><b>Object</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_EMBED__OBJECT = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Entity Mock Object Embed</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_EMBED_FEATURE_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_EMBED___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_OBJECT_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Object Embed</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_EMBED_OPERATION_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionImpl <em>Entity Mock Object Function</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectFunction()
	 * @generated
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION = 19;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION__NAME = IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME;

	/**
	 * The feature id for the '<em><b>Oftype</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION__OFTYPE = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Params</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION__PARAMS = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Body</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION__BODY = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 2;

	/**
	 * The number of structural features of the '<em>Entity Mock Object Function</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION_FEATURE_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 3;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_OBJECT_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Object Function</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION_OPERATION_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionParameterImpl <em>Entity Mock Object Function Parameter</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionParameterImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectFunctionParameter()
	 * @generated
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER = 20;

	/**
	 * The feature id for the '<em><b>Parameter Type</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__PARAMETER_TYPE = 0;

	/**
	 * The feature id for the '<em><b>Name</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__NAME = 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Object Function Parameter</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER_FEATURE_COUNT = 2;

	/**
	 * The number of operations of the '<em>Entity Mock Object Function Parameter</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFillImpl <em>Entity Mock Object Fill</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFillImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectFill()
	 * @generated
	 */
	int ENTITY_MOCK_OBJECT_FILL = 21;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FILL__NAME = IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME;

	/**
	 * The feature id for the '<em><b>Filler Type</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FILL__FILLER_TYPE = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Entity Mock Object Fill</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FILL_FEATURE_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FILL___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_OBJECT_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Object Fill</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_OBJECT_FILL_OPERATION_COUNT = IENTITY_MOCK_OBJECT_ATTRIBUTE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTypeImpl <em>Property Filler Type</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTypeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerType()
	 * @generated
	 */
	int PROPERTY_FILLER_TYPE = 22;

	/**
	 * The number of structural features of the '<em>Property Filler Type</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TYPE_FEATURE_COUNT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT = ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Type</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TYPE_OPERATION_COUNT = ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateTypeImpl <em>Property Filler Date Type</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateTypeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDateType()
	 * @generated
	 */
	int PROPERTY_FILLER_DATE_TYPE = 23;

	/**
	 * The number of structural features of the '<em>Property Filler Date Type</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_TYPE_FEATURE_COUNT = PROPERTY_FILLER_TYPE_FEATURE_COUNT + 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Date Type</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_TYPE_OPERATION_COUNT = PROPERTY_FILLER_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerBooleanImpl <em>Property Filler Boolean</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerBooleanImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerBoolean()
	 * @generated
	 */
	int PROPERTY_FILLER_BOOLEAN = 24;

	/**
	 * The number of structural features of the '<em>Property Filler Boolean</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_BOOLEAN_FEATURE_COUNT = PROPERTY_FILLER_TYPE_FEATURE_COUNT + 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_BOOLEAN___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Boolean</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_BOOLEAN_OPERATION_COUNT = PROPERTY_FILLER_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDoubleTypeImpl <em>Property Filler Double Type</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDoubleTypeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDoubleType()
	 * @generated
	 */
	int PROPERTY_FILLER_DOUBLE_TYPE = 25;

	/**
	 * The number of structural features of the '<em>Property Filler Double Type</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT = PROPERTY_FILLER_TYPE_FEATURE_COUNT + 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DOUBLE_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Double Type</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DOUBLE_TYPE_OPERATION_COUNT = PROPERTY_FILLER_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerIntegerTypeImpl <em>Property Filler Integer Type</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerIntegerTypeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerIntegerType()
	 * @generated
	 */
	int PROPERTY_FILLER_INTEGER_TYPE = 26;

	/**
	 * The number of structural features of the '<em>Property Filler Integer Type</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT = PROPERTY_FILLER_TYPE_FEATURE_COUNT + 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_INTEGER_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Integer Type</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_INTEGER_TYPE_OPERATION_COUNT = PROPERTY_FILLER_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextTypeImpl <em>Property Filler Text Type</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextTypeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextType()
	 * @generated
	 */
	int PROPERTY_FILLER_TEXT_TYPE = 27;

	/**
	 * The number of structural features of the '<em>Property Filler Text Type</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_TYPE_FEATURE_COUNT = PROPERTY_FILLER_TYPE_FEATURE_COUNT + 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Text Type</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_TYPE_OPERATION_COUNT = PROPERTY_FILLER_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateFutureImpl <em>Property Filler Date Future</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateFutureImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDateFuture()
	 * @generated
	 */
	int PROPERTY_FILLER_DATE_FUTURE = 28;

	/**
	 * The feature id for the '<em><b>Date Future Years</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_FUTURE__DATE_FUTURE_YEARS = PROPERTY_FILLER_DATE_TYPE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Property Filler Date Future</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_FUTURE_FEATURE_COUNT = PROPERTY_FILLER_DATE_TYPE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_FUTURE___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_DATE_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Date Future</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_FUTURE_OPERATION_COUNT = PROPERTY_FILLER_DATE_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDatePastImpl <em>Property Filler Date Past</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDatePastImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDatePast()
	 * @generated
	 */
	int PROPERTY_FILLER_DATE_PAST = 29;

	/**
	 * The feature id for the '<em><b>Date Past Years</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_PAST__DATE_PAST_YEARS = PROPERTY_FILLER_DATE_TYPE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Property Filler Date Past</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_PAST_FEATURE_COUNT = PROPERTY_FILLER_DATE_TYPE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_PAST___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_DATE_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Date Past</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_PAST_OPERATION_COUNT = PROPERTY_FILLER_DATE_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateRangeImpl <em>Property Filler Date Range</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateRangeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDateRange()
	 * @generated
	 */
	int PROPERTY_FILLER_DATE_RANGE = 30;

	/**
	 * The feature id for the '<em><b>Date Begin Years</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_RANGE__DATE_BEGIN_YEARS = PROPERTY_FILLER_DATE_TYPE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Date End Years</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_RANGE__DATE_END_YEARS = PROPERTY_FILLER_DATE_TYPE_FEATURE_COUNT + 1;

	/**
	 * The number of structural features of the '<em>Property Filler Date Range</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_RANGE_FEATURE_COUNT = PROPERTY_FILLER_DATE_TYPE_FEATURE_COUNT + 2;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_RANGE___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_DATE_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Date Range</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_DATE_RANGE_OPERATION_COUNT = PROPERTY_FILLER_DATE_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRangeImpl <em>Property Filler Signed Double Range</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRangeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedDoubleRange()
	 * @generated
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE = 31;

	/**
	 * The feature id for the '<em><b>Decimals</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__DECIMALS = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Begin Range</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__BEGIN_RANGE = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>End Range</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__END_RANGE = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 2;

	/**
	 * The feature id for the '<em><b>Begin Range Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__BEGIN_RANGE_REF = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 3;

	/**
	 * The feature id for the '<em><b>End Range Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__END_RANGE_REF = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 4;

	/**
	 * The feature id for the '<em><b>Rounded</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__ROUNDED = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 5;

	/**
	 * The number of structural features of the '<em>Property Filler Signed Double Range</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE_FEATURE_COUNT = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 6;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_DOUBLE_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Signed Double Range</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANGE_OPERATION_COUNT = PROPERTY_FILLER_DOUBLE_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRandomImpl <em>Property Filler Signed Double Random</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRandomImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedDoubleRandom()
	 * @generated
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM = 32;

	/**
	 * The feature id for the '<em><b>Items</b></em>' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM__ITEMS = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Property Filler Signed Double Random</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM_FEATURE_COUNT = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_DOUBLE_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Signed Double Random</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM_OPERATION_COUNT = PROPERTY_FILLER_DOUBLE_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRangeImpl <em>Property Filler Signed Integer Range</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRangeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedIntegerRange()
	 * @generated
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANGE = 33;

	/**
	 * The feature id for the '<em><b>Begin Range</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANGE__BEGIN_RANGE = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>End Range</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANGE__END_RANGE = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Begin Range Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANGE__BEGIN_RANGE_REF = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 2;

	/**
	 * The feature id for the '<em><b>End Range Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANGE__END_RANGE_REF = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 3;

	/**
	 * The feature id for the '<em><b>Rounded</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANGE__ROUNDED = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 4;

	/**
	 * The number of structural features of the '<em>Property Filler Signed Integer Range</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANGE_FEATURE_COUNT = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 5;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANGE___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_INTEGER_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Signed Integer Range</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANGE_OPERATION_COUNT = PROPERTY_FILLER_INTEGER_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRandomImpl <em>Property Filler Signed Integer Random</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRandomImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedIntegerRandom()
	 * @generated
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANDOM = 34;

	/**
	 * The feature id for the '<em><b>Items</b></em>' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANDOM__ITEMS = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Property Filler Signed Integer Random</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANDOM_FEATURE_COUNT = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANDOM___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_INTEGER_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Signed Integer Random</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_SIGNED_INTEGER_RANDOM_OPERATION_COUNT = PROPERTY_FILLER_INTEGER_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextRandomImpl <em>Property Filler Text Random</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextRandomImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextRandom()
	 * @generated
	 */
	int PROPERTY_FILLER_TEXT_RANDOM = 35;

	/**
	 * The feature id for the '<em><b>Items</b></em>' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_RANDOM__ITEMS = PROPERTY_FILLER_TEXT_TYPE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Property Filler Text Random</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_RANDOM_FEATURE_COUNT = PROPERTY_FILLER_TEXT_TYPE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_RANDOM___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_TEXT_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Text Random</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_RANDOM_OPERATION_COUNT = PROPERTY_FILLER_TEXT_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextParagraphsImpl <em>Property Filler Text Paragraphs</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextParagraphsImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextParagraphs()
	 * @generated
	 */
	int PROPERTY_FILLER_TEXT_PARAGRAPHS = 36;

	/**
	 * The feature id for the '<em><b>Count</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_PARAGRAPHS__COUNT = PROPERTY_FILLER_TEXT_TYPE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Property Filler Text Paragraphs</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_PARAGRAPHS_FEATURE_COUNT = PROPERTY_FILLER_TEXT_TYPE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_PARAGRAPHS___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_TEXT_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Text Paragraphs</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_PARAGRAPHS_OPERATION_COUNT = PROPERTY_FILLER_TEXT_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextSentencesImpl <em>Property Filler Text Sentences</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextSentencesImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextSentences()
	 * @generated
	 */
	int PROPERTY_FILLER_TEXT_SENTENCES = 37;

	/**
	 * The feature id for the '<em><b>Count</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_SENTENCES__COUNT = PROPERTY_FILLER_TEXT_TYPE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Property Filler Text Sentences</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_SENTENCES_FEATURE_COUNT = PROPERTY_FILLER_TEXT_TYPE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_SENTENCES___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_TEXT_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Text Sentences</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_SENTENCES_OPERATION_COUNT = PROPERTY_FILLER_TEXT_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextWordsImpl <em>Property Filler Text Words</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextWordsImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextWords()
	 * @generated
	 */
	int PROPERTY_FILLER_TEXT_WORDS = 38;

	/**
	 * The feature id for the '<em><b>Count</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_WORDS__COUNT = PROPERTY_FILLER_TEXT_TYPE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Property Filler Text Words</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_WORDS_FEATURE_COUNT = PROPERTY_FILLER_TEXT_TYPE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_WORDS___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_TEXT_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Text Words</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_TEXT_WORDS_OPERATION_COUNT = PROPERTY_FILLER_TEXT_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRangeImpl <em>Property Filler Unsigned Double Range</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRangeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedDoubleRange()
	 * @generated
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE = 39;

	/**
	 * The feature id for the '<em><b>Decimals</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__DECIMALS = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Begin Range</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__BEGIN_RANGE = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>End Range</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__END_RANGE = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 2;

	/**
	 * The feature id for the '<em><b>Begin Range Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__BEGIN_RANGE_REF = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 3;

	/**
	 * The feature id for the '<em><b>End Range Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__END_RANGE_REF = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 4;

	/**
	 * The feature id for the '<em><b>Rounded</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__ROUNDED = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 5;

	/**
	 * The number of structural features of the '<em>Property Filler Unsigned Double Range</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE_FEATURE_COUNT = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 6;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_DOUBLE_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Unsigned Double Range</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE_OPERATION_COUNT = PROPERTY_FILLER_DOUBLE_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRandomImpl <em>Property Filler Unsigned Double Random</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRandomImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedDoubleRandom()
	 * @generated
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM = 40;

	/**
	 * The feature id for the '<em><b>Items</b></em>' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM__ITEMS = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Property Filler Unsigned Double Random</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM_FEATURE_COUNT = PROPERTY_FILLER_DOUBLE_TYPE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_DOUBLE_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Unsigned Double Random</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM_OPERATION_COUNT = PROPERTY_FILLER_DOUBLE_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRangeImpl <em>Property Filler Unsigned Integer Range</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRangeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedIntegerRange()
	 * @generated
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE = 41;

	/**
	 * The feature id for the '<em><b>Begin Range</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__BEGIN_RANGE = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>End Range</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__END_RANGE = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Begin Range Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__BEGIN_RANGE_REF = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 2;

	/**
	 * The feature id for the '<em><b>End Range Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__END_RANGE_REF = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 3;

	/**
	 * The feature id for the '<em><b>Rounded</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__ROUNDED = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 4;

	/**
	 * The number of structural features of the '<em>Property Filler Unsigned Integer Range</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE_FEATURE_COUNT = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 5;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_INTEGER_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Unsigned Integer Range</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE_OPERATION_COUNT = PROPERTY_FILLER_INTEGER_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRandomImpl <em>Property Filler Unsigned Integer Random</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRandomImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedIntegerRandom()
	 * @generated
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM = 42;

	/**
	 * The feature id for the '<em><b>Items</b></em>' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM__ITEMS = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Property Filler Unsigned Integer Random</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM_FEATURE_COUNT = PROPERTY_FILLER_INTEGER_TYPE_FEATURE_COUNT + 1;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM___ERESOLVE_PROXY__INTERNALEOBJECT = PROPERTY_FILLER_INTEGER_TYPE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Property Filler Unsigned Integer Random</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM_OPERATION_COUNT = PROPERTY_FILLER_INTEGER_TYPE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntitiesImpl <em>Entity Mock Entities</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntitiesImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntities()
	 * @generated
	 */
	int ENTITY_MOCK_ENTITIES = 43;

	/**
	 * The feature id for the '<em><b>Entities</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITIES__ENTITIES = 0;

	/**
	 * The number of structural features of the '<em>Entity Mock Entities</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITIES_FEATURE_COUNT = 1;

	/**
	 * The number of operations of the '<em>Entity Mock Entities</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITIES_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl <em>Entity Mock Entity</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntity()
	 * @generated
	 */
	int ENTITY_MOCK_ENTITY = 44;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__NAME = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Min Rows</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__MIN_ROWS = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Max Rows</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__MAX_ROWS = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 2;

	/**
	 * The feature id for the '<em><b>Create Blob Mapping</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__CREATE_BLOB_MAPPING = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 3;

	/**
	 * The feature id for the '<em><b>Iterate</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__ITERATE = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 4;

	/**
	 * The feature id for the '<em><b>Templates</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__TEMPLATES = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 5;

	/**
	 * The feature id for the '<em><b>Attributes</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__ATTRIBUTES = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 6;

	/**
	 * The feature id for the '<em><b>Calculations</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__CALCULATIONS = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 7;

	/**
	 * The feature id for the '<em><b>By Resource Attributes</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__BY_RESOURCE_ATTRIBUTES = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 8;

	/**
	 * The feature id for the '<em><b>Complete Year Filler</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__COMPLETE_YEAR_FILLER = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 9;

	/**
	 * The feature id for the '<em><b>Entity Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__ENTITY_REF = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 10;

	/**
	 * The feature id for the '<em><b>Iterator</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__ITERATOR = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 11;

	/**
	 * The feature id for the '<em><b>By Resource</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY__BY_RESOURCE = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 12;

	/**
	 * The number of structural features of the '<em>Entity Mock Entity</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_FEATURE_COUNT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 13;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY___ERESOLVE_PROXY__INTERNALEOBJECT = ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Entity</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_OPERATION_COUNT = ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.CompleteYearFillerImpl <em>Complete Year Filler</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.CompleteYearFillerImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getCompleteYearFiller()
	 * @generated
	 */
	int COMPLETE_YEAR_FILLER = 45;

	/**
	 * The feature id for the '<em><b>Filler Date Type</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int COMPLETE_YEAR_FILLER__FILLER_DATE_TYPE = 0;

	/**
	 * The number of structural features of the '<em>Complete Year Filler</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int COMPLETE_YEAR_FILLER_FEATURE_COUNT = 1;

	/**
	 * The number of operations of the '<em>Complete Year Filler</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int COMPLETE_YEAR_FILLER_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IIterateImpl <em>IIterate</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.IIterateImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIIterate()
	 * @generated
	 */
	int IITERATE = 46;

	/**
	 * The number of structural features of the '<em>IIterate</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IITERATE_FEATURE_COUNT = 0;

	/**
	 * The number of operations of the '<em>IIterate</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IITERATE_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IntegerIterateImpl <em>Integer Iterate</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.IntegerIterateImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIntegerIterate()
	 * @generated
	 */
	int INTEGER_ITERATE = 47;

	/**
	 * The feature id for the '<em><b>From</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_ITERATE__FROM = IITERATE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Until</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_ITERATE__UNTIL = IITERATE_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Step</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_ITERATE__STEP = IITERATE_FEATURE_COUNT + 2;

	/**
	 * The number of structural features of the '<em>Integer Iterate</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_ITERATE_FEATURE_COUNT = IITERATE_FEATURE_COUNT + 3;

	/**
	 * The number of operations of the '<em>Integer Iterate</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_ITERATE_OPERATION_COUNT = IITERATE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.DateIterateImpl <em>Date Iterate</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.DateIterateImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getDateIterate()
	 * @generated
	 */
	int DATE_ITERATE = 48;

	/**
	 * The feature id for the '<em><b>From</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE_ITERATE__FROM = IITERATE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Until</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE_ITERATE__UNTIL = IITERATE_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Step Count</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE_ITERATE__STEP_COUNT = IITERATE_FEATURE_COUNT + 2;

	/**
	 * The feature id for the '<em><b>Step Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE_ITERATE__STEP_TYPE = IITERATE_FEATURE_COUNT + 3;

	/**
	 * The number of structural features of the '<em>Date Iterate</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE_ITERATE_FEATURE_COUNT = IITERATE_FEATURE_COUNT + 4;

	/**
	 * The number of operations of the '<em>Date Iterate</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE_ITERATE_OPERATION_COUNT = IITERATE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.DateImpl <em>Date</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.DateImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getDate()
	 * @generated
	 */
	int DATE = 49;

	/**
	 * The feature id for the '<em><b>Yesterday</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE__YESTERDAY = 0;

	/**
	 * The feature id for the '<em><b>Today</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE__TODAY = 1;

	/**
	 * The feature id for the '<em><b>Tomorrow</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE__TOMORROW = 2;

	/**
	 * The feature id for the '<em><b>Offset Count</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE__OFFSET_COUNT = 3;

	/**
	 * The feature id for the '<em><b>Offset Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE__OFFSET_TYPE = 4;

	/**
	 * The feature id for the '<em><b>Year</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE__YEAR = 5;

	/**
	 * The feature id for the '<em><b>Month</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE__MONTH = 6;

	/**
	 * The feature id for the '<em><b>Day</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE__DAY = 7;

	/**
	 * The number of structural features of the '<em>Date</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE_FEATURE_COUNT = 8;

	/**
	 * The number of operations of the '<em>Date</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DATE_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockByResourceAttributeImpl <em>Entity Mock By Resource Attribute</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockByResourceAttributeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockByResourceAttribute()
	 * @generated
	 */
	int ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE = 50;

	/**
	 * The feature id for the '<em><b>Attribute Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF = 0;

	/**
	 * The feature id for the '<em><b>Resource Attribute</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE = 1;

	/**
	 * The number of structural features of the '<em>Entity Mock By Resource Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE_FEATURE_COUNT = 2;

	/**
	 * The number of operations of the '<em>Entity Mock By Resource Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemplateImpl <em>Entity Mock Template</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemplateImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockTemplate()
	 * @generated
	 */
	int ENTITY_MOCK_TEMPLATE = 51;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_TEMPLATE__NAME = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Object</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_TEMPLATE__OBJECT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Template</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_TEMPLATE_FEATURE_COUNT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 2;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_TEMPLATE___ERESOLVE_PROXY__INTERNALEOBJECT = ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Template</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_TEMPLATE_OPERATION_COUNT = ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IEntityMockEntityUsableImpl <em>IEntity Mock Entity Usable</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.IEntityMockEntityUsableImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockEntityUsable()
	 * @generated
	 */
	int IENTITY_MOCK_ENTITY_USABLE = 53;

	/**
	 * The number of structural features of the '<em>IEntity Mock Entity Usable</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_ENTITY_USABLE_FEATURE_COUNT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_ENTITY_USABLE___ERESOLVE_PROXY__INTERNALEOBJECT = ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>IEntity Mock Entity Usable</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_ENTITY_USABLE_OPERATION_COUNT = ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IEntityMockAttributeImpl <em>IEntity Mock Attribute</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.IEntityMockAttributeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockAttribute()
	 * @generated
	 */
	int IENTITY_MOCK_ATTRIBUTE = 54;

	/**
	 * The number of structural features of the '<em>IEntity Mock Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT = IENTITY_MOCK_ENTITY_USABLE_FEATURE_COUNT + 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_ENTITY_USABLE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>IEntity Mock Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IENTITY_MOCK_ATTRIBUTE_OPERATION_COUNT = IENTITY_MOCK_ENTITY_USABLE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockReferencedObjectAttributeImpl <em>Entity Mock Referenced Object Attribute</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockReferencedObjectAttributeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockReferencedObjectAttribute()
	 * @generated
	 */
	int ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE = 55;

	/**
	 * The feature id for the '<em><b>Template</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Embedded</b></em>' reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Attribute</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__ATTRIBUTE = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 2;

	/**
	 * The number of structural features of the '<em>Entity Mock Referenced Object Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE_FEATURE_COUNT = ENTITY_MOCK_LAZY_RESOLVER_FEATURE_COUNT + 3;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT = ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Referenced Object Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE_OPERATION_COUNT = ENTITY_MOCK_LAZY_RESOLVER_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByObjectImpl <em>Entity Mock Attribute By Object</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByObjectImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockAttributeByObject()
	 * @generated
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_OBJECT = 56;

	/**
	 * The feature id for the '<em><b>Attribute Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__ATTRIBUTE_REF = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Reference</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__REFERENCE = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Resource Enum</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__RESOURCE_ENUM = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 2;

	/**
	 * The feature id for the '<em><b>Resource Attribute</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__RESOURCE_ATTRIBUTE = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 3;

	/**
	 * The number of structural features of the '<em>Entity Mock Attribute By Object</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_OBJECT_FEATURE_COUNT = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 4;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_OBJECT___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Attribute By Object</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_OBJECT_OPERATION_COUNT = IENTITY_MOCK_ATTRIBUTE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeFillerImpl <em>Entity Mock Attribute Filler</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeFillerImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockAttributeFiller()
	 * @generated
	 */
	int ENTITY_MOCK_ATTRIBUTE_FILLER = 57;

	/**
	 * The feature id for the '<em><b>Attribute Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Filler Type</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_FILLER__FILLER_TYPE = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Attribute Filler</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_FILLER_FEATURE_COUNT = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 2;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_FILLER___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Attribute Filler</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_FILLER_OPERATION_COUNT = IENTITY_MOCK_ATTRIBUTE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByReferenceImpl <em>Entity Mock Attribute By Reference</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByReferenceImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockAttributeByReference()
	 * @generated
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE = 58;

	/**
	 * The feature id for the '<em><b>Attribute Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__ATTRIBUTE_REF = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Mocked Entity</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__MOCKED_ENTITY = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Optional For</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__OPTIONAL_FOR = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 2;

	/**
	 * The number of structural features of the '<em>Entity Mock Attribute By Reference</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE_FEATURE_COUNT = IENTITY_MOCK_ATTRIBUTE_FEATURE_COUNT + 3;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_ATTRIBUTE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Attribute By Reference</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE_OPERATION_COUNT = IENTITY_MOCK_ATTRIBUTE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionImpl <em>Entity Mock Entity Function</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntityFunction()
	 * @generated
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION = 59;

	/**
	 * The feature id for the '<em><b>Attribute Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION__ATTRIBUTE_REF = IENTITY_MOCK_ENTITY_USABLE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Params</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION__PARAMS = IENTITY_MOCK_ENTITY_USABLE_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Body</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION__BODY = IENTITY_MOCK_ENTITY_USABLE_FEATURE_COUNT + 2;

	/**
	 * The number of structural features of the '<em>Entity Mock Entity Function</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION_FEATURE_COUNT = IENTITY_MOCK_ENTITY_USABLE_FEATURE_COUNT + 3;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION___ERESOLVE_PROXY__INTERNALEOBJECT = IENTITY_MOCK_ENTITY_USABLE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Entity Mock Entity Function</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION_OPERATION_COUNT = IENTITY_MOCK_ENTITY_USABLE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityNestedAttributeImpl <em>Entity Mock Entity Nested Attribute</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityNestedAttributeImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntityNestedAttribute()
	 * @generated
	 */
	int ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE = 60;

	/**
	 * The feature id for the '<em><b>Reference</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE = 0;

	/**
	 * The feature id for the '<em><b>Attribute</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE = 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Entity Nested Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE_FEATURE_COUNT = 2;

	/**
	 * The number of operations of the '<em>Entity Mock Entity Nested Attribute</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionParameterImpl <em>Entity Mock Entity Function Parameter</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionParameterImpl
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntityFunctionParameter()
	 * @generated
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER = 61;

	/**
	 * The feature id for the '<em><b>Attribute Ref</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF = 0;

	/**
	 * The feature id for the '<em><b>Nested Attribute</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE = 1;

	/**
	 * The number of structural features of the '<em>Entity Mock Entity Function Parameter</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER_FEATURE_COUNT = 2;

	/**
	 * The number of operations of the '<em>Entity Mock Entity Function Parameter</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.entitymock.EDateStepType <em>EDate Step Type</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.entitymock.EDateStepType
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEDateStepType()
	 * @generated
	 */
	int EDATE_STEP_TYPE = 62;

	/**
	 * The meta object id for the '<em>Internal EObject</em>' data type.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.InternalEObject
	 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getInternalEObject()
	 * @generated
	 */
	int INTERNAL_EOBJECT = 63;


	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockModel <em>Entity Mock Model</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Model</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockModel
	 * @generated
	 */
	EClass getEntityMockModel();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockModel#getImportSection <em>Import Section</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Import Section</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockModel#getImportSection()
	 * @see #getEntityMockModel()
	 * @generated
	 */
	EReference getEntityMockModel_ImportSection();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockModel#getPackages <em>Packages</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Packages</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockModel#getPackages()
	 * @see #getEntityMockModel()
	 * @generated
	 */
	EReference getEntityMockModel_Packages();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver <em>Entity Mock Lazy Resolver</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Lazy Resolver</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver
	 * @generated
	 */
	EClass getEntityMockLazyResolver();

	/**
	 * Returns the meta object for the '{@link org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver#eResolveProxy(org.eclipse.emf.ecore.InternalEObject) <em>EResolve Proxy</em>}' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the '<em>EResolve Proxy</em>' operation.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver#eResolveProxy(org.eclipse.emf.ecore.InternalEObject)
	 * @generated
	 */
	EOperation getEntityMockLazyResolver__EResolveProxy__InternalEObject();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage <em>Entity Mock Package</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Package</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockPackage
	 * @generated
	 */
	EClass getEntityMockPackage();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getMocks <em>Mocks</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Mocks</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockPackage#getMocks()
	 * @see #getEntityMockPackage()
	 * @generated
	 */
	EReference getEntityMockPackage_Mocks();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMock <em>Entity Mock</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock
	 * @generated
	 */
	EClass getEntityMock();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getName <em>Name</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Name</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getName()
	 * @see #getEntityMock()
	 * @generated
	 */
	EAttribute getEntityMock_Name();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#isDescription <em>Description</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Description</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#isDescription()
	 * @see #getEntityMock()
	 * @generated
	 */
	EAttribute getEntityMock_Description();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getDescriptionValue <em>Description Value</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Description Value</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getDescriptionValue()
	 * @see #getEntityMock()
	 * @generated
	 */
	EAttribute getEntityMock_DescriptionValue();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getRunPriority <em>Run Priority</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Run Priority</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getRunPriority()
	 * @see #getEntityMock()
	 * @generated
	 */
	EAttribute getEntityMock_RunPriority();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getDatainterchanges <em>Datainterchanges</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Datainterchanges</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getDatainterchanges()
	 * @see #getEntityMock()
	 * @generated
	 */
	EReference getEntityMock_Datainterchanges();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getResources <em>Resources</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Resources</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getResources()
	 * @see #getEntityMock()
	 * @generated
	 */
	EReference getEntityMock_Resources();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getObjects <em>Objects</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Objects</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getObjects()
	 * @see #getEntityMock()
	 * @generated
	 */
	EReference getEntityMock_Objects();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMock#getEntities <em>Entities</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Entities</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMock#getEntities()
	 * @see #getEntityMock()
	 * @generated
	 */
	EReference getEntityMock_Entities();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges <em>Running Data Interchanges</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Running Data Interchanges</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges
	 * @generated
	 */
	EClass getRunningDataInterchanges();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges#getDatainterchanges <em>Datainterchanges</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Datainterchanges</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges#getDatainterchanges()
	 * @see #getRunningDataInterchanges()
	 * @generated
	 */
	EReference getRunningDataInterchanges_Datainterchanges();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.RunningDataInterchange <em>Running Data Interchange</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Running Data Interchange</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.RunningDataInterchange
	 * @generated
	 */
	EClass getRunningDataInterchange();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.RunningDataInterchange#getDatainterchangeRef <em>Datainterchange Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Datainterchange Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.RunningDataInterchange#getDatainterchangeRef()
	 * @see #getRunningDataInterchange()
	 * @generated
	 */
	EReference getRunningDataInterchange_DatainterchangeRef();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.RunningDataInterchange#getFileURL <em>File URL</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>File URL</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.RunningDataInterchange#getFileURL()
	 * @see #getRunningDataInterchange()
	 * @generated
	 */
	EAttribute getRunningDataInterchange_FileURL();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockResources <em>Entity Mock Resources</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Resources</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockResources
	 * @generated
	 */
	EClass getEntityMockResources();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockResources#getResources <em>Resources</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Resources</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockResources#getResources()
	 * @see #getEntityMockResources()
	 * @generated
	 */
	EReference getEntityMockResources_Resources();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockResource <em>Entity Mock Resource</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Resource</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockResource
	 * @generated
	 */
	EClass getEntityMockResource();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockResource#getAttributes <em>Attributes</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Attributes</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockResource#getAttributes()
	 * @see #getEntityMockResource()
	 * @generated
	 */
	EReference getEntityMockResource_Attributes();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockResource#getDatarows <em>Datarows</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Datarows</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockResource#getDatarows()
	 * @see #getEntityMockResource()
	 * @generated
	 */
	EReference getEntityMockResource_Datarows();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockResourceAttribute <em>Entity Mock Resource Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Resource Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockResourceAttribute
	 * @generated
	 */
	EClass getEntityMockResourceAttribute();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow <em>Entity Mock Resource Data Row</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Resource Data Row</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow
	 * @generated
	 */
	EClass getEntityMockResourceDataRow();

	/**
	 * Returns the meta object for the attribute list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow#getValues <em>Values</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute list '<em>Values</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow#getValues()
	 * @see #getEntityMockResourceDataRow()
	 * @generated
	 */
	EAttribute getEntityMockResourceDataRow_Values();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjects <em>Entity Mock Objects</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Objects</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjects
	 * @generated
	 */
	EClass getEntityMockObjects();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjects#getObjects <em>Objects</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Objects</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjects#getObjects()
	 * @see #getEntityMockObjects()
	 * @generated
	 */
	EReference getEntityMockObjects_Objects();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObject <em>Entity Mock Object</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Object</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObject
	 * @generated
	 */
	EClass getEntityMockObject();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObject#getName <em>Name</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Name</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObject#getName()
	 * @see #getEntityMockObject()
	 * @generated
	 */
	EAttribute getEntityMockObject_Name();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObject#getEnumerations <em>Enumerations</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Enumerations</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObject#getEnumerations()
	 * @see #getEntityMockObject()
	 * @generated
	 */
	EReference getEntityMockObject_Enumerations();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObject#getAttributes <em>Attributes</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Attributes</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObject#getAttributes()
	 * @see #getEntityMockObject()
	 * @generated
	 */
	EReference getEntityMockObject_Attributes();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObject#getCalculations <em>Calculations</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Calculations</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObject#getCalculations()
	 * @see #getEntityMockObject()
	 * @generated
	 */
	EReference getEntityMockObject_Calculations();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum <em>Entity Mock Object Enum</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Object Enum</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum
	 * @generated
	 */
	EClass getEntityMockObjectEnum();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum#getName <em>Name</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Name</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum#getName()
	 * @see #getEntityMockObjectEnum()
	 * @generated
	 */
	EAttribute getEntityMockObjectEnum_Name();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum#getUsingResource <em>Using Resource</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Using Resource</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum#getUsingResource()
	 * @see #getEntityMockObjectEnum()
	 * @generated
	 */
	EReference getEntityMockObjectEnum_UsingResource();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute <em>IEntity Mock Object Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>IEntity Mock Object Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute
	 * @generated
	 */
	EClass getIEntityMockObjectAttribute();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute#getName <em>Name</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Name</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute#getName()
	 * @see #getIEntityMockObjectAttribute()
	 * @generated
	 */
	EAttribute getIEntityMockObjectAttribute_Name();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectPlainValue <em>Entity Mock Object Plain Value</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Object Plain Value</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectPlainValue
	 * @generated
	 */
	EClass getEntityMockObjectPlainValue();

	/**
	 * Returns the meta object for the attribute list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectPlainValue#getValues <em>Values</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute list '<em>Values</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectPlainValue#getValues()
	 * @see #getEntityMockObjectPlainValue()
	 * @generated
	 */
	EAttribute getEntityMockObjectPlainValue_Values();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue <em>Entity Mock Object Resource Value</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Object Resource Value</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue
	 * @generated
	 */
	EClass getEntityMockObjectResourceValue();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue#getResourceEnum <em>Resource Enum</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Resource Enum</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue#getResourceEnum()
	 * @see #getEntityMockObjectResourceValue()
	 * @generated
	 */
	EReference getEntityMockObjectResourceValue_ResourceEnum();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue#getResourceAttribute <em>Resource Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Resource Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue#getResourceAttribute()
	 * @see #getEntityMockObjectResourceValue()
	 * @generated
	 */
	EReference getEntityMockObjectResourceValue_ResourceAttribute();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue <em>Entity Mock Object Array Value</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Object Array Value</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue
	 * @generated
	 */
	EClass getEntityMockObjectArrayValue();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue#getEnumeration <em>Enumeration</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Enumeration</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue#getEnumeration()
	 * @see #getEntityMockObjectArrayValue()
	 * @generated
	 */
	EReference getEntityMockObjectArrayValue_Enumeration();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue#getItems <em>Items</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Items</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue#getItems()
	 * @see #getEntityMockObjectArrayValue()
	 * @generated
	 */
	EReference getEntityMockObjectArrayValue_Items();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectItemValue <em>Entity Mock Object Item Value</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Object Item Value</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectItemValue
	 * @generated
	 */
	EClass getEntityMockObjectItemValue();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectItemValue#getDatarow <em>Datarow</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Datarow</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectItemValue#getDatarow()
	 * @see #getEntityMockObjectItemValue()
	 * @generated
	 */
	EReference getEntityMockObjectItemValue_Datarow();

	/**
	 * Returns the meta object for the attribute list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectItemValue#getValues <em>Values</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute list '<em>Values</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectItemValue#getValues()
	 * @see #getEntityMockObjectItemValue()
	 * @generated
	 */
	EAttribute getEntityMockObjectItemValue_Values();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed <em>Entity Mock Object Embed</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Object Embed</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed
	 * @generated
	 */
	EClass getEntityMockObjectEmbed();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed#getObject <em>Object</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Object</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed#getObject()
	 * @see #getEntityMockObjectEmbed()
	 * @generated
	 */
	EReference getEntityMockObjectEmbed_Object();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction <em>Entity Mock Object Function</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Object Function</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction
	 * @generated
	 */
	EClass getEntityMockObjectFunction();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction#getOftype <em>Oftype</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Oftype</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction#getOftype()
	 * @see #getEntityMockObjectFunction()
	 * @generated
	 */
	EReference getEntityMockObjectFunction_Oftype();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction#getParams <em>Params</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Params</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction#getParams()
	 * @see #getEntityMockObjectFunction()
	 * @generated
	 */
	EReference getEntityMockObjectFunction_Params();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction#getBody <em>Body</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Body</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction#getBody()
	 * @see #getEntityMockObjectFunction()
	 * @generated
	 */
	EReference getEntityMockObjectFunction_Body();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunctionParameter <em>Entity Mock Object Function Parameter</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Object Function Parameter</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunctionParameter
	 * @generated
	 */
	EClass getEntityMockObjectFunctionParameter();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunctionParameter#getParameterType <em>Parameter Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Parameter Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunctionParameter#getParameterType()
	 * @see #getEntityMockObjectFunctionParameter()
	 * @generated
	 */
	EReference getEntityMockObjectFunctionParameter_ParameterType();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunctionParameter#getName <em>Name</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Name</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunctionParameter#getName()
	 * @see #getEntityMockObjectFunctionParameter()
	 * @generated
	 */
	EReference getEntityMockObjectFunctionParameter_Name();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFill <em>Entity Mock Object Fill</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Object Fill</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectFill
	 * @generated
	 */
	EClass getEntityMockObjectFill();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockObjectFill#getFillerType <em>Filler Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Filler Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockObjectFill#getFillerType()
	 * @see #getEntityMockObjectFill()
	 * @generated
	 */
	EReference getEntityMockObjectFill_FillerType();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerType <em>Property Filler Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerType
	 * @generated
	 */
	EClass getPropertyFillerType();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDateType <em>Property Filler Date Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Date Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerDateType
	 * @generated
	 */
	EClass getPropertyFillerDateType();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerBoolean <em>Property Filler Boolean</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Boolean</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerBoolean
	 * @generated
	 */
	EClass getPropertyFillerBoolean();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDoubleType <em>Property Filler Double Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Double Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerDoubleType
	 * @generated
	 */
	EClass getPropertyFillerDoubleType();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerIntegerType <em>Property Filler Integer Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Integer Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerIntegerType
	 * @generated
	 */
	EClass getPropertyFillerIntegerType();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextType <em>Property Filler Text Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Text Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerTextType
	 * @generated
	 */
	EClass getPropertyFillerTextType();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDateFuture <em>Property Filler Date Future</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Date Future</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerDateFuture
	 * @generated
	 */
	EClass getPropertyFillerDateFuture();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDateFuture#getDateFutureYears <em>Date Future Years</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Date Future Years</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerDateFuture#getDateFutureYears()
	 * @see #getPropertyFillerDateFuture()
	 * @generated
	 */
	EAttribute getPropertyFillerDateFuture_DateFutureYears();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDatePast <em>Property Filler Date Past</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Date Past</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerDatePast
	 * @generated
	 */
	EClass getPropertyFillerDatePast();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDatePast#getDatePastYears <em>Date Past Years</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Date Past Years</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerDatePast#getDatePastYears()
	 * @see #getPropertyFillerDatePast()
	 * @generated
	 */
	EAttribute getPropertyFillerDatePast_DatePastYears();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDateRange <em>Property Filler Date Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Date Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerDateRange
	 * @generated
	 */
	EClass getPropertyFillerDateRange();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDateRange#getDateBeginYears <em>Date Begin Years</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Date Begin Years</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerDateRange#getDateBeginYears()
	 * @see #getPropertyFillerDateRange()
	 * @generated
	 */
	EAttribute getPropertyFillerDateRange_DateBeginYears();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerDateRange#getDateEndYears <em>Date End Years</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Date End Years</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerDateRange#getDateEndYears()
	 * @see #getPropertyFillerDateRange()
	 * @generated
	 */
	EAttribute getPropertyFillerDateRange_DateEndYears();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange <em>Property Filler Signed Double Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Signed Double Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange
	 * @generated
	 */
	EClass getPropertyFillerSignedDoubleRange();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getDecimals <em>Decimals</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Decimals</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getDecimals()
	 * @see #getPropertyFillerSignedDoubleRange()
	 * @generated
	 */
	EAttribute getPropertyFillerSignedDoubleRange_Decimals();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getBeginRange <em>Begin Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Begin Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getBeginRange()
	 * @see #getPropertyFillerSignedDoubleRange()
	 * @generated
	 */
	EAttribute getPropertyFillerSignedDoubleRange_BeginRange();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getEndRange <em>End Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>End Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getEndRange()
	 * @see #getPropertyFillerSignedDoubleRange()
	 * @generated
	 */
	EAttribute getPropertyFillerSignedDoubleRange_EndRange();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getBeginRangeRef <em>Begin Range Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Begin Range Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getBeginRangeRef()
	 * @see #getPropertyFillerSignedDoubleRange()
	 * @generated
	 */
	EReference getPropertyFillerSignedDoubleRange_BeginRangeRef();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getEndRangeRef <em>End Range Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>End Range Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getEndRangeRef()
	 * @see #getPropertyFillerSignedDoubleRange()
	 * @generated
	 */
	EReference getPropertyFillerSignedDoubleRange_EndRangeRef();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getRounded <em>Rounded</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Rounded</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange#getRounded()
	 * @see #getPropertyFillerSignedDoubleRange()
	 * @generated
	 */
	EAttribute getPropertyFillerSignedDoubleRange_Rounded();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRandom <em>Property Filler Signed Double Random</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Signed Double Random</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRandom
	 * @generated
	 */
	EClass getPropertyFillerSignedDoubleRandom();

	/**
	 * Returns the meta object for the attribute list '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRandom#getItems <em>Items</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute list '<em>Items</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRandom#getItems()
	 * @see #getPropertyFillerSignedDoubleRandom()
	 * @generated
	 */
	EAttribute getPropertyFillerSignedDoubleRandom_Items();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange <em>Property Filler Signed Integer Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Signed Integer Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange
	 * @generated
	 */
	EClass getPropertyFillerSignedIntegerRange();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getBeginRange <em>Begin Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Begin Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getBeginRange()
	 * @see #getPropertyFillerSignedIntegerRange()
	 * @generated
	 */
	EAttribute getPropertyFillerSignedIntegerRange_BeginRange();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getEndRange <em>End Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>End Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getEndRange()
	 * @see #getPropertyFillerSignedIntegerRange()
	 * @generated
	 */
	EAttribute getPropertyFillerSignedIntegerRange_EndRange();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getBeginRangeRef <em>Begin Range Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Begin Range Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getBeginRangeRef()
	 * @see #getPropertyFillerSignedIntegerRange()
	 * @generated
	 */
	EReference getPropertyFillerSignedIntegerRange_BeginRangeRef();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getEndRangeRef <em>End Range Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>End Range Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getEndRangeRef()
	 * @see #getPropertyFillerSignedIntegerRange()
	 * @generated
	 */
	EReference getPropertyFillerSignedIntegerRange_EndRangeRef();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getRounded <em>Rounded</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Rounded</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange#getRounded()
	 * @see #getPropertyFillerSignedIntegerRange()
	 * @generated
	 */
	EAttribute getPropertyFillerSignedIntegerRange_Rounded();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRandom <em>Property Filler Signed Integer Random</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Signed Integer Random</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRandom
	 * @generated
	 */
	EClass getPropertyFillerSignedIntegerRandom();

	/**
	 * Returns the meta object for the attribute list '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRandom#getItems <em>Items</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute list '<em>Items</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRandom#getItems()
	 * @see #getPropertyFillerSignedIntegerRandom()
	 * @generated
	 */
	EAttribute getPropertyFillerSignedIntegerRandom_Items();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextRandom <em>Property Filler Text Random</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Text Random</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerTextRandom
	 * @generated
	 */
	EClass getPropertyFillerTextRandom();

	/**
	 * Returns the meta object for the attribute list '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextRandom#getItems <em>Items</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute list '<em>Items</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerTextRandom#getItems()
	 * @see #getPropertyFillerTextRandom()
	 * @generated
	 */
	EAttribute getPropertyFillerTextRandom_Items();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextParagraphs <em>Property Filler Text Paragraphs</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Text Paragraphs</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerTextParagraphs
	 * @generated
	 */
	EClass getPropertyFillerTextParagraphs();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextParagraphs#getCount <em>Count</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Count</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerTextParagraphs#getCount()
	 * @see #getPropertyFillerTextParagraphs()
	 * @generated
	 */
	EAttribute getPropertyFillerTextParagraphs_Count();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextSentences <em>Property Filler Text Sentences</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Text Sentences</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerTextSentences
	 * @generated
	 */
	EClass getPropertyFillerTextSentences();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextSentences#getCount <em>Count</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Count</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerTextSentences#getCount()
	 * @see #getPropertyFillerTextSentences()
	 * @generated
	 */
	EAttribute getPropertyFillerTextSentences_Count();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextWords <em>Property Filler Text Words</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Text Words</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerTextWords
	 * @generated
	 */
	EClass getPropertyFillerTextWords();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerTextWords#getCount <em>Count</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Count</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerTextWords#getCount()
	 * @see #getPropertyFillerTextWords()
	 * @generated
	 */
	EAttribute getPropertyFillerTextWords_Count();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange <em>Property Filler Unsigned Double Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Unsigned Double Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange
	 * @generated
	 */
	EClass getPropertyFillerUnsignedDoubleRange();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getDecimals <em>Decimals</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Decimals</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getDecimals()
	 * @see #getPropertyFillerUnsignedDoubleRange()
	 * @generated
	 */
	EAttribute getPropertyFillerUnsignedDoubleRange_Decimals();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getBeginRange <em>Begin Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Begin Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getBeginRange()
	 * @see #getPropertyFillerUnsignedDoubleRange()
	 * @generated
	 */
	EAttribute getPropertyFillerUnsignedDoubleRange_BeginRange();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getEndRange <em>End Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>End Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getEndRange()
	 * @see #getPropertyFillerUnsignedDoubleRange()
	 * @generated
	 */
	EAttribute getPropertyFillerUnsignedDoubleRange_EndRange();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getBeginRangeRef <em>Begin Range Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Begin Range Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getBeginRangeRef()
	 * @see #getPropertyFillerUnsignedDoubleRange()
	 * @generated
	 */
	EReference getPropertyFillerUnsignedDoubleRange_BeginRangeRef();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getEndRangeRef <em>End Range Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>End Range Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getEndRangeRef()
	 * @see #getPropertyFillerUnsignedDoubleRange()
	 * @generated
	 */
	EReference getPropertyFillerUnsignedDoubleRange_EndRangeRef();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getRounded <em>Rounded</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Rounded</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange#getRounded()
	 * @see #getPropertyFillerUnsignedDoubleRange()
	 * @generated
	 */
	EAttribute getPropertyFillerUnsignedDoubleRange_Rounded();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRandom <em>Property Filler Unsigned Double Random</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Unsigned Double Random</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRandom
	 * @generated
	 */
	EClass getPropertyFillerUnsignedDoubleRandom();

	/**
	 * Returns the meta object for the attribute list '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRandom#getItems <em>Items</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute list '<em>Items</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRandom#getItems()
	 * @see #getPropertyFillerUnsignedDoubleRandom()
	 * @generated
	 */
	EAttribute getPropertyFillerUnsignedDoubleRandom_Items();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange <em>Property Filler Unsigned Integer Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Unsigned Integer Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange
	 * @generated
	 */
	EClass getPropertyFillerUnsignedIntegerRange();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getBeginRange <em>Begin Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Begin Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getBeginRange()
	 * @see #getPropertyFillerUnsignedIntegerRange()
	 * @generated
	 */
	EAttribute getPropertyFillerUnsignedIntegerRange_BeginRange();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getEndRange <em>End Range</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>End Range</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getEndRange()
	 * @see #getPropertyFillerUnsignedIntegerRange()
	 * @generated
	 */
	EAttribute getPropertyFillerUnsignedIntegerRange_EndRange();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getBeginRangeRef <em>Begin Range Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Begin Range Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getBeginRangeRef()
	 * @see #getPropertyFillerUnsignedIntegerRange()
	 * @generated
	 */
	EReference getPropertyFillerUnsignedIntegerRange_BeginRangeRef();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getEndRangeRef <em>End Range Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>End Range Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getEndRangeRef()
	 * @see #getPropertyFillerUnsignedIntegerRange()
	 * @generated
	 */
	EReference getPropertyFillerUnsignedIntegerRange_EndRangeRef();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getRounded <em>Rounded</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Rounded</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange#getRounded()
	 * @see #getPropertyFillerUnsignedIntegerRange()
	 * @generated
	 */
	EAttribute getPropertyFillerUnsignedIntegerRange_Rounded();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRandom <em>Property Filler Unsigned Integer Random</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Property Filler Unsigned Integer Random</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRandom
	 * @generated
	 */
	EClass getPropertyFillerUnsignedIntegerRandom();

	/**
	 * Returns the meta object for the attribute list '{@link org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRandom#getItems <em>Items</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute list '<em>Items</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRandom#getItems()
	 * @see #getPropertyFillerUnsignedIntegerRandom()
	 * @generated
	 */
	EAttribute getPropertyFillerUnsignedIntegerRandom_Items();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntities <em>Entity Mock Entities</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Entities</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntities
	 * @generated
	 */
	EClass getEntityMockEntities();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntities#getEntities <em>Entities</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Entities</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntities#getEntities()
	 * @see #getEntityMockEntities()
	 * @generated
	 */
	EReference getEntityMockEntities_Entities();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity <em>Entity Mock Entity</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Entity</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity
	 * @generated
	 */
	EClass getEntityMockEntity();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getName <em>Name</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Name</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getName()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EAttribute getEntityMockEntity_Name();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getMinRows <em>Min Rows</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Min Rows</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getMinRows()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EAttribute getEntityMockEntity_MinRows();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getMaxRows <em>Max Rows</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Max Rows</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getMaxRows()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EAttribute getEntityMockEntity_MaxRows();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#isCreateBlobMapping <em>Create Blob Mapping</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Create Blob Mapping</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#isCreateBlobMapping()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EAttribute getEntityMockEntity_CreateBlobMapping();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getIterate <em>Iterate</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Iterate</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getIterate()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EReference getEntityMockEntity_Iterate();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getTemplates <em>Templates</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Templates</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getTemplates()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EReference getEntityMockEntity_Templates();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getAttributes <em>Attributes</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Attributes</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getAttributes()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EReference getEntityMockEntity_Attributes();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getCalculations <em>Calculations</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Calculations</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getCalculations()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EReference getEntityMockEntity_Calculations();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getByResourceAttributes <em>By Resource Attributes</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>By Resource Attributes</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getByResourceAttributes()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EReference getEntityMockEntity_ByResourceAttributes();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getCompleteYearFiller <em>Complete Year Filler</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Complete Year Filler</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getCompleteYearFiller()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EReference getEntityMockEntity_CompleteYearFiller();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getEntityRef <em>Entity Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Entity Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getEntityRef()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EReference getEntityMockEntity_EntityRef();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getIterator <em>Iterator</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Iterator</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getIterator()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EReference getEntityMockEntity_Iterator();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getByResource <em>By Resource</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>By Resource</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntity#getByResource()
	 * @see #getEntityMockEntity()
	 * @generated
	 */
	EReference getEntityMockEntity_ByResource();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.CompleteYearFiller <em>Complete Year Filler</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Complete Year Filler</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.CompleteYearFiller
	 * @generated
	 */
	EClass getCompleteYearFiller();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.CompleteYearFiller#getFillerDateType <em>Filler Date Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Filler Date Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.CompleteYearFiller#getFillerDateType()
	 * @see #getCompleteYearFiller()
	 * @generated
	 */
	EReference getCompleteYearFiller_FillerDateType();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.IIterate <em>IIterate</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>IIterate</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.IIterate
	 * @generated
	 */
	EClass getIIterate();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.IntegerIterate <em>Integer Iterate</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Integer Iterate</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.IntegerIterate
	 * @generated
	 */
	EClass getIntegerIterate();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.IntegerIterate#getFrom <em>From</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>From</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.IntegerIterate#getFrom()
	 * @see #getIntegerIterate()
	 * @generated
	 */
	EAttribute getIntegerIterate_From();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.IntegerIterate#getUntil <em>Until</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Until</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.IntegerIterate#getUntil()
	 * @see #getIntegerIterate()
	 * @generated
	 */
	EAttribute getIntegerIterate_Until();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.IntegerIterate#getStep <em>Step</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Step</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.IntegerIterate#getStep()
	 * @see #getIntegerIterate()
	 * @generated
	 */
	EAttribute getIntegerIterate_Step();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.DateIterate <em>Date Iterate</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Date Iterate</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.DateIterate
	 * @generated
	 */
	EClass getDateIterate();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.DateIterate#getFrom <em>From</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>From</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.DateIterate#getFrom()
	 * @see #getDateIterate()
	 * @generated
	 */
	EReference getDateIterate_From();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.DateIterate#getUntil <em>Until</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Until</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.DateIterate#getUntil()
	 * @see #getDateIterate()
	 * @generated
	 */
	EReference getDateIterate_Until();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.DateIterate#getStepCount <em>Step Count</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Step Count</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.DateIterate#getStepCount()
	 * @see #getDateIterate()
	 * @generated
	 */
	EAttribute getDateIterate_StepCount();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.DateIterate#getStepType <em>Step Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Step Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.DateIterate#getStepType()
	 * @see #getDateIterate()
	 * @generated
	 */
	EAttribute getDateIterate_StepType();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.Date <em>Date</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Date</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.Date
	 * @generated
	 */
	EClass getDate();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.Date#isYesterday <em>Yesterday</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Yesterday</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.Date#isYesterday()
	 * @see #getDate()
	 * @generated
	 */
	EAttribute getDate_Yesterday();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.Date#isToday <em>Today</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Today</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.Date#isToday()
	 * @see #getDate()
	 * @generated
	 */
	EAttribute getDate_Today();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.Date#isTomorrow <em>Tomorrow</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Tomorrow</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.Date#isTomorrow()
	 * @see #getDate()
	 * @generated
	 */
	EAttribute getDate_Tomorrow();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.Date#getOffsetCount <em>Offset Count</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Offset Count</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.Date#getOffsetCount()
	 * @see #getDate()
	 * @generated
	 */
	EAttribute getDate_OffsetCount();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.Date#getOffsetType <em>Offset Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Offset Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.Date#getOffsetType()
	 * @see #getDate()
	 * @generated
	 */
	EAttribute getDate_OffsetType();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.Date#getYear <em>Year</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Year</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.Date#getYear()
	 * @see #getDate()
	 * @generated
	 */
	EAttribute getDate_Year();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.Date#getMonth <em>Month</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Month</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.Date#getMonth()
	 * @see #getDate()
	 * @generated
	 */
	EAttribute getDate_Month();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.Date#getDay <em>Day</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Day</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.Date#getDay()
	 * @see #getDate()
	 * @generated
	 */
	EAttribute getDate_Day();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute <em>Entity Mock By Resource Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock By Resource Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute
	 * @generated
	 */
	EClass getEntityMockByResourceAttribute();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute#getAttributeRef <em>Attribute Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Attribute Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute#getAttributeRef()
	 * @see #getEntityMockByResourceAttribute()
	 * @generated
	 */
	EReference getEntityMockByResourceAttribute_AttributeRef();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute#getResourceAttribute <em>Resource Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Resource Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute#getResourceAttribute()
	 * @see #getEntityMockByResourceAttribute()
	 * @generated
	 */
	EReference getEntityMockByResourceAttribute_ResourceAttribute();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate <em>Entity Mock Template</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Template</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockTemplate
	 * @generated
	 */
	EClass getEntityMockTemplate();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getName <em>Name</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Name</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getName()
	 * @see #getEntityMockTemplate()
	 * @generated
	 */
	EAttribute getEntityMockTemplate_Name();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getObject <em>Object</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Object</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockTemplate#getObject()
	 * @see #getEntityMockTemplate()
	 * @generated
	 */
	EReference getEntityMockTemplate_Object();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.IEntityMockObjectUsable <em>IEntity Mock Object Usable</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>IEntity Mock Object Usable</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.IEntityMockObjectUsable
	 * @generated
	 */
	EClass getIEntityMockObjectUsable();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.IEntityMockEntityUsable <em>IEntity Mock Entity Usable</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>IEntity Mock Entity Usable</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.IEntityMockEntityUsable
	 * @generated
	 */
	EClass getIEntityMockEntityUsable();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.IEntityMockAttribute <em>IEntity Mock Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>IEntity Mock Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.IEntityMockAttribute
	 * @generated
	 */
	EClass getIEntityMockAttribute();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute <em>Entity Mock Referenced Object Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Referenced Object Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute
	 * @generated
	 */
	EClass getEntityMockReferencedObjectAttribute();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getTemplate <em>Template</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Template</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getTemplate()
	 * @see #getEntityMockReferencedObjectAttribute()
	 * @generated
	 */
	EReference getEntityMockReferencedObjectAttribute_Template();

	/**
	 * Returns the meta object for the reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getEmbedded <em>Embedded</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference list '<em>Embedded</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getEmbedded()
	 * @see #getEntityMockReferencedObjectAttribute()
	 * @generated
	 */
	EReference getEntityMockReferencedObjectAttribute_Embedded();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getAttribute <em>Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute#getAttribute()
	 * @see #getEntityMockReferencedObjectAttribute()
	 * @generated
	 */
	EReference getEntityMockReferencedObjectAttribute_Attribute();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject <em>Entity Mock Attribute By Object</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Attribute By Object</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject
	 * @generated
	 */
	EClass getEntityMockAttributeByObject();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getAttributeRef <em>Attribute Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Attribute Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getAttributeRef()
	 * @see #getEntityMockAttributeByObject()
	 * @generated
	 */
	EReference getEntityMockAttributeByObject_AttributeRef();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getReference <em>Reference</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Reference</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getReference()
	 * @see #getEntityMockAttributeByObject()
	 * @generated
	 */
	EReference getEntityMockAttributeByObject_Reference();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getResourceEnum <em>Resource Enum</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Resource Enum</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getResourceEnum()
	 * @see #getEntityMockAttributeByObject()
	 * @generated
	 */
	EReference getEntityMockAttributeByObject_ResourceEnum();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getResourceAttribute <em>Resource Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Resource Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject#getResourceAttribute()
	 * @see #getEntityMockAttributeByObject()
	 * @generated
	 */
	EReference getEntityMockAttributeByObject_ResourceAttribute();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller <em>Entity Mock Attribute Filler</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Attribute Filler</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller
	 * @generated
	 */
	EClass getEntityMockAttributeFiller();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller#getAttributeRef <em>Attribute Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Attribute Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller#getAttributeRef()
	 * @see #getEntityMockAttributeFiller()
	 * @generated
	 */
	EReference getEntityMockAttributeFiller_AttributeRef();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller#getFillerType <em>Filler Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Filler Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller#getFillerType()
	 * @see #getEntityMockAttributeFiller()
	 * @generated
	 */
	EReference getEntityMockAttributeFiller_FillerType();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference <em>Entity Mock Attribute By Reference</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Attribute By Reference</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference
	 * @generated
	 */
	EClass getEntityMockAttributeByReference();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference#getAttributeRef <em>Attribute Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Attribute Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference#getAttributeRef()
	 * @see #getEntityMockAttributeByReference()
	 * @generated
	 */
	EReference getEntityMockAttributeByReference_AttributeRef();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference#getMockedEntity <em>Mocked Entity</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Mocked Entity</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference#getMockedEntity()
	 * @see #getEntityMockAttributeByReference()
	 * @generated
	 */
	EReference getEntityMockAttributeByReference_MockedEntity();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference#getOptionalFor <em>Optional For</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Optional For</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference#getOptionalFor()
	 * @see #getEntityMockAttributeByReference()
	 * @generated
	 */
	EAttribute getEntityMockAttributeByReference_OptionalFor();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction <em>Entity Mock Entity Function</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Entity Function</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction
	 * @generated
	 */
	EClass getEntityMockEntityFunction();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getAttributeRef <em>Attribute Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Attribute Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getAttributeRef()
	 * @see #getEntityMockEntityFunction()
	 * @generated
	 */
	EReference getEntityMockEntityFunction_AttributeRef();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getParams <em>Params</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Params</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getParams()
	 * @see #getEntityMockEntityFunction()
	 * @generated
	 */
	EReference getEntityMockEntityFunction_Params();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getBody <em>Body</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Body</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction#getBody()
	 * @see #getEntityMockEntityFunction()
	 * @generated
	 */
	EReference getEntityMockEntityFunction_Body();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute <em>Entity Mock Entity Nested Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Entity Nested Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute
	 * @generated
	 */
	EClass getEntityMockEntityNestedAttribute();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getReference <em>Reference</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Reference</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getReference()
	 * @see #getEntityMockEntityNestedAttribute()
	 * @generated
	 */
	EReference getEntityMockEntityNestedAttribute_Reference();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getAttribute <em>Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute#getAttribute()
	 * @see #getEntityMockEntityNestedAttribute()
	 * @generated
	 */
	EReference getEntityMockEntityNestedAttribute_Attribute();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter <em>Entity Mock Entity Function Parameter</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Entity Mock Entity Function Parameter</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter
	 * @generated
	 */
	EClass getEntityMockEntityFunctionParameter();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getAttributeRef <em>Attribute Ref</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Attribute Ref</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getAttributeRef()
	 * @see #getEntityMockEntityFunctionParameter()
	 * @generated
	 */
	EReference getEntityMockEntityFunctionParameter_AttributeRef();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getNestedAttribute <em>Nested Attribute</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Nested Attribute</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter#getNestedAttribute()
	 * @see #getEntityMockEntityFunctionParameter()
	 * @generated
	 */
	EReference getEntityMockEntityFunctionParameter_NestedAttribute();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.entitymock.EDateStepType <em>EDate Step Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>EDate Step Type</em>'.
	 * @see org.eclipse.osbp.xtext.entitymock.EDateStepType
	 * @generated
	 */
	EEnum getEDateStepType();

	/**
	 * Returns the meta object for data type '{@link org.eclipse.emf.ecore.InternalEObject <em>Internal EObject</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for data type '<em>Internal EObject</em>'.
	 * @see org.eclipse.emf.ecore.InternalEObject
	 * @model instanceClass="org.eclipse.emf.ecore.InternalEObject"
	 * @generated
	 */
	EDataType getInternalEObject();

	/**
	 * Returns the factory that creates the instances of the model.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the factory that creates the instances of the model.
	 * @generated
	 */
	EntityMockDSLFactory getEntityMockDSLFactory();

	/**
	 * <!-- begin-user-doc -->
	 * Defines literals for the meta objects that represent
	 * <ul>
	 *   <li>each class,</li>
	 *   <li>each feature of each class,</li>
	 *   <li>each operation of each class,</li>
	 *   <li>each enum,</li>
	 *   <li>and each data type</li>
	 * </ul>
	 * <!-- end-user-doc -->
	 * @generated
	 */
	interface Literals {
		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockModelImpl <em>Entity Mock Model</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockModelImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockModel()
		 * @generated
		 */
		EClass ENTITY_MOCK_MODEL = eINSTANCE.getEntityMockModel();

		/**
		 * The meta object literal for the '<em><b>Import Section</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_MODEL__IMPORT_SECTION = eINSTANCE.getEntityMockModel_ImportSection();

		/**
		 * The meta object literal for the '<em><b>Packages</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_MODEL__PACKAGES = eINSTANCE.getEntityMockModel_Packages();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl <em>Entity Mock Lazy Resolver</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockLazyResolverImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockLazyResolver()
		 * @generated
		 */
		EClass ENTITY_MOCK_LAZY_RESOLVER = eINSTANCE.getEntityMockLazyResolver();

		/**
		 * The meta object literal for the '<em><b>EResolve Proxy</b></em>' operation.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EOperation ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT = eINSTANCE.getEntityMockLazyResolver__EResolveProxy__InternalEObject();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl <em>Entity Mock Package</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockPackageImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockPackage()
		 * @generated
		 */
		EClass ENTITY_MOCK_PACKAGE = eINSTANCE.getEntityMockPackage();

		/**
		 * The meta object literal for the '<em><b>Mocks</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_PACKAGE__MOCKS = eINSTANCE.getEntityMockPackage_Mocks();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl <em>Entity Mock</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMock()
		 * @generated
		 */
		EClass ENTITY_MOCK = eINSTANCE.getEntityMock();

		/**
		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK__NAME = eINSTANCE.getEntityMock_Name();

		/**
		 * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK__DESCRIPTION = eINSTANCE.getEntityMock_Description();

		/**
		 * The meta object literal for the '<em><b>Description Value</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK__DESCRIPTION_VALUE = eINSTANCE.getEntityMock_DescriptionValue();

		/**
		 * The meta object literal for the '<em><b>Run Priority</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK__RUN_PRIORITY = eINSTANCE.getEntityMock_RunPriority();

		/**
		 * The meta object literal for the '<em><b>Datainterchanges</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK__DATAINTERCHANGES = eINSTANCE.getEntityMock_Datainterchanges();

		/**
		 * The meta object literal for the '<em><b>Resources</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK__RESOURCES = eINSTANCE.getEntityMock_Resources();

		/**
		 * The meta object literal for the '<em><b>Objects</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK__OBJECTS = eINSTANCE.getEntityMock_Objects();

		/**
		 * The meta object literal for the '<em><b>Entities</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK__ENTITIES = eINSTANCE.getEntityMock_Entities();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangesImpl <em>Running Data Interchanges</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangesImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getRunningDataInterchanges()
		 * @generated
		 */
		EClass RUNNING_DATA_INTERCHANGES = eINSTANCE.getRunningDataInterchanges();

		/**
		 * The meta object literal for the '<em><b>Datainterchanges</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference RUNNING_DATA_INTERCHANGES__DATAINTERCHANGES = eINSTANCE.getRunningDataInterchanges_Datainterchanges();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangeImpl <em>Running Data Interchange</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.RunningDataInterchangeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getRunningDataInterchange()
		 * @generated
		 */
		EClass RUNNING_DATA_INTERCHANGE = eINSTANCE.getRunningDataInterchange();

		/**
		 * The meta object literal for the '<em><b>Datainterchange Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF = eINSTANCE.getRunningDataInterchange_DatainterchangeRef();

		/**
		 * The meta object literal for the '<em><b>File URL</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute RUNNING_DATA_INTERCHANGE__FILE_URL = eINSTANCE.getRunningDataInterchange_FileURL();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourcesImpl <em>Entity Mock Resources</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourcesImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResources()
		 * @generated
		 */
		EClass ENTITY_MOCK_RESOURCES = eINSTANCE.getEntityMockResources();

		/**
		 * The meta object literal for the '<em><b>Resources</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_RESOURCES__RESOURCES = eINSTANCE.getEntityMockResources_Resources();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceImpl <em>Entity Mock Resource</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResource()
		 * @generated
		 */
		EClass ENTITY_MOCK_RESOURCE = eINSTANCE.getEntityMockResource();

		/**
		 * The meta object literal for the '<em><b>Attributes</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_RESOURCE__ATTRIBUTES = eINSTANCE.getEntityMockResource_Attributes();

		/**
		 * The meta object literal for the '<em><b>Datarows</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_RESOURCE__DATAROWS = eINSTANCE.getEntityMockResource_Datarows();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceAttributeImpl <em>Entity Mock Resource Attribute</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceAttributeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResourceAttribute()
		 * @generated
		 */
		EClass ENTITY_MOCK_RESOURCE_ATTRIBUTE = eINSTANCE.getEntityMockResourceAttribute();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceDataRowImpl <em>Entity Mock Resource Data Row</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockResourceDataRowImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockResourceDataRow()
		 * @generated
		 */
		EClass ENTITY_MOCK_RESOURCE_DATA_ROW = eINSTANCE.getEntityMockResourceDataRow();

		/**
		 * The meta object literal for the '<em><b>Values</b></em>' attribute list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK_RESOURCE_DATA_ROW__VALUES = eINSTANCE.getEntityMockResourceDataRow_Values();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectsImpl <em>Entity Mock Objects</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectsImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjects()
		 * @generated
		 */
		EClass ENTITY_MOCK_OBJECTS = eINSTANCE.getEntityMockObjects();

		/**
		 * The meta object literal for the '<em><b>Objects</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECTS__OBJECTS = eINSTANCE.getEntityMockObjects_Objects();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectImpl <em>Entity Mock Object</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObject()
		 * @generated
		 */
		EClass ENTITY_MOCK_OBJECT = eINSTANCE.getEntityMockObject();

		/**
		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK_OBJECT__NAME = eINSTANCE.getEntityMockObject_Name();

		/**
		 * The meta object literal for the '<em><b>Enumerations</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT__ENUMERATIONS = eINSTANCE.getEntityMockObject_Enumerations();

		/**
		 * The meta object literal for the '<em><b>Attributes</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT__ATTRIBUTES = eINSTANCE.getEntityMockObject_Attributes();

		/**
		 * The meta object literal for the '<em><b>Calculations</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT__CALCULATIONS = eINSTANCE.getEntityMockObject_Calculations();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectEnumImpl <em>Entity Mock Object Enum</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectEnumImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectEnum()
		 * @generated
		 */
		EClass ENTITY_MOCK_OBJECT_ENUM = eINSTANCE.getEntityMockObjectEnum();

		/**
		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK_OBJECT_ENUM__NAME = eINSTANCE.getEntityMockObjectEnum_Name();

		/**
		 * The meta object literal for the '<em><b>Using Resource</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_ENUM__USING_RESOURCE = eINSTANCE.getEntityMockObjectEnum_UsingResource();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IEntityMockObjectAttributeImpl <em>IEntity Mock Object Attribute</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.IEntityMockObjectAttributeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockObjectAttribute()
		 * @generated
		 */
		EClass IENTITY_MOCK_OBJECT_ATTRIBUTE = eINSTANCE.getIEntityMockObjectAttribute();

		/**
		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME = eINSTANCE.getIEntityMockObjectAttribute_Name();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectPlainValueImpl <em>Entity Mock Object Plain Value</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectPlainValueImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectPlainValue()
		 * @generated
		 */
		EClass ENTITY_MOCK_OBJECT_PLAIN_VALUE = eINSTANCE.getEntityMockObjectPlainValue();

		/**
		 * The meta object literal for the '<em><b>Values</b></em>' attribute list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK_OBJECT_PLAIN_VALUE__VALUES = eINSTANCE.getEntityMockObjectPlainValue_Values();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectResourceValueImpl <em>Entity Mock Object Resource Value</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectResourceValueImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectResourceValue()
		 * @generated
		 */
		EClass ENTITY_MOCK_OBJECT_RESOURCE_VALUE = eINSTANCE.getEntityMockObjectResourceValue();

		/**
		 * The meta object literal for the '<em><b>Resource Enum</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_RESOURCE_VALUE__RESOURCE_ENUM = eINSTANCE.getEntityMockObjectResourceValue_ResourceEnum();

		/**
		 * The meta object literal for the '<em><b>Resource Attribute</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_RESOURCE_VALUE__RESOURCE_ATTRIBUTE = eINSTANCE.getEntityMockObjectResourceValue_ResourceAttribute();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectArrayValueImpl <em>Entity Mock Object Array Value</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectArrayValueImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectArrayValue()
		 * @generated
		 */
		EClass ENTITY_MOCK_OBJECT_ARRAY_VALUE = eINSTANCE.getEntityMockObjectArrayValue();

		/**
		 * The meta object literal for the '<em><b>Enumeration</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION = eINSTANCE.getEntityMockObjectArrayValue_Enumeration();

		/**
		 * The meta object literal for the '<em><b>Items</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_ARRAY_VALUE__ITEMS = eINSTANCE.getEntityMockObjectArrayValue_Items();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectItemValueImpl <em>Entity Mock Object Item Value</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectItemValueImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectItemValue()
		 * @generated
		 */
		EClass ENTITY_MOCK_OBJECT_ITEM_VALUE = eINSTANCE.getEntityMockObjectItemValue();

		/**
		 * The meta object literal for the '<em><b>Datarow</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_ITEM_VALUE__DATAROW = eINSTANCE.getEntityMockObjectItemValue_Datarow();

		/**
		 * The meta object literal for the '<em><b>Values</b></em>' attribute list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK_OBJECT_ITEM_VALUE__VALUES = eINSTANCE.getEntityMockObjectItemValue_Values();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectEmbedImpl <em>Entity Mock Object Embed</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectEmbedImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectEmbed()
		 * @generated
		 */
		EClass ENTITY_MOCK_OBJECT_EMBED = eINSTANCE.getEntityMockObjectEmbed();

		/**
		 * The meta object literal for the '<em><b>Object</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_EMBED__OBJECT = eINSTANCE.getEntityMockObjectEmbed_Object();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionImpl <em>Entity Mock Object Function</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectFunction()
		 * @generated
		 */
		EClass ENTITY_MOCK_OBJECT_FUNCTION = eINSTANCE.getEntityMockObjectFunction();

		/**
		 * The meta object literal for the '<em><b>Oftype</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_FUNCTION__OFTYPE = eINSTANCE.getEntityMockObjectFunction_Oftype();

		/**
		 * The meta object literal for the '<em><b>Params</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_FUNCTION__PARAMS = eINSTANCE.getEntityMockObjectFunction_Params();

		/**
		 * The meta object literal for the '<em><b>Body</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_FUNCTION__BODY = eINSTANCE.getEntityMockObjectFunction_Body();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionParameterImpl <em>Entity Mock Object Function Parameter</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFunctionParameterImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectFunctionParameter()
		 * @generated
		 */
		EClass ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER = eINSTANCE.getEntityMockObjectFunctionParameter();

		/**
		 * The meta object literal for the '<em><b>Parameter Type</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__PARAMETER_TYPE = eINSTANCE.getEntityMockObjectFunctionParameter_ParameterType();

		/**
		 * The meta object literal for the '<em><b>Name</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__NAME = eINSTANCE.getEntityMockObjectFunctionParameter_Name();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFillImpl <em>Entity Mock Object Fill</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectFillImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockObjectFill()
		 * @generated
		 */
		EClass ENTITY_MOCK_OBJECT_FILL = eINSTANCE.getEntityMockObjectFill();

		/**
		 * The meta object literal for the '<em><b>Filler Type</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_OBJECT_FILL__FILLER_TYPE = eINSTANCE.getEntityMockObjectFill_FillerType();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTypeImpl <em>Property Filler Type</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTypeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerType()
		 * @generated
		 */
		EClass PROPERTY_FILLER_TYPE = eINSTANCE.getPropertyFillerType();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateTypeImpl <em>Property Filler Date Type</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateTypeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDateType()
		 * @generated
		 */
		EClass PROPERTY_FILLER_DATE_TYPE = eINSTANCE.getPropertyFillerDateType();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerBooleanImpl <em>Property Filler Boolean</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerBooleanImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerBoolean()
		 * @generated
		 */
		EClass PROPERTY_FILLER_BOOLEAN = eINSTANCE.getPropertyFillerBoolean();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDoubleTypeImpl <em>Property Filler Double Type</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDoubleTypeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDoubleType()
		 * @generated
		 */
		EClass PROPERTY_FILLER_DOUBLE_TYPE = eINSTANCE.getPropertyFillerDoubleType();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerIntegerTypeImpl <em>Property Filler Integer Type</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerIntegerTypeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerIntegerType()
		 * @generated
		 */
		EClass PROPERTY_FILLER_INTEGER_TYPE = eINSTANCE.getPropertyFillerIntegerType();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextTypeImpl <em>Property Filler Text Type</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextTypeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextType()
		 * @generated
		 */
		EClass PROPERTY_FILLER_TEXT_TYPE = eINSTANCE.getPropertyFillerTextType();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateFutureImpl <em>Property Filler Date Future</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateFutureImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDateFuture()
		 * @generated
		 */
		EClass PROPERTY_FILLER_DATE_FUTURE = eINSTANCE.getPropertyFillerDateFuture();

		/**
		 * The meta object literal for the '<em><b>Date Future Years</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_DATE_FUTURE__DATE_FUTURE_YEARS = eINSTANCE.getPropertyFillerDateFuture_DateFutureYears();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDatePastImpl <em>Property Filler Date Past</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDatePastImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDatePast()
		 * @generated
		 */
		EClass PROPERTY_FILLER_DATE_PAST = eINSTANCE.getPropertyFillerDatePast();

		/**
		 * The meta object literal for the '<em><b>Date Past Years</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_DATE_PAST__DATE_PAST_YEARS = eINSTANCE.getPropertyFillerDatePast_DatePastYears();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateRangeImpl <em>Property Filler Date Range</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerDateRangeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerDateRange()
		 * @generated
		 */
		EClass PROPERTY_FILLER_DATE_RANGE = eINSTANCE.getPropertyFillerDateRange();

		/**
		 * The meta object literal for the '<em><b>Date Begin Years</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_DATE_RANGE__DATE_BEGIN_YEARS = eINSTANCE.getPropertyFillerDateRange_DateBeginYears();

		/**
		 * The meta object literal for the '<em><b>Date End Years</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_DATE_RANGE__DATE_END_YEARS = eINSTANCE.getPropertyFillerDateRange_DateEndYears();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRangeImpl <em>Property Filler Signed Double Range</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRangeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedDoubleRange()
		 * @generated
		 */
		EClass PROPERTY_FILLER_SIGNED_DOUBLE_RANGE = eINSTANCE.getPropertyFillerSignedDoubleRange();

		/**
		 * The meta object literal for the '<em><b>Decimals</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__DECIMALS = eINSTANCE.getPropertyFillerSignedDoubleRange_Decimals();

		/**
		 * The meta object literal for the '<em><b>Begin Range</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__BEGIN_RANGE = eINSTANCE.getPropertyFillerSignedDoubleRange_BeginRange();

		/**
		 * The meta object literal for the '<em><b>End Range</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__END_RANGE = eINSTANCE.getPropertyFillerSignedDoubleRange_EndRange();

		/**
		 * The meta object literal for the '<em><b>Begin Range Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__BEGIN_RANGE_REF = eINSTANCE.getPropertyFillerSignedDoubleRange_BeginRangeRef();

		/**
		 * The meta object literal for the '<em><b>End Range Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__END_RANGE_REF = eINSTANCE.getPropertyFillerSignedDoubleRange_EndRangeRef();

		/**
		 * The meta object literal for the '<em><b>Rounded</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__ROUNDED = eINSTANCE.getPropertyFillerSignedDoubleRange_Rounded();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRandomImpl <em>Property Filler Signed Double Random</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedDoubleRandomImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedDoubleRandom()
		 * @generated
		 */
		EClass PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM = eINSTANCE.getPropertyFillerSignedDoubleRandom();

		/**
		 * The meta object literal for the '<em><b>Items</b></em>' attribute list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM__ITEMS = eINSTANCE.getPropertyFillerSignedDoubleRandom_Items();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRangeImpl <em>Property Filler Signed Integer Range</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRangeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedIntegerRange()
		 * @generated
		 */
		EClass PROPERTY_FILLER_SIGNED_INTEGER_RANGE = eINSTANCE.getPropertyFillerSignedIntegerRange();

		/**
		 * The meta object literal for the '<em><b>Begin Range</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_SIGNED_INTEGER_RANGE__BEGIN_RANGE = eINSTANCE.getPropertyFillerSignedIntegerRange_BeginRange();

		/**
		 * The meta object literal for the '<em><b>End Range</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_SIGNED_INTEGER_RANGE__END_RANGE = eINSTANCE.getPropertyFillerSignedIntegerRange_EndRange();

		/**
		 * The meta object literal for the '<em><b>Begin Range Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PROPERTY_FILLER_SIGNED_INTEGER_RANGE__BEGIN_RANGE_REF = eINSTANCE.getPropertyFillerSignedIntegerRange_BeginRangeRef();

		/**
		 * The meta object literal for the '<em><b>End Range Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PROPERTY_FILLER_SIGNED_INTEGER_RANGE__END_RANGE_REF = eINSTANCE.getPropertyFillerSignedIntegerRange_EndRangeRef();

		/**
		 * The meta object literal for the '<em><b>Rounded</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_SIGNED_INTEGER_RANGE__ROUNDED = eINSTANCE.getPropertyFillerSignedIntegerRange_Rounded();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRandomImpl <em>Property Filler Signed Integer Random</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerSignedIntegerRandomImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerSignedIntegerRandom()
		 * @generated
		 */
		EClass PROPERTY_FILLER_SIGNED_INTEGER_RANDOM = eINSTANCE.getPropertyFillerSignedIntegerRandom();

		/**
		 * The meta object literal for the '<em><b>Items</b></em>' attribute list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_SIGNED_INTEGER_RANDOM__ITEMS = eINSTANCE.getPropertyFillerSignedIntegerRandom_Items();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextRandomImpl <em>Property Filler Text Random</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextRandomImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextRandom()
		 * @generated
		 */
		EClass PROPERTY_FILLER_TEXT_RANDOM = eINSTANCE.getPropertyFillerTextRandom();

		/**
		 * The meta object literal for the '<em><b>Items</b></em>' attribute list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_TEXT_RANDOM__ITEMS = eINSTANCE.getPropertyFillerTextRandom_Items();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextParagraphsImpl <em>Property Filler Text Paragraphs</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextParagraphsImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextParagraphs()
		 * @generated
		 */
		EClass PROPERTY_FILLER_TEXT_PARAGRAPHS = eINSTANCE.getPropertyFillerTextParagraphs();

		/**
		 * The meta object literal for the '<em><b>Count</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_TEXT_PARAGRAPHS__COUNT = eINSTANCE.getPropertyFillerTextParagraphs_Count();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextSentencesImpl <em>Property Filler Text Sentences</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextSentencesImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextSentences()
		 * @generated
		 */
		EClass PROPERTY_FILLER_TEXT_SENTENCES = eINSTANCE.getPropertyFillerTextSentences();

		/**
		 * The meta object literal for the '<em><b>Count</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_TEXT_SENTENCES__COUNT = eINSTANCE.getPropertyFillerTextSentences_Count();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextWordsImpl <em>Property Filler Text Words</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerTextWordsImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerTextWords()
		 * @generated
		 */
		EClass PROPERTY_FILLER_TEXT_WORDS = eINSTANCE.getPropertyFillerTextWords();

		/**
		 * The meta object literal for the '<em><b>Count</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_TEXT_WORDS__COUNT = eINSTANCE.getPropertyFillerTextWords_Count();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRangeImpl <em>Property Filler Unsigned Double Range</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRangeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedDoubleRange()
		 * @generated
		 */
		EClass PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE = eINSTANCE.getPropertyFillerUnsignedDoubleRange();

		/**
		 * The meta object literal for the '<em><b>Decimals</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__DECIMALS = eINSTANCE.getPropertyFillerUnsignedDoubleRange_Decimals();

		/**
		 * The meta object literal for the '<em><b>Begin Range</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__BEGIN_RANGE = eINSTANCE.getPropertyFillerUnsignedDoubleRange_BeginRange();

		/**
		 * The meta object literal for the '<em><b>End Range</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__END_RANGE = eINSTANCE.getPropertyFillerUnsignedDoubleRange_EndRange();

		/**
		 * The meta object literal for the '<em><b>Begin Range Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__BEGIN_RANGE_REF = eINSTANCE.getPropertyFillerUnsignedDoubleRange_BeginRangeRef();

		/**
		 * The meta object literal for the '<em><b>End Range Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__END_RANGE_REF = eINSTANCE.getPropertyFillerUnsignedDoubleRange_EndRangeRef();

		/**
		 * The meta object literal for the '<em><b>Rounded</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__ROUNDED = eINSTANCE.getPropertyFillerUnsignedDoubleRange_Rounded();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRandomImpl <em>Property Filler Unsigned Double Random</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedDoubleRandomImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedDoubleRandom()
		 * @generated
		 */
		EClass PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM = eINSTANCE.getPropertyFillerUnsignedDoubleRandom();

		/**
		 * The meta object literal for the '<em><b>Items</b></em>' attribute list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM__ITEMS = eINSTANCE.getPropertyFillerUnsignedDoubleRandom_Items();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRangeImpl <em>Property Filler Unsigned Integer Range</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRangeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedIntegerRange()
		 * @generated
		 */
		EClass PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE = eINSTANCE.getPropertyFillerUnsignedIntegerRange();

		/**
		 * The meta object literal for the '<em><b>Begin Range</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__BEGIN_RANGE = eINSTANCE.getPropertyFillerUnsignedIntegerRange_BeginRange();

		/**
		 * The meta object literal for the '<em><b>End Range</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__END_RANGE = eINSTANCE.getPropertyFillerUnsignedIntegerRange_EndRange();

		/**
		 * The meta object literal for the '<em><b>Begin Range Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__BEGIN_RANGE_REF = eINSTANCE.getPropertyFillerUnsignedIntegerRange_BeginRangeRef();

		/**
		 * The meta object literal for the '<em><b>End Range Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__END_RANGE_REF = eINSTANCE.getPropertyFillerUnsignedIntegerRange_EndRangeRef();

		/**
		 * The meta object literal for the '<em><b>Rounded</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__ROUNDED = eINSTANCE.getPropertyFillerUnsignedIntegerRange_Rounded();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRandomImpl <em>Property Filler Unsigned Integer Random</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.PropertyFillerUnsignedIntegerRandomImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getPropertyFillerUnsignedIntegerRandom()
		 * @generated
		 */
		EClass PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM = eINSTANCE.getPropertyFillerUnsignedIntegerRandom();

		/**
		 * The meta object literal for the '<em><b>Items</b></em>' attribute list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM__ITEMS = eINSTANCE.getPropertyFillerUnsignedIntegerRandom_Items();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntitiesImpl <em>Entity Mock Entities</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntitiesImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntities()
		 * @generated
		 */
		EClass ENTITY_MOCK_ENTITIES = eINSTANCE.getEntityMockEntities();

		/**
		 * The meta object literal for the '<em><b>Entities</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITIES__ENTITIES = eINSTANCE.getEntityMockEntities_Entities();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl <em>Entity Mock Entity</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntity()
		 * @generated
		 */
		EClass ENTITY_MOCK_ENTITY = eINSTANCE.getEntityMockEntity();

		/**
		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK_ENTITY__NAME = eINSTANCE.getEntityMockEntity_Name();

		/**
		 * The meta object literal for the '<em><b>Min Rows</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK_ENTITY__MIN_ROWS = eINSTANCE.getEntityMockEntity_MinRows();

		/**
		 * The meta object literal for the '<em><b>Max Rows</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK_ENTITY__MAX_ROWS = eINSTANCE.getEntityMockEntity_MaxRows();

		/**
		 * The meta object literal for the '<em><b>Create Blob Mapping</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK_ENTITY__CREATE_BLOB_MAPPING = eINSTANCE.getEntityMockEntity_CreateBlobMapping();

		/**
		 * The meta object literal for the '<em><b>Iterate</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY__ITERATE = eINSTANCE.getEntityMockEntity_Iterate();

		/**
		 * The meta object literal for the '<em><b>Templates</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY__TEMPLATES = eINSTANCE.getEntityMockEntity_Templates();

		/**
		 * The meta object literal for the '<em><b>Attributes</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY__ATTRIBUTES = eINSTANCE.getEntityMockEntity_Attributes();

		/**
		 * The meta object literal for the '<em><b>Calculations</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY__CALCULATIONS = eINSTANCE.getEntityMockEntity_Calculations();

		/**
		 * The meta object literal for the '<em><b>By Resource Attributes</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY__BY_RESOURCE_ATTRIBUTES = eINSTANCE.getEntityMockEntity_ByResourceAttributes();

		/**
		 * The meta object literal for the '<em><b>Complete Year Filler</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY__COMPLETE_YEAR_FILLER = eINSTANCE.getEntityMockEntity_CompleteYearFiller();

		/**
		 * The meta object literal for the '<em><b>Entity Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY__ENTITY_REF = eINSTANCE.getEntityMockEntity_EntityRef();

		/**
		 * The meta object literal for the '<em><b>Iterator</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY__ITERATOR = eINSTANCE.getEntityMockEntity_Iterator();

		/**
		 * The meta object literal for the '<em><b>By Resource</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY__BY_RESOURCE = eINSTANCE.getEntityMockEntity_ByResource();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.CompleteYearFillerImpl <em>Complete Year Filler</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.CompleteYearFillerImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getCompleteYearFiller()
		 * @generated
		 */
		EClass COMPLETE_YEAR_FILLER = eINSTANCE.getCompleteYearFiller();

		/**
		 * The meta object literal for the '<em><b>Filler Date Type</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference COMPLETE_YEAR_FILLER__FILLER_DATE_TYPE = eINSTANCE.getCompleteYearFiller_FillerDateType();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IIterateImpl <em>IIterate</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.IIterateImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIIterate()
		 * @generated
		 */
		EClass IITERATE = eINSTANCE.getIIterate();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IntegerIterateImpl <em>Integer Iterate</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.IntegerIterateImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIntegerIterate()
		 * @generated
		 */
		EClass INTEGER_ITERATE = eINSTANCE.getIntegerIterate();

		/**
		 * The meta object literal for the '<em><b>From</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute INTEGER_ITERATE__FROM = eINSTANCE.getIntegerIterate_From();

		/**
		 * The meta object literal for the '<em><b>Until</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute INTEGER_ITERATE__UNTIL = eINSTANCE.getIntegerIterate_Until();

		/**
		 * The meta object literal for the '<em><b>Step</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute INTEGER_ITERATE__STEP = eINSTANCE.getIntegerIterate_Step();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.DateIterateImpl <em>Date Iterate</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.DateIterateImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getDateIterate()
		 * @generated
		 */
		EClass DATE_ITERATE = eINSTANCE.getDateIterate();

		/**
		 * The meta object literal for the '<em><b>From</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference DATE_ITERATE__FROM = eINSTANCE.getDateIterate_From();

		/**
		 * The meta object literal for the '<em><b>Until</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference DATE_ITERATE__UNTIL = eINSTANCE.getDateIterate_Until();

		/**
		 * The meta object literal for the '<em><b>Step Count</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DATE_ITERATE__STEP_COUNT = eINSTANCE.getDateIterate_StepCount();

		/**
		 * The meta object literal for the '<em><b>Step Type</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DATE_ITERATE__STEP_TYPE = eINSTANCE.getDateIterate_StepType();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.DateImpl <em>Date</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.DateImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getDate()
		 * @generated
		 */
		EClass DATE = eINSTANCE.getDate();

		/**
		 * The meta object literal for the '<em><b>Yesterday</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DATE__YESTERDAY = eINSTANCE.getDate_Yesterday();

		/**
		 * The meta object literal for the '<em><b>Today</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DATE__TODAY = eINSTANCE.getDate_Today();

		/**
		 * The meta object literal for the '<em><b>Tomorrow</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DATE__TOMORROW = eINSTANCE.getDate_Tomorrow();

		/**
		 * The meta object literal for the '<em><b>Offset Count</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DATE__OFFSET_COUNT = eINSTANCE.getDate_OffsetCount();

		/**
		 * The meta object literal for the '<em><b>Offset Type</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DATE__OFFSET_TYPE = eINSTANCE.getDate_OffsetType();

		/**
		 * The meta object literal for the '<em><b>Year</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DATE__YEAR = eINSTANCE.getDate_Year();

		/**
		 * The meta object literal for the '<em><b>Month</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DATE__MONTH = eINSTANCE.getDate_Month();

		/**
		 * The meta object literal for the '<em><b>Day</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DATE__DAY = eINSTANCE.getDate_Day();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockByResourceAttributeImpl <em>Entity Mock By Resource Attribute</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockByResourceAttributeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockByResourceAttribute()
		 * @generated
		 */
		EClass ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE = eINSTANCE.getEntityMockByResourceAttribute();

		/**
		 * The meta object literal for the '<em><b>Attribute Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF = eINSTANCE.getEntityMockByResourceAttribute_AttributeRef();

		/**
		 * The meta object literal for the '<em><b>Resource Attribute</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE = eINSTANCE.getEntityMockByResourceAttribute_ResourceAttribute();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemplateImpl <em>Entity Mock Template</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockTemplateImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockTemplate()
		 * @generated
		 */
		EClass ENTITY_MOCK_TEMPLATE = eINSTANCE.getEntityMockTemplate();

		/**
		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK_TEMPLATE__NAME = eINSTANCE.getEntityMockTemplate_Name();

		/**
		 * The meta object literal for the '<em><b>Object</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_TEMPLATE__OBJECT = eINSTANCE.getEntityMockTemplate_Object();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IEntityMockObjectUsableImpl <em>IEntity Mock Object Usable</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.IEntityMockObjectUsableImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockObjectUsable()
		 * @generated
		 */
		EClass IENTITY_MOCK_OBJECT_USABLE = eINSTANCE.getIEntityMockObjectUsable();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IEntityMockEntityUsableImpl <em>IEntity Mock Entity Usable</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.IEntityMockEntityUsableImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockEntityUsable()
		 * @generated
		 */
		EClass IENTITY_MOCK_ENTITY_USABLE = eINSTANCE.getIEntityMockEntityUsable();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.IEntityMockAttributeImpl <em>IEntity Mock Attribute</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.IEntityMockAttributeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getIEntityMockAttribute()
		 * @generated
		 */
		EClass IENTITY_MOCK_ATTRIBUTE = eINSTANCE.getIEntityMockAttribute();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockReferencedObjectAttributeImpl <em>Entity Mock Referenced Object Attribute</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockReferencedObjectAttributeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockReferencedObjectAttribute()
		 * @generated
		 */
		EClass ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE = eINSTANCE.getEntityMockReferencedObjectAttribute();

		/**
		 * The meta object literal for the '<em><b>Template</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE = eINSTANCE.getEntityMockReferencedObjectAttribute_Template();

		/**
		 * The meta object literal for the '<em><b>Embedded</b></em>' reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED = eINSTANCE.getEntityMockReferencedObjectAttribute_Embedded();

		/**
		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__ATTRIBUTE = eINSTANCE.getEntityMockReferencedObjectAttribute_Attribute();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByObjectImpl <em>Entity Mock Attribute By Object</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByObjectImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockAttributeByObject()
		 * @generated
		 */
		EClass ENTITY_MOCK_ATTRIBUTE_BY_OBJECT = eINSTANCE.getEntityMockAttributeByObject();

		/**
		 * The meta object literal for the '<em><b>Attribute Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__ATTRIBUTE_REF = eINSTANCE.getEntityMockAttributeByObject_AttributeRef();

		/**
		 * The meta object literal for the '<em><b>Reference</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__REFERENCE = eINSTANCE.getEntityMockAttributeByObject_Reference();

		/**
		 * The meta object literal for the '<em><b>Resource Enum</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__RESOURCE_ENUM = eINSTANCE.getEntityMockAttributeByObject_ResourceEnum();

		/**
		 * The meta object literal for the '<em><b>Resource Attribute</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__RESOURCE_ATTRIBUTE = eINSTANCE.getEntityMockAttributeByObject_ResourceAttribute();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeFillerImpl <em>Entity Mock Attribute Filler</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeFillerImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockAttributeFiller()
		 * @generated
		 */
		EClass ENTITY_MOCK_ATTRIBUTE_FILLER = eINSTANCE.getEntityMockAttributeFiller();

		/**
		 * The meta object literal for the '<em><b>Attribute Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF = eINSTANCE.getEntityMockAttributeFiller_AttributeRef();

		/**
		 * The meta object literal for the '<em><b>Filler Type</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ATTRIBUTE_FILLER__FILLER_TYPE = eINSTANCE.getEntityMockAttributeFiller_FillerType();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByReferenceImpl <em>Entity Mock Attribute By Reference</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockAttributeByReferenceImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockAttributeByReference()
		 * @generated
		 */
		EClass ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE = eINSTANCE.getEntityMockAttributeByReference();

		/**
		 * The meta object literal for the '<em><b>Attribute Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__ATTRIBUTE_REF = eINSTANCE.getEntityMockAttributeByReference_AttributeRef();

		/**
		 * The meta object literal for the '<em><b>Mocked Entity</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__MOCKED_ENTITY = eINSTANCE.getEntityMockAttributeByReference_MockedEntity();

		/**
		 * The meta object literal for the '<em><b>Optional For</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__OPTIONAL_FOR = eINSTANCE.getEntityMockAttributeByReference_OptionalFor();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionImpl <em>Entity Mock Entity Function</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntityFunction()
		 * @generated
		 */
		EClass ENTITY_MOCK_ENTITY_FUNCTION = eINSTANCE.getEntityMockEntityFunction();

		/**
		 * The meta object literal for the '<em><b>Attribute Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY_FUNCTION__ATTRIBUTE_REF = eINSTANCE.getEntityMockEntityFunction_AttributeRef();

		/**
		 * The meta object literal for the '<em><b>Params</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY_FUNCTION__PARAMS = eINSTANCE.getEntityMockEntityFunction_Params();

		/**
		 * The meta object literal for the '<em><b>Body</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY_FUNCTION__BODY = eINSTANCE.getEntityMockEntityFunction_Body();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityNestedAttributeImpl <em>Entity Mock Entity Nested Attribute</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityNestedAttributeImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntityNestedAttribute()
		 * @generated
		 */
		EClass ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE = eINSTANCE.getEntityMockEntityNestedAttribute();

		/**
		 * The meta object literal for the '<em><b>Reference</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE = eINSTANCE.getEntityMockEntityNestedAttribute_Reference();

		/**
		 * The meta object literal for the '<em><b>Attribute</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE = eINSTANCE.getEntityMockEntityNestedAttribute_Attribute();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionParameterImpl <em>Entity Mock Entity Function Parameter</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockEntityFunctionParameterImpl
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEntityMockEntityFunctionParameter()
		 * @generated
		 */
		EClass ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER = eINSTANCE.getEntityMockEntityFunctionParameter();

		/**
		 * The meta object literal for the '<em><b>Attribute Ref</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF = eINSTANCE.getEntityMockEntityFunctionParameter_AttributeRef();

		/**
		 * The meta object literal for the '<em><b>Nested Attribute</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE = eINSTANCE.getEntityMockEntityFunctionParameter_NestedAttribute();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.entitymock.EDateStepType <em>EDate Step Type</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.entitymock.EDateStepType
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getEDateStepType()
		 * @generated
		 */
		EEnum EDATE_STEP_TYPE = eINSTANCE.getEDateStepType();

		/**
		 * The meta object literal for the '<em>Internal EObject</em>' data type.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.emf.ecore.InternalEObject
		 * @see org.eclipse.osbp.xtext.entitymock.impl.EntityMockDSLPackageImpl#getInternalEObject()
		 * @generated
		 */
		EDataType INTERNAL_EOBJECT = eINSTANCE.getInternalEObject();

	}

} //EntityMockDSLPackage
