/***************************************************************************************************
 * Copyright (c) 2005, 2006 IBM Corporation and others. 
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: 
 *   IBM Corporation - initial API and implementation
 *   Oracle Corporation - revision
 **************************************************************************************************/
package org.eclipse.jst.jsf.facesconfig.emf;

import org.eclipse.emf.ecore.EFactory;

/**
 * <!-- begin-user-doc -->
 * The <b>Factory</b> for the model.
 * It provides a create method for each non-abstract class of the model.
 * <!-- end-user-doc -->
 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage
 * @generated
 */
public interface FacesConfigFactory extends EFactory {
    /**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$

    /**
	 * The singleton instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	FacesConfigFactory eINSTANCE = org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigFactoryImpl.init();

    /**
	 * Returns a new object of class '<em>Absolute Ordering Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Absolute Ordering Type</em>'.
	 * @generated
	 */
	AbsoluteOrderingType createAbsoluteOrderingType();

				/**
	 * Returns a new object of class '<em>Action Listener Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Action Listener Type</em>'.
	 * @generated
	 */
	ActionListenerType createActionListenerType();

    /**
	 * Returns a new object of class '<em>Application Factory Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Application Factory Type</em>'.
	 * @generated
	 */
	ApplicationFactoryType createApplicationFactoryType();

    /**
	 * Returns a new object of class '<em>Application Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Application Type</em>'.
	 * @generated
	 */
	ApplicationType createApplicationType();

    /**
	 * Returns a new object of class '<em>Attribute Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Attribute Class Type</em>'.
	 * @generated
	 */
	AttributeClassType createAttributeClassType();

    /**
	 * Returns a new object of class '<em>Attribute Extension Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Attribute Extension Type</em>'.
	 * @generated
	 */
	AttributeExtensionType createAttributeExtensionType();

    /**
	 * Returns a new object of class '<em>Attribute Name Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Attribute Name Type</em>'.
	 * @generated
	 */
	AttributeNameType createAttributeNameType();

    /**
	 * Returns a new object of class '<em>Attribute Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Attribute Type</em>'.
	 * @generated
	 */
	AttributeType createAttributeType();

    /**
	 * Returns a new object of class '<em>Behavior Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Behavior Class Type</em>'.
	 * @generated
	 */
	BehaviorClassType createBehaviorClassType();

				/**
	 * Returns a new object of class '<em>Behavior Id Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Behavior Id Type</em>'.
	 * @generated
	 */
	BehaviorIdType createBehaviorIdType();

				/**
	 * Returns a new object of class '<em>Behavior Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Behavior Type</em>'.
	 * @generated
	 */
	BehaviorType createBehaviorType();

				/**
	 * Returns a new object of class '<em>Behavior Extension Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Behavior Extension Type</em>'.
	 * @generated
	 */
	BehaviorExtensionType createBehaviorExtensionType();

				/**
	 * Returns a new object of class '<em>Client Behavior Renderer Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Client Behavior Renderer Class Type</em>'.
	 * @generated
	 */
	ClientBehaviorRendererClassType createClientBehaviorRendererClassType();

				/**
	 * Returns a new object of class '<em>Client Behavior Renderer Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Client Behavior Renderer Type</em>'.
	 * @generated
	 */
	ClientBehaviorRendererType createClientBehaviorRendererType();

				/**
	 * Returns a new object of class '<em>Client Behavior Renderer Type Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Client Behavior Renderer Type Type</em>'.
	 * @generated
	 */
	ClientBehaviorRendererTypeType createClientBehaviorRendererTypeType();

				/**
	 * Returns a new object of class '<em>Component Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Component Class Type</em>'.
	 * @generated
	 */
	ComponentClassType createComponentClassType();

    /**
	 * Returns a new object of class '<em>Component Extension Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Component Extension Type</em>'.
	 * @generated
	 */
	ComponentExtensionType createComponentExtensionType();

    /**
	 * Returns a new object of class '<em>Component Family Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Component Family Type</em>'.
	 * @generated
	 */
	ComponentFamilyType createComponentFamilyType();

    /**
	 * Returns a new object of class '<em>Component Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Component Type</em>'.
	 * @generated
	 */
	ComponentType createComponentType();

    /**
	 * Returns a new object of class '<em>Component Type Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Component Type Type</em>'.
	 * @generated
	 */
	ComponentTypeType createComponentTypeType();

    /**
	 * Returns a new object of class '<em>Converter Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Converter Class Type</em>'.
	 * @generated
	 */
	ConverterClassType createConverterClassType();

