<?xml version="1.0"?>
<!--
/**
 * Copyright © 2018 CyberSource. All rights reserved.
 * See LICENSE.txt for license details.
 */
-->

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

    <!-- Payment Method Facade configuration -->
    <virtualType name="CyberSourceSAGatewayFacade" type="Magento\Payment\Model\Method\Adapter">
        <arguments>
            <argument name="code" xsi:type="const">\CyberSource\SecureAcceptance\Model\Ui\ConfigProvider::CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="valueHandlerPool" xsi:type="object">CyberSourceSAGatewayValueHandlerPool</argument>
            <argument name="commandPool" xsi:type="object">CyberSourceSAGatewayCommandPool</argument>
            <argument name="validatorPool" xsi:type="object">CyberSourceSecureAcceptanceValidatorPool</argument>
        </arguments>
    </virtualType>

    <!-- Configuration reader -->
    <type name="CyberSource\SecureAcceptance\Gateway\Config\Config">
        <arguments>
            <argument name="pathPattern" xsi:type="const">Magento\Payment\Gateway\Config\Config::DEFAULT_PATH_PATTERN</argument>
            <argument name="methodCode" xsi:type="const">CyberSource\SecureAcceptance\Model\Ui\ConfigProvider::CODE</argument>
        </arguments>
    </type>

    <!-- Commands infrastructure -->
    <virtualType name="CyberSourceSAGatewayCommandPool" type="Magento\Payment\Gateway\Command\CommandPool">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="create_token" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Command\TokenCreateRequestCommand</item>
                <item name="process_token" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Command\TokenHandleResponseCommand</item>
                <item name="initialize" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Command\Sop\InitializeCommand</item>
                <item name="authorize" xsi:type="string">CyberSourceSAGatewayAuthorizeStrategyCommand</item>
                <item name="authorize_soap" xsi:type="string">CyberSourceSAGatewaySoapAuthorizeCommand</item>
                <item name="authorize_legacy" xsi:type="string">CyberSourceSAGatewayAuthorizeCommand</item>
                <item name="sop_request" xsi:type="string">CyberSourceSAGatewayAuthorizeRequestCommand</item>
                <item name="sop_handle_response" xsi:type="string">CyberSourceSAGatewayAuthorizeHandleResponseCommand</item>
                <item name="capture" xsi:type="string">CyberSourceSACaptureStrategyCommand</item>
                <item name="settlement" xsi:type="string">CyberSourceSAGatewaySoapCaptureCommand</item>
                <item name="sale" xsi:type="string">CyberSourceSAGatewaySaleStrategyCommand</item>
                <item name="sale_soap" xsi:type="string">CyberSourceSAGatewaySoapSaleCommand</item>
                <item name="sale_legacy" xsi:type="string">CyberSourceSASaleCommand</item>
                <item name="subscription_retrieve" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Command\RetrieveSubscriptionCommand</item>
                <item name="void" xsi:type="string">CyberSourceSAGatewayCancelCommand</item>
                <item name="void_payment" xsi:type="string">CyberSourceSAGatewayVoidCommand</item>
                <item name="cancel" xsi:type="string">CyberSourceSAGatewayCancelCommand</item>
                <item name="refund" xsi:type="string">CyberSourceSAGatewayRefundCommand</item>
                <item name="vault_refund" xsi:type="string">CyberSourceSAGatewayRefundCommand</item>
                <item name="vault_authorize" xsi:type="string">CyberSourceSAGatewaySoapVaultAuthorizeCommand</item>
                <item name="vault_sale" xsi:type="string">CyberSourceSAGatewaySoapVaultSaleCommand</item>
                <item name="generate_flex_key" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Command\Flex\GenerateKeyCommand</item>
            </argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\SecureAcceptance\Gateway\Command\LegacyStrategyCommand">
        <arguments>
            <argument name="commandPool" xsi:type="object">CyberSourceSAGatewayCommandPool</argument>
            <argument name="config" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <virtualType name="CyberSourceSAGatewayAuthorizeStrategyCommand" type="CyberSource\SecureAcceptance\Gateway\Command\LegacyStrategyCommand">
        <arguments>
            <argument name="command" xsi:type="string">authorize_soap</argument>
            <argument name="legacyCommand" xsi:type="string">authorize_legacy</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewaySaleStrategyCommand" type="CyberSource\SecureAcceptance\Gateway\Command\LegacyStrategyCommand">
        <arguments>
            <argument name="command" xsi:type="string">sale_soap</argument>
            <argument name="legacyCommand" xsi:type="string">sale_legacy</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSACaptureStrategyCommand" type="CyberSource\SecureAcceptance\Gateway\Command\CaptureStrategyCommand">
        <arguments>
            <argument name="commandPool" xsi:type="object">CyberSourceSAGatewayCommandPool</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAVoidStrategyCommand" type="CyberSource\SecureAcceptance\Gateway\Command\VoidStrategyCommand">
        <arguments>
            <argument name="commandPool" xsi:type="object">CyberSourceSAGatewayCommandPool</argument>
        </arguments>
    </virtualType>

    <!-- Authorize SOP command legacy -->
    <virtualType name="CyberSourceSAGatewayAuthorizeCommand" type="Magento\Payment\Gateway\Command\NullCommand"/>

    <!-- Authorize SOAP command -->
    <virtualType name="CyberSourceSAGatewaySoapAuthorizeCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceSAGatewaySoapAuthorizeRequestBuilder</argument>
            <argument name="handler" xsi:type="object">CyberSourceSAGatewaySoapAuthorizationHandler</argument>
            <argument name="validator" xsi:type="object">CyberSourceSAGatewayAuthorizeValidator</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\Client\SOAPClient</argument>
            <argument name="errorMessageMapper" xsi:type="object">CyberSource\Core\Gateway\ErrorMapper\ConfigurableMapper</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewaySoapVaultAuthorizeCommand" type="CyberSourceSAGatewaySoapAuthorizeCommand"/>

    <virtualType name="CyberSourceSAGatewayAuthorizeRequestCommand" type="CyberSource\Core\Gateway\Command\CreateRequestCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceSAGatewaySopAuthorizeRequestBuilder</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayAuthorizeHandleResponseCommand" type="CyberSource\Core\Gateway\Command\HandleResponseCommand">
        <arguments>
            <argument name="validator" xsi:type="object">CyberSourceSAGatewayAuthorizeSopValidator</argument>
            <argument name="handler" xsi:type="object">CyberSourceSAAuthorizationHandler</argument>
            <argument name="errorHandler" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Response\Sop\FailsHandler</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayAuthorizeSopValidator" type="Magento\Payment\Gateway\Validator\ValidatorComposite">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="reasonCode" xsi:type="string">\CyberSource\SecureAcceptance\Gateway\Validator\ResponseCodeValidator</item>
                <item name="quote" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Validator\Sop\QuoteValidator</item>
                <item name="signature" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Validator\Sop\SignatureValidator</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayAuthorizeValidator" type="Magento\Payment\Gateway\Validator\ValidatorComposite">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="responseCodeValidator" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Validator\SoapReasonCodeValidator</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewaySoapAuthorizeRequestBuilder" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="merchantData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\MerchantDataBuilder</item>
                <item name="paymentData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\PaymentDataBuilder</item>
                <item name="addressData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\AddressDataBuilder</item>
                <item name="itemsData" xsi:type="string">CyberSourceSAGatewayAuthorizeItemsDataBuilder</item>
                <item name="ccAuthService" xsi:type="string">CyberSourceSAGatewayCcAuthServiceRequest</item>
                <item name="mddBuilder" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\DecisionManagerMddBuilder</item>
                <item name="tokenBuilderStrategy" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Flex\BuilderStrategy</item>
                <item name="transientToken" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\TransientTokenBuilder</item>
                <item name="businessRulesBuilder" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\BusinessRulesBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewaySopAuthorizeRequestBuilder" type="CyberSource\SecureAcceptance\Gateway\Request\Sop\SignatureDecorator">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="merchantData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\MerchantDataBuilder</item>
                <item name="paymentData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\PaymentDataBuilder</item>
                <item name="addressData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\AddressDataBuilder</item>
                <item name="transactionType" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\TransactionTypeBuilder</item>
                <item name="cardData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\CardDataBuilder</item>
                <item name="sid" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\SidBuilder</item>
                <item name="itemsData" xsi:type="string">CyberSourceSAGatewaySopAuthorizeItemsBuilder</item>
                <item name="mddBuilder" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\MddBuilder</item>
                <item name="businessRulesBuilder" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\BusinessRulesBuilder</item>
                <item name="receiptPagesBuilder" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\ReceiptPageUrlBuilder</item>
                <item name="paBuilder" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\PaBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewaySopAuthorizeItemsBuilder" type="CyberSource\SecureAcceptance\Gateway\Request\Sop\ItemIdDecorator">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="orderItems" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\ItemsDataBuilder</item>
                <item name="shippingItem" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Sop\ShippingItemBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\SecureAcceptance\Gateway\Request\Flex\BuilderStrategy">
        <arguments>
            <argument name="microformBuilder" xsi:type="object">CyberSourceSecureAcceptanceGatewayRequestFlexBuilder</argument>
            <argument name="standardBuilder" xsi:type="object">CyberSourceSecureAcceptanceGatewayRequestNonFlexBuilder</argument>
        </arguments>
    </type>

    <virtualType name="CyberSourceSecureAcceptanceGatewayRequestFlexBuilder" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="transientToken" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\TransientTokenBuilder</item>
                <item name="cardDataBuilder" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\CardDataBuilder</item>
                <item name="cvnBuilder" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\CvnBuilder</item>
                <item name="microformSubscriptionCreate" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\MicroformSubscriptionStrategy</item>
            </argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\SecureAcceptance\Gateway\Request\Soap\MicroformSubscriptionStrategy">
        <arguments>
            <argument name="subscriptionCreateBuilder" xsi:type="object">CyberSourceSecureAcceptanceGatewayRequestSoapMicroformSubscriptionCreate</argument>
        </arguments>
    </type>

    <virtualType name="CyberSourceSecureAcceptanceGatewayRequestSoapMicroformSubscriptionCreate" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="subscriptionCreateService" xsi:type="string">CyberSourceSecureAcceptanceGatewayRequestSubscriptionCreateService</item>
                <item name="subscriptionCreateFrequency" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\SubscriptionFrequencyBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSecureAcceptanceGatewayRequestSubscriptionCreateService" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ServiceRequest">
        <arguments>
            <argument name="serviceName" xsi:type="string">paySubscriptionCreateService</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSecureAcceptanceGatewayRequestNonFlexBuilder" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="subscriptionId" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\SubscriptionBuilder</item>
                <item name="cardDataBuilder" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\CardDataBuilder</item>
                <item name="cvnBuilder" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\CvnBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayCcAuthServiceRequest" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ServiceRequest">
        <arguments>
            <argument name="serviceName" xsi:type="string">ccAuthService</argument>
        </arguments>
    </virtualType>

    <!-- Capture Service Request -->
    <virtualType name="CyberSourceSAGatewayCcCaptureServiceRequest" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ServiceRequest">
        <arguments>
            <argument name="serviceName" xsi:type="string">ccCaptureService</argument>
        </arguments>
    </virtualType>

    <!-- Settlement Service Request -->
    <virtualType name="CyberSourceSAGatewayCcSettlementServiceRequest" type="CyberSourceSAGatewayCcCaptureServiceRequest">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="parentTransactionIdBuilder" xsi:type="string">CyberSourceSAGatewayCaptureParentTransactionIdBuilder</item>
                <item name="captureSequenceBuilder" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\CaptureSequenceBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayCaptureParentTransactionIdBuilder" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ParentTransactionIdBuilder">
        <arguments>
            <argument name="parentTransactionName" xsi:type="string">authRequestID</argument>
        </arguments>
    </virtualType>

    <!-- Authorize Handler -->
    <virtualType name="CyberSourceSAAuthorizationHandler" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="order" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\AuthorizeResponseHandler</item>
                <item name="vault_details" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\VaultDetailsHandler</item>
                <item name="raw_details" xsi:type="string">CyberSource\Core\Gateway\Response\RawDetailsHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewaySoapAuthorizationHandler" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="transactionDetails" xsi:type="string">CyberSourceSASoapAuthorizeTransactionDetailsHandler</item>
                <item name="additionalInfo" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\Soap\AdditionalInfoHandler</item>
                <item name="dmDetails" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\Soap\DecisionManagerHandler</item>
                <item name="cc_info" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\Soap\CcDataHandler</item>
                <item name="subscription_create" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\Soap\SubscriptionCreateHandler</item>
                <item name="microformTokenHandler" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\Soap\TokenHandler</item>
                <item name="vault_details" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\VaultDetailsHandler</item>
                <item name="vault_cc_info" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\Soap\VaultCcInfoHandler</item>
                <item name="clean_handle" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\Soap\CleanSessionHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSASoapAuthorizeTransactionDetailsHandler" type="CyberSource\SecureAcceptance\Gateway\Response\Soap\TransactionDetailsHandler">
        <arguments>
            <argument name="shouldCloseTransaction" xsi:type="boolean">false</argument>
            <argument name="shouldCloseParentTransaction" xsi:type="boolean">false</argument>
        </arguments>
    </virtualType>

    <!-- Authorization Request -->
    <type name="CyberSource\SecureAcceptance\Gateway\Request\AuthorizationRequest">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <!-- Capture command -->
    <virtualType name="CyberSourceSAGatewayCaptureCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Request\CaptureRequest</argument>
            <argument name="handler" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Response\CaptureResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Validator\SoapReasonCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\Client\SOAPClient</argument>
            <argument name="errorMessageMapper" xsi:type="object">CyberSource\Core\Gateway\ErrorMapper\ConfigurableMapper</argument>
        </arguments>
    </virtualType>

    <!-- Capture Request -->
    <type name="CyberSource\SecureAcceptance\Gateway\Request\CaptureRequest">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <!-- Sale command -->
    <virtualType name="CyberSourceSASaleCommand" type="Magento\Payment\Gateway\Command\NullCommand"/>

    <!-- Sale Handler -->
    <virtualType name="CyberSourceSASaleHandler" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="order" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\SaleResponseHandler</item>
                <item name="vault_details" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\VaultDetailsHandler</item>
                <item name="raw_details" xsi:type="string">CyberSource\Core\Gateway\Response\RawDetailsHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Sale Legacy Request -->
    <virtualType name="CyberSourceSASaleRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="authorize" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\AuthorizationRequest</item>
                <item name="settlement" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\SettlementRequest</item>
            </argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\SecureAcceptance\Gateway\Request\SaleRequest">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Config\Config</argument>
        </arguments>
    </type>

    <!-- Void command -->
    <virtualType name="CyberSourceSAGatewayVoidCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceSAGatewayVoidRequest</argument>
            <argument name="handler" xsi:type="object">CyberSourceSAVoidResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Validator\SoapReasonCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\Client\SOAPClient</argument>
        </arguments>
    </virtualType>

    <!-- Void Request -->
    <virtualType name="CyberSourceSAGatewayVoidRequest"  type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="merchantData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\MerchantDataBuilder</item>
                <item name="paymentData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\PaymentDataBuilder</item>
                <item name="voidService" xsi:type="string">CyberSourceSAGatewayVoidServiceRequest</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayVoidServiceRequest" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ServiceRequest">
        <arguments>
            <argument name="serviceName" xsi:type="string">voidService</argument>
            <argument name="builders" xsi:type="array">
                <item name="parentTransactionIdBuilder" xsi:type="string">CyberSourceSAGatewayVoidParentTransactionIdBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayVoidParentTransactionIdBuilder" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ParentTransactionIdBuilder">
        <arguments>
            <argument name="parentTransactionName" xsi:type="string">voidRequestID</argument>
        </arguments>
    </virtualType>

    <!-- Void Response -->
    <virtualType name="CyberSourceSAVoidResponseHandler" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="transactionDetails" xsi:type="string">CyberSourceSAVoidTransactionDetailsHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAVoidTransactionDetailsHandler" type="CyberSource\SecureAcceptance\Gateway\Response\Soap\TransactionDetailsHandler">
        <arguments>
            <argument name="shouldCloseTransaction" xsi:type="boolean">true</argument>
            <argument name="shouldCloseParentTransaction" xsi:type="boolean">true</argument>
        </arguments>
    </virtualType>

    <!-- Cancel command -->
    <virtualType name="CyberSourceSAGatewayCancelCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceSAGatewayCancelRequest</argument>
            <!-- cancel responce handler the same as void-->
            <argument name="handler" xsi:type="object">CyberSourceSAVoidResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Validator\SoapReasonCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\Client\SOAPClient</argument>
        </arguments>
    </virtualType>

    <!-- Cancel Request -->
    <virtualType name="CyberSourceSAGatewayCancelRequest"  type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="merchantData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\MerchantDataBuilder</item>
                <item name="paymentData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\PaymentDataBuilder</item>
                <item name="cancelService" xsi:type="string">CyberSourceSAGatewayCancelServiceRequest</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayCancelServiceRequest" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ServiceRequest">
        <arguments>
            <argument name="serviceName" xsi:type="string">ccAuthReversalService</argument>
            <argument name="builders" xsi:type="array">
                <item name="parentTransactionIdBuilder" xsi:type="string">CyberSourceSAGatewayCancelParentTransactionIdBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayCancelParentTransactionIdBuilder" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ParentTransactionIdBuilder">
        <arguments>
            <argument name="parentTransactionName" xsi:type="string">authRequestID</argument>
        </arguments>
    </virtualType>

    <!-- Refund command -->
    <virtualType name="CyberSourceSAGatewayRefundCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceSAGatewayRefundRequest</argument>
            <argument name="handler" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Response\RefundResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Validator\SoapReasonCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\Client\SOAPClient</argument>
        </arguments>
    </virtualType>

    <!-- Refund Request -->
    <virtualType name="CyberSourceSAGatewayRefundRequest"  type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="merchantData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\MerchantDataBuilder</item>
                <item name="paymentData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\PaymentDataBuilder</item>
                <item name="itemsData" xsi:type="string">CyberSourceSAGatewayRefundItemsDataBuilder</item>
                <item name="ccRefundService" xsi:type="string">CyberSourceSAGatewayCcRefundServiceRequest</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayRefundItemsDataBuilder" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ItemsDataBuilder">
        <arguments>
            <argument name="objectName" xsi:type="string">creditmemo</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayCcRefundServiceRequest" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ServiceRequest">
        <arguments>
            <argument name="serviceName" xsi:type="string">ccCreditService</argument>
            <argument name="builders" xsi:type="array">
                <item name="parentTransactionIdBuilder" xsi:type="string">CyberSourceSAGatewayRefundParentTransactionIdBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayRefundParentTransactionIdBuilder" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ParentTransactionIdBuilder">
        <arguments>
            <argument name="parentTransactionName" xsi:type="string">captureRequestID</argument>
        </arguments>
    </virtualType>

    <!-- Response handlers -->
    <virtualType name="CyberSourceSAGatewayResponseHandlerComposite" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="authorizeresponse" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\AuthorizeResponseHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <!-- Value handlers infrastructure -->
    <virtualType name="CyberSourceSAGatewayValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">CyberSourceSAGatewayConfigValueHandler</item>
                <item name="can_initialize" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Config\CanInitializeHandler</item>
                <item name="can_void" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Config\CanVoidHandler</item>
                <item name="can_cancel" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Config\CanVoidHandler</item>
                <item name="sandbox_flag" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Config\SandboxFlagHandler</item>
                <item name="cgi_url_test_mode" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Config\CgiTestUrlHandler</item>
                <item name="cgi_url" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Config\CgiUrlHandler</item>
                <item name="useccv" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Config\UseCcvHandler</item>
                <item name="place_order_url" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Config\PlaceOrderUrlHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="CyberSourceSAGatewayConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Config\Config</argument>
        </arguments>
    </virtualType>

    <!-- Vault -->
    <virtualType name="CyberSourceSAVaultPaymentConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">CyberSource\SecureAcceptance\Model\Ui\ConfigProvider::CC_VAULT_CODE</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSACreditCardVaultFacade" type="Magento\Vault\Model\Method\Vault">
        <arguments>
            <argument name="config" xsi:type="object">CyberSourceSAVaultPaymentConfig</argument>
            <argument name="valueHandlerPool" xsi:type="object">CyberSourceSAVaultPaymentValueHandlerPool</argument>
            <argument name="vaultProvider" xsi:type="object">CyberSourceSAGatewayFacade</argument>
            <argument name="code" xsi:type="const">CyberSource\SecureAcceptance\Model\Ui\ConfigProvider::CC_VAULT_CODE</argument>
            <argument name="commandManagerPool" xsi:type="object">CyberSourceSACcVaultCommandManagerPool</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayAuthorizeItemsDataBuilder" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ItemsDataBuilder">
        <arguments>
            <argument name="objectName" xsi:type="string">order</argument>
        </arguments>
    </virtualType>

    <!-- Capture Soap command -->
    <virtualType name="CyberSourceSAGatewaySoapCaptureCommand" type="CyberSourceSAGatewaySoapAuthorizeCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceSAGatewaySoapCaptureRequestBuilder</argument>
            <argument name="handler" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Response\CaptureResponseHandler</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewaySoapCaptureRequestBuilder"  type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="merchantData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\MerchantDataBuilder</item>
                <item name="paymentData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\PaymentDataBuilder</item>
                <item name="itemsData" xsi:type="string">CyberSourceSAGatewayCaptureItemsDataBuilder</item>
                <item name="ccCaptureService" xsi:type="string">CyberSourceSAGatewayCcSettlementServiceRequest</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayCaptureItemsDataBuilder" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ItemsDataBuilder">
        <arguments>
            <argument name="objectName" xsi:type="string">invoice</argument>
        </arguments>
    </virtualType>

    <!-- Sale Soap Command -->
    <virtualType name="CyberSourceSAGatewaySoapSaleCommand" type="CyberSourceSAGatewaySoapAuthorizeCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceSAGatewaySoapSaleRequest</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewaySoapVaultSaleCommand" type="CyberSourceSAGatewaySoapSaleCommand"/>

    <!-- Sale Request -->
    <virtualType name="CyberSourceSAGatewaySoapSaleRequest"  type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="authorize" xsi:type="string">CyberSourceSAGatewaySoapAuthorizeRequestBuilder</item>
                <item name="capture" xsi:type="string">CyberSourceSAGatewayCcCaptureServiceRequest</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSACommandManager" type="Magento\Payment\Gateway\Command\CommandManager">
        <arguments>
            <argument name="commandPool" xsi:type="object">CyberSourceSAGatewayCommandPool</argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\SecureAcceptance\Controller\SecureAcceptance\TokenRequest">
        <arguments>
            <argument name="commandManager" xsi:type="object">CyberSourceSACommandManager</argument>
            <argument name="sessionManager" xsi:type="object">Magento\Checkout\Model\Session</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Controller\SecureAcceptance\TokenProcess">
        <arguments>
            <argument name="commandManager" xsi:type="object">CyberSourceSACommandManager</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Controller\Index\LoadSilentData">
        <arguments>
            <argument name="commandManager" xsi:type="object">CyberSourceSACommandManager</argument>
            <argument name="sessionManager" xsi:type="object">Magento\Checkout\Model\Session</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Controller\Index\Cancel">
        <arguments>
            <argument name="checkoutSession" xsi:type="object">Magento\Checkout\Model\Session</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Command\TokenCreateRequestCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Request\Sop\CreateTokenRequest</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Request\Sop\CreateTokenRequest">
        <arguments>
            <argument name="configProvider" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Config\SaConfigProviderNonPa</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Command\TokenHandleResponseCommand">
        <arguments>
            <argument name="handler" xsi:type="object">CyberSourceSecureAcceptanceGatewayCreateTokenHandler</argument>
            <argument name="validator" xsi:type="object">CyberSourceSecureAcceptanceGatewayCreateTokenValidator</argument>
        </arguments>
    </type>

    <virtualType name="CyberSourceSecureAcceptanceGatewayCreateTokenValidator" type="Magento\Payment\Gateway\Validator\ValidatorComposite">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="reasonCode" xsi:type="string">\CyberSource\SecureAcceptance\Gateway\Validator\ResponseCodeValidator</item>
                <item name="quote" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Validator\Sop\QuoteValidator</item>
                <item name="signature" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Validator\Sop\SignatureValidator</item>
                <item name="transactionType" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Validator\Sop\TransactionTypeValidator</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSecureAcceptanceGatewayCreateTokenHandler" type="Magento\Payment\Gateway\Response\HandlerChain">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="token" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\Sop\TokenHandler</item>
                <item name="cc_data" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Response\Sop\CcDataHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSACcVaultCommandManagerPool" type="Magento\Payment\Gateway\Command\CommandManagerPool">
        <arguments>
            <argument name="executors" xsi:type="array">
                <item name="chcybersource" xsi:type="string">CyberSourceSACommandManager</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAVaultPaymentValueHandlerPool" type="VaultPaymentValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">CyberSourceSAVaultPaymentValueHandler</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAVaultPaymentValueHandler" type="VaultPaymentDefaultValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">CyberSourceSAVaultPaymentConfig</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAHttpRestClient" type="CyberSource\Core\Gateway\Http\Client\Rest">
        <arguments>
            <argument name="requestMethod" xsi:type="const">Magento\Framework\HTTP\ZendClient::POST</argument>
            <argument name="requestPath" xsi:type="string">/flex/v1/keys?format=JWT</argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\SecureAcceptance\Gateway\Command\Flex\GenerateKeyCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Request\Flex\GenerateKeyRequest</argument>
            <argument name="validator" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Validator\Flex\GenerateKeyResponseValidator</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\Core\Gateway\Http\TransferFactory</argument>
            <argument name="client" xsi:type="object">CyberSourceSAHttpRestClient</argument>
            <argument name="handler" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Response\Flex\PublicKeyHandler</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Controller\Microform\TokenRequest">
        <arguments>
            <argument name="commandManager" xsi:type="object">CyberSourceSACommandManager</argument>
            <argument name="sessionManager" xsi:type="object">Magento\Checkout\Model\Session</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Command\RetrieveSubscriptionCommand">
        <arguments>
            <argument name="requestBuilder" xsi:type="object">CyberSourceSASoapRetrieveSubscriptionRequest</argument>
            <argument name="handler" xsi:type="object">CyberSourceSAVoidResponseHandler</argument>
            <argument name="transferFactory" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\TransferFactory</argument>
            <argument name="validator" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Validator\SoapReasonCodeValidator</argument>
            <argument name="client" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Http\Client\SOAPClient</argument>
        </arguments>
    </type>

    <virtualType name="CyberSourceSASoapRetrieveSubscriptionRequest" type="Magento\Payment\Gateway\Request\BuilderComposite">
        <arguments>
            <argument name="builders" xsi:type="array">
                <item name="merchantData" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\MerchantDataBuilder</item>
                <item name="ccAuthService" xsi:type="string">CyberSourceSAGatewayCcSubscriptionRetrieveServiceRequest</item>
                <item name="subscriptionId" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\SubscriptionBuilder</item>
                <item name="mrn" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Request\Soap\SubscriptionRetrieveMrnBuilder</item>
            </argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSAGatewayCcSubscriptionRetrieveServiceRequest" type="CyberSource\SecureAcceptance\Gateway\Request\Soap\ServiceRequest">
        <arguments>
            <argument name="serviceName" xsi:type="string">paySubscriptionRetrieveService</argument>
        </arguments>
    </virtualType>

    <virtualType name="CyberSourceSecureAcceptanceCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Config\Config</argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\SecureAcceptance\Gateway\Validator\Flex\MicroformResponseValidator">
        <arguments>
            <argument name="signatureValidator" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Validator\Flex\SignatureValidator\ValidatorOpenssl</argument>
        </arguments>
    </type>

    <virtualType name="CyberSourceSecureAcceptanceGlobalValidator" type="Magento\Payment\Gateway\Validator\ValidatorComposite">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="cc_type_validator" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Validator\Flex\CcTypeValidator</item>
                <item name="flex_validator" xsi:type="string">CyberSource\SecureAcceptance\Gateway\Validator\Flex\MicroformResponseValidator</item>
            </argument>
            <argument name="chainBreakingValidators" xsi:type="array">
                <item name="cc_type_validator" xsi:type="string">cc_type_validator</item>
                <item name="flex_validator" xsi:type="string">flex_validator</item>
            </argument>
        </arguments>
    </virtualType>

    <type name="Magento\Quote\Model\Quote\Payment\ToOrderPayment">
        <plugin name="cybersource_sa_after_convert" type="CyberSource\SecureAcceptance\Plugin\Model\Quote\Payment\ToOrderPaymentPlugin"/>
    </type>

    <virtualType name="CyberSourceSecureAcceptanceValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="global" xsi:type="string">CyberSourceSecureAcceptanceGlobalValidator</item>
                <item name="country" xsi:type="string">CyberSourceSecureAcceptanceCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>

    <type name="CyberSource\SecureAcceptance\Helper\RequestDataBuilder">
        <arguments>
            <argument name="checkoutSession" xsi:type="object">Magento\Checkout\Model\Session</argument>
            <argument name="filter" xsi:type="object">CyberSourceCoreGatewayStringProductNameFilter</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Http\Client\SOAPClient">
        <plugin name="transparent_data_plugin" type="CyberSource\SecureAcceptance\Gateway\Http\Client\TransparentResponsePlugin"/>
    </type>

    <preference for="CyberSource\SecureAcceptance\Model\SignatureManagementInterface" type="CyberSource\SecureAcceptance\Model\SignatureManagement"/>
    <preference for="CyberSource\SecureAcceptance\Model\Jwt\JwtProcessorInterface" type="CyberSource\SecureAcceptance\Model\Jwt\JwtProcessor"/>
    <preference for="CyberSource\SecureAcceptance\Model\Jwk\ConverterInterface" type="CyberSource\SecureAcceptance\Model\Jwk\Converter"/>
    <preference for="CyberSource\SecureAcceptance\Model\Backpost\DetectorInterface" type="CyberSource\SecureAcceptance\Model\Backpost\Detector"/>

    <type name="Magento\Framework\Session\SessionManagerInterface">
        <plugin name="cybersource-session-manager-plugin" type="CyberSource\SecureAcceptance\Plugin\Session\SessionManagerPlugin"/>
    </type>

    <type name="Magento\Framework\Session\SidResolverInterface">
        <plugin name="cybersource-sid-resolver" type="CyberSource\SecureAcceptance\Plugin\Session\SidResolverPlugin"/>
    </type>

    <type name="CyberSource\Core\Helper\Data">
        <arguments>
            <argument name="additionalInfoKeys" xsi:type="array">
                <item name="transaction_id" xsi:type="const">CyberSource\SecureAcceptance\Gateway\Response\AbstractResponseHandler::TRANSACTION_ID</item>
                <item name="reason_code" xsi:type="const">CyberSource\SecureAcceptance\Gateway\Response\AbstractResponseHandler::REASON_CODE</item>
                <item name="dm_decision" xsi:type="const">CyberSource\SecureAcceptance\Gateway\Response\AbstractResponseHandler::DECISION</item>
                <item name="card_type" xsi:type="string">cardNumber</item>
            </argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Observer\DataAssignObserver">
        <arguments>
            <argument name="session" xsi:type="object">Magento\Checkout\Model\Session</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Request\Soap\DecisionManagerMddBuilder">
        <arguments>
            <argument name="checkoutSession" xsi:type="object">Magento\Checkout\Model\Session</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Request\Soap\CvnBuilder">
        <arguments>
            <argument name="session" xsi:type="object">Magento\Checkout\Model\Session</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Response\Soap\CleanSessionHandler">
        <arguments>
            <argument name="sessionManager" xsi:type="object">Magento\Checkout\Model\Session</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Request\Soap\ItemsDataBuilder">
        <plugin sortOrder="1" name="cyberSourceSecureAcceptanceItemsDataBuilder" type="CyberSource\Core\Plugin\Gateway\Request\StringFilterPlugin"/>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Request\Soap\AddressDataBuilder">
        <plugin sortOrder="1" name="cyberSourceSecureAcceptanceAddressDataBuilder" type="CyberSource\Core\Plugin\Gateway\Request\StringFilterPlugin"/>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Request\Sop\ItemsDataBuilder">
        <plugin sortOrder="1" name="cyberSourceSecureAcceptanceSopItemsDataBuilder" type="CyberSource\Core\Plugin\Gateway\Request\StringFilterPlugin"/>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Request\Sop\AddressDataBuilder">
        <plugin sortOrder="1" name="cyberSourceSecureAcceptanceSopAddressDataBuilder" type="CyberSource\Core\Plugin\Gateway\Request\StringFilterPlugin"/>
    </type>

    <virtualType name="CyberSourceSecureAcceptancePaymentTokenRepositoryPlugin" type="CyberSource\Core\Plugin\PaymentTokenRepositoryPlugin">
        <arguments>
            <argument name="checkoutSession" xsi:type="object">Magento\Checkout\Model\Session\Proxy</argument>
            <argument name="config" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Config\Config</argument>
            <argument name="configKey" xsi:type="const">CyberSource\SecureAcceptance\Gateway\Config\Config::KEY_MERCHANT_ID</argument>
            <argument name="methodCode" xsi:type="const">CyberSource\SecureAcceptance\Model\Ui\ConfigProvider::CODE</argument>
        </arguments>
    </virtualType>

    <type name="Magento\Store\Api\StoreResolverInterface">
        <plugin sortOrder="1" name="cyberSourceSecureAcceptanceStoreResolverInterface" type="CyberSource\SecureAcceptance\Plugin\Store\Api\StoreResolverInterfacePlugin"/>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Config\SaConfigProviderStrategy">
        <arguments>
            <argument name="paConfigProvider" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Config\SaConfigProvider</argument>
            <argument name="paNonPaConfigProvider" xsi:type="object">CyberSource\SecureAcceptance\Gateway\Config\SaConfigProviderNonPa</argument>
        </arguments>
    </type>

    <type name="CyberSource\SecureAcceptance\Gateway\Config\SaConfigProviderInterface" shared="false"/>

    <preference for="CyberSource\SecureAcceptance\Gateway\Config\SaConfigProviderInterface" type="CyberSource\SecureAcceptance\Gateway\Config\SaConfigProviderStrategy"/>

</config>

