// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AmazonEC2SkeletonInterface.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis2 version: 1.5.1  Built on : Oct 19, 2009 (10:59:00 EDT)
 */
    package com.amazon.ec2;
    /**
     *  AmazonEC2SkeletonInterface java skeleton interface for the axisService
     */
    public interface AmazonEC2SkeletonInterface {
     
         
        /**
         * Auto generated method signature
         * 
                                    * @param registerImage
         */

        
                public com.amazon.ec2.RegisterImageResponse registerImage
                (
                  com.amazon.ec2.RegisterImage registerImage
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteTags
         */

        
                public com.amazon.ec2.DeleteTagsResponse deleteTags
                (
                  com.amazon.ec2.DeleteTags deleteTags
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createKeyPair
         */

        
                public com.amazon.ec2.CreateKeyPairResponse createKeyPair
                (
                  com.amazon.ec2.CreateKeyPair createKeyPair
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param terminateInstances
         */

        
                public com.amazon.ec2.TerminateInstancesResponse terminateInstances
                (
                  com.amazon.ec2.TerminateInstances terminateInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeImageAttribute
         */

        
                public com.amazon.ec2.DescribeImageAttributeResponse describeImageAttribute
                (
                  com.amazon.ec2.DescribeImageAttribute describeImageAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSecurityGroups
         */

        
                public com.amazon.ec2.DescribeSecurityGroupsResponse describeSecurityGroups
                (
                  com.amazon.ec2.DescribeSecurityGroups describeSecurityGroups
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describePlacementGroups
         */

        
                public com.amazon.ec2.DescribePlacementGroupsResponse describePlacementGroups
                (
                  com.amazon.ec2.DescribePlacementGroups describePlacementGroups
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createVpnConnection
         */

        
                public com.amazon.ec2.CreateVpnConnectionResponse createVpnConnection
                (
                  com.amazon.ec2.CreateVpnConnection createVpnConnection
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param attachVpnGateway
         */

        
                public com.amazon.ec2.AttachVpnGatewayResponse attachVpnGateway
                (
                  com.amazon.ec2.AttachVpnGateway attachVpnGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createVolume
         */

        
                public com.amazon.ec2.CreateVolumeResponse createVolume
                (
                  com.amazon.ec2.CreateVolume createVolume
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param releaseAddress
         */

        
                public com.amazon.ec2.ReleaseAddressResponse releaseAddress
                (
                  com.amazon.ec2.ReleaseAddress releaseAddress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeRegions
         */

        
                public com.amazon.ec2.DescribeRegionsResponse describeRegions
                (
                  com.amazon.ec2.DescribeRegions describeRegions
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteSubnet
         */

        
                public com.amazon.ec2.DeleteSubnetResponse deleteSubnet
                (
                  com.amazon.ec2.DeleteSubnet deleteSubnet
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeVpcs
         */

        
                public com.amazon.ec2.DescribeVpcsResponse describeVpcs
                (
                  com.amazon.ec2.DescribeVpcs describeVpcs
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSpotPriceHistory
         */

        
                public com.amazon.ec2.DescribeSpotPriceHistoryResponse describeSpotPriceHistory
                (
                  com.amazon.ec2.DescribeSpotPriceHistory describeSpotPriceHistory
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeReservedInstances
         */

        
                public com.amazon.ec2.DescribeReservedInstancesResponse describeReservedInstances
                (
                  com.amazon.ec2.DescribeReservedInstances describeReservedInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeTags
         */

        
                public com.amazon.ec2.DescribeTagsResponse describeTags
                (
                  com.amazon.ec2.DescribeTags describeTags
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param importVolume
         */

        
                public com.amazon.ec2.ImportVolumeResponse importVolume
                (
                  com.amazon.ec2.ImportVolume importVolume
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSpotDatafeedSubscription
         */

        
                public com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse describeSpotDatafeedSubscription
                (
                  com.amazon.ec2.DescribeSpotDatafeedSubscription describeSpotDatafeedSubscription
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deactivateLicense
         */

        
                public com.amazon.ec2.DeactivateLicenseResponse deactivateLicense
                (
                  com.amazon.ec2.DeactivateLicense deactivateLicense
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param detachVolume
         */

        
                public com.amazon.ec2.DetachVolumeResponse detachVolume
                (
                  com.amazon.ec2.DetachVolume detachVolume
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeReservedInstancesOfferings
         */

        
                public com.amazon.ec2.DescribeReservedInstancesOfferingsResponse describeReservedInstancesOfferings
                (
                  com.amazon.ec2.DescribeReservedInstancesOfferings describeReservedInstancesOfferings
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeConversionTasks
         */

        
                public com.amazon.ec2.DescribeConversionTasksResponse describeConversionTasks
                (
                  com.amazon.ec2.DescribeConversionTasks describeConversionTasks
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteCustomerGateway
         */

        
                public com.amazon.ec2.DeleteCustomerGatewayResponse deleteCustomerGateway
                (
                  com.amazon.ec2.DeleteCustomerGateway deleteCustomerGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deletePlacementGroup
         */

        
                public com.amazon.ec2.DeletePlacementGroupResponse deletePlacementGroup
                (
                  com.amazon.ec2.DeletePlacementGroup deletePlacementGroup
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param requestSpotInstances
         */

        
                public com.amazon.ec2.RequestSpotInstancesResponse requestSpotInstances
                (
                  com.amazon.ec2.RequestSpotInstances requestSpotInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param confirmProductInstance
         */

        
                public com.amazon.ec2.ConfirmProductInstanceResponse confirmProductInstance
                (
                  com.amazon.ec2.ConfirmProductInstance confirmProductInstance
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param modifySnapshotAttribute
         */

        
                public com.amazon.ec2.ModifySnapshotAttributeResponse modifySnapshotAttribute
                (
                  com.amazon.ec2.ModifySnapshotAttribute modifySnapshotAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param purchaseReservedInstancesOffering
         */

        
                public com.amazon.ec2.PurchaseReservedInstancesOfferingResponse purchaseReservedInstancesOffering
                (
                  com.amazon.ec2.PurchaseReservedInstancesOffering purchaseReservedInstancesOffering
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param cancelConversionTask
         */

        
                public com.amazon.ec2.CancelConversionTaskResponse cancelConversionTask
                (
                  com.amazon.ec2.CancelConversionTask cancelConversionTask
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteVpnConnection
         */

        
                public com.amazon.ec2.DeleteVpnConnectionResponse deleteVpnConnection
                (
                  com.amazon.ec2.DeleteVpnConnection deleteVpnConnection
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param detachVpnGateway
         */

        
                public com.amazon.ec2.DetachVpnGatewayResponse detachVpnGateway
                (
                  com.amazon.ec2.DetachVpnGateway detachVpnGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeCustomerGateways
         */

        
                public com.amazon.ec2.DescribeCustomerGatewaysResponse describeCustomerGateways
                (
                  com.amazon.ec2.DescribeCustomerGateways describeCustomerGateways
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeLicenses
         */

        
                public com.amazon.ec2.DescribeLicensesResponse describeLicenses
                (
                  com.amazon.ec2.DescribeLicenses describeLicenses
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param revokeSecurityGroupIngress
         */

        
                public com.amazon.ec2.RevokeSecurityGroupIngressResponse revokeSecurityGroupIngress
                (
                  com.amazon.ec2.RevokeSecurityGroupIngress revokeSecurityGroupIngress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSubnets
         */

        
                public com.amazon.ec2.DescribeSubnetsResponse describeSubnets
                (
                  com.amazon.ec2.DescribeSubnets describeSubnets
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param resetSnapshotAttribute
         */

        
                public com.amazon.ec2.ResetSnapshotAttributeResponse resetSnapshotAttribute
                (
                  com.amazon.ec2.ResetSnapshotAttribute resetSnapshotAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeAddresses
         */

        
                public com.amazon.ec2.DescribeAddressesResponse describeAddresses
                (
                  com.amazon.ec2.DescribeAddresses describeAddresses
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createSecurityGroup
         */

        
                public com.amazon.ec2.CreateSecurityGroupResponse createSecurityGroup
                (
                  com.amazon.ec2.CreateSecurityGroup createSecurityGroup
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param allocateAddress
         */

        
                public com.amazon.ec2.AllocateAddressResponse allocateAddress
                (
                  com.amazon.ec2.AllocateAddress allocateAddress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param importKeyPair
         */

        
                public com.amazon.ec2.ImportKeyPairResponse importKeyPair
                (
                  com.amazon.ec2.ImportKeyPair importKeyPair
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createTags
         */

        
                public com.amazon.ec2.CreateTagsResponse createTags
                (
                  com.amazon.ec2.CreateTags createTags
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param startInstances
         */

        
                public com.amazon.ec2.StartInstancesResponse startInstances
                (
                  com.amazon.ec2.StartInstances startInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeVpnConnections
         */

        
                public com.amazon.ec2.DescribeVpnConnectionsResponse describeVpnConnections
                (
                  com.amazon.ec2.DescribeVpnConnections describeVpnConnections
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param rebootInstances
         */

        
                public com.amazon.ec2.RebootInstancesResponse rebootInstances
                (
                  com.amazon.ec2.RebootInstances rebootInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeAvailabilityZones
         */

        
                public com.amazon.ec2.DescribeAvailabilityZonesResponse describeAvailabilityZones
                (
                  com.amazon.ec2.DescribeAvailabilityZones describeAvailabilityZones
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param bundleInstance
         */

        
                public com.amazon.ec2.BundleInstanceResponse bundleInstance
                (
                  com.amazon.ec2.BundleInstance bundleInstance
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param activateLicense
         */

        
                public com.amazon.ec2.ActivateLicenseResponse activateLicense
                (
                  com.amazon.ec2.ActivateLicense activateLicense
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSnapshots
         */

        
                public com.amazon.ec2.DescribeSnapshotsResponse describeSnapshots
                (
                  com.amazon.ec2.DescribeSnapshots describeSnapshots
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createPlacementGroup
         */

        
                public com.amazon.ec2.CreatePlacementGroupResponse createPlacementGroup
                (
                  com.amazon.ec2.CreatePlacementGroup createPlacementGroup
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSpotInstanceRequests
         */

        
                public com.amazon.ec2.DescribeSpotInstanceRequestsResponse describeSpotInstanceRequests
                (
                  com.amazon.ec2.DescribeSpotInstanceRequests describeSpotInstanceRequests
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param associateAddress
         */

        
                public com.amazon.ec2.AssociateAddressResponse associateAddress
                (
                  com.amazon.ec2.AssociateAddress associateAddress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param runInstances
         */

        
                public com.amazon.ec2.RunInstancesResponse runInstances
                (
                  com.amazon.ec2.RunInstances runInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteSecurityGroup
         */

        
                public com.amazon.ec2.DeleteSecurityGroupResponse deleteSecurityGroup
                (
                  com.amazon.ec2.DeleteSecurityGroup deleteSecurityGroup
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteVpc
         */

        
                public com.amazon.ec2.DeleteVpcResponse deleteVpc
                (
                  com.amazon.ec2.DeleteVpc deleteVpc
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteVolume
         */

        
                public com.amazon.ec2.DeleteVolumeResponse deleteVolume
                (
                  com.amazon.ec2.DeleteVolume deleteVolume
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createVpnGateway
         */

        
                public com.amazon.ec2.CreateVpnGatewayResponse createVpnGateway
                (
                  com.amazon.ec2.CreateVpnGateway createVpnGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param resetInstanceAttribute
         */

        
                public com.amazon.ec2.ResetInstanceAttributeResponse resetInstanceAttribute
                (
                  com.amazon.ec2.ResetInstanceAttribute resetInstanceAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createVpc
         */

        
                public com.amazon.ec2.CreateVpcResponse createVpc
                (
                  com.amazon.ec2.CreateVpc createVpc
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteKeyPair
         */

        
                public com.amazon.ec2.DeleteKeyPairResponse deleteKeyPair
                (
                  com.amazon.ec2.DeleteKeyPair deleteKeyPair
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param stopInstances
         */

        
                public com.amazon.ec2.StopInstancesResponse stopInstances
                (
                  com.amazon.ec2.StopInstances stopInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createImage
         */

        
                public com.amazon.ec2.CreateImageResponse createImage
                (
                  com.amazon.ec2.CreateImage createImage
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeVolumes
         */

        
                public com.amazon.ec2.DescribeVolumesResponse describeVolumes
                (
                  com.amazon.ec2.DescribeVolumes describeVolumes
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeKeyPairs
         */

        
                public com.amazon.ec2.DescribeKeyPairsResponse describeKeyPairs
                (
                  com.amazon.ec2.DescribeKeyPairs describeKeyPairs
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createCustomerGateway
         */

        
                public com.amazon.ec2.CreateCustomerGatewayResponse createCustomerGateway
                (
                  com.amazon.ec2.CreateCustomerGateway createCustomerGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeImages
         */

        
                public com.amazon.ec2.DescribeImagesResponse describeImages
                (
                  com.amazon.ec2.DescribeImages describeImages
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createSubnet
         */

        
                public com.amazon.ec2.CreateSubnetResponse createSubnet
                (
                  com.amazon.ec2.CreateSubnet createSubnet
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param disassociateAddress
         */

        
                public com.amazon.ec2.DisassociateAddressResponse disassociateAddress
                (
                  com.amazon.ec2.DisassociateAddress disassociateAddress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteVpnGateway
         */

        
                public com.amazon.ec2.DeleteVpnGatewayResponse deleteVpnGateway
                (
                  com.amazon.ec2.DeleteVpnGateway deleteVpnGateway
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param cancelSpotInstanceRequests
         */

        
                public com.amazon.ec2.CancelSpotInstanceRequestsResponse cancelSpotInstanceRequests
                (
                  com.amazon.ec2.CancelSpotInstanceRequests cancelSpotInstanceRequests
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param monitorInstances
         */

        
                public com.amazon.ec2.MonitorInstancesResponse monitorInstances
                (
                  com.amazon.ec2.MonitorInstances monitorInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createSnapshot
         */

        
                public com.amazon.ec2.CreateSnapshotResponse createSnapshot
                (
                  com.amazon.ec2.CreateSnapshot createSnapshot
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param resetImageAttribute
         */

        
                public com.amazon.ec2.ResetImageAttributeResponse resetImageAttribute
                (
                  com.amazon.ec2.ResetImageAttribute resetImageAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param attachVolume
         */

        
                public com.amazon.ec2.AttachVolumeResponse attachVolume
                (
                  com.amazon.ec2.AttachVolume attachVolume
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeInstanceAttribute
         */

        
                public com.amazon.ec2.DescribeInstanceAttributeResponse describeInstanceAttribute
                (
                  com.amazon.ec2.DescribeInstanceAttribute describeInstanceAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param authorizeSecurityGroupIngress
         */

        
                public com.amazon.ec2.AuthorizeSecurityGroupIngressResponse authorizeSecurityGroupIngress
                (
                  com.amazon.ec2.AuthorizeSecurityGroupIngress authorizeSecurityGroupIngress
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param modifyInstanceAttribute
         */

        
                public com.amazon.ec2.ModifyInstanceAttributeResponse modifyInstanceAttribute
                (
                  com.amazon.ec2.ModifyInstanceAttribute modifyInstanceAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeSnapshotAttribute
         */

        
                public com.amazon.ec2.DescribeSnapshotAttributeResponse describeSnapshotAttribute
                (
                  com.amazon.ec2.DescribeSnapshotAttribute describeSnapshotAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param getConsoleOutput
         */

        
                public com.amazon.ec2.GetConsoleOutputResponse getConsoleOutput
                (
                  com.amazon.ec2.GetConsoleOutput getConsoleOutput
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeDhcpOptions
         */

        
                public com.amazon.ec2.DescribeDhcpOptionsResponse describeDhcpOptions
                (
                  com.amazon.ec2.DescribeDhcpOptions describeDhcpOptions
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param cancelBundleTask
         */

        
                public com.amazon.ec2.CancelBundleTaskResponse cancelBundleTask
                (
                  com.amazon.ec2.CancelBundleTask cancelBundleTask
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteSnapshot
         */

        
                public com.amazon.ec2.DeleteSnapshotResponse deleteSnapshot
                (
                  com.amazon.ec2.DeleteSnapshot deleteSnapshot
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createSpotDatafeedSubscription
         */

        
                public com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse createSpotDatafeedSubscription
                (
                  com.amazon.ec2.CreateSpotDatafeedSubscription createSpotDatafeedSubscription
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteSpotDatafeedSubscription
         */

        
                public com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse deleteSpotDatafeedSubscription
                (
                  com.amazon.ec2.DeleteSpotDatafeedSubscription deleteSpotDatafeedSubscription
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deregisterImage
         */

        
                public com.amazon.ec2.DeregisterImageResponse deregisterImage
                (
                  com.amazon.ec2.DeregisterImage deregisterImage
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeBundleTasks
         */

        
                public com.amazon.ec2.DescribeBundleTasksResponse describeBundleTasks
                (
                  com.amazon.ec2.DescribeBundleTasks describeBundleTasks
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param createDhcpOptions
         */

        
                public com.amazon.ec2.CreateDhcpOptionsResponse createDhcpOptions
                (
                  com.amazon.ec2.CreateDhcpOptions createDhcpOptions
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param modifyImageAttribute
         */

        
                public com.amazon.ec2.ModifyImageAttributeResponse modifyImageAttribute
                (
                  com.amazon.ec2.ModifyImageAttribute modifyImageAttribute
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeInstances
         */

        
                public com.amazon.ec2.DescribeInstancesResponse describeInstances
                (
                  com.amazon.ec2.DescribeInstances describeInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param describeVpnGateways
         */

        
                public com.amazon.ec2.DescribeVpnGatewaysResponse describeVpnGateways
                (
                  com.amazon.ec2.DescribeVpnGateways describeVpnGateways
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param deleteDhcpOptions
         */

        
                public com.amazon.ec2.DeleteDhcpOptionsResponse deleteDhcpOptions
                (
                  com.amazon.ec2.DeleteDhcpOptions deleteDhcpOptions
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param importInstance
         */

        
                public com.amazon.ec2.ImportInstanceResponse importInstance
                (
                  com.amazon.ec2.ImportInstance importInstance
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param associateDhcpOptions
         */

        
                public com.amazon.ec2.AssociateDhcpOptionsResponse associateDhcpOptions
                (
                  com.amazon.ec2.AssociateDhcpOptions associateDhcpOptions
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param unmonitorInstances
         */

        
                public com.amazon.ec2.UnmonitorInstancesResponse unmonitorInstances
                (
                  com.amazon.ec2.UnmonitorInstances unmonitorInstances
                 )
            ;
        
         
        /**
         * Auto generated method signature
         * 
                                    * @param getPasswordData
         */

        
                public com.amazon.ec2.GetPasswordDataResponse getPasswordData
                (
                  com.amazon.ec2.GetPasswordData getPasswordData
                 )
            ;
        
         }
    