    /**
	 * Returns a new object of class '<em>Converter For Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Converter For Class Type</em>'.
	 * @generated
	 */
	ConverterForClassType createConverterForClassType();

    /**
	 * Returns a new object of class '<em>Converter Id Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Converter Id Type</em>'.
	 * @generated
	 */
	ConverterIdType createConverterIdType();

    /**
	 * Returns a new object of class '<em>Converter Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Converter Type</em>'.
	 * @generated
	 */
	ConverterType createConverterType();

    /**
	 * Returns a new object of class '<em>Default Locale Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Default Locale Type</em>'.
	 * @generated
	 */
	DefaultLocaleType createDefaultLocaleType();

    /**
	 * Returns a new object of class '<em>Default Render Kit Id Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Default Render Kit Id Type</em>'.
	 * @generated
	 */
	DefaultRenderKitIdType createDefaultRenderKitIdType();

    /**
	 * Returns a new object of class '<em>Default Validators Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Default Validators Type</em>'.
	 * @generated
	 */
	DefaultValidatorsType createDefaultValidatorsType();

				/**
	 * Returns a new object of class '<em>Default Value Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Default Value Type</em>'.
	 * @generated
	 */
	DefaultValueType createDefaultValueType();

    /**
	 * Returns a new object of class '<em>Description Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Description Type</em>'.
	 * @generated
	 */
	DescriptionType createDescriptionType();

    /**
	 * Returns a new object of class '<em>Display Name Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Display Name Type</em>'.
	 * @generated
	 */
	DisplayNameType createDisplayNameType();

    /**
	 * Returns a new object of class '<em>Document Root</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Document Root</em>'.
	 * @generated
	 */
	DocumentRoot createDocumentRoot();

    /**
	 * Returns a new object of class '<em>Dynamic Attribute</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Dynamic Attribute</em>'.
	 * @generated
	 */
    DynamicAttribute createDynamicAttribute();

    /**
	 * Returns a new object of class '<em>Dynamic Element</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Dynamic Element</em>'.
	 * @generated
	 */
    DynamicElement createDynamicElement();

    /**
	 * Returns a new object of class '<em>EL Resolver Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>EL Resolver Type</em>'.
	 * @generated
	 */
    ELResolverType createELResolverType();

    /**
	 * Returns a new object of class '<em>Exception Handler Factory Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Exception Handler Factory Type</em>'.
	 * @generated
	 */
	ExceptionHandlerFactoryType createExceptionHandlerFactoryType();

				/**
	 * Returns a new object of class '<em>External Context Factory Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>External Context Factory Type</em>'.
	 * @generated
	 */
	ExternalContextFactoryType createExternalContextFactoryType();

				/**
	 * Returns a new object of class '<em>Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Type</em>'.
	 * @generated
	 */
	FacesConfigType createFacesConfigType();

    /**
	 * Returns a new object of class '<em>Faces Context Factory Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Faces Context Factory Type</em>'.
	 * @generated
	 */
	FacesContextFactoryType createFacesContextFactoryType();

    /**
	 * Returns a new object of class '<em>Facet Extension Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Facet Extension Type</em>'.
	 * @generated
	 */
	FacetExtensionType createFacetExtensionType();

    /**
	 * Returns a new object of class '<em>Facet Name Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Facet Name Type</em>'.
	 * @generated
	 */
	FacetNameType createFacetNameType();

    /**
	 * Returns a new object of class '<em>Facet Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Facet Type</em>'.
	 * @generated
	 */
	FacetType createFacetType();

    /**
	 * Returns a new object of class '<em>Factory Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Factory Type</em>'.
	 * @generated
	 */
	FactoryType createFactoryType();

    /**
	 * Returns a new object of class '<em>From Action Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>From Action Type</em>'.
	 * @generated
	 */
	FromActionType createFromActionType();

    /**
	 * Returns a new object of class '<em>From Outcome Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>From Outcome Type</em>'.
	 * @generated
	 */
	FromOutcomeType createFromOutcomeType();

    /**
	 * Returns a new object of class '<em>From View Id Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>From View Id Type</em>'.
	 * @generated
	 */
	FromViewIdType createFromViewIdType();

    /**
	 * Returns a new object of class '<em>Icon Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Icon Type</em>'.
	 * @generated
	 */
	IconType createIconType();

    /**
	 * Returns a new object of class '<em>If Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>If Type</em>'.
	 * @generated
	 */
	IfType createIfType();

				/**
	 * Returns a new object of class '<em>Key Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Key Class Type</em>'.
	 * @generated
	 */
	KeyClassType createKeyClassType();

