//Generated with EGF 1.3.0.qualifier
package org.eclipse.egf.emf.pattern.model;

import org.eclipse.egf.emf.pattern.base.*;
import org.eclipse.emf.codegen.ecore.genmodel.*;
import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
import org.eclipse.emf.codegen.util.*;
import org.eclipse.emf.ecore.util.*;
import org.eclipse.emf.common.util.*;
import org.eclipse.egf.common.helper.*;
import java.util.*;
import org.eclipse.emf.ecore.*;
import org.eclipse.egf.model.pattern.*;
import org.eclipse.egf.pattern.execution.*;
import org.eclipse.egf.pattern.query.*;

public class PackageInterface extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
	protected static String nl;

	public static synchronized PackageInterface create(String lineSeparator) {
		nl = lineSeparator;
		PackageInterface result = new PackageInterface();
		nl = null;
		return result;
	}

	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
	protected final String TEXT_1 = "";
	protected final String TEXT_2 = NL + "package ";
	protected final String TEXT_3 = ";";
	protected final String TEXT_4 = NL + "package ";
	protected final String TEXT_5 = ";";
	protected final String TEXT_6 = NL;
	protected final String TEXT_7 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
			+ " * The <b>Package</b> for the model." + NL + " * It contains accessors for the meta objects to represent"
			+ NL + " * <ul>" + NL + " *   <li>each class,</li>" + NL + " *   <li>each feature of each class,</li>";
	protected final String TEXT_8 = NL + " *   <li>each operation of each class,</li>";
	protected final String TEXT_9 = NL + " *   <li>each enum,</li>" + NL + " *   <li>and each data type</li>" + NL
			+ " * </ul>" + NL + " * <!-- end-user-doc -->";
	protected final String TEXT_10 = NL + " * <!-- begin-model-doc -->" + NL + " * ";
	protected final String TEXT_11 = NL + " * <!-- end-model-doc -->";
	protected final String TEXT_12 = NL + " * @see ";
	protected final String TEXT_13 = NL + " * @model ";
	protected final String TEXT_14 = NL + " *        ";
	protected final String TEXT_15 = NL + " * @model";
	protected final String TEXT_16 = NL + " * @generated" + NL + " */";
	protected final String TEXT_17 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
			+ " * An implementation of the model <b>Package</b>." + NL + " * <!-- end-user-doc -->" + NL
			+ " * @generated" + NL + " */";
	protected final String TEXT_18 = NL + "public class ";
	protected final String TEXT_19 = " extends ";
	protected final String TEXT_20 = " implements ";
	protected final String TEXT_21 = NL + "public interface ";
	protected final String TEXT_22 = " extends ";
	protected final String TEXT_23 = NL + "{";
	protected final String TEXT_24 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
	protected final String TEXT_25 = " copyright = ";
	protected final String TEXT_26 = ";";
	protected final String TEXT_27 = NL;
	protected final String TEXT_28 = NL + "\t/**" + NL + "\t * The package name." + NL + "\t * <!-- begin-user-doc -->"
			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
	protected final String TEXT_29 = " eNAME = \"";
	protected final String TEXT_30 = "\";";
	protected final String TEXT_31 = NL + NL + "\t/**" + NL + "\t * The package namespace URI." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\t";
	protected final String TEXT_32 = " eNS_URI = \"";
	protected final String TEXT_33 = "\";";
	protected final String TEXT_34 = NL + NL + "\t/**" + NL + "\t * The package namespace name." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\t";
	protected final String TEXT_35 = " eNS_PREFIX = \"";
	protected final String TEXT_36 = "\";";
	protected final String TEXT_37 = NL + NL + "\t/**" + NL + "\t * The package content type ID." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\t";
	protected final String TEXT_38 = " eCONTENT_TYPE = \"";
	protected final String TEXT_39 = "\";";
	protected final String TEXT_40 = NL + NL + "\t/**" + NL + "\t * The singleton instance of the package." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\t";
	protected final String TEXT_41 = " eINSTANCE = ";
	protected final String TEXT_42 = ".init();" + NL;
	protected final String TEXT_43 = NL + "\t/**";
	protected final String TEXT_44 = NL + "\t * The meta object id for the '{@link ";
	protected final String TEXT_45 = " <em>";
	protected final String TEXT_46 = "</em>}' class." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
	protected final String TEXT_47 = NL + "\t * The meta object id for the '{@link ";
	protected final String TEXT_48 = " <em>";
	protected final String TEXT_49 = "</em>}' class." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
	protected final String TEXT_50 = NL + "\t * The meta object id for the '{@link ";
	protected final String TEXT_51 = " <em>";
	protected final String TEXT_52 = "</em>}' enum." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
	protected final String TEXT_53 = NL + "\t * The meta object id for the '<em>";
	protected final String TEXT_54 = "</em>' data type." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->";
	protected final String TEXT_55 = NL + "\t * @see ";
	protected final String TEXT_56 = NL + "\t * @see ";
	protected final String TEXT_57 = "#get";
	protected final String TEXT_58 = "()" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
	protected final String TEXT_59 = "int ";
	protected final String TEXT_60 = " = ";
	protected final String TEXT_61 = ";" + NL;
	protected final String TEXT_62 = NL + "\t/**" + NL + "\t * The feature id for the '<em><b>";
	protected final String TEXT_63 = "</b></em>' ";
	protected final String TEXT_64 = "." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
			+ "\t * @generated" + NL + "\t * @ordered" + NL + "\t */" + NL + "\t";
	protected final String TEXT_65 = "int ";
	protected final String TEXT_66 = " = ";
	protected final String TEXT_67 = ";" + NL;
	protected final String TEXT_68 = NL + "\t/**" + NL + "\t * The number of structural features of the '<em>";
	protected final String TEXT_69 = "</em>' class." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */" + NL + "\t";
	protected final String TEXT_70 = "int ";
	protected final String TEXT_71 = " = ";
	protected final String TEXT_72 = ";" + NL;
	protected final String TEXT_73 = NL + "\t/**" + NL + "\t * The operation id for the '<em>";
	protected final String TEXT_74 = "</em>' operation." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */" + NL + "\t";
	protected final String TEXT_75 = "int ";
	protected final String TEXT_76 = " = ";
	protected final String TEXT_77 = ";" + NL;
	protected final String TEXT_78 = NL + "\t/**" + NL + "\t * The number of operations of the '<em>";
	protected final String TEXT_79 = "</em>' class." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */" + NL + "\t";
	protected final String TEXT_80 = "int ";
	protected final String TEXT_81 = " = ";
	protected final String TEXT_82 = ";" + NL;
	protected final String TEXT_83 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprotected String packageFilename = \"";
	protected final String TEXT_84 = "\";";
	protected final String TEXT_85 = NL;
	protected final String TEXT_86 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprivate ";
	protected final String TEXT_87 = " ";
	protected final String TEXT_88 = " = null;" + NL;
	protected final String TEXT_89 = NL + "\t/**" + NL
			+ "\t * Creates an instance of the model <b>Package</b>, registered with" + NL
			+ "\t * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package" + NL
			+ "\t * package URI value." + NL + "\t * <p>Note: the correct way to create the package is via the static"
			+ NL + "\t * factory method {@link #init init()}, which also performs" + NL
			+ "\t * initialization of the package, or returns the registered package," + NL
			+ "\t * if one already exists." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
			+ NL + "\t * @see org.eclipse.emf.ecore.EPackage.Registry" + NL + "\t * @see ";
	protected final String TEXT_90 = "#eNS_URI" + NL + "\t * @see #init()" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate ";
	protected final String TEXT_91 = "()" + NL + "\t{" + NL + "\t\tsuper(eNS_URI, ";
	protected final String TEXT_92 = ");" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->"
			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate static boolean isInited = false;" + NL + "" + NL + "\t/**" + NL
			+ "\t * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends."
			+ NL + "\t * " + NL + "\t * <p>This method is used to initialize {@link ";
	protected final String TEXT_93 = "#eINSTANCE} when that field is accessed." + NL
			+ "\t * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package."
			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @see #eNS_URI";
	protected final String TEXT_94 = NL + "\t * @see #createPackageContents()" + NL
			+ "\t * @see #initializePackageContents()";
	protected final String TEXT_95 = NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static ";
	protected final String TEXT_96 = " init()" + NL + "\t{" + NL + "\t\tif (isInited) return (";
	protected final String TEXT_97 = ")";
	protected final String TEXT_98 = ".Registry.INSTANCE.getEPackage(";
	protected final String TEXT_99 = ".eNS_URI);" + NL;
	protected final String TEXT_100 = NL + "\t\tinitializeRegistryHelpers();" + NL;
	protected final String TEXT_101 = NL + "\t\t// Obtain or create and register package" + NL + "\t\t";
	protected final String TEXT_102 = " the";
	protected final String TEXT_103 = " = (";
	protected final String TEXT_104 = ")(";
	protected final String TEXT_105 = ".Registry.INSTANCE.get(eNS_URI) instanceof ";
	protected final String TEXT_106 = " ? ";
	protected final String TEXT_107 = ".Registry.INSTANCE.get(eNS_URI) : new ";
	protected final String TEXT_108 = "());" + NL + "" + NL + "\t\tisInited = true;" + NL;
	protected final String TEXT_109 = NL + "\t\t// Initialize simple dependencies";
	protected final String TEXT_110 = NL + "\t\t";
	protected final String TEXT_111 = ".eINSTANCE.eClass();";
	protected final String TEXT_112 = NL;
	protected final String TEXT_113 = NL + "\t\t// Obtain or create and register interdependencies";
	protected final String TEXT_114 = NL + "\t\t";
	protected final String TEXT_115 = " ";
	protected final String TEXT_116 = " = (";
	protected final String TEXT_117 = ")(";
	protected final String TEXT_118 = ".Registry.INSTANCE.getEPackage(";
	protected final String TEXT_119 = ".eNS_URI) instanceof ";
	protected final String TEXT_120 = " ? ";
	protected final String TEXT_121 = ".Registry.INSTANCE.getEPackage(";
	protected final String TEXT_122 = ".eNS_URI) : ";
	protected final String TEXT_123 = ".eINSTANCE);";
	protected final String TEXT_124 = NL;
	protected final String TEXT_125 = NL + "\t\t// Load packages";
	protected final String TEXT_126 = NL + "\t\tthe";
	protected final String TEXT_127 = ".loadPackage();";
	protected final String TEXT_128 = NL + "\t\t";
	protected final String TEXT_129 = ".loadPackage();";
	protected final String TEXT_130 = NL;
	protected final String TEXT_131 = NL + "\t\t// Create package meta-data objects";
	protected final String TEXT_132 = NL + "\t\tthe";
	protected final String TEXT_133 = ".createPackageContents();";
	protected final String TEXT_134 = NL + "\t\t";
	protected final String TEXT_135 = ".createPackageContents();";
	protected final String TEXT_136 = NL + NL + "\t\t// Initialize created meta-data";
	protected final String TEXT_137 = NL + "\t\tthe";
	protected final String TEXT_138 = ".initializePackageContents();";
	protected final String TEXT_139 = NL + "\t\t";
	protected final String TEXT_140 = ".initializePackageContents();";
	protected final String TEXT_141 = NL;
	protected final String TEXT_142 = NL + "\t\t// Fix loaded packages";
	protected final String TEXT_143 = NL + "\t\tthe";
	protected final String TEXT_144 = ".fixPackageContents();";
	protected final String TEXT_145 = NL + "\t\t";
	protected final String TEXT_146 = ".fixPackageContents();";
	protected final String TEXT_147 = NL;
	protected final String TEXT_148 = NL + "\t\t// Register package validator" + NL + "\t\t";
	protected final String TEXT_149 = ".Registry.INSTANCE.put" + NL + "\t\t\t(the";
	protected final String TEXT_150 = ", " + NL + "\t\t\t new ";
	protected final String TEXT_151 = ".Descriptor()" + NL + "\t\t\t {" + NL + "\t\t\t\t public ";
	protected final String TEXT_152 = " getEValidator()" + NL + "\t\t\t\t {" + NL + "\t\t\t\t\t return ";
	protected final String TEXT_153 = ".INSTANCE;" + NL + "\t\t\t\t }" + NL + "\t\t\t });" + NL;
	protected final String TEXT_154 = NL + "\t\t// Mark meta-data to indicate it can't be changed" + NL + "\t\tthe";
	protected final String TEXT_155 = ".freeze();" + NL;
	protected final String TEXT_156 = NL + "  " + NL + "\t\t// Update the registry and return the package" + NL
			+ "\t\t";
	protected final String TEXT_157 = ".Registry.INSTANCE.put(";
	protected final String TEXT_158 = ".eNS_URI, the";
	protected final String TEXT_159 = ");" + NL + "\t\treturn the";
	protected final String TEXT_160 = ";" + NL + "\t}";
	protected final String TEXT_161 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tpublic static void initializeRegistryHelpers()" + NL + "\t{";
	protected final String TEXT_162 = NL + "\t\t";
	protected final String TEXT_163 = ".register" + NL + "\t\t\t(";
	protected final String TEXT_164 = ".class, " + NL + "\t\t\t new ";
	protected final String TEXT_165 = ".Helper() " + NL + "\t\t\t {" + NL
			+ "\t\t\t\t public boolean isInstance(Object instance)" + NL + "\t\t\t\t {" + NL
			+ "\t\t\t\t\t return instance instanceof ";
	protected final String TEXT_166 = ";" + NL + "\t\t\t\t }" + NL + "" + NL
			+ "\t\t\t\t public Object newArrayInstance(int size)" + NL + "\t\t\t\t {" + NL + "\t\t\t\t\t return new ";
	protected final String TEXT_167 = "[size];" + NL + "\t\t\t\t }" + NL + "\t\t\t });";
	protected final String TEXT_168 = NL + "\t\t";
	protected final String TEXT_169 = ".register" + NL + "\t\t\t(";
	protected final String TEXT_170 = ".class, " + NL + "\t\t\t new ";
	protected final String TEXT_171 = ".Helper() " + NL + "\t\t\t {" + NL
			+ "\t\t\t\t public boolean isInstance(Object instance)" + NL + "\t\t\t\t {" + NL
			+ "\t\t\t\t\t return instance instanceof ";
	protected final String TEXT_172 = ";" + NL + "\t\t\t\t }" + NL + "" + NL
			+ "\t\t\t\t public Object newArrayInstance(int size)" + NL + "\t\t\t\t {";
	protected final String TEXT_173 = NL + "\t\t\t\t\t return new ";
	protected final String TEXT_174 = "[size]";
	protected final String TEXT_175 = ";";
	protected final String TEXT_176 = NL + "\t\t\t\t\t return new ";
	protected final String TEXT_177 = "[size];";
	protected final String TEXT_178 = NL + "\t\t\t\t }" + NL + "\t\t});";
	protected final String TEXT_179 = NL + "\t}" + NL + "" + NL + "" + NL + "\t/**" + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic static class WhiteList implements ";
	protected final String TEXT_180 = ", EBasicWhiteList" + NL + "\t{";
	protected final String TEXT_181 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ";
	protected final String TEXT_182 = " ";
	protected final String TEXT_183 = ";" + NL;
	protected final String TEXT_184 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ";
	protected final String TEXT_185 = " ";
	protected final String TEXT_186 = ";" + NL;
	protected final String TEXT_187 = NL + "\t}";
	protected final String TEXT_188 = NL;
	protected final String TEXT_189 = NL;
	protected final String TEXT_190 = NL + "\t/**";
	protected final String TEXT_191 = NL + "\t * Returns the meta object for class '{@link ";
	protected final String TEXT_192 = " <em>";
	protected final String TEXT_193 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for class '<em>";
	protected final String TEXT_194 = "</em>'." + NL + "\t * @see ";
	protected final String TEXT_195 = NL + "\t * @model ";
	protected final String TEXT_196 = NL + "\t *        ";
	protected final String TEXT_197 = NL + "\t * @model";
	protected final String TEXT_198 = NL + "\t * Returns the meta object for enum '{@link ";
	protected final String TEXT_199 = " <em>";
	protected final String TEXT_200 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for enum '<em>";
	protected final String TEXT_201 = "</em>'." + NL + "\t * @see ";
	protected final String TEXT_202 = NL + "\t * Returns the meta object for data type '<em>";
	protected final String TEXT_203 = "</em>'.";
	protected final String TEXT_204 = NL + "\t * Returns the meta object for data type '{@link ";
	protected final String TEXT_205 = " <em>";
	protected final String TEXT_206 = "</em>}'.";
	protected final String TEXT_207 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
			+ "\t * @return the meta object for data type '<em>";
	protected final String TEXT_208 = "</em>'.";
	protected final String TEXT_209 = NL + "\t * @see ";
	protected final String TEXT_210 = NL + "\t * @model ";
	protected final String TEXT_211 = NL + "\t *        ";
	protected final String TEXT_212 = NL + "\t * @model";
	protected final String TEXT_213 = NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_214 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_215 = NL + "\tpublic ";
	protected final String TEXT_216 = " get";
	protected final String TEXT_217 = "()" + NL + "\t{";
	protected final String TEXT_218 = NL + "\t\tif (";
	protected final String TEXT_219 = " == null)" + NL + "\t\t{" + NL + "\t\t\t";
	protected final String TEXT_220 = " = (";
	protected final String TEXT_221 = ")";
	protected final String TEXT_222 = ".Registry.INSTANCE.getEPackage(";
	protected final String TEXT_223 = ".eNS_URI).getEClassifiers().get(";
	protected final String TEXT_224 = ");" + NL + "\t\t}";
	protected final String TEXT_225 = NL + "\t\treturn ";
	protected final String TEXT_226 = ";" + NL + "\t}" + NL;
	protected final String TEXT_227 = NL + "\t";
	protected final String TEXT_228 = " get";
	protected final String TEXT_229 = "();" + NL;
	protected final String TEXT_230 = NL + "\t/**" + NL + "\t * Returns the meta object for the ";
	protected final String TEXT_231 = " '{@link ";
	protected final String TEXT_232 = "#";
	protected final String TEXT_233 = " <em>";
	protected final String TEXT_234 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for the ";
	protected final String TEXT_235 = " '<em>";
	protected final String TEXT_236 = "</em>'." + NL + "\t * @see ";
	protected final String TEXT_237 = "#";
	protected final String TEXT_238 = "()";
	protected final String TEXT_239 = NL + "\t * @see #get";
	protected final String TEXT_240 = "()" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_241 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_242 = NL + "\tpublic ";
	protected final String TEXT_243 = " get";
	protected final String TEXT_244 = "()" + NL + "\t{";
	protected final String TEXT_245 = NL + "\t\treturn (";
	protected final String TEXT_246 = ")";
	protected final String TEXT_247 = ".getEStructuralFeatures().get(";
	protected final String TEXT_248 = ");";
	protected final String TEXT_249 = NL + "        return (";
	protected final String TEXT_250 = ")get";
	protected final String TEXT_251 = "().getEStructuralFeatures().get(";
	protected final String TEXT_252 = ");";
	protected final String TEXT_253 = NL + "\t}";
	protected final String TEXT_254 = NL + "\t";
	protected final String TEXT_255 = " get";
	protected final String TEXT_256 = "();";
	protected final String TEXT_257 = NL;
	protected final String TEXT_258 = NL + "\t/**" + NL + "\t * Returns the meta object for the '{@link ";
	protected final String TEXT_259 = "#";
	protected final String TEXT_260 = "(";
	protected final String TEXT_261 = ") <em>";
	protected final String TEXT_262 = "</em>}' operation." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for the '<em>";
	protected final String TEXT_263 = "</em>' operation." + NL + "\t * @see ";
	protected final String TEXT_264 = "#";
	protected final String TEXT_265 = "(";
	protected final String TEXT_266 = ")" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_267 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_268 = NL + "\tpublic ";
	protected final String TEXT_269 = " get";
	protected final String TEXT_270 = "()" + NL + "\t{";
	protected final String TEXT_271 = NL + "\t\treturn ";
	protected final String TEXT_272 = ".getEOperations().get(";
	protected final String TEXT_273 = ");";
	protected final String TEXT_274 = NL + "        return get";
	protected final String TEXT_275 = "().getEOperations().get(";
	protected final String TEXT_276 = ");";
	protected final String TEXT_277 = NL + "\t}";
	protected final String TEXT_278 = NL + "\t";
	protected final String TEXT_279 = " get";
	protected final String TEXT_280 = "();";
	protected final String TEXT_281 = NL;
	protected final String TEXT_282 = NL + "\t/**" + NL
			+ "\t * Returns the factory that creates the instances of the model." + NL + "\t * <!-- begin-user-doc -->"
			+ NL + "\t * <!-- end-user-doc -->" + NL
			+ "\t * @return the factory that creates the instances of the model." + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_283 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_284 = NL + "\tpublic ";
	protected final String TEXT_285 = " get";
	protected final String TEXT_286 = "()" + NL + "\t{" + NL + "\t\treturn (";
	protected final String TEXT_287 = ")getEFactoryInstance();" + NL + "\t}";
	protected final String TEXT_288 = NL + "\t";
	protected final String TEXT_289 = " get";
	protected final String TEXT_290 = "();";
	protected final String TEXT_291 = NL;
	protected final String TEXT_292 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate boolean isCreated = false;" + NL + "" + NL + "\t/**" + NL
			+ "\t * Creates the meta-model objects for the package.  This method is" + NL
			+ "\t * guarded to have no affect on any invocation but its first." + NL + "\t * <!-- begin-user-doc -->"
			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tpublic void createPackageContents()" + NL + "\t{" + NL + "\t\tif (isCreated) return;" + NL
			+ "\t\tisCreated = true;";
	protected final String TEXT_293 = NL + NL + "\t\t// Create classes and their features";
	protected final String TEXT_294 = NL + "\t\t";
	protected final String TEXT_295 = " = create";
	protected final String TEXT_296 = "(";
	protected final String TEXT_297 = ");";
	protected final String TEXT_298 = NL + "\t\tcreate";
	protected final String TEXT_299 = "(";
	protected final String TEXT_300 = ", ";
	protected final String TEXT_301 = ");";
	protected final String TEXT_302 = NL + "\t\tcreateEOperation(";
	protected final String TEXT_303 = ", ";
	protected final String TEXT_304 = ");";
	protected final String TEXT_305 = NL;
	protected final String TEXT_306 = NL + NL + "\t\t// Create enums";
	protected final String TEXT_307 = NL + "\t\t";
	protected final String TEXT_308 = " = createEEnum(";
	protected final String TEXT_309 = ");";
	protected final String TEXT_310 = NL + NL + "\t\t// Create data types";
	protected final String TEXT_311 = NL + "\t\t";
	protected final String TEXT_312 = " = createEDataType(";
	protected final String TEXT_313 = ");";
	protected final String TEXT_314 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate boolean isInitialized = false;" + NL;
	protected final String TEXT_315 = NL + "\t/**" + NL
			+ "\t * Complete the initialization of the package and its meta-model.  This" + NL
			+ "\t * method is guarded to have no affect on any invocation but its first." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic void initializePackageContents()" + NL + "\t{" + NL + "\t\tif (isInitialized) return;" + NL
			+ "\t\tisInitialized = true;" + NL + "" + NL + "\t\t// Initialize package" + NL + "\t\tsetName(eNAME);" + NL
			+ "\t\tsetNsPrefix(eNS_PREFIX);" + NL + "\t\tsetNsURI(eNS_URI);";
	protected final String TEXT_316 = NL + NL + "\t\t// Obtain other dependent packages";
	protected final String TEXT_317 = NL + "\t\t";
	protected final String TEXT_318 = " ";
	protected final String TEXT_319 = " = (";
	protected final String TEXT_320 = ")";
	protected final String TEXT_321 = ".Registry.INSTANCE.getEPackage(";
	protected final String TEXT_322 = ".eNS_URI);";
	protected final String TEXT_323 = NL + NL + "\t\t// Add subpackages";
	protected final String TEXT_324 = NL + "\t\tgetESubpackages().add(";
	protected final String TEXT_325 = ");";
	protected final String TEXT_326 = NL + NL + "\t\t// Create type parameters";
	protected final String TEXT_327 = NL + "\t\t";
	protected final String TEXT_328 = " ";
	protected final String TEXT_329 = "_";
	protected final String TEXT_330 = " = addETypeParameter(";
	protected final String TEXT_331 = ", \"";
	protected final String TEXT_332 = "\");";
	protected final String TEXT_333 = NL + "\t\taddETypeParameter(";
	protected final String TEXT_334 = ", \"";
	protected final String TEXT_335 = "\");";
	protected final String TEXT_336 = NL + NL + "\t\t// Set bounds for type parameters";
	protected final String TEXT_337 = NL + "\t\t";
	protected final String TEXT_338 = "g";
	protected final String TEXT_339 = " = createEGenericType(";
	protected final String TEXT_340 = ");";
	protected final String TEXT_341 = NL + "\t\tg";
	protected final String TEXT_342 = ".";
	protected final String TEXT_343 = "(g";
	protected final String TEXT_344 = ");";
	protected final String TEXT_345 = NL + "\t\t";
	protected final String TEXT_346 = "_";
	protected final String TEXT_347 = ".getEBounds().add(g1);";
	protected final String TEXT_348 = NL + NL + "\t\t// Add supertypes to classes";
	protected final String TEXT_349 = NL + "\t\t";
	protected final String TEXT_350 = ".getESuperTypes().add(";
	protected final String TEXT_351 = ".get";
	protected final String TEXT_352 = "());";
	protected final String TEXT_353 = NL + "\t\t";
	protected final String TEXT_354 = "g";
	protected final String TEXT_355 = " = createEGenericType(";
	protected final String TEXT_356 = ");";
	protected final String TEXT_357 = NL + "\t\tg";
	protected final String TEXT_358 = ".";
	protected final String TEXT_359 = "(g";
	protected final String TEXT_360 = ");";
	protected final String TEXT_361 = NL + "\t\t";
	protected final String TEXT_362 = ".getEGenericSuperTypes().add(g1);";
	protected final String TEXT_363 = NL + NL + "\t\t// Initialize classes";
	protected final String TEXT_364 = ", features, and operations; add parameters";
	protected final String TEXT_365 = " and features; add operations and parameters";
	protected final String TEXT_366 = NL + "\t\tinitEClass(";
	protected final String TEXT_367 = ", ";
	protected final String TEXT_368 = "null";
	protected final String TEXT_369 = ".class";
	protected final String TEXT_370 = ", \"";
	protected final String TEXT_371 = "\", ";
	protected final String TEXT_372 = ", ";
	protected final String TEXT_373 = ", ";
	protected final String TEXT_374 = ", \"";
	protected final String TEXT_375 = "\"";
	protected final String TEXT_376 = ");";
	protected final String TEXT_377 = NL + "\t\t";
	protected final String TEXT_378 = "g";
	protected final String TEXT_379 = " = createEGenericType(";
	protected final String TEXT_380 = ");";
	protected final String TEXT_381 = NL + "\t\tg";
	protected final String TEXT_382 = ".";
	protected final String TEXT_383 = "(g";
	protected final String TEXT_384 = ");";
	protected final String TEXT_385 = NL + "\t\tinitEReference(get";
	protected final String TEXT_386 = "(), ";
	protected final String TEXT_387 = "g1";
	protected final String TEXT_388 = ".get";
	protected final String TEXT_389 = "()";
	protected final String TEXT_390 = ", ";
	protected final String TEXT_391 = ", \"";
	protected final String TEXT_392 = "\", ";
	protected final String TEXT_393 = ", ";
	protected final String TEXT_394 = ", ";
	protected final String TEXT_395 = ", ";
	protected final String TEXT_396 = ", ";
	protected final String TEXT_397 = ", ";
	protected final String TEXT_398 = ", ";
	protected final String TEXT_399 = ", ";
	protected final String TEXT_400 = ", ";
	protected final String TEXT_401 = ", ";
	protected final String TEXT_402 = ", ";
	protected final String TEXT_403 = ", ";
	protected final String TEXT_404 = ", ";
	protected final String TEXT_405 = ");";
	protected final String TEXT_406 = NL + "\t\tget";
	protected final String TEXT_407 = "().getEKeys().add(";
	protected final String TEXT_408 = ".get";
	protected final String TEXT_409 = "());";
	protected final String TEXT_410 = NL + "\t\tinitEAttribute(get";
	protected final String TEXT_411 = "(), ";
	protected final String TEXT_412 = "g1";
	protected final String TEXT_413 = ".get";
	protected final String TEXT_414 = "()";
	protected final String TEXT_415 = ", \"";
	protected final String TEXT_416 = "\", ";
	protected final String TEXT_417 = ", ";
	protected final String TEXT_418 = ", ";
	protected final String TEXT_419 = ", ";
	protected final String TEXT_420 = ", ";
	protected final String TEXT_421 = ", ";
	protected final String TEXT_422 = ", ";
	protected final String TEXT_423 = ", ";
	protected final String TEXT_424 = ", ";
	protected final String TEXT_425 = ", ";
	protected final String TEXT_426 = ", ";
	protected final String TEXT_427 = ", ";
	protected final String TEXT_428 = ");";
	protected final String TEXT_429 = NL;
	protected final String TEXT_430 = NL + "\t\t";
	protected final String TEXT_431 = "initEOperation(get";
	protected final String TEXT_432 = "()";
	protected final String TEXT_433 = "addEOperation(";
	protected final String TEXT_434 = ", ";
	protected final String TEXT_435 = "null";
	protected final String TEXT_436 = ".get";
	protected final String TEXT_437 = "()";
	protected final String TEXT_438 = ", \"";
	protected final String TEXT_439 = "\", ";
	protected final String TEXT_440 = ", ";
	protected final String TEXT_441 = ", ";
	protected final String TEXT_442 = ", ";
	protected final String TEXT_443 = ");";
	protected final String TEXT_444 = NL + "\t\t";
	protected final String TEXT_445 = "initEOperation(get";
	protected final String TEXT_446 = "()";
	protected final String TEXT_447 = "addEOperation(";
	protected final String TEXT_448 = ", ";
	protected final String TEXT_449 = ".get";
	protected final String TEXT_450 = "(), \"";
	protected final String TEXT_451 = "\", ";
	protected final String TEXT_452 = ", ";
	protected final String TEXT_453 = ", ";
	protected final String TEXT_454 = ", ";
	protected final String TEXT_455 = ");";
	protected final String TEXT_456 = NL + "\t\t";
	protected final String TEXT_457 = "initEOperation(get";
	protected final String TEXT_458 = "()";
	protected final String TEXT_459 = "addEOperation(";
	protected final String TEXT_460 = ", ";
	protected final String TEXT_461 = ".get";
	protected final String TEXT_462 = "(), \"";
	protected final String TEXT_463 = "\", ";
	protected final String TEXT_464 = ", ";
	protected final String TEXT_465 = ");";
	protected final String TEXT_466 = NL + "\t\t";
	protected final String TEXT_467 = "initEOperation(get";
	protected final String TEXT_468 = "()";
	protected final String TEXT_469 = "addEOperation(";
	protected final String TEXT_470 = ", null, \"";
	protected final String TEXT_471 = "\");";
	protected final String TEXT_472 = NL + "\t\t";
	protected final String TEXT_473 = "addETypeParameter(op, \"";
	protected final String TEXT_474 = "\");";
	protected final String TEXT_475 = NL + "\t\t";
	protected final String TEXT_476 = "g";
	protected final String TEXT_477 = " = createEGenericType(";
	protected final String TEXT_478 = ");";
	protected final String TEXT_479 = NL + "\t\tg";
	protected final String TEXT_480 = ".";
	protected final String TEXT_481 = "(g";
	protected final String TEXT_482 = ");";
	protected final String TEXT_483 = NL + "\t\tt";
	protected final String TEXT_484 = ".getEBounds().add(g1);";
	protected final String TEXT_485 = NL + "\t\t";
	protected final String TEXT_486 = "g";
	protected final String TEXT_487 = " = createEGenericType(";
	protected final String TEXT_488 = ");";
	protected final String TEXT_489 = NL + "\t\tg";
	protected final String TEXT_490 = ".";
	protected final String TEXT_491 = "(g";
	protected final String TEXT_492 = ");";
	protected final String TEXT_493 = NL + "\t\taddEParameter(op, ";
	protected final String TEXT_494 = "g1";
	protected final String TEXT_495 = ".get";
	protected final String TEXT_496 = "()";
	protected final String TEXT_497 = ", \"";
	protected final String TEXT_498 = "\", ";
	protected final String TEXT_499 = ", ";
	protected final String TEXT_500 = ", ";
	protected final String TEXT_501 = ", ";
	protected final String TEXT_502 = ");";
	protected final String TEXT_503 = NL + "\t\taddEParameter(op, ";
	protected final String TEXT_504 = "g1";
	protected final String TEXT_505 = ".get";
	protected final String TEXT_506 = "()";
	protected final String TEXT_507 = ", \"";
	protected final String TEXT_508 = "\", ";
	protected final String TEXT_509 = ", ";
	protected final String TEXT_510 = ", ";
	protected final String TEXT_511 = ", ";
	protected final String TEXT_512 = ");";
	protected final String TEXT_513 = NL + "\t\taddEParameter(op, ";
	protected final String TEXT_514 = "g1";
	protected final String TEXT_515 = ".get";
	protected final String TEXT_516 = "()";
	protected final String TEXT_517 = ", \"";
	protected final String TEXT_518 = "\", ";
	protected final String TEXT_519 = ", ";
	protected final String TEXT_520 = ");";
	protected final String TEXT_521 = NL + "\t\t";
	protected final String TEXT_522 = "g";
	protected final String TEXT_523 = " = createEGenericType(";
	protected final String TEXT_524 = ");";
	protected final String TEXT_525 = NL + "\t\tg";
	protected final String TEXT_526 = ".";
	protected final String TEXT_527 = "(g";
	protected final String TEXT_528 = ");";
	protected final String TEXT_529 = NL + "\t\taddEException(op, g";
	protected final String TEXT_530 = ");";
	protected final String TEXT_531 = NL + "\t\taddEException(op, ";
	protected final String TEXT_532 = ".get";
	protected final String TEXT_533 = "());";
	protected final String TEXT_534 = NL + "\t\t";
	protected final String TEXT_535 = "g";
	protected final String TEXT_536 = " = createEGenericType(";
	protected final String TEXT_537 = ");";
	protected final String TEXT_538 = NL + "\t\tg";
	protected final String TEXT_539 = ".";
	protected final String TEXT_540 = "(g";
	protected final String TEXT_541 = ");";
	protected final String TEXT_542 = NL + "\t\tinitEOperation(op, g1);";
	protected final String TEXT_543 = NL;
	protected final String TEXT_544 = NL + NL + "\t\t// Initialize enums and add enum literals";
	protected final String TEXT_545 = NL + "\t\tinitEEnum(";
	protected final String TEXT_546 = ", ";
	protected final String TEXT_547 = ".class, \"";
	protected final String TEXT_548 = "\");";
	protected final String TEXT_549 = NL + "\t\taddEEnumLiteral(";
	protected final String TEXT_550 = ", ";
	protected final String TEXT_551 = ".";
	protected final String TEXT_552 = ");";
	protected final String TEXT_553 = NL;
	protected final String TEXT_554 = NL + NL + "\t\t// Initialize data types";
	protected final String TEXT_555 = NL + "\t\tinitEDataType(";
	protected final String TEXT_556 = ", ";
	protected final String TEXT_557 = ".class, \"";
	protected final String TEXT_558 = "\", ";
	protected final String TEXT_559 = ", ";
	protected final String TEXT_560 = ", \"";
	protected final String TEXT_561 = "\"";
	protected final String TEXT_562 = ");";
	protected final String TEXT_563 = NL + NL + "\t\t// Create resource" + NL + "\t\tcreateResource(";
	protected final String TEXT_564 = ");";
	protected final String TEXT_565 = NL + NL + "\t\t// Create annotations";
	protected final String TEXT_566 = NL + "\t\t// ";
	protected final String TEXT_567 = NL + "\t\tcreate";
	protected final String TEXT_568 = "Annotations();";
	protected final String TEXT_569 = NL + "\t}" + NL;
	protected final String TEXT_570 = NL + "\t/**" + NL + "\t * Initializes the annotations for <b>";
	protected final String TEXT_571 = "</b>." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
			+ NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected void create";
	protected final String TEXT_572 = "Annotations()" + NL + "\t{" + NL + "\t\tString source = ";
	protected final String TEXT_573 = "null;";
	protected final String TEXT_574 = "\"";
	protected final String TEXT_575 = "\";";
	protected final String TEXT_576 = "\t" + NL + "\t\taddAnnotation" + NL + "\t\t  (";
	protected final String TEXT_577 = ", " + NL + "\t\t   source, " + NL + "\t\t   new String[] " + NL + "\t\t   {";
	protected final String TEXT_578 = NL + "\t\t\t ";
	protected final String TEXT_579 = ", ";
	protected final String TEXT_580 = NL + "\t\t   }";
	protected final String TEXT_581 = ");";
	protected final String TEXT_582 = ",";
	protected final String TEXT_583 = NL + "\t\t   new ";
	protected final String TEXT_584 = "[] " + NL + "\t\t   {";
	protected final String TEXT_585 = NL + "\t\t\t ";
	protected final String TEXT_586 = ".createURI(";
	protected final String TEXT_587 = ".";
	protected final String TEXT_588 = "eNS_URI).appendFragment(\"";
	protected final String TEXT_589 = "\")";
	protected final String TEXT_590 = ",";
	protected final String TEXT_591 = NL + "\t\t   });";
	protected final String TEXT_592 = NL + "\t\taddAnnotation" + NL + "\t\t  (";
	protected final String TEXT_593 = ", " + NL + "\t\t   ";
	protected final String TEXT_594 = "new boolean[] { ";
	protected final String TEXT_595 = " }";
	protected final String TEXT_596 = "," + NL + "\t\t   ";
	protected final String TEXT_597 = "null,";
	protected final String TEXT_598 = "\"";
	protected final String TEXT_599 = "\",";
	protected final String TEXT_600 = NL + "\t\t   new String[] " + NL + "\t\t   {";
	protected final String TEXT_601 = NL + "\t\t\t ";
	protected final String TEXT_602 = ", ";
	protected final String TEXT_603 = NL + "\t\t   }";
	protected final String TEXT_604 = ");";
	protected final String TEXT_605 = ",";
	protected final String TEXT_606 = NL + "\t\t   new ";
	protected final String TEXT_607 = "[] " + NL + "\t\t   {";
	protected final String TEXT_608 = NL + "\t\t\t ";
	protected final String TEXT_609 = ".createURI(";
	protected final String TEXT_610 = ".";
	protected final String TEXT_611 = "eNS_URI).appendFragment(\"";
	protected final String TEXT_612 = "\")";
	protected final String TEXT_613 = ",";
	protected final String TEXT_614 = NL + "\t\t   });";
	protected final String TEXT_615 = NL + "\t}" + NL;
	protected final String TEXT_616 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate boolean isLoaded = false;" + NL + "" + NL + "\t/**" + NL
			+ "\t * Laods the package and any sub-packages from their serialized form." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic void loadPackage()" + NL + "\t{" + NL + "\t\tif (isLoaded) return;" + NL
			+ "\t\tisLoaded = true;" + NL + "" + NL + "\t\t";
	protected final String TEXT_617 = " url = getClass().getResource(packageFilename);" + NL + "\t\tif (url == null)"
			+ NL + "\t\t{" + NL
			+ "\t\t\tthrow new RuntimeException(\"Missing serialized package: \" + packageFilename);";
	protected final String TEXT_618 = NL + "\t\t}" + NL + "\t\t";
	protected final String TEXT_619 = " uri = ";
	protected final String TEXT_620 = ".createURI(url.toString());" + NL + "\t\t";
	protected final String TEXT_621 = " resource = new ";
	protected final String TEXT_622 = "().createResource(uri);" + NL + "\t\ttry" + NL + "\t\t{" + NL
			+ "\t\t\tresource.load(null);" + NL + "\t\t}" + NL + "\t\tcatch (";
	protected final String TEXT_623 = " exception)" + NL + "\t\t{" + NL + "\t\t\tthrow new ";
	protected final String TEXT_624 = "(exception);" + NL + "\t\t}" + NL + "\t\tinitializeFromLoadedEPackage(this, (";
	protected final String TEXT_625 = ")resource.getContents().get(0));" + NL + "\t\tcreateResource(eNS_URI);" + NL
			+ "\t}" + NL;
	protected final String TEXT_626 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate boolean isFixed = false;" + NL + "" + NL + "\t/**" + NL
			+ "\t * Fixes up the loaded package, to make it appear as if it had been programmatically built." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic void fixPackageContents()" + NL + "\t{" + NL + "\t\tif (isFixed) return;" + NL
			+ "\t\tisFixed = true;" + NL + "\t\tfixEClassifiers();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
			+ "\t * Sets the instance class on the given classifier." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_627 = NL + "\t@Override";
	protected final String TEXT_628 = NL + "\tprotected void fixInstanceClass(";
	protected final String TEXT_629 = " eClassifier)" + NL + "\t{" + NL
			+ "\t\tif (eClassifier.getInstanceClassName() == null)" + NL + "\t\t{";
	protected final String TEXT_630 = NL + "\t\t\teClassifier.setInstanceClassName(\"";
	protected final String TEXT_631 = ".\" + eClassifier.getName());";
	protected final String TEXT_632 = NL + "\t\t\tsetGeneratedClassName(eClassifier);";
	protected final String TEXT_633 = NL + "\t\t\tswitch (eClassifier.getClassifierID())" + NL + "\t\t\t{";
	protected final String TEXT_634 = NL + "\t\t\t\tcase ";
	protected final String TEXT_635 = ":";
	protected final String TEXT_636 = NL + "\t\t\t\t{" + NL + "\t\t\t\t\tbreak;" + NL + "\t\t\t\t}" + NL
			+ "\t\t\t\tdefault:" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\teClassifier.setInstanceClassName(\"";
	protected final String TEXT_637 = ".\" + eClassifier.getName());";
	protected final String TEXT_638 = NL + "\t\t\t\t\tsetGeneratedClassName(eClassifier);" + NL + "\t\t\t\t\tbreak;"
			+ NL + "\t\t\t\t}" + NL + "\t\t\t}";
	protected final String TEXT_639 = NL + "\t\t}" + NL + "\t}" + NL;
	protected final String TEXT_640 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
	protected final String TEXT_641 = " addEOperation(";
	protected final String TEXT_642 = " owner, ";
	protected final String TEXT_643 = " type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)"
			+ NL + "\t{" + NL + "\t\t";
	protected final String TEXT_644 = " o = addEOperation(owner, type, name, lowerBound, upperBound);" + NL
			+ "\t\to.setUnique(isUnique);" + NL + "\t\to.setOrdered(isOrdered);" + NL + "\t\treturn o;" + NL + "\t}"
			+ NL + "\t";
	protected final String TEXT_645 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
	protected final String TEXT_646 = " addEParameter(";
	protected final String TEXT_647 = " owner, ";
	protected final String TEXT_648 = " type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)"
			+ NL + "\t{" + NL + "\t\t";
	protected final String TEXT_649 = " p = ecoreFactory.createEParameter();" + NL + "\t\tp.setEType(type);" + NL
			+ "\t\tp.setName(name);" + NL + "\t\tp.setLowerBound(lowerBound);" + NL + "\t\tp.setUpperBound(upperBound);"
			+ NL + "\t\tp.setUnique(isUnique);" + NL + "\t\tp.setOrdered(isOrdered);" + NL
			+ "\t\towner.getEParameters().add(p);" + NL + "\t\treturn p;" + NL + "\t}" + NL + "\t";
	protected final String TEXT_650 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * Defines literals for the meta objects that represent" + NL + "\t * <ul>" + NL
			+ "\t *   <li>each class,</li>" + NL + "\t *   <li>each feature of each class,</li>";
	protected final String TEXT_651 = NL + "\t *   <li>each operation of each class,</li>";
	protected final String TEXT_652 = NL + "\t *   <li>each enum,</li>" + NL + "\t *   <li>and each data type</li>" + NL
			+ "\t * </ul>" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
	protected final String TEXT_653 = "public ";
	protected final String TEXT_654 = "interface Literals" + NL + "\t{";
	protected final String TEXT_655 = NL + "\t\t/**";
	protected final String TEXT_656 = NL + "\t\t * The meta object literal for the '{@link ";
	protected final String TEXT_657 = " <em>";
	protected final String TEXT_658 = "</em>}' class." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
	protected final String TEXT_659 = NL + "\t\t * The meta object literal for the '{@link ";
	protected final String TEXT_660 = " <em>";
	protected final String TEXT_661 = "</em>}' class." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
	protected final String TEXT_662 = NL + "\t\t * The meta object literal for the '{@link ";
	protected final String TEXT_663 = " <em>";
	protected final String TEXT_664 = "</em>}' enum." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
	protected final String TEXT_665 = NL + "\t\t * The meta object literal for the '<em>";
	protected final String TEXT_666 = "</em>' data type." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->";
	protected final String TEXT_667 = NL + "\t\t * @see ";
	protected final String TEXT_668 = NL + "\t\t * @see ";
	protected final String TEXT_669 = "#get";
	protected final String TEXT_670 = "()" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
	protected final String TEXT_671 = " ";
	protected final String TEXT_672 = " = eINSTANCE.get";
	protected final String TEXT_673 = "();" + NL;
	protected final String TEXT_674 = NL + "\t\t/**" + NL + "\t\t * The meta object literal for the '<em><b>";
	protected final String TEXT_675 = "</b></em>' ";
	protected final String TEXT_676 = " feature." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
	protected final String TEXT_677 = " ";
	protected final String TEXT_678 = " = eINSTANCE.get";
	protected final String TEXT_679 = "();" + NL;
	protected final String TEXT_680 = NL + "\t\t/**" + NL + "\t\t * The meta object literal for the '<em><b>";
	protected final String TEXT_681 = "</b></em>' operation." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
	protected final String TEXT_682 = " ";
	protected final String TEXT_683 = " = eINSTANCE.get";
	protected final String TEXT_684 = "();" + NL;
	protected final String TEXT_685 = NL + "\t}" + NL;
	protected final String TEXT_686 = NL + "} //";
	protected final String TEXT_687 = NL;
	protected final String TEXT_688 = NL;
	protected final String TEXT_689 = NL;

	public PackageInterface() {
		//Here is the constructor
		StringBuffer stringBuffer = new StringBuffer();

		// add initialisation of the pattern variables (declaration has been already done).

	}

	public String generate(Object argument) throws Exception {
		final StringBuffer stringBuffer = new StringBuffer();

		InternalPatternContext ctx = (InternalPatternContext) argument;
		Map<String, String> queryCtx = null;
		IQuery.ParameterDescription paramDesc = null;
		Node.Container currentNode = ctx.getNode();

		List<Object> parameterList = null;
		//this pattern can only be called by another (i.e. it's not an entry point in execution)

		for (Object parameterParameter : parameterList) {

			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;

			if (preCondition(ctx)) {
				ctx.setNode(new Node.Container(currentNode, getClass()));
				orchestration(ctx);
			}

		}
		ctx.setNode(currentNode);
		if (ctx.useReporter()) {
			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
		}

		stringBuffer.append(TEXT_688);
		stringBuffer.append(TEXT_689);
		return stringBuffer.toString();
	}

	public String orchestration(PatternContext ctx) throws Exception {
		InternalPatternContext ictx = (InternalPatternContext) ctx;

		super.orchestration(new SuperOrchestrationContext(ictx));

		method_preGenerate(new StringBuffer(), ictx);

		method_doGenerate(new StringBuffer(), ictx);
		{
			final Map<String, Object> parameters = getParameters();
			CallbackContext ctx_callback = new CallbackContext(ictx);
			CallHelper.callBack(ctx_callback, parameters);
		}

		method_postGenerate(new StringBuffer(), ictx);

		if (ictx.useReporter()) {
			Map<String, Object> parameterValues = new HashMap<String, Object>();
			parameterValues.put("parameter", this.parameter);
			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
		}
		return null;
	}

	public Map<String, Object> getParameters() {
		final Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("parameter", this.parameter);
		return parameters;
	}

	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
			throws Exception {

		GenPackage genPackage = parameter;
		targetPath = genPackage.getGenModel().getModelDirectory();
		packageName = genPackage.getReflectionPackageName();
		className = genPackage.getPackageInterfaceName();

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
	}

	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		GenPackage genPackage = parameter;
		argument = ((Object[]) new Object[] { new Object[] { genPackage, Boolean.TRUE, Boolean.FALSE } })[0];

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
	}

	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
			throws Exception {

		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
	}

	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		/**
		 * Copyright (c) 2002-2010 IBM Corporation and others.
		 * This program and the accompanying materials
		 * are made available under the terms of the Eclipse Public License v2.0
		 * which accompanies this distribution, and is available at
		 * https://www.eclipse.org/legal/epl-v2.0
		 *
		 * SPDX-License-Identifier: EPL-2.0
		 * 
		 * Contributors: 
		 *   IBM - Initial API and implementation
		 */

		final GenPackage genPackage = (GenPackage) ((Object[]) argument)[0];
		final GenModel genModel = genPackage.getGenModel();
		boolean isInterface = Boolean.TRUE.equals(((Object[]) argument)[1]);
		boolean isImplementation = Boolean.TRUE.equals(((Object[]) argument)[2]);
		String publicStaticFinalFlag = isImplementation ? "public static final " : "";
		boolean needsAddEOperation = false;
		boolean needsAddEParameter = false;
		stringBuffer.append(TEXT_1);
		{
			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>

			InternalPatternContext ictx = (InternalPatternContext) ctx;
			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
			stringBuffer.setLength(0);

			final Map<String, Object> callParameters = new HashMap<String, Object>();
			callParameters.put("argument", parameter);
			CallHelper.executeWithParameterInjection(
					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
					new ExecutionContext((InternalPatternContext) ctx), callParameters);
			stringBuffer.setLength(0);
		}

		if (isImplementation && !genModel.isSuppressInterfaces()) {
			stringBuffer.append(TEXT_2);
			stringBuffer.append(genPackage.getClassPackageName());
			stringBuffer.append(TEXT_3);
		} else {
			stringBuffer.append(TEXT_4);
			stringBuffer.append(genPackage.getReflectionPackageName());
			stringBuffer.append(TEXT_5);
		}
		stringBuffer.append(TEXT_6);
		genModel.markImportLocation(stringBuffer, genPackage);
		if (isImplementation) {
			genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Registry");
			genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Descriptor");
			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.EPackageImpl.EBasicWhiteList");
			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container");
			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container.Dynamic");
			if (genPackage.isLiteralsInterface()) {
				genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + ".Literals");
			}
			for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers())
				genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + "."
						+ genPackage.getClassifierID(genClassifier));
		}
		if (isInterface) {
			stringBuffer.append(TEXT_7);
			if (genModel.isOperationReflection()) {
				stringBuffer.append(TEXT_8);
			}
			stringBuffer.append(TEXT_9);
			if (genPackage.hasDocumentation()) {
				stringBuffer.append(TEXT_10);
				stringBuffer.append(genPackage.getDocumentation(genModel.getIndentation(stringBuffer)));
				stringBuffer.append(TEXT_11);
			}
			stringBuffer.append(TEXT_12);
			stringBuffer.append(genPackage.getQualifiedFactoryInterfaceName());
			if (!genModel.isSuppressEMFModelTags()) {
				boolean first = true;
				for (StringTokenizer stringTokenizer = new StringTokenizer(genPackage.getModelInfo(),
						"\n\r"); stringTokenizer.hasMoreTokens();) {
					String modelInfo = stringTokenizer.nextToken();
					if (first) {
						first = false;
						stringBuffer.append(TEXT_13);
						stringBuffer.append(modelInfo);
					} else {
						stringBuffer.append(TEXT_14);
						stringBuffer.append(modelInfo);
					}
				}
				if (first) {
					stringBuffer.append(TEXT_15);
				}
			}
			stringBuffer.append(TEXT_16);
		} else {
			stringBuffer.append(TEXT_17);
		}
		if (isImplementation) {
			stringBuffer.append(TEXT_18);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_19);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.EPackageImpl"));
			if (!isInterface) {
				stringBuffer.append(TEXT_20);
				stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			}
		} else {
			stringBuffer.append(TEXT_21);
			stringBuffer.append(genPackage.getPackageInterfaceName());
			stringBuffer.append(TEXT_22);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
		}
		stringBuffer.append(TEXT_23);
		if (genModel.hasCopyrightField()) {
			stringBuffer.append(TEXT_24);
			stringBuffer.append(publicStaticFinalFlag);
			stringBuffer.append(genModel.getImportedName("java.lang.String"));
			stringBuffer.append(TEXT_25);
			stringBuffer.append(genModel.getCopyrightFieldLiteral());
			stringBuffer.append(TEXT_26);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_27);
		}
		if (isInterface) {
			stringBuffer.append(TEXT_28);
			stringBuffer.append(publicStaticFinalFlag);
			stringBuffer.append(genModel.getImportedName("java.lang.String"));
			stringBuffer.append(TEXT_29);
			stringBuffer.append(genPackage.getPackageName());
			stringBuffer.append(TEXT_30);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_31);
			stringBuffer.append(publicStaticFinalFlag);
			stringBuffer.append(genModel.getImportedName("java.lang.String"));
			stringBuffer.append(TEXT_32);
			stringBuffer.append(genPackage.getNSURI());
			stringBuffer.append(TEXT_33);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_34);
			stringBuffer.append(publicStaticFinalFlag);
			stringBuffer.append(genModel.getImportedName("java.lang.String"));
			stringBuffer.append(TEXT_35);
			stringBuffer.append(genPackage.getNSName());
			stringBuffer.append(TEXT_36);
			stringBuffer.append(genModel.getNonNLS());
			if (genPackage.isContentType()) {
				stringBuffer.append(TEXT_37);
				stringBuffer.append(publicStaticFinalFlag);
				stringBuffer.append(genModel.getImportedName("java.lang.String"));
				stringBuffer.append(TEXT_38);
				stringBuffer.append(genPackage.getContentTypeIdentifier());
				stringBuffer.append(TEXT_39);
				stringBuffer.append(genModel.getNonNLS());
			}
			stringBuffer.append(TEXT_40);
			stringBuffer.append(publicStaticFinalFlag);
			stringBuffer.append(genPackage.getPackageInterfaceName());
			stringBuffer.append(TEXT_41);
			stringBuffer.append(genPackage.getQualifiedPackageClassName());
			stringBuffer.append(TEXT_42);
			for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers()) {
				stringBuffer.append(TEXT_43);
				if (genClassifier instanceof GenClass) {
					GenClass genClass = (GenClass) genClassifier;
					if (!genClass.isInterface()) {
						stringBuffer.append(TEXT_44);
						stringBuffer.append(genClass.getQualifiedClassName());
						stringBuffer.append(TEXT_45);
						stringBuffer.append(genClass.getFormattedName());
						stringBuffer.append(TEXT_46);
						stringBuffer.append(genClass.getQualifiedClassName());
					} else {
						stringBuffer.append(TEXT_47);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
						stringBuffer.append(TEXT_48);
						stringBuffer.append(genClass.getFormattedName());
						stringBuffer.append(TEXT_49);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
					}
				} else if (genClassifier instanceof GenEnum) {
					GenEnum genEnum = (GenEnum) genClassifier;
					stringBuffer.append(TEXT_50);
					stringBuffer.append(genEnum.getQualifiedName());
					stringBuffer.append(TEXT_51);
					stringBuffer.append(genEnum.getFormattedName());
					stringBuffer.append(TEXT_52);
					stringBuffer.append(genEnum.getQualifiedName());
				} else if (genClassifier instanceof GenDataType) {
					GenDataType genDataType = (GenDataType) genClassifier;
					stringBuffer.append(TEXT_53);
					stringBuffer.append(genDataType.getFormattedName());
					stringBuffer.append(TEXT_54);
					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
						stringBuffer.append(TEXT_55);
						stringBuffer.append(genDataType.getRawInstanceClassName());
					}
				}
				stringBuffer.append(TEXT_56);
				stringBuffer.append(genPackage.getQualifiedPackageClassName());
				stringBuffer.append(TEXT_57);
				stringBuffer.append(genClassifier.getClassifierAccessorName());
				stringBuffer.append(TEXT_58);
				stringBuffer.append(publicStaticFinalFlag);
				stringBuffer.append(TEXT_59);
				stringBuffer.append(genPackage.getClassifierID(genClassifier));
				stringBuffer.append(TEXT_60);
				stringBuffer.append(genPackage.getClassifierValue(genClassifier));
				stringBuffer.append(TEXT_61);
				if (genClassifier instanceof GenClass) {
					GenClass genClass = (GenClass) genClassifier;
					for (GenFeature genFeature : genClass.getAllGenFeatures()) {
						stringBuffer.append(TEXT_62);
						stringBuffer.append(genFeature.getFormattedName());
						stringBuffer.append(TEXT_63);
						stringBuffer.append(genFeature.getFeatureKind());
						stringBuffer.append(TEXT_64);
						stringBuffer.append(publicStaticFinalFlag);
						stringBuffer.append(TEXT_65);
						stringBuffer.append(genClass.getFeatureID(genFeature));
						stringBuffer.append(TEXT_66);
						stringBuffer.append(genClass.getFeatureValue(genFeature));
						stringBuffer.append(TEXT_67);
					}
					stringBuffer.append(TEXT_68);
					stringBuffer.append(genClass.getFormattedName());
					stringBuffer.append(TEXT_69);
					stringBuffer.append(publicStaticFinalFlag);
					stringBuffer.append(TEXT_70);
					stringBuffer.append(genClass.getFeatureCountID());
					stringBuffer.append(TEXT_71);
					stringBuffer.append(genClass.getFeatureCountValue());
					stringBuffer.append(TEXT_72);
					if (genModel.isOperationReflection()) {
						for (GenOperation genOperation : genClass.getAllGenOperations(false)) {
							if (genClass.getOverrideGenOperation(genOperation) == null) {
								stringBuffer.append(TEXT_73);
								stringBuffer.append(genOperation.getFormattedName());
								stringBuffer.append(TEXT_74);
								stringBuffer.append(publicStaticFinalFlag);
								stringBuffer.append(TEXT_75);
								stringBuffer.append(genClass.getOperationID(genOperation, false));
								stringBuffer.append(TEXT_76);
								stringBuffer.append(genClass.getOperationValue(genOperation));
								stringBuffer.append(TEXT_77);
							}
						}
						stringBuffer.append(TEXT_78);
						stringBuffer.append(genClass.getFormattedName());
						stringBuffer.append(TEXT_79);
						stringBuffer.append(publicStaticFinalFlag);
						stringBuffer.append(TEXT_80);
						stringBuffer.append(genClass.getOperationCountID());
						stringBuffer.append(TEXT_81);
						stringBuffer.append(genClass.getOperationCountValue());
						stringBuffer.append(TEXT_82);
					}
				}
			}
		}
		if (isImplementation) {
			if (genPackage.isLoadingInitialization()) {
				stringBuffer.append(TEXT_83);
				stringBuffer.append(genPackage.getSerializedPackageFilename());
				stringBuffer.append(TEXT_84);
				stringBuffer.append(genModel.getNonNLS());
				stringBuffer.append(TEXT_85);
			}
			for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
				stringBuffer.append(TEXT_86);
				stringBuffer.append(genClassifier.getImportedMetaType());
				stringBuffer.append(TEXT_87);
				stringBuffer.append(genClassifier.getClassifierInstanceName());
				stringBuffer.append(TEXT_88);
			}
			stringBuffer.append(TEXT_89);
			stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
			stringBuffer.append(TEXT_90);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_91);
			stringBuffer.append(genPackage.getQualifiedEFactoryInstanceAccessor());
			stringBuffer.append(TEXT_92);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_93);
			if (!genPackage.isLoadedInitialization()) {
				stringBuffer.append(TEXT_94);
			}
			stringBuffer.append(TEXT_95);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_96);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_97);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
			stringBuffer.append(TEXT_98);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_99);
			if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
				stringBuffer.append(TEXT_100);
			}
			stringBuffer.append(TEXT_101);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_102);
			stringBuffer.append(genPackage.getBasicPackageName());
			stringBuffer.append(TEXT_103);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_104);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
			stringBuffer.append(TEXT_105);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_106);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
			stringBuffer.append(TEXT_107);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_108);
			if (!genPackage.getPackageSimpleDependencies().isEmpty()) {
				stringBuffer.append(TEXT_109);
				for (GenPackage dep : genPackage.getPackageSimpleDependencies()) {
					stringBuffer.append(TEXT_110);
					stringBuffer.append(dep.getImportedPackageInterfaceName());
					stringBuffer.append(TEXT_111);
				}
				stringBuffer.append(TEXT_112);
			}
			if (!genPackage.getPackageInterDependencies().isEmpty()) {
				stringBuffer.append(TEXT_113);
				for (GenPackage interdep : genPackage.getPackageInterDependencies()) {
					stringBuffer.append(TEXT_114);
					stringBuffer.append(interdep.getImportedPackageClassName());
					stringBuffer.append(TEXT_115);
					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
					stringBuffer.append(TEXT_116);
					stringBuffer.append(interdep.getImportedPackageClassName());
					stringBuffer.append(TEXT_117);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
					stringBuffer.append(TEXT_118);
					stringBuffer.append(interdep.getImportedPackageInterfaceName());
					stringBuffer.append(TEXT_119);
					stringBuffer.append(interdep.getImportedPackageClassName());
					stringBuffer.append(TEXT_120);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
					stringBuffer.append(TEXT_121);
					stringBuffer.append(interdep.getImportedPackageInterfaceName());
					stringBuffer.append(TEXT_122);
					stringBuffer.append(interdep.getImportedPackageInterfaceName());
					stringBuffer.append(TEXT_123);
				}
				stringBuffer.append(TEXT_124);
			}
			if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {
				stringBuffer.append(TEXT_125);
				if (genPackage.isLoadingInitialization()) {
					stringBuffer.append(TEXT_126);
					stringBuffer.append(genPackage.getBasicPackageName());
					stringBuffer.append(TEXT_127);
				}
				for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {
					if (interdep.isLoadingInitialization()) {
						stringBuffer.append(TEXT_128);
						stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
						stringBuffer.append(TEXT_129);
					}
				}
				stringBuffer.append(TEXT_130);
			}
			if (!genPackage.isLoadedInitialization() || !genPackage.getPackageBuildInterDependencies().isEmpty()) {
				stringBuffer.append(TEXT_131);
				if (!genPackage.isLoadedInitialization()) {
					stringBuffer.append(TEXT_132);
					stringBuffer.append(genPackage.getBasicPackageName());
					stringBuffer.append(TEXT_133);
				}
				for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {
					stringBuffer.append(TEXT_134);
					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
					stringBuffer.append(TEXT_135);
				}
				stringBuffer.append(TEXT_136);
				if (!genPackage.isLoadedInitialization()) {
					stringBuffer.append(TEXT_137);
					stringBuffer.append(genPackage.getBasicPackageName());
					stringBuffer.append(TEXT_138);
				}
				for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {
					stringBuffer.append(TEXT_139);
					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
					stringBuffer.append(TEXT_140);
				}
				stringBuffer.append(TEXT_141);
			}
			if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {
				stringBuffer.append(TEXT_142);
				if (genPackage.isLoadedInitialization()) {
					stringBuffer.append(TEXT_143);
					stringBuffer.append(genPackage.getBasicPackageName());
					stringBuffer.append(TEXT_144);
				}
				for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {
					stringBuffer.append(TEXT_145);
					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
					stringBuffer.append(TEXT_146);
				}
				stringBuffer.append(TEXT_147);
			}
			if (genPackage.hasConstraints()) {
				stringBuffer.append(TEXT_148);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
				stringBuffer.append(TEXT_149);
				stringBuffer.append(genPackage.getBasicPackageName());
				stringBuffer.append(TEXT_150);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
				stringBuffer.append(TEXT_151);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
				stringBuffer.append(TEXT_152);
				stringBuffer.append(genPackage.getImportedValidatorClassName());
				stringBuffer.append(TEXT_153);
			}
			if (!genPackage.isEcorePackage()) {
				stringBuffer.append(TEXT_154);
				stringBuffer.append(genPackage.getBasicPackageName());
				stringBuffer.append(TEXT_155);
			}
			stringBuffer.append(TEXT_156);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
			stringBuffer.append(TEXT_157);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_158);
			stringBuffer.append(genPackage.getBasicPackageName());
			stringBuffer.append(TEXT_159);
			stringBuffer.append(genPackage.getBasicPackageName());
			stringBuffer.append(TEXT_160);
			if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
				stringBuffer.append(TEXT_161);
				Set<String> helpers = new HashSet<String>();
				for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
					if (genClassifier instanceof GenClass) {
						GenClass genClass = (GenClass) genClassifier;
						if (!genClass.isDynamic()) {
							String theClass = genClass.isMapEntry() ? genClass.getImportedClassName()
									: genClass.getRawImportedInterfaceName();
							if (helpers.add(theClass)) {
								stringBuffer.append(TEXT_162);
								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
								stringBuffer.append(TEXT_163);
								stringBuffer.append(theClass);
								stringBuffer.append(TEXT_164);
								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
								stringBuffer.append(TEXT_165);
								stringBuffer.append(genClass.isMapEntry() ? genClass.getImportedClassName()
										: genClass.getRawImportedInterfaceName()
												+ genClass.getInterfaceWildTypeArguments());
								stringBuffer.append(TEXT_166);
								stringBuffer.append(theClass);
								stringBuffer.append(TEXT_167);
							}
						}
					} else if (genClassifier instanceof GenDataType) {
						GenDataType genDataType = (GenDataType) genClassifier;
						if (!genDataType.isPrimitiveType() && !genDataType.isObjectType()) {
							String theClass = genDataType.getRawImportedInstanceClassName();
							if (helpers.add(theClass)) {
								stringBuffer.append(TEXT_168);
								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
								stringBuffer.append(TEXT_169);
								stringBuffer.append(theClass);
								stringBuffer.append(TEXT_170);
								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
								stringBuffer.append(TEXT_171);
								stringBuffer.append(theClass);
								stringBuffer.append(TEXT_172);
								if (genDataType.isArrayType()) {
									String componentType = theClass;
									String indices = "";
									while (componentType.endsWith("[]")) {
										componentType = componentType.substring(0, componentType.length() - 2);
										indices += "[]";
									}
									stringBuffer.append(TEXT_173);
									stringBuffer.append(componentType);
									stringBuffer.append(TEXT_174);
									stringBuffer.append(indices);
									stringBuffer.append(TEXT_175);
								} else {
									stringBuffer.append(TEXT_176);
									stringBuffer.append(theClass);
									stringBuffer.append(TEXT_177);
								}
								stringBuffer.append(TEXT_178);
							}
						}
					}
				}
				stringBuffer.append(TEXT_179);
				stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.IsSerializable"));
				stringBuffer.append(TEXT_180);
				for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
					if (genClassifier instanceof GenClass) {
						GenClass genClass = (GenClass) genClassifier;
						if (!genClass.isDynamic()) {
							stringBuffer.append(TEXT_181);
							stringBuffer.append(genClass.isMapEntry() ? genClass.getImportedClassName()
									: genClass.getImportedWildcardInstanceClassName());
							stringBuffer.append(TEXT_182);
							stringBuffer.append(genClass.getSafeUncapName());
							stringBuffer.append(TEXT_183);
						}
					} else if (genClassifier instanceof GenDataType) {
						GenDataType genDataType = (GenDataType) genClassifier;
						if (!genDataType.isObjectType() && genDataType.isSerializable()) {
							stringBuffer.append(TEXT_184);
							stringBuffer.append(genDataType.getImportedWildcardInstanceClassName());
							stringBuffer.append(TEXT_185);
							stringBuffer.append(genDataType.getSafeUncapName());
							stringBuffer.append(TEXT_186);
						}
					}
				}
				stringBuffer.append(TEXT_187);
			}
			stringBuffer.append(TEXT_188);
		}
		if (isInterface) { // TODO REMOVE THIS BOGUS EMPTY LINE
			stringBuffer.append(TEXT_189);
		}
		for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
			if (isInterface) {
				stringBuffer.append(TEXT_190);
				if (genClassifier instanceof GenClass) {
					GenClass genClass = (GenClass) genClassifier;
					stringBuffer.append(TEXT_191);
					stringBuffer.append(genClass.getQualifiedInterfaceName());
					stringBuffer.append(TEXT_192);
					stringBuffer.append(genClass.getFormattedName());
					stringBuffer.append(TEXT_193);
					stringBuffer.append(genClass.getFormattedName());
					stringBuffer.append(TEXT_194);
					stringBuffer.append(genClass.getQualifiedInterfaceName());
					if (!genModel.isSuppressEMFModelTags()
							&& (genClass.isExternalInterface() || genClass.isDynamic())) {
						boolean first = true;
						for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(),
								"\n\r"); stringTokenizer.hasMoreTokens();) {
							String modelInfo = stringTokenizer.nextToken();
							if (first) {
								first = false;
								stringBuffer.append(TEXT_195);
								stringBuffer.append(modelInfo);
							} else {
								stringBuffer.append(TEXT_196);
								stringBuffer.append(modelInfo);
							}
						}
						if (first) {
							stringBuffer.append(TEXT_197);
						}
					}
				} else if (genClassifier instanceof GenEnum) {
					GenEnum genEnum = (GenEnum) genClassifier;
					stringBuffer.append(TEXT_198);
					stringBuffer.append(genEnum.getQualifiedName());
					stringBuffer.append(TEXT_199);
					stringBuffer.append(genEnum.getFormattedName());
					stringBuffer.append(TEXT_200);
					stringBuffer.append(genEnum.getFormattedName());
					stringBuffer.append(TEXT_201);
					stringBuffer.append(genEnum.getQualifiedName());
				} else if (genClassifier instanceof GenDataType) {
					GenDataType genDataType = (GenDataType) genClassifier;
					if (genDataType.isPrimitiveType() || genDataType.isArrayType()) {
						stringBuffer.append(TEXT_202);
						stringBuffer.append(genDataType.getFormattedName());
						stringBuffer.append(TEXT_203);
					} else {
						stringBuffer.append(TEXT_204);
						stringBuffer.append(genDataType.getRawInstanceClassName());
						stringBuffer.append(TEXT_205);
						stringBuffer.append(genDataType.getFormattedName());
						stringBuffer.append(TEXT_206);
					}
					stringBuffer.append(TEXT_207);
					stringBuffer.append(genDataType.getFormattedName());
					stringBuffer.append(TEXT_208);
					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
						stringBuffer.append(TEXT_209);
						stringBuffer.append(genDataType.getRawInstanceClassName());
					}
					if (!genModel.isSuppressEMFModelTags()) {
						boolean first = true;
						for (StringTokenizer stringTokenizer = new StringTokenizer(genDataType.getModelInfo(),
								"\n\r"); stringTokenizer.hasMoreTokens();) {
							String modelInfo = stringTokenizer.nextToken();
							if (first) {
								first = false;
								stringBuffer.append(TEXT_210);
								stringBuffer.append(modelInfo);
							} else {
								stringBuffer.append(TEXT_211);
								stringBuffer.append(modelInfo);
							}
						}
						if (first) {
							stringBuffer.append(TEXT_212);
						}
					}
				}
				stringBuffer.append(TEXT_213);
			} else {
				stringBuffer.append(TEXT_214);
			}
			if (isImplementation) {
				stringBuffer.append(TEXT_215);
				stringBuffer.append(genClassifier.getImportedMetaType());
				stringBuffer.append(TEXT_216);
				stringBuffer.append(genClassifier.getClassifierAccessorName());
				stringBuffer.append(TEXT_217);
				if (genPackage.isLoadedInitialization()) {
					stringBuffer.append(TEXT_218);
					stringBuffer.append(genClassifier.getClassifierInstanceName());
					stringBuffer.append(TEXT_219);
					stringBuffer.append(genClassifier.getClassifierInstanceName());
					stringBuffer.append(TEXT_220);
					stringBuffer.append(genClassifier.getImportedMetaType());
					stringBuffer.append(TEXT_221);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
					stringBuffer.append(TEXT_222);
					stringBuffer.append(genPackage.getImportedPackageInterfaceName());
					stringBuffer.append(TEXT_223);
					stringBuffer.append(genPackage.getLocalClassifierIndex(genClassifier));
					stringBuffer.append(TEXT_224);
				}
				stringBuffer.append(TEXT_225);
				stringBuffer.append(genClassifier.getClassifierInstanceName());
				stringBuffer.append(TEXT_226);
			} else {
				stringBuffer.append(TEXT_227);
				stringBuffer.append(genClassifier.getImportedMetaType());
				stringBuffer.append(TEXT_228);
				stringBuffer.append(genClassifier.getClassifierAccessorName());
				stringBuffer.append(TEXT_229);
			}
			if (genClassifier instanceof GenClass) {
				GenClass genClass = (GenClass) genClassifier;
				for (GenFeature genFeature : genClass.getGenFeatures()) {
					if (isInterface) {
						stringBuffer.append(TEXT_230);
						stringBuffer.append(genFeature.getFeatureKind());
						stringBuffer.append(TEXT_231);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
						if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {
							stringBuffer.append(TEXT_232);
							stringBuffer.append(genFeature.getGetAccessor());
						}
						stringBuffer.append(TEXT_233);
						stringBuffer.append(genFeature.getFormattedName());
						stringBuffer.append(TEXT_234);
						stringBuffer.append(genFeature.getFeatureKind());
						stringBuffer.append(TEXT_235);
						stringBuffer.append(genFeature.getFormattedName());
						stringBuffer.append(TEXT_236);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
						if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {
							stringBuffer.append(TEXT_237);
							stringBuffer.append(genFeature.getGetAccessor());
							stringBuffer.append(TEXT_238);
						}
						stringBuffer.append(TEXT_239);
						stringBuffer.append(genClass.getClassifierAccessorName());
						stringBuffer.append(TEXT_240);
					} else {
						stringBuffer.append(TEXT_241);
					}
					if (isImplementation) {
						stringBuffer.append(TEXT_242);
						stringBuffer.append(genFeature.getImportedMetaType());
						stringBuffer.append(TEXT_243);
						stringBuffer.append(genFeature.getFeatureAccessorName());
						stringBuffer.append(TEXT_244);
						if (!genPackage.isLoadedInitialization()) {
							stringBuffer.append(TEXT_245);
							stringBuffer.append(genFeature.getImportedMetaType());
							stringBuffer.append(TEXT_246);
							stringBuffer.append(genClass.getClassifierInstanceName());
							stringBuffer.append(TEXT_247);
							stringBuffer.append(genClass.getLocalFeatureIndex(genFeature));
							stringBuffer.append(TEXT_248);
						} else {
							stringBuffer.append(TEXT_249);
							stringBuffer.append(genFeature.getImportedMetaType());
							stringBuffer.append(TEXT_250);
							stringBuffer.append(genClassifier.getClassifierAccessorName());
							stringBuffer.append(TEXT_251);
							stringBuffer.append(genClass.getLocalFeatureIndex(genFeature));
							stringBuffer.append(TEXT_252);
						}
						stringBuffer.append(TEXT_253);
					} else {
						stringBuffer.append(TEXT_254);
						stringBuffer.append(genFeature.getImportedMetaType());
						stringBuffer.append(TEXT_255);
						stringBuffer.append(genFeature.getFeatureAccessorName());
						stringBuffer.append(TEXT_256);
					}
					stringBuffer.append(TEXT_257);
				}
				if (genModel.isOperationReflection()) {
					for (GenOperation genOperation : genClass.getGenOperations()) {
						if (isInterface) {
							stringBuffer.append(TEXT_258);
							stringBuffer.append(genClass.getQualifiedInterfaceName());
							stringBuffer.append(TEXT_259);
							stringBuffer.append(genOperation.getName());
							stringBuffer.append(TEXT_260);
							stringBuffer.append(genOperation.getParameterTypes(", "));
							stringBuffer.append(TEXT_261);
							stringBuffer.append(genOperation.getFormattedName());
							stringBuffer.append(TEXT_262);
							stringBuffer.append(genOperation.getFormattedName());
							stringBuffer.append(TEXT_263);
							stringBuffer.append(genClass.getQualifiedInterfaceName());
							stringBuffer.append(TEXT_264);
							stringBuffer.append(genOperation.getName());
							stringBuffer.append(TEXT_265);
							stringBuffer.append(genOperation.getParameterTypes(", "));
							stringBuffer.append(TEXT_266);
						} else {
							stringBuffer.append(TEXT_267);
						}
						if (isImplementation) {
							stringBuffer.append(TEXT_268);
							stringBuffer.append(genOperation.getImportedMetaType());
							stringBuffer.append(TEXT_269);
							stringBuffer.append(genOperation.getOperationAccessorName());
							stringBuffer.append(TEXT_270);
							if (!genPackage.isLoadedInitialization()) {
								stringBuffer.append(TEXT_271);
								stringBuffer.append(genClass.getClassifierInstanceName());
								stringBuffer.append(TEXT_272);
								stringBuffer.append(genClass.getLocalOperationIndex(genOperation));
								stringBuffer.append(TEXT_273);
							} else {
								stringBuffer.append(TEXT_274);
								stringBuffer.append(genClassifier.getClassifierAccessorName());
								stringBuffer.append(TEXT_275);
								stringBuffer.append(genClass.getLocalOperationIndex(genOperation));
								stringBuffer.append(TEXT_276);
							}
							stringBuffer.append(TEXT_277);
						} else {
							stringBuffer.append(TEXT_278);
							stringBuffer.append(genOperation.getImportedMetaType());
							stringBuffer.append(TEXT_279);
							stringBuffer.append(genOperation.getOperationAccessorName());
							stringBuffer.append(TEXT_280);
						}
						stringBuffer.append(TEXT_281);
					}
				}
			}
		}
		if (isInterface) {
			stringBuffer.append(TEXT_282);
		} else {
			stringBuffer.append(TEXT_283);
		}
		if (isImplementation) {
			stringBuffer.append(TEXT_284);
			stringBuffer.append(genPackage.getImportedFactoryInterfaceName());
			stringBuffer.append(TEXT_285);
			stringBuffer.append(genPackage.getFactoryName());
			stringBuffer.append(TEXT_286);
			stringBuffer.append(genPackage.getImportedFactoryInterfaceName());
			stringBuffer.append(TEXT_287);
		} else {
			stringBuffer.append(TEXT_288);
			stringBuffer.append(genPackage.getFactoryInterfaceName());
			stringBuffer.append(TEXT_289);
			stringBuffer.append(genPackage.getFactoryName());
			stringBuffer.append(TEXT_290);
		}
		stringBuffer.append(TEXT_291);
		if (isImplementation) {
			if (!genPackage.isLoadedInitialization()) {
				stringBuffer.append(TEXT_292);
				if (!genPackage.getGenClasses().isEmpty()) {
					stringBuffer.append(TEXT_293);
					for (Iterator<GenClass> c = genPackage.getGenClasses().iterator(); c.hasNext();) {
						GenClass genClass = c.next();
						stringBuffer.append(TEXT_294);
						stringBuffer.append(genClass.getClassifierInstanceName());
						stringBuffer.append(TEXT_295);
						stringBuffer.append(genClass.getMetaType());
						stringBuffer.append(TEXT_296);
						stringBuffer.append(genClass.getClassifierID());
						stringBuffer.append(TEXT_297);
						for (GenFeature genFeature : genClass.getGenFeatures()) {
							stringBuffer.append(TEXT_298);
							stringBuffer.append(genFeature.getMetaType());
							stringBuffer.append(TEXT_299);
							stringBuffer.append(genClass.getClassifierInstanceName());
							stringBuffer.append(TEXT_300);
							stringBuffer.append(genClass.getFeatureID(genFeature));
							stringBuffer.append(TEXT_301);
						}
						if (genModel.isOperationReflection()) {
							for (GenOperation genOperation : genClass.getGenOperations()) {
								stringBuffer.append(TEXT_302);
								stringBuffer.append(genClass.getClassifierInstanceName());
								stringBuffer.append(TEXT_303);
								stringBuffer.append(genClass.getOperationID(genOperation, false));
								stringBuffer.append(TEXT_304);
							}
						}
						if (c.hasNext()) {
							stringBuffer.append(TEXT_305);
						}
					}
				}
				if (!genPackage.getGenEnums().isEmpty()) {
					stringBuffer.append(TEXT_306);
					for (GenEnum genEnum : genPackage.getGenEnums()) {
						stringBuffer.append(TEXT_307);
						stringBuffer.append(genEnum.getClassifierInstanceName());
						stringBuffer.append(TEXT_308);
						stringBuffer.append(genEnum.getClassifierID());
						stringBuffer.append(TEXT_309);
					}
				}
				if (!genPackage.getGenDataTypes().isEmpty()) {
					stringBuffer.append(TEXT_310);
					for (GenDataType genDataType : genPackage.getGenDataTypes()) {
						stringBuffer.append(TEXT_311);
						stringBuffer.append(genDataType.getClassifierInstanceName());
						stringBuffer.append(TEXT_312);
						stringBuffer.append(genDataType.getClassifierID());
						stringBuffer.append(TEXT_313);
					}
				}
				stringBuffer.append(TEXT_314);

				///////////////////////
				class Information {
					@SuppressWarnings("unused")
					EGenericType eGenericType;
					int depth;
					String type;
					String accessor;
				}

				class InformationIterator {
					Iterator<?> iterator;

					InformationIterator(EGenericType eGenericType) {
						iterator = EcoreUtil.getAllContents(Collections.singleton(eGenericType));
					}

					boolean hasNext() {
						return iterator.hasNext();
					}

					Information next() {
						Information information = new Information();
						EGenericType eGenericType = information.eGenericType = (EGenericType) iterator.next();
						for (EObject container = eGenericType
								.eContainer(); container instanceof EGenericType; container = container.eContainer()) {
							++information.depth;
						}
						if (eGenericType.getEClassifier() != null) {
							GenClassifier genClassifier = genModel.findGenClassifier(eGenericType.getEClassifier());
							information.type = genPackage.getPackageInstanceVariable(genClassifier.getGenPackage())
									+ ".get" + genClassifier.getClassifierAccessorName() + "()";
						} else if (eGenericType.getETypeParameter() != null) {
							ETypeParameter eTypeParameter = eGenericType.getETypeParameter();
							if (eTypeParameter.eContainer() instanceof EClass) {
								information.type = genModel.findGenClassifier((EClass) eTypeParameter.eContainer())
										.getClassifierInstanceName() + "_" + eGenericType.getETypeParameter().getName();
							} else {
								information.type = "t" + (((EOperation) eTypeParameter.eContainer())
										.getETypeParameters().indexOf(eTypeParameter) + 1);
							}
						} else {
							information.type = "";
						}
						if (information.depth > 0) {
							if (eGenericType.eContainmentFeature().isMany()) {
								information.accessor = "getE"
										+ eGenericType.eContainmentFeature().getName().substring(1) + "().add";
							} else {
								information.accessor = "setE"
										+ eGenericType.eContainmentFeature().getName().substring(1);
							}
						}
						return information;
					}
				}
				///////////////////////
				int maxGenericTypeAssignment = 0;

				stringBuffer.append(TEXT_315);
				if (!genPackage.getPackageInitializationDependencies().isEmpty()) {
					stringBuffer.append(TEXT_316);
					for (GenPackage dep : genPackage.getPackageInitializationDependencies()) {
						stringBuffer.append(TEXT_317);
						stringBuffer.append(dep.getImportedPackageInterfaceName());
						stringBuffer.append(TEXT_318);
						stringBuffer.append(genPackage.getPackageInstanceVariable(dep));
						stringBuffer.append(TEXT_319);
						stringBuffer.append(dep.getImportedPackageInterfaceName());
						stringBuffer.append(TEXT_320);
						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
						stringBuffer.append(TEXT_321);
						stringBuffer.append(dep.getImportedPackageInterfaceName());
						stringBuffer.append(TEXT_322);
					}
				}
				if (!genPackage.getSubGenPackages().isEmpty()) {
					stringBuffer.append(TEXT_323);
					for (GenPackage sub : genPackage.getSubGenPackages()) {
						stringBuffer.append(TEXT_324);
						stringBuffer.append(genPackage.getPackageInstanceVariable(sub));
						stringBuffer.append(TEXT_325);
					}
				}
				if (!genPackage.getGenClasses().isEmpty()) {
					boolean firstOperationAssignment = true;
					int maxTypeParameterAssignment = 0;
					if (genModel.useGenerics()) {
						stringBuffer.append(TEXT_326);
						for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
							for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {
								if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty()
										|| genTypeParameter.isUsed()) {
									stringBuffer.append(TEXT_327);
									stringBuffer
											.append(genModel.getImportedName("org.eclipse.emf.ecore.ETypeParameter"));
									stringBuffer.append(TEXT_328);
									stringBuffer.append(genClassifier.getClassifierInstanceName());
									stringBuffer.append(TEXT_329);
									stringBuffer.append(genTypeParameter.getName());
									stringBuffer.append(TEXT_330);
									stringBuffer.append(genClassifier.getClassifierInstanceName());
									stringBuffer.append(TEXT_331);
									stringBuffer.append(genTypeParameter.getName());
									stringBuffer.append(TEXT_332);
									stringBuffer.append(genModel.getNonNLS());
								} else {
									stringBuffer.append(TEXT_333);
									stringBuffer.append(genClassifier.getClassifierInstanceName());
									stringBuffer.append(TEXT_334);
									stringBuffer.append(genTypeParameter.getName());
									stringBuffer.append(TEXT_335);
									stringBuffer.append(genModel.getNonNLS());
								}
							}
						}
					}
					if (genModel.useGenerics()) {
						stringBuffer.append(TEXT_336);
						for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
							for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {
								for (EGenericType bound : genTypeParameter.getEcoreTypeParameter().getEBounds()) {
									for (InformationIterator i = new InformationIterator(bound); i.hasNext();) {
										Information info = i.next();
										String prefix = "";
										if (maxGenericTypeAssignment <= info.depth) {
											++maxGenericTypeAssignment;
											prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
													+ " ";
										}
										stringBuffer.append(TEXT_337);
										stringBuffer.append(prefix);
										stringBuffer.append(TEXT_338);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_339);
										stringBuffer.append(info.type);
										stringBuffer.append(TEXT_340);
										if (info.depth > 0) {
											stringBuffer.append(TEXT_341);
											stringBuffer.append(info.depth);
											stringBuffer.append(TEXT_342);
											stringBuffer.append(info.accessor);
											stringBuffer.append(TEXT_343);
											stringBuffer.append(info.depth + 1);
											stringBuffer.append(TEXT_344);
										}
									}
									stringBuffer.append(TEXT_345);
									stringBuffer.append(genClassifier.getClassifierInstanceName());
									stringBuffer.append(TEXT_346);
									stringBuffer.append(genTypeParameter.getName());
									stringBuffer.append(TEXT_347);
								}
							}
						}
					}
					stringBuffer.append(TEXT_348);
					for (GenClass genClass : genPackage.getGenClasses()) {
						if (!genClass.hasGenericSuperTypes()) {
							for (GenClass baseGenClass : genClass.getBaseGenClasses()) {
								stringBuffer.append(TEXT_349);
								stringBuffer.append(genClass.getClassifierInstanceName());
								stringBuffer.append(TEXT_350);
								stringBuffer
										.append(genPackage.getPackageInstanceVariable(baseGenClass.getGenPackage()));
								stringBuffer.append(TEXT_351);
								stringBuffer.append(baseGenClass.getClassifierAccessorName());
								stringBuffer.append(TEXT_352);
							}
						} else {
							for (EGenericType superType : genClass.getEcoreClass().getEGenericSuperTypes()) {
								for (InformationIterator i = new InformationIterator(superType); i.hasNext();) {
									Information info = i.next();
									String prefix = "";
									if (maxGenericTypeAssignment <= info.depth) {
										++maxGenericTypeAssignment;
										prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
									}
									stringBuffer.append(TEXT_353);
									stringBuffer.append(prefix);
									stringBuffer.append(TEXT_354);
									stringBuffer.append(info.depth + 1);
									stringBuffer.append(TEXT_355);
									stringBuffer.append(info.type);
									stringBuffer.append(TEXT_356);
									if (info.depth > 0) {
										stringBuffer.append(TEXT_357);
										stringBuffer.append(info.depth);
										stringBuffer.append(TEXT_358);
										stringBuffer.append(info.accessor);
										stringBuffer.append(TEXT_359);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_360);
									}
								}
								stringBuffer.append(TEXT_361);
								stringBuffer.append(genClass.getClassifierInstanceName());
								stringBuffer.append(TEXT_362);
							}
						}
					}
					stringBuffer.append(TEXT_363);
					if (genModel.isOperationReflection()) {
						stringBuffer.append(TEXT_364);
					} else {
						stringBuffer.append(TEXT_365);
					}
					for (Iterator<GenClass> c = genPackage.getGenClasses().iterator(); c.hasNext();) {
						GenClass genClass = c.next();
						boolean hasInstanceTypeName = genModel.useGenerics()
								&& genClass.getEcoreClass().getInstanceTypeName() != null
								&& genClass.getEcoreClass().getInstanceTypeName().contains("<");
						stringBuffer.append(TEXT_366);
						stringBuffer.append(genClass.getClassifierInstanceName());
						stringBuffer.append(TEXT_367);
						if (genClass.isDynamic()) {
							stringBuffer.append(TEXT_368);
						} else {
							stringBuffer.append(genClass.getRawImportedInterfaceName());
							stringBuffer.append(TEXT_369);
						}
						stringBuffer.append(TEXT_370);
						stringBuffer.append(genClass.getName());
						stringBuffer.append(TEXT_371);
						stringBuffer.append(genClass.getAbstractFlag());
						stringBuffer.append(TEXT_372);
						stringBuffer.append(genClass.getInterfaceFlag());
						stringBuffer.append(TEXT_373);
						stringBuffer.append(genClass.getGeneratedInstanceClassFlag());
						if (hasInstanceTypeName) {
							stringBuffer.append(TEXT_374);
							stringBuffer.append(genClass.getEcoreClass().getInstanceTypeName());
							stringBuffer.append(TEXT_375);
						}
						stringBuffer.append(TEXT_376);
						stringBuffer.append(genModel.getNonNLS());
						if (hasInstanceTypeName) {
							stringBuffer.append(genModel.getNonNLS(2));
						}
						for (GenFeature genFeature : genClass.getGenFeatures()) {
							if (genFeature.hasGenericType()) {
								for (InformationIterator i = new InformationIterator(
										genFeature.getEcoreFeature().getEGenericType()); i.hasNext();) {
									Information info = i.next();
									String prefix = "";
									if (maxGenericTypeAssignment <= info.depth) {
										++maxGenericTypeAssignment;
										prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
									}
									stringBuffer.append(TEXT_377);
									stringBuffer.append(prefix);
									stringBuffer.append(TEXT_378);
									stringBuffer.append(info.depth + 1);
									stringBuffer.append(TEXT_379);
									stringBuffer.append(info.type);
									stringBuffer.append(TEXT_380);
									if (info.depth > 0) {
										stringBuffer.append(TEXT_381);
										stringBuffer.append(info.depth);
										stringBuffer.append(TEXT_382);
										stringBuffer.append(info.accessor);
										stringBuffer.append(TEXT_383);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_384);
									}
								}
							}
							if (genFeature.isReferenceType()) {
								GenFeature reverseGenFeature = genFeature.getReverse();
								String reverse = reverseGenFeature == null ? "null"
										: genPackage.getPackageInstanceVariable(reverseGenFeature.getGenPackage())
												+ ".get" + reverseGenFeature.getFeatureAccessorName() + "()";
								stringBuffer.append(TEXT_385);
								stringBuffer.append(genFeature.getFeatureAccessorName());
								stringBuffer.append(TEXT_386);
								if (genFeature.hasGenericType()) {
									stringBuffer.append(TEXT_387);
								} else {
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage()));
									stringBuffer.append(TEXT_388);
									stringBuffer.append(genFeature.getTypeClassifierAccessorName());
									stringBuffer.append(TEXT_389);
								}
								stringBuffer.append(TEXT_390);
								stringBuffer.append(reverse);
								stringBuffer.append(TEXT_391);
								stringBuffer.append(genFeature.getName());
								stringBuffer.append(TEXT_392);
								stringBuffer.append(genFeature.getDefaultValue());
								stringBuffer.append(TEXT_393);
								stringBuffer.append(genFeature.getLowerBound());
								stringBuffer.append(TEXT_394);
								stringBuffer.append(genFeature.getUpperBound());
								stringBuffer.append(TEXT_395);
								stringBuffer.append(genFeature.getContainerClass());
								stringBuffer.append(TEXT_396);
								stringBuffer.append(genFeature.getTransientFlag());
								stringBuffer.append(TEXT_397);
								stringBuffer.append(genFeature.getVolatileFlag());
								stringBuffer.append(TEXT_398);
								stringBuffer.append(genFeature.getChangeableFlag());
								stringBuffer.append(TEXT_399);
								stringBuffer.append(genFeature.getContainmentFlag());
								stringBuffer.append(TEXT_400);
								stringBuffer.append(genFeature.getResolveProxiesFlag());
								stringBuffer.append(TEXT_401);
								stringBuffer.append(genFeature.getUnsettableFlag());
								stringBuffer.append(TEXT_402);
								stringBuffer.append(genFeature.getUniqueFlag());
								stringBuffer.append(TEXT_403);
								stringBuffer.append(genFeature.getDerivedFlag());
								stringBuffer.append(TEXT_404);
								stringBuffer.append(genFeature.getOrderedFlag());
								stringBuffer.append(TEXT_405);
								stringBuffer.append(genModel.getNonNLS());
								stringBuffer.append(genModel.getNonNLS(genFeature.getDefaultValue(), 2));
								for (GenFeature keyFeature : genFeature.getKeys()) {
									stringBuffer.append(TEXT_406);
									stringBuffer.append(genFeature.getFeatureAccessorName());
									stringBuffer.append(TEXT_407);
									stringBuffer
											.append(genPackage.getPackageInstanceVariable(keyFeature.getGenPackage()));
									stringBuffer.append(TEXT_408);
									stringBuffer.append(keyFeature.getFeatureAccessorName());
									stringBuffer.append(TEXT_409);
								}
							} else {
								stringBuffer.append(TEXT_410);
								stringBuffer.append(genFeature.getFeatureAccessorName());
								stringBuffer.append(TEXT_411);
								if (genFeature.hasGenericType()) {
									stringBuffer.append(TEXT_412);
								} else {
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage()));
									stringBuffer.append(TEXT_413);
									stringBuffer.append(genFeature.getTypeClassifierAccessorName());
									stringBuffer.append(TEXT_414);
								}
								stringBuffer.append(TEXT_415);
								stringBuffer.append(genFeature.getName());
								stringBuffer.append(TEXT_416);
								stringBuffer.append(genFeature.getDefaultValue());
								stringBuffer.append(TEXT_417);
								stringBuffer.append(genFeature.getLowerBound());
								stringBuffer.append(TEXT_418);
								stringBuffer.append(genFeature.getUpperBound());
								stringBuffer.append(TEXT_419);
								stringBuffer.append(genFeature.getContainerClass());
								stringBuffer.append(TEXT_420);
								stringBuffer.append(genFeature.getTransientFlag());
								stringBuffer.append(TEXT_421);
								stringBuffer.append(genFeature.getVolatileFlag());
								stringBuffer.append(TEXT_422);
								stringBuffer.append(genFeature.getChangeableFlag());
								stringBuffer.append(TEXT_423);
								stringBuffer.append(genFeature.getUnsettableFlag());
								stringBuffer.append(TEXT_424);
								stringBuffer.append(genFeature.getIDFlag());
								stringBuffer.append(TEXT_425);
								stringBuffer.append(genFeature.getUniqueFlag());
								stringBuffer.append(TEXT_426);
								stringBuffer.append(genFeature.getDerivedFlag());
								stringBuffer.append(TEXT_427);
								stringBuffer.append(genFeature.getOrderedFlag());
								stringBuffer.append(TEXT_428);
								stringBuffer.append(genModel.getNonNLS());
								stringBuffer.append(genModel.getNonNLS(genFeature.getDefaultValue(), 2));
							}
						}
						for (GenOperation genOperation : genClass.getGenOperations()) {
							String prefix = "";
							if (genOperation.hasGenericType() || !genOperation.getGenParameters().isEmpty()
									|| !genOperation.getGenExceptions().isEmpty()
									|| !genOperation.getGenTypeParameters().isEmpty()) {
								if (firstOperationAssignment) {
									firstOperationAssignment = false;
									prefix = genModel.getImportedName("org.eclipse.emf.ecore.EOperation") + " op = ";
								} else {
									prefix = "op = ";
								}
							}
							stringBuffer.append(TEXT_429);
							if (genModel.useGenerics()) {
								stringBuffer.append(TEXT_430);
								stringBuffer.append(prefix);
								if (genModel.isOperationReflection()) {
									stringBuffer.append(TEXT_431);
									stringBuffer.append(genOperation.getOperationAccessorName());
									stringBuffer.append(TEXT_432);
								} else {
									stringBuffer.append(TEXT_433);
									stringBuffer.append(genClass.getClassifierInstanceName());
								}
								stringBuffer.append(TEXT_434);
								if (genOperation.isVoid() || genOperation.hasGenericType()) {
									stringBuffer.append(TEXT_435);
								} else {
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
									stringBuffer.append(TEXT_436);
									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
									stringBuffer.append(TEXT_437);
								}
								stringBuffer.append(TEXT_438);
								stringBuffer.append(genOperation.getName());
								stringBuffer.append(TEXT_439);
								stringBuffer.append(genOperation.getLowerBound());
								stringBuffer.append(TEXT_440);
								stringBuffer.append(genOperation.getUpperBound());
								stringBuffer.append(TEXT_441);
								stringBuffer.append(genOperation.getUniqueFlag());
								stringBuffer.append(TEXT_442);
								stringBuffer.append(genOperation.getOrderedFlag());
								stringBuffer.append(TEXT_443);
								stringBuffer.append(genModel.getNonNLS());
							} else if (!genOperation.isVoid()) {
								if (!genOperation.getEcoreOperation().isOrdered()
										|| !genOperation.getEcoreOperation().isUnique()) {
									needsAddEOperation = true;
									stringBuffer.append(TEXT_444);
									stringBuffer.append(prefix);
									if (genModel.isOperationReflection()) {
										stringBuffer.append(TEXT_445);
										stringBuffer.append(genOperation.getOperationAccessorName());
										stringBuffer.append(TEXT_446);
									} else {
										stringBuffer.append(TEXT_447);
										stringBuffer.append(genClass.getClassifierInstanceName());
									}
									stringBuffer.append(TEXT_448);
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
									stringBuffer.append(TEXT_449);
									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
									stringBuffer.append(TEXT_450);
									stringBuffer.append(genOperation.getName());
									stringBuffer.append(TEXT_451);
									stringBuffer.append(genOperation.getLowerBound());
									stringBuffer.append(TEXT_452);
									stringBuffer.append(genOperation.getUpperBound());
									stringBuffer.append(TEXT_453);
									stringBuffer.append(genOperation.getUniqueFlag());
									stringBuffer.append(TEXT_454);
									stringBuffer.append(genOperation.getOrderedFlag());
									stringBuffer.append(TEXT_455);
									stringBuffer.append(genModel.getNonNLS());
								} else {
									stringBuffer.append(TEXT_456);
									stringBuffer.append(prefix);
									if (genModel.isOperationReflection()) {
										stringBuffer.append(TEXT_457);
										stringBuffer.append(genOperation.getOperationAccessorName());
										stringBuffer.append(TEXT_458);
									} else {
										stringBuffer.append(TEXT_459);
										stringBuffer.append(genClass.getClassifierInstanceName());
									}
									stringBuffer.append(TEXT_460);
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
									stringBuffer.append(TEXT_461);
									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
									stringBuffer.append(TEXT_462);
									stringBuffer.append(genOperation.getName());
									stringBuffer.append(TEXT_463);
									stringBuffer.append(genOperation.getLowerBound());
									stringBuffer.append(TEXT_464);
									stringBuffer.append(genOperation.getUpperBound());
									stringBuffer.append(TEXT_465);
									stringBuffer.append(genModel.getNonNLS());
								}
							} else {
								stringBuffer.append(TEXT_466);
								stringBuffer.append(prefix);
								if (genModel.isOperationReflection()) {
									stringBuffer.append(TEXT_467);
									stringBuffer.append(genOperation.getOperationAccessorName());
									stringBuffer.append(TEXT_468);
								} else {
									stringBuffer.append(TEXT_469);
									stringBuffer.append(genClass.getClassifierInstanceName());
								}
								stringBuffer.append(TEXT_470);
								stringBuffer.append(genOperation.getName());
								stringBuffer.append(TEXT_471);
								stringBuffer.append(genModel.getNonNLS());
							}
							if (genModel.useGenerics()) {
								for (ListIterator<GenTypeParameter> t = genOperation.getGenTypeParameters()
										.listIterator(); t.hasNext();) {
									GenTypeParameter genTypeParameter = t.next();
									String typeParameterVariable = "";
									if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty()
											|| genTypeParameter.isUsed()) {
										if (maxTypeParameterAssignment <= t.previousIndex()) {
											++maxTypeParameterAssignment;
											typeParameterVariable = genModel
													.getImportedName("org.eclipse.emf.ecore.ETypeParameter") + " t"
													+ t.nextIndex() + " = ";
										} else {
											typeParameterVariable = "t" + t.nextIndex() + " = ";
										}
									}
									stringBuffer.append(TEXT_472);
									stringBuffer.append(typeParameterVariable);
									stringBuffer.append(TEXT_473);
									stringBuffer.append(genTypeParameter.getName());
									stringBuffer.append(TEXT_474);
									stringBuffer.append(genModel.getNonNLS());
									for (EGenericType typeParameter : genTypeParameter.getEcoreTypeParameter()
											.getEBounds()) {
										for (InformationIterator i = new InformationIterator(typeParameter); i
												.hasNext();) {
											Information info = i.next();
											String typePrefix = "";
											if (maxGenericTypeAssignment <= info.depth) {
												++maxGenericTypeAssignment;
												typePrefix = genModel
														.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
											}
											stringBuffer.append(TEXT_475);
											stringBuffer.append(typePrefix);
											stringBuffer.append(TEXT_476);
											stringBuffer.append(info.depth + 1);
											stringBuffer.append(TEXT_477);
											stringBuffer.append(info.type);
											stringBuffer.append(TEXT_478);
											if (info.depth > 0) {
												stringBuffer.append(TEXT_479);
												stringBuffer.append(info.depth);
												stringBuffer.append(TEXT_480);
												stringBuffer.append(info.accessor);
												stringBuffer.append(TEXT_481);
												stringBuffer.append(info.depth + 1);
												stringBuffer.append(TEXT_482);
											}
										}
										stringBuffer.append(TEXT_483);
										stringBuffer.append(t.nextIndex());
										stringBuffer.append(TEXT_484);
									}
								}
							}
							for (GenParameter genParameter : genOperation.getGenParameters()) {
								if (genParameter.hasGenericType()) {
									for (InformationIterator i = new InformationIterator(
											genParameter.getEcoreParameter().getEGenericType()); i.hasNext();) {
										Information info = i.next();
										String typePrefix = "";
										if (maxGenericTypeAssignment <= info.depth) {
											++maxGenericTypeAssignment;
											typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
													+ " ";
										}
										stringBuffer.append(TEXT_485);
										stringBuffer.append(typePrefix);
										stringBuffer.append(TEXT_486);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_487);
										stringBuffer.append(info.type);
										stringBuffer.append(TEXT_488);
										if (info.depth > 0) {
											stringBuffer.append(TEXT_489);
											stringBuffer.append(info.depth);
											stringBuffer.append(TEXT_490);
											stringBuffer.append(info.accessor);
											stringBuffer.append(TEXT_491);
											stringBuffer.append(info.depth + 1);
											stringBuffer.append(TEXT_492);
										}
									}
								}
								if (genModel.useGenerics()) {
									stringBuffer.append(TEXT_493);
									if (genParameter.hasGenericType()) {
										stringBuffer.append(TEXT_494);
									} else {
										stringBuffer.append(genPackage
												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
										stringBuffer.append(TEXT_495);
										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
										stringBuffer.append(TEXT_496);
									}
									stringBuffer.append(TEXT_497);
									stringBuffer.append(genParameter.getName());
									stringBuffer.append(TEXT_498);
									stringBuffer.append(genParameter.getLowerBound());
									stringBuffer.append(TEXT_499);
									stringBuffer.append(genParameter.getUpperBound());
									stringBuffer.append(TEXT_500);
									stringBuffer.append(genParameter.getUniqueFlag());
									stringBuffer.append(TEXT_501);
									stringBuffer.append(genParameter.getOrderedFlag());
									stringBuffer.append(TEXT_502);
									stringBuffer.append(genModel.getNonNLS());
								} else if (!genParameter.getEcoreParameter().isOrdered()
										|| !genParameter.getEcoreParameter().isUnique()) {
									needsAddEParameter = true;
									stringBuffer.append(TEXT_503);
									if (genParameter.hasGenericType()) {
										stringBuffer.append(TEXT_504);
									} else {
										stringBuffer.append(genPackage
												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
										stringBuffer.append(TEXT_505);
										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
										stringBuffer.append(TEXT_506);
									}
									stringBuffer.append(TEXT_507);
									stringBuffer.append(genParameter.getName());
									stringBuffer.append(TEXT_508);
									stringBuffer.append(genParameter.getLowerBound());
									stringBuffer.append(TEXT_509);
									stringBuffer.append(genParameter.getUpperBound());
									stringBuffer.append(TEXT_510);
									stringBuffer.append(genParameter.getUniqueFlag());
									stringBuffer.append(TEXT_511);
									stringBuffer.append(genParameter.getOrderedFlag());
									stringBuffer.append(TEXT_512);
									stringBuffer.append(genModel.getNonNLS());
								} else {
									stringBuffer.append(TEXT_513);
									if (genParameter.hasGenericType()) {
										stringBuffer.append(TEXT_514);
									} else {
										stringBuffer.append(genPackage
												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
										stringBuffer.append(TEXT_515);
										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
										stringBuffer.append(TEXT_516);
									}
									stringBuffer.append(TEXT_517);
									stringBuffer.append(genParameter.getName());
									stringBuffer.append(TEXT_518);
									stringBuffer.append(genParameter.getLowerBound());
									stringBuffer.append(TEXT_519);
									stringBuffer.append(genParameter.getUpperBound());
									stringBuffer.append(TEXT_520);
									stringBuffer.append(genModel.getNonNLS());
								}
							}
							if (genOperation.hasGenericExceptions()) {
								for (EGenericType genericExceptions : genOperation.getEcoreOperation()
										.getEGenericExceptions()) {
									for (InformationIterator i = new InformationIterator(genericExceptions); i
											.hasNext();) {
										Information info = i.next();
										String typePrefix = "";
										if (maxGenericTypeAssignment <= info.depth) {
											++maxGenericTypeAssignment;
											typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
													+ " ";
										}
										stringBuffer.append(TEXT_521);
										stringBuffer.append(typePrefix);
										stringBuffer.append(TEXT_522);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_523);
										stringBuffer.append(info.type);
										stringBuffer.append(TEXT_524);
										if (info.depth > 0) {
											stringBuffer.append(TEXT_525);
											stringBuffer.append(info.depth);
											stringBuffer.append(TEXT_526);
											stringBuffer.append(info.accessor);
											stringBuffer.append(TEXT_527);
											stringBuffer.append(info.depth + 1);
											stringBuffer.append(TEXT_528);
										}
										stringBuffer.append(TEXT_529);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_530);
									}
								}
							} else {
								for (GenClassifier genException : genOperation.getGenExceptions()) {
									stringBuffer.append(TEXT_531);
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genException.getGenPackage()));
									stringBuffer.append(TEXT_532);
									stringBuffer.append(genException.getClassifierAccessorName());
									stringBuffer.append(TEXT_533);
								}
							}
							if (!genOperation.isVoid() && genOperation.hasGenericType()) {
								for (InformationIterator i = new InformationIterator(
										genOperation.getEcoreOperation().getEGenericType()); i.hasNext();) {
									Information info = i.next();
									String typePrefix = "";
									if (maxGenericTypeAssignment <= info.depth) {
										++maxGenericTypeAssignment;
										typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
												+ " ";
									}
									stringBuffer.append(TEXT_534);
									stringBuffer.append(typePrefix);
									stringBuffer.append(TEXT_535);
									stringBuffer.append(info.depth + 1);
									stringBuffer.append(TEXT_536);
									stringBuffer.append(info.type);
									stringBuffer.append(TEXT_537);
									if (info.depth > 0) {
										stringBuffer.append(TEXT_538);
										stringBuffer.append(info.depth);
										stringBuffer.append(TEXT_539);
										stringBuffer.append(info.accessor);
										stringBuffer.append(TEXT_540);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_541);
									}
								}
								stringBuffer.append(TEXT_542);
							}
						}
						if (c.hasNext()) {
							stringBuffer.append(TEXT_543);
						}
					}
				}
				if (!genPackage.getGenEnums().isEmpty()) {
					stringBuffer.append(TEXT_544);
					for (Iterator<GenEnum> e = genPackage.getGenEnums().iterator(); e.hasNext();) {
						GenEnum genEnum = e.next();
						stringBuffer.append(TEXT_545);
						stringBuffer.append(genEnum.getClassifierInstanceName());
						stringBuffer.append(TEXT_546);
						stringBuffer.append(genEnum.getImportedName());
						stringBuffer.append(TEXT_547);
						stringBuffer.append(genEnum.getName());
						stringBuffer.append(TEXT_548);
						stringBuffer.append(genModel.getNonNLS());
						for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
							stringBuffer.append(TEXT_549);
							stringBuffer.append(genEnum.getClassifierInstanceName());
							stringBuffer.append(TEXT_550);
							stringBuffer.append(genEnum.getImportedName().equals(genEnum.getClassifierID())
									? genEnum.getQualifiedName() : genEnum.getImportedName());
							stringBuffer.append(TEXT_551);
							stringBuffer.append(genEnumLiteral.getEnumLiteralInstanceConstantName());
							stringBuffer.append(TEXT_552);
						}
						if (e.hasNext()) {
							stringBuffer.append(TEXT_553);
						}
					}
				}
				if (!genPackage.getGenDataTypes().isEmpty()) {
					stringBuffer.append(TEXT_554);
					for (GenDataType genDataType : genPackage.getGenDataTypes()) {
						boolean hasInstanceTypeName = genModel.useGenerics()
								&& genDataType.getEcoreDataType().getInstanceTypeName() != null
								&& genDataType.getEcoreDataType().getInstanceTypeName().contains("<");
						stringBuffer.append(TEXT_555);
						stringBuffer.append(genDataType.getClassifierInstanceName());
						stringBuffer.append(TEXT_556);
						stringBuffer.append(genDataType.getRawImportedInstanceClassName());
						stringBuffer.append(TEXT_557);
						stringBuffer.append(genDataType.getName());
						stringBuffer.append(TEXT_558);
						stringBuffer.append(genDataType.getSerializableFlag());
						stringBuffer.append(TEXT_559);
						stringBuffer.append(genDataType.getGeneratedInstanceClassFlag());
						if (hasInstanceTypeName) {
							stringBuffer.append(TEXT_560);
							stringBuffer.append(genDataType.getEcoreDataType().getInstanceTypeName());
							stringBuffer.append(TEXT_561);
						}
						stringBuffer.append(TEXT_562);
						stringBuffer.append(genModel.getNonNLS());
						if (hasInstanceTypeName) {
							stringBuffer.append(genModel.getNonNLS(2));
						}
					}
				}
				if (genPackage.getSuperGenPackage() == null) {
					stringBuffer.append(TEXT_563);
					stringBuffer.append(genPackage.getSchemaLocation());
					stringBuffer.append(TEXT_564);
				}
				if (!genPackage.isEcorePackage() && !genPackage.getAnnotationSources().isEmpty()) {
					stringBuffer.append(TEXT_565);
					for (String annotationSource : genPackage.getAnnotationSources()) {
						stringBuffer.append(TEXT_566);
						stringBuffer.append(annotationSource);
						stringBuffer.append(TEXT_567);
						stringBuffer.append(genPackage.getAnnotationSourceIdentifier(annotationSource));
						stringBuffer.append(TEXT_568);
					}
				}
				stringBuffer.append(TEXT_569);
				for (String annotationSource : genPackage.getAnnotationSources()) {
					stringBuffer.append(TEXT_570);
					stringBuffer.append(annotationSource);
					stringBuffer.append(TEXT_571);
					stringBuffer.append(genPackage.getAnnotationSourceIdentifier(annotationSource));
					stringBuffer.append(TEXT_572);
					if (annotationSource == null) {
						stringBuffer.append(TEXT_573);
					} else {
						stringBuffer.append(TEXT_574);
						stringBuffer.append(annotationSource);
						stringBuffer.append(TEXT_575);
						stringBuffer.append(genModel.getNonNLS());
					}
					for (EAnnotation eAnnotation : genPackage.getAllAnnotations()) {
						List<GenPackage.AnnotationReferenceData> annotationReferenceDataList = genPackage
								.getReferenceData(eAnnotation);
						if (annotationSource == null ? eAnnotation.getSource() == null
								: annotationSource.equals(eAnnotation.getSource())) {
							stringBuffer.append(TEXT_576);
							stringBuffer.append(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
							stringBuffer.append(TEXT_577);
							for (Iterator<Map.Entry<String, String>> k = eAnnotation.getDetails().iterator(); k
									.hasNext();) {
								Map.Entry<String, String> detail = k.next();
								String key = Literals.toStringLiteral(detail.getKey(), genModel);
								String value = Literals.toStringLiteral(detail.getValue(), genModel);
								stringBuffer.append(TEXT_578);
								stringBuffer.append(key);
								stringBuffer.append(TEXT_579);
								stringBuffer.append(value);
								stringBuffer.append(k.hasNext() ? "," : "");
								stringBuffer.append(genModel.getNonNLS(key + value));
							}
							stringBuffer.append(TEXT_580);
							if (annotationReferenceDataList.isEmpty()) {
								stringBuffer.append(TEXT_581);
							} else {
								stringBuffer.append(TEXT_582);
							}
							if (!annotationReferenceDataList.isEmpty()) {
								stringBuffer.append(TEXT_583);
								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
								stringBuffer.append(TEXT_584);
								for (Iterator<GenPackage.AnnotationReferenceData> k = annotationReferenceDataList
										.iterator(); k.hasNext();) {
									GenPackage.AnnotationReferenceData annotationReferenceData = k.next();
									stringBuffer.append(TEXT_585);
									stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
									stringBuffer.append(TEXT_586);
									if (annotationReferenceData.containingGenPackage != genPackage) {
										stringBuffer.append(annotationReferenceData.containingGenPackage
												.getImportedPackageInterfaceName());
										stringBuffer.append(TEXT_587);
									}
									stringBuffer.append(TEXT_588);
									stringBuffer.append(annotationReferenceData.uriFragment);
									stringBuffer.append(TEXT_589);
									if (k.hasNext()) {
										stringBuffer.append(TEXT_590);
									}
									stringBuffer.append(genModel.getNonNLS());
								}
								stringBuffer.append(TEXT_591);
							}
							for (EAnnotation nestedEAnnotation : genPackage.getAllNestedAnnotations(eAnnotation)) {
								String nestedAnnotationSource = nestedEAnnotation.getSource();
								int depth = 0;
								boolean nonContentAnnotation = false;
								StringBuilder path = new StringBuilder();
								for (EObject eContainer = nestedEAnnotation
										.eContainer(), child = nestedEAnnotation; child != eAnnotation; child = eContainer, eContainer = eContainer
												.eContainer()) {
									boolean nonContentChild = child
											.eContainmentFeature() != EcorePackage.Literals.EANNOTATION__CONTENTS;
									if (path.length() != 0) {
										path.insert(0, ", ");
									}
									path.insert(0, nonContentChild);
									if (nonContentChild) {
										nonContentAnnotation = true;
									}
									++depth;
								}
								List<GenPackage.AnnotationReferenceData> nestedAnnotationReferenceDataList = genPackage
										.getReferenceData(nestedEAnnotation);
								stringBuffer.append(TEXT_592);
								stringBuffer.append(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
								stringBuffer.append(TEXT_593);
								if (nonContentAnnotation
										&& genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF210_VALUE) {
									stringBuffer.append(TEXT_594);
									stringBuffer.append(path.toString());
									stringBuffer.append(TEXT_595);
								} else {
									stringBuffer.append(depth);
								}
								stringBuffer.append(TEXT_596);
								if (nestedAnnotationSource == null) {
									stringBuffer.append(TEXT_597);
								} else {
									stringBuffer.append(TEXT_598);
									stringBuffer.append(nestedAnnotationSource);
									stringBuffer.append(TEXT_599);
									stringBuffer.append(genModel.getNonNLS());
								}
								stringBuffer.append(TEXT_600);
								for (Iterator<Map.Entry<String, String>> l = nestedEAnnotation.getDetails()
										.iterator(); l.hasNext();) {
									Map.Entry<String, String> detail = l.next();
									String key = Literals.toStringLiteral(detail.getKey(), genModel);
									String value = Literals.toStringLiteral(detail.getValue(), genModel);
									stringBuffer.append(TEXT_601);
									stringBuffer.append(key);
									stringBuffer.append(TEXT_602);
									stringBuffer.append(value);
									stringBuffer.append(l.hasNext() ? "," : "");
									stringBuffer.append(genModel.getNonNLS(key + value));
								}
								stringBuffer.append(TEXT_603);
								if (nestedAnnotationReferenceDataList.isEmpty()) {
									stringBuffer.append(TEXT_604);
								} else {
									stringBuffer.append(TEXT_605);
								}
								if (!nestedAnnotationReferenceDataList.isEmpty()) {
									stringBuffer.append(TEXT_606);
									stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
									stringBuffer.append(TEXT_607);
									for (Iterator<GenPackage.AnnotationReferenceData> l = nestedAnnotationReferenceDataList
											.iterator(); l.hasNext();) {
										GenPackage.AnnotationReferenceData annotationReferenceData = l.next();
										stringBuffer.append(TEXT_608);
										stringBuffer
												.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
										stringBuffer.append(TEXT_609);
										if (annotationReferenceData.containingGenPackage != genPackage) {
											stringBuffer.append(annotationReferenceData.containingGenPackage
													.getImportedPackageInterfaceName());
											stringBuffer.append(TEXT_610);
										}
										stringBuffer.append(TEXT_611);
										stringBuffer.append(annotationReferenceData.uriFragment);
										stringBuffer.append(TEXT_612);
										if (l.hasNext()) {
											stringBuffer.append(TEXT_613);
										}
										stringBuffer.append(genModel.getNonNLS());
									}
									stringBuffer.append(TEXT_614);
								}
							}
						}
					}
					stringBuffer.append(TEXT_615);
				}
			} else {
				if (genPackage.isLoadingInitialization()) {
					stringBuffer.append(TEXT_616);
					stringBuffer.append(genModel.getImportedName("java.net.URL"));
					stringBuffer.append(TEXT_617);
					stringBuffer.append(genModel.getNonNLS());
					stringBuffer.append(TEXT_618);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
					stringBuffer.append(TEXT_619);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
					stringBuffer.append(TEXT_620);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource"));
					stringBuffer.append(TEXT_621);
					stringBuffer.append(
							genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl"));
					stringBuffer.append(TEXT_622);
					stringBuffer.append(genModel.getImportedName("java.io.IOException"));
					stringBuffer.append(TEXT_623);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.WrappedException"));
					stringBuffer.append(TEXT_624);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
					stringBuffer.append(TEXT_625);
				}
				stringBuffer.append(TEXT_626);
				if (genModel.useClassOverrideAnnotation()) {
					stringBuffer.append(TEXT_627);
				}
				stringBuffer.append(TEXT_628);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
				stringBuffer.append(TEXT_629);
				ArrayList<GenClass> dynamicGenClasses = new ArrayList<GenClass>();
				for (GenClass genClass : genPackage.getGenClasses()) {
					if (genClass.isDynamic()) {
						dynamicGenClasses.add(genClass);
					}
				}
				if (dynamicGenClasses.isEmpty()) {
					stringBuffer.append(TEXT_630);
					stringBuffer.append(genPackage.getInterfacePackageName());
					stringBuffer.append(TEXT_631);
					stringBuffer.append(genModel.getNonNLS());
					stringBuffer.append(TEXT_632);
				} else {
					stringBuffer.append(TEXT_633);
					for (GenClass genClass : dynamicGenClasses) {
						if (genClass.isDynamic()) {
							stringBuffer.append(TEXT_634);
							stringBuffer.append(genPackage.getClassifierID(genClass));
							stringBuffer.append(TEXT_635);
						}
					}
					stringBuffer.append(TEXT_636);
					stringBuffer.append(genPackage.getInterfacePackageName());
					stringBuffer.append(TEXT_637);
					stringBuffer.append(genModel.getNonNLS());
					stringBuffer.append(TEXT_638);
				}
				stringBuffer.append(TEXT_639);
			}
			if (needsAddEOperation) {
				stringBuffer.append(TEXT_640);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
				stringBuffer.append(TEXT_641);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClass"));
				stringBuffer.append(TEXT_642);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
				stringBuffer.append(TEXT_643);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
				stringBuffer.append(TEXT_644);
			}
			if (needsAddEParameter) {
				stringBuffer.append(TEXT_645);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EParameter"));
				stringBuffer.append(TEXT_646);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
				stringBuffer.append(TEXT_647);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
				stringBuffer.append(TEXT_648);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EParameter"));
				stringBuffer.append(TEXT_649);
			}
		}
		if (isInterface && genPackage.isLiteralsInterface()) {
			stringBuffer.append(TEXT_650);
			if (genModel.isOperationReflection()) {
				stringBuffer.append(TEXT_651);
			}
			stringBuffer.append(TEXT_652);
			if (isImplementation) {
				stringBuffer.append(TEXT_653);
			}
			stringBuffer.append(TEXT_654);
			for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
				stringBuffer.append(TEXT_655);
				if (genClassifier instanceof GenClass) {
					GenClass genClass = (GenClass) genClassifier;
					if (!genClass.isInterface()) {
						stringBuffer.append(TEXT_656);
						stringBuffer.append(genClass.getQualifiedClassName());
						stringBuffer.append(TEXT_657);
						stringBuffer.append(genClass.getFormattedName());
						stringBuffer.append(TEXT_658);
						stringBuffer.append(genClass.getQualifiedClassName());
					} else {
						stringBuffer.append(TEXT_659);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
						stringBuffer.append(TEXT_660);
						stringBuffer.append(genClass.getFormattedName());
						stringBuffer.append(TEXT_661);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
					}
				} else if (genClassifier instanceof GenEnum) {
					GenEnum genEnum = (GenEnum) genClassifier;
					stringBuffer.append(TEXT_662);
					stringBuffer.append(genEnum.getQualifiedName());
					stringBuffer.append(TEXT_663);
					stringBuffer.append(genEnum.getFormattedName());
					stringBuffer.append(TEXT_664);
					stringBuffer.append(genEnum.getQualifiedName());
				} else if (genClassifier instanceof GenDataType) {
					GenDataType genDataType = (GenDataType) genClassifier;
					stringBuffer.append(TEXT_665);
					stringBuffer.append(genDataType.getFormattedName());
					stringBuffer.append(TEXT_666);
					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
						stringBuffer.append(TEXT_667);
						stringBuffer.append(genDataType.getRawInstanceClassName());
					}
				}
				stringBuffer.append(TEXT_668);
				stringBuffer.append(genPackage.getQualifiedPackageClassName());
				stringBuffer.append(TEXT_669);
				stringBuffer.append(genClassifier.getClassifierAccessorName());
				stringBuffer.append(TEXT_670);
				stringBuffer.append(publicStaticFinalFlag);
				stringBuffer.append(genClassifier.getImportedMetaType());
				stringBuffer.append(TEXT_671);
				stringBuffer.append(genPackage.getClassifierID(genClassifier));
				stringBuffer.append(TEXT_672);
				stringBuffer.append(genClassifier.getClassifierAccessorName());
				stringBuffer.append(TEXT_673);
				if (genClassifier instanceof GenClass) {
					GenClass genClass = (GenClass) genClassifier;
					for (GenFeature genFeature : genClass.getGenFeatures()) {
						stringBuffer.append(TEXT_674);
						stringBuffer.append(genFeature.getFormattedName());
						stringBuffer.append(TEXT_675);
						stringBuffer.append(genFeature.getFeatureKind());
						stringBuffer.append(TEXT_676);
						stringBuffer.append(publicStaticFinalFlag);
						stringBuffer.append(genFeature.getImportedMetaType());
						stringBuffer.append(TEXT_677);
						stringBuffer.append(genClass.getFeatureID(genFeature));
						stringBuffer.append(TEXT_678);
						stringBuffer.append(genFeature.getFeatureAccessorName());
						stringBuffer.append(TEXT_679);
					}
					if (genModel.isOperationReflection()) {
						for (GenOperation genOperation : genClass.getGenOperations()) {
							stringBuffer.append(TEXT_680);
							stringBuffer.append(genOperation.getFormattedName());
							stringBuffer.append(TEXT_681);
							stringBuffer.append(publicStaticFinalFlag);
							stringBuffer.append(genOperation.getImportedMetaType());
							stringBuffer.append(TEXT_682);
							stringBuffer.append(genClass.getOperationID(genOperation, false));
							stringBuffer.append(TEXT_683);
							stringBuffer.append(genOperation.getOperationAccessorName());
							stringBuffer.append(TEXT_684);
						}
					}
				}
			}
			stringBuffer.append(TEXT_685);
		}
		stringBuffer.append(TEXT_686);
		stringBuffer.append(isInterface ? genPackage.getPackageInterfaceName() : genPackage.getPackageClassName());
		genModel.emitSortedImports();
		stringBuffer.append(TEXT_687);
		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
	}

	public boolean preCondition(PatternContext ctx) throws Exception {
		GenPackage genPackage = parameter;
		genModel = parameter.getGenModel();
		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
		canGenerate = canGenerate && (genPackage.hasClassifiers() && !genModel.isSuppressEMFMetaData()
				&& !genModel.isSuppressInterfaces());
		return canGenerate;
	}
}