    /**
	 * Returns a new object of class '<em>Key Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Key Type</em>'.
	 * @generated
	 */
	KeyType createKeyType();

    /**
	 * Returns a new object of class '<em>Large Icon Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Large Icon Type</em>'.
	 * @generated
	 */
	LargeIconType createLargeIconType();

    /**
	 * Returns a new object of class '<em>Lifecycle Factory Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Lifecycle Factory Type</em>'.
	 * @generated
	 */
	LifecycleFactoryType createLifecycleFactoryType();

    /**
	 * Returns a new object of class '<em>Lifecycle Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Lifecycle Type</em>'.
	 * @generated
	 */
	LifecycleType createLifecycleType();

    /**
	 * Returns a new object of class '<em>List Entries Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>List Entries Type</em>'.
	 * @generated
	 */
	ListEntriesType createListEntriesType();

    /**
	 * Returns a new object of class '<em>Locale Config Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Locale Config Type</em>'.
	 * @generated
	 */
	LocaleConfigType createLocaleConfigType();

    /**
	 * Returns a new object of class '<em>Managed Bean Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Managed Bean Class Type</em>'.
	 * @generated
	 */
	ManagedBeanClassType createManagedBeanClassType();

    /**
	 * Returns a new object of class '<em>Managed Bean Name Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Managed Bean Name Type</em>'.
	 * @generated
	 */
	ManagedBeanNameType createManagedBeanNameType();

    /**
	 * Returns a new object of class '<em>Managed Bean Scope Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Managed Bean Scope Type</em>'.
	 * @generated
	 */
	ManagedBeanScopeType createManagedBeanScopeType();

    /**
	 * Returns a new object of class '<em>Managed Bean Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Managed Bean Type</em>'.
	 * @generated
	 */
	ManagedBeanType createManagedBeanType();

    /**
	 * Returns a new object of class '<em>Managed Property Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Managed Property Type</em>'.
	 * @generated
	 */
	ManagedPropertyType createManagedPropertyType();

    /**
	 * Returns a new object of class '<em>Map Entries Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Map Entries Type</em>'.
	 * @generated
	 */
	MapEntriesType createMapEntriesType();

    /**
	 * Returns a new object of class '<em>Map Entry Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Map Entry Type</em>'.
	 * @generated
	 */
	MapEntryType createMapEntryType();

    /**
	 * Returns a new object of class '<em>Message Bundle Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Message Bundle Type</em>'.
	 * @generated
	 */
	MessageBundleType createMessageBundleType();

    /**
	 * Returns a new object of class '<em>Name Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Name Type</em>'.
	 * @generated
	 */
	NameType createNameType();

				/**
	 * Returns a new object of class '<em>Navigation Case Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Navigation Case Type</em>'.
	 * @generated
	 */
	NavigationCaseType createNavigationCaseType();

    /**
	 * Returns a new object of class '<em>Navigation Handler Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Navigation Handler Type</em>'.
	 * @generated
	 */
	NavigationHandlerType createNavigationHandlerType();

    /**
	 * Returns a new object of class '<em>Navigation Rule Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Navigation Rule Type</em>'.
	 * @generated
	 */
	NavigationRuleType createNavigationRuleType();

    /**
	 * Returns a new object of class '<em>Null Value Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Null Value Type</em>'.
	 * @generated
	 */
	NullValueType createNullValueType();

    /**
	 * Returns a new object of class '<em>Ordering Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Ordering Type</em>'.
	 * @generated
	 */
	OrderingType createOrderingType();

				/**
	 * Returns a new object of class '<em>Ordering Ordering Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Ordering Ordering Type</em>'.
	 * @generated
	 */
	OrderingOrderingType createOrderingOrderingType();

				/**
	 * Returns a new object of class '<em>Ordering Others Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Ordering Others Type</em>'.
	 * @generated
	 */
	OrderingOthersType createOrderingOthersType();

				/**
	 * Returns a new object of class '<em>Partial View Context Factory Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Partial View Context Factory Type</em>'.
	 * @generated
	 */
	PartialViewContextFactoryType createPartialViewContextFactoryType();

				/**
	 * Returns a new object of class '<em>Phase Listener Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Phase Listener Type</em>'.
	 * @generated
	 */
	PhaseListenerType createPhaseListenerType();

    /**
	 * Returns a new object of class '<em>Property Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Class Type</em>'.
	 * @generated
	 */
	PropertyClassType createPropertyClassType();

    /**
	 * Returns a new object of class '<em>Property Extension Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Extension Type</em>'.
	 * @generated
	 */
	PropertyExtensionType createPropertyExtensionType();

    /**
	 * Returns a new object of class '<em>Property Name Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Name Type</em>'.
	 * @generated
	 */
	PropertyNameType createPropertyNameType();

    /**
	 * Returns a new object of class '<em>Property Resolver Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Resolver Type</em>'.
	 * @generated
	 */
	PropertyResolverType createPropertyResolverType();

    /**
	 * Returns a new object of class '<em>Property Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Property Type</em>'.
	 * @generated
	 */
	PropertyType createPropertyType();

    /**
	 * Returns a new object of class '<em>Redirect Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Redirect Type</em>'.
	 * @generated
	 */
	RedirectType createRedirectType();

    /**
	 * Returns a new object of class '<em>Redirect View Param Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Redirect View Param Type</em>'.
	 * @generated
	 */
	RedirectViewParamType createRedirectViewParamType();

				/**
	 * Returns a new object of class '<em>Referenced Bean Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Referenced Bean Class Type</em>'.
	 * @generated
	 */
	ReferencedBeanClassType createReferencedBeanClassType();

    /**
	 * Returns a new object of class '<em>Referenced Bean Name Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Referenced Bean Name Type</em>'.
	 * @generated
	 */
	ReferencedBeanNameType createReferencedBeanNameType();

    /**
	 * Returns a new object of class '<em>Referenced Bean Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Referenced Bean Type</em>'.
	 * @generated
	 */
	ReferencedBeanType createReferencedBeanType();

    /**
	 * Returns a new object of class '<em>Renderer Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Renderer Class Type</em>'.
	 * @generated
	 */
	RendererClassType createRendererClassType();

    /**
	 * Returns a new object of class '<em>Renderer Extension Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Renderer Extension Type</em>'.
	 * @generated
	 */
	RendererExtensionType createRendererExtensionType();

    /**
	 * Returns a new object of class '<em>Renderer Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Renderer Type</em>'.
	 * @generated
	 */
	RendererType createRendererType();

    /**
	 * Returns a new object of class '<em>Renderer Type Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Renderer Type Type</em>'.
	 * @generated
	 */
	RendererTypeType createRendererTypeType();

    /**
	 * Returns a new object of class '<em>Render Kit Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Render Kit Class Type</em>'.
	 * @generated
	 */
	RenderKitClassType createRenderKitClassType();

    /**
	 * Returns a new object of class '<em>Render Kit Factory Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Render Kit Factory Type</em>'.
	 * @generated
	 */
	RenderKitFactoryType createRenderKitFactoryType();

    /**
	 * Returns a new object of class '<em>Render Kit Id Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Render Kit Id Type</em>'.
	 * @generated
	 */
	RenderKitIdType createRenderKitIdType();

    /**
	 * Returns a new object of class '<em>Render Kit Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Render Kit Type</em>'.
	 * @generated
	 */
	RenderKitType createRenderKitType();

    /**
	 * Returns a new object of class '<em>Small Icon Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Small Icon Type</em>'.
	 * @generated
	 */
	SmallIconType createSmallIconType();

    /**
	 * Returns a new object of class '<em>Source Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Source Class Type</em>'.
	 * @generated
	 */
	SourceClassType createSourceClassType();

				/**
	 * Returns a new object of class '<em>State Manager Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>State Manager Type</em>'.
	 * @generated
	 */
	StateManagerType createStateManagerType();

    /**
	 * Returns a new object of class '<em>Suggested Value Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Suggested Value Type</em>'.
	 * @generated
	 */
	SuggestedValueType createSuggestedValueType();

    /**
	 * Returns a new object of class '<em>Supported Locale Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Supported Locale Type</em>'.
	 * @generated
	 */
	SupportedLocaleType createSupportedLocaleType();

    /**
	 * Returns a new object of class '<em>System Event Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>System Event Class Type</em>'.
	 * @generated
	 */
	SystemEventClassType createSystemEventClassType();

				/**
	 * Returns a new object of class '<em>System Event Listener Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>System Event Listener Class Type</em>'.
	 * @generated
	 */
	SystemEventListenerClassType createSystemEventListenerClassType();

				/**
	 * Returns a new object of class '<em>System Event Listener Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>System Event Listener Type</em>'.
	 * @generated
	 */
	SystemEventListenerType createSystemEventListenerType();

				/**
	 * Returns a new object of class '<em>Tag Handler Delegate Factory Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Tag Handler Delegate Factory Type</em>'.
	 * @generated
	 */
	TagHandlerDelegateFactoryType createTagHandlerDelegateFactoryType();

				/**
	 * Returns a new object of class '<em>To View Id Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>To View Id Type</em>'.
	 * @generated
	 */
	ToViewIdType createToViewIdType();

    /**
	 * Returns a new object of class '<em>Validator Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Validator Class Type</em>'.
	 * @generated
	 */
	ValidatorClassType createValidatorClassType();

    /**
	 * Returns a new object of class '<em>Validator Id Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Validator Id Type</em>'.
	 * @generated
	 */
	ValidatorIdType createValidatorIdType();

    /**
	 * Returns a new object of class '<em>Validator Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Validator Type</em>'.
	 * @generated
	 */
	ValidatorType createValidatorType();

    /**
	 * Returns a new object of class '<em>Value Class Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Value Class Type</em>'.
	 * @generated
	 */
	ValueClassType createValueClassType();

    /**
	 * Returns a new object of class '<em>Value Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Value Type</em>'.
	 * @generated
	 */
	ValueType createValueType();

    /**
	 * Returns a new object of class '<em>Variable Resolver Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Variable Resolver Type</em>'.
	 * @generated
	 */
	VariableResolverType createVariableResolverType();

    /**
	 * Returns a new object of class '<em>View Handler Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>View Handler Type</em>'.
	 * @generated
	 */
	ViewHandlerType createViewHandlerType();

    /**
	 * Returns a new object of class '<em>Application Extension Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Application Extension Type</em>'.
	 * @generated
	 */
    ApplicationExtensionType createApplicationExtensionType();

    /**
	 * Returns a new object of class '<em>Resource Bundle Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Resource Bundle Type</em>'.
	 * @generated
	 */
    ResourceBundleType createResourceBundleType();

    /**
	 * Returns a new object of class '<em>Base Name Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Base Name Type</em>'.
	 * @generated
	 */
    BaseNameType createBaseNameType();

    /**
	 * Returns a new object of class '<em>Var Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Var Type</em>'.
	 * @generated
	 */
    VarType createVarType();

    /**
	 * Returns a new object of class '<em>View Declaration Language Factory Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>View Declaration Language Factory Type</em>'.
	 * @generated
	 */
	ViewDeclarationLanguageFactoryType createViewDeclarationLanguageFactoryType();

				/**
	 * Returns a new object of class '<em>Visit Context Factory Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Visit Context Factory Type</em>'.
	 * @generated
	 */
	VisitContextFactoryType createVisitContextFactoryType();

				/**
	 * Returns a new object of class '<em>Render Kit Extension Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Render Kit Extension Type</em>'.
	 * @generated
	 */
    RenderKitExtensionType createRenderKitExtensionType();

    /**
	 * Returns a new object of class '<em>Resource Handler Type</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Resource Handler Type</em>'.
	 * @generated
	 */
	ResourceHandlerType createResourceHandlerType();

				/**
	 * Returns a new object of class '<em>Navigation Rule Extension Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Navigation Rule Extension Type</em>'.
	 * @generated
	 */
    NavigationRuleExtensionType createNavigationRuleExtensionType();

    /**
	 * Returns a new object of class '<em>Validator Extension Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Validator Extension Type</em>'.
	 * @generated
	 */
    ValidatorExtensionType createValidatorExtensionType();

    /**
	 * Returns a new object of class '<em>Extension Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Extension Type</em>'.
	 * @generated
	 */
    FacesConfigExtensionType createFacesConfigExtensionType();

    /**
	 * Returns a new object of class '<em>Factory Extension Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Factory Extension Type</em>'.
	 * @generated
	 */
    FactoryExtensionType createFactoryExtensionType();

    /**
	 * Returns a new object of class '<em>Lifecycle Extension Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Lifecycle Extension Type</em>'.
	 * @generated
	 */
    LifecycleExtensionType createLifecycleExtensionType();

    /**
	 * Returns a new object of class '<em>Managed Bean Extension Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Managed Bean Extension Type</em>'.
	 * @generated
	 */
    ManagedBeanExtensionType createManagedBeanExtensionType();

    /**
	 * Returns a new object of class '<em>Converter Extension Type</em>'.
	 * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
	 * @return a new object of class '<em>Converter Extension Type</em>'.
	 * @generated
	 */
    ConverterExtensionType createConverterExtensionType();

    /**
	 * Returns the package supported by this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the package supported by this factory.
	 * @generated
	 */
	FacesConfigPackage getFacesConfigPackage();

} //FacesConfigFactory
