// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.

package contract

import (
	"math/big"
	"strings"

	ethereum "github.com/ethereum/go-ethereum"
	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/event"
)

// AbstractXDCXListingABI is the input ABI used to generate the binding from.
const AbstractXDCXListingABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"getTokenStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"

// AbstractXDCXListingBin is the compiled bytecode used for deploying new contracts.
const AbstractXDCXListingBin = `0x`

// DeployAbstractXDCXListing deploys a new Ethereum contract, binding an instance of AbstractXDCXListing to it.
func DeployAbstractXDCXListing(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *AbstractXDCXListing, error) {
	parsed, err := abi.JSON(strings.NewReader(AbstractXDCXListingABI))
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(AbstractXDCXListingBin), backend)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &AbstractXDCXListing{AbstractXDCXListingCaller: AbstractXDCXListingCaller{contract: contract}, AbstractXDCXListingTransactor: AbstractXDCXListingTransactor{contract: contract}, AbstractXDCXListingFilterer: AbstractXDCXListingFilterer{contract: contract}}, nil
}

// AbstractXDCXListing is an auto generated Go binding around an Ethereum contract.
type AbstractXDCXListing struct {
	AbstractXDCXListingCaller     // Read-only binding to the contract
	AbstractXDCXListingTransactor // Write-only binding to the contract
	AbstractXDCXListingFilterer   // Log filterer for contract events
}

// AbstractXDCXListingCaller is an auto generated read-only Go binding around an Ethereum contract.
type AbstractXDCXListingCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// AbstractXDCXListingTransactor is an auto generated write-only Go binding around an Ethereum contract.
type AbstractXDCXListingTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// AbstractXDCXListingFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type AbstractXDCXListingFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// AbstractXDCXListingSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type AbstractXDCXListingSession struct {
	Contract     *AbstractXDCXListing // Generic contract binding to set the session for
	CallOpts     bind.CallOpts        // Call options to use throughout this session
	TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
}

// AbstractXDCXListingCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type AbstractXDCXListingCallerSession struct {
	Contract *AbstractXDCXListingCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts              // Call options to use throughout this session
}

// AbstractXDCXListingTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type AbstractXDCXListingTransactorSession struct {
	Contract     *AbstractXDCXListingTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
}

// AbstractXDCXListingRaw is an auto generated low-level Go binding around an Ethereum contract.
type AbstractXDCXListingRaw struct {
	Contract *AbstractXDCXListing // Generic contract binding to access the raw methods on
}

// AbstractXDCXListingCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type AbstractXDCXListingCallerRaw struct {
	Contract *AbstractXDCXListingCaller // Generic read-only contract binding to access the raw methods on
}

// AbstractXDCXListingTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type AbstractXDCXListingTransactorRaw struct {
	Contract *AbstractXDCXListingTransactor // Generic write-only contract binding to access the raw methods on
}

// NewAbstractXDCXListing creates a new instance of AbstractXDCXListing, bound to a specific deployed contract.
func NewAbstractXDCXListing(address common.Address, backend bind.ContractBackend) (*AbstractXDCXListing, error) {
	contract, err := bindAbstractXDCXListing(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &AbstractXDCXListing{AbstractXDCXListingCaller: AbstractXDCXListingCaller{contract: contract}, AbstractXDCXListingTransactor: AbstractXDCXListingTransactor{contract: contract}, AbstractXDCXListingFilterer: AbstractXDCXListingFilterer{contract: contract}}, nil
}

// NewAbstractXDCXListingCaller creates a new read-only instance of AbstractXDCXListing, bound to a specific deployed contract.
func NewAbstractXDCXListingCaller(address common.Address, caller bind.ContractCaller) (*AbstractXDCXListingCaller, error) {
	contract, err := bindAbstractXDCXListing(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &AbstractXDCXListingCaller{contract: contract}, nil
}

// NewAbstractXDCXListingTransactor creates a new write-only instance of AbstractXDCXListing, bound to a specific deployed contract.
func NewAbstractXDCXListingTransactor(address common.Address, transactor bind.ContractTransactor) (*AbstractXDCXListingTransactor, error) {
	contract, err := bindAbstractXDCXListing(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &AbstractXDCXListingTransactor{contract: contract}, nil
}

// NewAbstractXDCXListingFilterer creates a new log filterer instance of AbstractXDCXListing, bound to a specific deployed contract.
func NewAbstractXDCXListingFilterer(address common.Address, filterer bind.ContractFilterer) (*AbstractXDCXListingFilterer, error) {
	contract, err := bindAbstractXDCXListing(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &AbstractXDCXListingFilterer{contract: contract}, nil
}

// bindAbstractXDCXListing binds a generic wrapper to an already deployed contract.
func bindAbstractXDCXListing(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(AbstractXDCXListingABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_AbstractXDCXListing *AbstractXDCXListingRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _AbstractXDCXListing.Contract.AbstractXDCXListingCaller.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_AbstractXDCXListing *AbstractXDCXListingRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _AbstractXDCXListing.Contract.AbstractXDCXListingTransactor.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_AbstractXDCXListing *AbstractXDCXListingRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _AbstractXDCXListing.Contract.AbstractXDCXListingTransactor.contract.Transact(opts, method, params...)
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_AbstractXDCXListing *AbstractXDCXListingCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _AbstractXDCXListing.Contract.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_AbstractXDCXListing *AbstractXDCXListingTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _AbstractXDCXListing.Contract.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_AbstractXDCXListing *AbstractXDCXListingTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _AbstractXDCXListing.Contract.contract.Transact(opts, method, params...)
}

// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
//
// Solidity: function getTokenStatus( address) constant returns(bool)
func (_AbstractXDCXListing *AbstractXDCXListingCaller) GetTokenStatus(opts *bind.CallOpts, arg0 common.Address) (bool, error) {
	var (
		ret0 = new(bool)
	)
	out := &[]interface{}{
		ret0,
	}
	err := _AbstractXDCXListing.contract.Call(opts, out, "getTokenStatus", arg0)
	return *ret0, err
}

// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
//
// Solidity: function getTokenStatus( address) constant returns(bool)
func (_AbstractXDCXListing *AbstractXDCXListingSession) GetTokenStatus(arg0 common.Address) (bool, error) {
	return _AbstractXDCXListing.Contract.GetTokenStatus(&_AbstractXDCXListing.CallOpts, arg0)
}

// GetTokenStatus is a free data retrieval call binding the contract method 0xa3ff31b5.
//
// Solidity: function getTokenStatus( address) constant returns(bool)
func (_AbstractXDCXListing *AbstractXDCXListingCallerSession) GetTokenStatus(arg0 common.Address) (bool, error) {
	return _AbstractXDCXListing.Contract.GetTokenStatus(&_AbstractXDCXListing.CallOpts, arg0)
}

// RelayerRegistrationABI is the input ABI used to generate the binding from.
const RelayerRegistrationABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"fromToken\",\"type\":\"address\"},{\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"listToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MaximumRelayers\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"tradeFee\",\"type\":\"uint16\"}],\"name\":\"updateFee\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"changeContractOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"RELAYER_LIST\",\"outputs\":[{\"name\":\"_deposit\",\"type\":\"uint256\"},{\"name\":\"_tradeFee\",\"type\":\"uint16\"},{\"name\":\"_index\",\"type\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"depositMore\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"RELAYER_COINBASES\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"RESIGN_REQUESTS\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"getRelayerByCoinbase\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"uint16\"},{\"name\":\"\",\"type\":\"address[]\"},{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"tradeFee\",\"type\":\"uint16\"},{\"name\":\"fromTokens\",\"type\":\"address[]\"},{\"name\":\"toTokens\",\"type\":\"address[]\"}],\"name\":\"update\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"maxRelayer\",\"type\":\"uint256\"},{\"name\":\"maxToken\",\"type\":\"uint256\"},{\"name\":\"minDeposit\",\"type\":\"uint256\"}],\"name\":\"reconfigure\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"cancelSelling\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"ActiveRelayerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"fromToken\",\"type\":\"address\"},{\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"deListToken\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"sellRelayer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"RelayerCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"RELAYER_ON_SALE_LIST\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"resign\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"new_owner\",\"type\":\"address\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MinimumDeposit\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"},{\"name\":\"tradeFee\",\"type\":\"uint16\"},{\"name\":\"fromTokens\",\"type\":\"address[]\"},{\"name\":\"toTokens\",\"type\":\"address[]\"}],\"name\":\"register\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MaximumTokenList\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"buyRelayer\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"coinbase\",\"type\":\"address\"}],\"name\":\"refund\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"CONTRACT_OWNER\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"XDCxListing\",\"type\":\"address\"},{\"name\":\"maxRelayers\",\"type\":\"uint256\"},{\"name\":\"maxTokenList\",\"type\":\"uint256\"},{\"name\":\"minDeposit\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"max_relayer\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"max_token\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"min_deposit\",\"type\":\"uint256\"}],\"name\":\"ConfigEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"deposit\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tradeFee\",\"type\":\"uint16\"},{\"indexed\":false,\"name\":\"fromTokens\",\"type\":\"address[]\"},{\"indexed\":false,\"name\":\"toTokens\",\"type\":\"address[]\"}],\"name\":\"RegisterEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"deposit\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tradeFee\",\"type\":\"uint16\"},{\"indexed\":false,\"name\":\"fromTokens\",\"type\":\"address[]\"},{\"indexed\":false,\"name\":\"toTokens\",\"type\":\"address[]\"}],\"name\":\"UpdateEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"coinbase\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"tradeFee\",\"type\":\"uint16\"}],\"name\":\"UpdateFeeEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"deposit\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"tradeFee\",\"type\":\"uint16\"},{\"indexed\":false,\"name\":\"fromTokens\",\"type\":\"address[]\"},{\"indexed\":false,\"name\":\"toTokens\",\"type\":\"address[]\"}],\"name\":\"TransferEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"deposit_release_time\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"deposit_amount\",\"type\":\"uint256\"}],\"name\":\"ResignEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"name\":\"remaining_time\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"deposit_amount\",\"type\":\"uint256\"}],\"name\":\"RefundEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"is_on_sale\",\"type\":\"bool\"},{\"indexed\":false,\"name\":\"coinbase\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"SellEvent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"name\":\"coinbase\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"BuyEvent\",\"type\":\"event\"}]"

// RelayerRegistrationBin is the compiled bytecode used for deploying new contracts.
const RelayerRegistrationBin = `0x608060405234801561001057600080fd5b50604051608080613d298339810160409081528151602083015191830151606090930151600a8054600160a060020a03909316600160a060020a0319938416179055600060078190556009819055600193909355600293909355600892909255805490911633179055613ca1806100886000396000f30060806040526004361061012f5763ffffffff60e060020a60003504166308764b9d81146101345780630e5c0fee146101635780633ea2391f1461018a5780633ead67b5146101b257806349ba1f70146101d35780634ce69bf5146102265780634fa339271461023a578063500f99f71461026e578063540105c71461028f57806356246b681461037f57806357ea3c41146104235780635b673b1f14610441578063735db683146104625780637aa667301461047757806387c6bbcd146104a457806387d340ab146104c8578063885b7137146104dd578063ae6e43f5146104fe578063ba45b0b81461051f578063c635a9f214610546578063c6c71aed1461055b578063cfaece12146105f2578063e699df0e14610607578063fa89401a1461061b578063fd301c491461063c575b600080fd5b34801561014057600080fd5b50610161600160a060020a0360043581169060243581169060443516610651565b005b34801561016f57600080fd5b506101786109c1565b60408051918252519081900360200190f35b34801561019657600080fd5b50610161600160a060020a036004351661ffff602435166109c7565b3480156101be57600080fd5b50610161600160a060020a0360043516610bf0565b3480156101df57600080fd5b506101f4600160a060020a0360043516610c89565b6040805194855261ffff909316602085015283830191909152600160a060020a03166060830152519081900360800190f35b610161600160a060020a0360043516610cbe565b34801561024657600080fd5b50610252600435611010565b60408051600160a060020a039092168252519081900360200190f35b34801561027a57600080fd5b50610178600160a060020a036004351661102b565b34801561029b57600080fd5b506102b0600160a060020a036004351661103d565b6040518087815260200186600160a060020a0316600160a060020a031681526020018581526020018461ffff1661ffff1681526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561032657818101518382015260200161030e565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561036557818101518382015260200161034d565b505050509050019850505050505050505060405180910390f35b34801561038b57600080fd5b506040805160206004604435818101358381028086018501909652808552610161958335600160a060020a0316956024803561ffff1696369695606495939492019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506111509650505050505050565b34801561042f57600080fd5b50610161600435602435604435611595565b34801561044d57600080fd5b50610161600160a060020a0360043516611684565b34801561046e57600080fd5b50610178611850565b34801561048357600080fd5b50610161600160a060020a0360043581169060243581169060443516611856565b3480156104b057600080fd5b50610161600160a060020a0360043516602435611b79565b3480156104d457600080fd5b50610178611d30565b3480156104e957600080fd5b50610178600160a060020a0360043516611d36565b34801561050a57600080fd5b50610161600160a060020a0360043516611d48565b34801561052b57600080fd5b50610161600160a060020a0360043581169060243516611f94565b34801561055257600080fd5b506101786122dc565b6040805160206004604435818101358381028086018501909652808552610161958335600160a060020a0316956024803561ffff1696369695606495939492019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506122e29650505050505050565b3480156105fe57600080fd5b5061017861299f565b610161600160a060020a03600435166129a5565b34801561062757600080fd5b50610161600160a060020a0360043516612c5e565b34801561064857600080fd5b50610252612f7b565b600160a060020a0383811660009081526003602052604090206005015484911633146106b5576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038416600090815260056020526040902054849015610727576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a038516600090815260066020526040902054859015610799576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b60028054600160a060020a0388166000908152600360205260409020909101541061080e576040805160e560020a62461bcd02815260206004820152601f60248201527f457863656564696e67206e756d626572206f6620747261646520706169727300604482015290519081900360640190fd5b610819868686612f8a565b1515600114610872576040805160e560020a62461bcd02815260206004820152600c60248201527f496e76616c696420706169720000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0380871660008181526003602081815260408084206002810180546001818101835582885285882090910180548f8b16600160a060020a031991821617909155958301805480830182558189528689200180549a8f169a909716999099179095559590945283549290930154835183815261ffff90911691810182905260809381018481528554948201859052600080516020613c168339815191529693959294929392606083019060a08401908690801561095e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610940575b505083810382528481815481526020019150805480156109a757602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610989575b5050965050505050505060405180910390a1505050505050565b60015481565b600160a060020a038281166000908152600360205260409020600501548391163314610a2b576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038316600090815260056020526040902054839015610a9d576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a038416600090815260066020526040902054849015610b0f576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b60008461ffff1610158015610b2957506103e88461ffff16105b1515610b7f576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c6964204d616b657220466565000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038516600081815260036020908152604091829020600101805461ffff191661ffff89811691909117918290558351948552169083015280517f5a4f79c1a68f4f5ef7148ac4f279a5a6caeb3237082c64f692e92c9e02ffc4599281900390910190a15050505050565b600054600160a060020a03163314610c52576040805160e560020a62461bcd02815260206004820152601460248201527f436f6e7472616374204f776e6572204f6e6c792e000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381161515610c6757600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6003602052600090815260409020805460018201546004830154600590930154919261ffff90911691600160a060020a031684565b600160a060020a038181166000908152600360205260409020600501548291163314610d22576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038216600090815260056020526040902054829015610d94576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a038316600090815260066020526040902054839015610e06576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b60003411610e5e576040805160e560020a62461bcd02815260206004820152601a60248201527f5472616e736665722076616c7565206d757374206265203e2030000000000000604482015290519081900360640190fd5b670de0b6b3a7640000341015610ee4576040805160e560020a62461bcd02815260206004820152603160248201527f4174206c65617374203120544f4d4f20697320726571756972656420666f722060448201527f61206465706f7369742072657175657374000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038416600090815260036020526040902054610f0d903463ffffffff61333c16565b600160a060020a0385166000908152600360208181526040928390208481556001810154845186815261ffff9091169281018390526080948101858152600283018054968301879052600080516020613c16833981519152979694959094930192606083019060a084019086908015610faf57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610f91575b50508381038252848181548152602001915080548015610ff857602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610fda575b5050965050505050505060405180910390a150505050565b600460205260009081526040902054600160a060020a031681565b60056020526000908152604090205481565b600160a060020a03808216600090815260036020818152604080842060048101546005820154825460018401546002850180548751818a0281018a01909852808852999a8b9a8b9a8b9a60609a8b9a989094169761ffff90961695909101929184918301828280156110d857602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116110ba575b505050505091508080548060200260200160405190810160405280929190818152602001828054801561113457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611116575b5050505050905095509550955095509550955091939550919395565b600160a060020a0384811660009081526003602052604090206005015485911633146111b4576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038516600090815260056020526040902054859015611226576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a038616600090815260066020526040902054869015611298576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b60008661ffff16101580156112b257506103e88661ffff16105b1515611308576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c6964204d616b657220466565000000000000000000000000000000604482015290519081900360640190fd5b60025485511115611363576040805160e560020a62461bcd02815260206004820152601f60248201527f457863656564696e67206e756d626572206f6620747261646520706169727300604482015290519081900360640190fd5b84518451146113bc576040805160e560020a62461bcd02815260206004820152601960248201527f4e6f742076616c6964206e756d626572206f6620506169727300000000000000604482015290519081900360640190fd5b6113c68585613359565b151560011461141f576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c69642071756f746520746f6b656e73000000000000000000000000604482015290519081900360640190fd5b600160a060020a038716600090815260036020908152604090912060018101805461ffff191661ffff8a16179055865161146192600290920191880190613aee565b50600160a060020a0387166000908152600360208181526040909220865161149193919092019190870190613aee565b50600160a060020a03871660009081526003602081815260409283902080546001820154855182815261ffff9091169381018490526080958101868152600284018054978301889052600080516020613c1683398151915297939690940192606083019060a08401908690801561153157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611513575b5050838103825284818154815260200191508054801561157a57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161155c575b5050965050505050505060405180910390a150505050505050565b600054600160a060020a031633146115f7576040805160e560020a62461bcd02815260206004820152601460248201527f436f6e7472616374204f776e6572204f6e6c792e000000000000000000000000604482015290519081900360640190fd5b60095483101561160657600080fd5b60048211801561161757506103e982105b151561162257600080fd5b612710811161163057600080fd5b600183905560028290556008819055604080518481526020810184905280820183905290517f8f6bd709a98381db4e403a67ba106d598972dad177e946f19b54777f54d939239181900360600190a1505050565b600160a060020a0381811660009081526003602052604090206005015482911633146116e8576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526005602052604090205482901561175a576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a038316600090815260066020526040812054116117ee576040805160e560020a62461bcd02815260206004820152602160248201527f52656c61796572206973206e6f742063757272656e746c7920666f722073616c60448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831660008181526006602090815260408083208390558051838152918201939093528083019190915290517fdb3d5e65fcde89731529c01d62b87bab1c64471cffdd528fc1adbc1712b5d0829181900360600190a1505050565b60095481565b600160a060020a03838116600090815260036020526040902060050154606091829186911633146118bf576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038616600090815260056020526040902054869015611931576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a0387166000908152600660205260409020548790156119a3576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b6119ae888888613718565b945094506119bc8585613359565b1515600114611a15576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c69642071756f746520746f6b656e73000000000000000000000000604482015290519081900360640190fd5b600160a060020a03881660009081526003602090815260409091208651611a4492600290920191880190613aee565b50600160a060020a03881660009081526003602081815260409092208651611a7493919092019190870190613aee565b50600160a060020a03881660009081526003602081815260409283902080546001820154855182815261ffff9091169381018490526080958101868152600284018054978301889052600080516020613c1683398151915297939690940192606083019060a084019086908015611b1457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611af6575b50508381038252848181548152602001915080548015611b5d57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611b3f575b5050965050505050505060405180910390a15050505050505050565b600160a060020a038281166000908152600360205260409020600501548391163314611bdd576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038316600090815260056020526040902054839015611c4f576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b60008311611ccd576040805160e560020a62461bcd02815260206004820152602860248201527f507269636520746167206d75737420626520646966666572656e74207468616e60448201527f205a65726f283029000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03841660008181526006602090815260409182902086905581516001815290810192909252818101859052517fdb3d5e65fcde89731529c01d62b87bab1c64471cffdd528fc1adbc1712b5d0829181900360600190a150505050565b60075481565b60066020526000908152604090205481565b600160a060020a038181166000908152600360205260409020600501548291163314611dac576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038216600090815260066020526040902054829015611e1e576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b600160a060020a03831660009081526003602052604081205411611eb2576040805160e560020a62461bcd02815260206004820152602760248201527f4e6f2072656c61796572206173736f636961746564207769746820746869732060448201527f6164647265737300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831660009081526005602052604090205415611f20576040805160e560020a62461bcd02815260206004820152601860248201527f5265717565737420616c72656164792072656365697665640000000000000000604482015290519081900360640190fd5b600160a060020a03831660009081526005602090815260408083206224ea0042018155600980546000190190555460038352928190205481519384529183019190915280517f2e821a4329d6351a6b13fe0c12fd7674cd0f4a2283685a4713e1325f36415ae59281900390910190a1505050565b600160a060020a038281166000908152600360205260409020600501548391163314611ff8576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a03831660009081526005602052604090205483901561206a576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a0384166000908152600660205260409020548490156120dc576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b600160a060020a038416158015906120fd5750600160a060020a0384163314155b151561210857600080fd5b600160a060020a0384811660009081526003602052604090206005015416156121a1576040805160e560020a62461bcd02815260206004820152603c60248201527f4f776e65722061646472657373206d757374206e6f742062652063757272656e60448201527f746c7920757365642061732072656c617965722d636f696e6261736500000000606482015290519081900360840190fd5b600160a060020a03858116600090815260036020818152604092839020600581018054600160a060020a0319168a871617908190558154600183015486519290971680835293820181905261ffff90961694810185905260a0606082018181526002840180549284018390527fc13ab794f75ba420a1f52192a8e35a2cf2c74ae31ed94f53f47ce7712011b66298959795969094019291608083019060c08401908690801561227957602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161225b575b505083810382528481815481526020019150805480156122c257602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116122a4575b505097505050505050505060405180910390a15050505050565b60085481565b600054600160a060020a031633141561236b576040805160e560020a62461bcd02815260206004820152602f60248201527f436f6e7472616374204f776e657220697320666f7262696464656e20746f206360448201527f726561746520612052656c617965720000000000000000000000000000000000606482015290519081900360840190fd5b33600160a060020a03851614156123f2576040805160e560020a62461bcd02815260206004820152603660248201527f436f696e6261736520616e642052656c617965724f776e65722061646472657360448201527f73206d757374206e6f74206265207468652073616d6500000000000000000000606482015290519081900360840190fd5b600054600160a060020a038581169116141561247e576040805160e560020a62461bcd02815260206004820152602b60248201527f436f696e62617365206d757374206e6f742062652073616d6520617320434f4e60448201527f54524143545f4f574e4552000000000000000000000000000000000000000000606482015290519081900360840190fd5b6008543410156124d8576040805160e560020a62461bcd02815260206004820152601e60248201527f4d696e696d756d206465706f736974206e6f74207361746973666965642e0000604482015290519081900360640190fd5b60008361ffff16101580156124f257506103e88361ffff16105b1515612548576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c6964204d616b657220466565000000000000000000000000000000604482015290519081900360640190fd5b600254825111156125a3576040805160e560020a62461bcd02815260206004820152601f60248201527f457863656564696e67206e756d626572206f6620747261646520706169727300604482015290519081900360640190fd5b81518151146125fc576040805160e560020a62461bcd02815260206004820152601960248201527f4e6f742076616c6964206e756d626572206f6620506169727300000000000000604482015290519081900360640190fd5b600160a060020a0384166000908152600360205260409020541561266a576040805160e560020a62461bcd02815260206004820152601c60248201527f436f696e6261736520616c726561647920726567697374657265642e00000000604482015290519081900360640190fd5b600160a060020a038416600090815260056020526040902054156126da576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b60015460095410612735576040805160e560020a62461bcd02815260206004820152601b60248201527f4d6178696d756d2072656c617965727320726567697374657265640000000000604482015290519081900360640190fd5b61273f8282613359565b1515600114612798576040805160e560020a62461bcd02815260206004820152601460248201527f496e76616c69642071756f746520746f6b656e73000000000000000000000000604482015290519081900360640190fd5b6007805460009081526004602090815260408083208054600160a060020a031916600160a060020a038a16908117909155815160c08101835234815261ffff8981168286019081528285018a8152606084018a9052975460808401523360a0840152928652600385529290942084518155905160018201805461ffff19169190931617909155925180519293926128359260028501920190613aee565b5060608201518051612851916003840191602090910190613aee565b50608082810151600483015560a09283015160059092018054600160a060020a031916600160a060020a039384161790556007805460019081019091556009805482019055918716600090815260036020818152604092839020805495810154845187815261ffff9091169281018390529384018581526002820180549686018790527fcf24380d990b0bb3dd21518926bca48f81495ac131ee92655696db28c43b1b1b9893969095929094019391929091606084019184019086908015610faf57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610f915750508381038252848181548152602001915080548015610ff857602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610fda575050965050505050505060405180910390a150505050565b60025481565b600160a060020a0381166000908152600560205260408120548190839015612a19576040805160e560020a62461bcd0281526020600482015260286024820152600080516020613bd68339815191526044820152600080516020613c36833981519152606482015290519081900360840190fd5b600160a060020a03841660009081526006602052604081205493508311612ab0576040805160e560020a62461bcd02815260206004820152602160248201527f52656c61796572206973206e6f742063757272656e746c7920666f722073616c60448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b348314612b07576040805160e560020a62461bcd02815260206004820152601960248201527f50726963652d746167206d757374206265206d61746368656400000000000000604482015290519081900360640190fd5b600160a060020a038085166000908152600360205260409020600501541691503315801590612b3f575033600160a060020a03831614155b8015612b535750600160a060020a03821615155b1515612ba9576040805160e560020a62461bcd02815260206004820152601160248201527f41646472657373206e6f742076616c6964000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0380851660009081526003602090815260408083206005018054600160a060020a031916331790556006909152808220829055519184169185156108fc0291869190818181858888f19350505050158015612c0f573d6000803e3d6000fd5b506040805160018152600160a060020a0386166020820152348183015290517f07e248a3b3d2184a9491c3b45089a6e15aac742b9d974e691e7beb0f6e7c58c69181900360600190a150505050565b600160a060020a038181166000908152600360205260408120600501549091829182918591163314612cc8576040805160e560020a62461bcd0281526020600482015260136024820152600080516020613bb6833981519152604482015290519081900360640190fd5b600160a060020a038516600090815260066020526040902054859015612d3a576040805160e560020a62461bcd02815260206004820152602a6024820152600080516020613bf68339815191526044820152600080516020613c56833981519152606482015290519081900360840190fd5b600160a060020a03861660009081526005602052604081205411612da8576040805160e560020a62461bcd02815260206004820152601160248201527f52657175657374206e6f7420666f756e64000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0386166000908152600360209081526040808320805460049091015460059093529220549196509450421115612f1657600160a060020a038616600090815260036020526040812081815560018101805461ffff1916905590612e156002830182613b53565b612e23600383016000613b53565b506000600482810182905560059283018054600160a060020a0319908116909155600160a060020a038a811684526020948552604080852085905560078054600019908101875285885282872080548087169091558c88528388208054919095169516851790935583865260039096528085209093018990558454019093555191945033916108fc88150291889190818181858888f19350505050158015612ecf573d6000803e3d6000fd5b5060408051600181526000602082015280820187905290517ffaba1aac53309af4c1c439f38c29500d3828405ee1ca5e7641b0432d17d302509181900360600190a1612f73565b600160a060020a038616600090815260056020908152604080832054815193845242900391830191909152818101879052517ffaba1aac53309af4c1c439f38c29500d3828405ee1ca5e7641b0432d17d302509181900360600190a15b505050505050565b600054600160a060020a031681565b600160a060020a0383166000908152600360208181526040808420909201548251600190910180825280830282019092019092528291606091839182918015612fdd578160200160208202803883390190505b50600a54604080517fa3ff31b5000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152915193965091169163a3ff31b5916024808201926020929091908290030181600087803b15801561304857600080fd5b505af115801561305c573d6000803e3d6000fd5b505050506040513d602081101561307257600080fd5b5051806130885750600160a060020a0386166001145b915081801561313a5750600a54604080517fa3ff31b5000000000000000000000000000000000000000000000000000000008152600160a060020a038a811660048301529151919092169163a3ff31b59160248083019260209291908290030181600087803b1580156130fa57600080fd5b505af115801561310e573d6000803e3d6000fd5b505050506040513d602081101561312457600080fd5b50518061313a5750600160a060020a0387166001145b915081151561314c5760009450613331565b600160a060020a0387166001148061316d5750600160a060020a0386166001145b1561317b5760019450613331565b5060005b600160a060020a0388166000908152600360208190526040909120015481101561331357600160a060020a038816600090815260036020819052604090912001805460019190839081106131cf57fe5b600091825260209091200154600160a060020a0316141561325957600160a060020a038816600090815260036020526040902060020180548290811061321157fe5b6000918252602090912001548351600160a060020a039091169084908690811061323757fe5b600160a060020a0390921660209283029091019091015260019093019261330b565b600160a060020a03881660009081526003602052604090206002018054600191908390811061328457fe5b600091825260209091200154600160a060020a0316141561330b57600160a060020a0388166000908152600360208190526040909120018054829081106132c757fe5b6000918252602090912001548351600160a060020a03909116908490869081106132ed57fe5b600160a060020a039092166020928302909101909101526001909301925b60010161317f565b61331d8387613a95565b151561332c5760009450613331565b600194505b505050509392505050565b60008282018381101561334e57600080fd5b8091505b5092915050565b60008060006060806000806000809650600095508951604051908082528060200260200182016040528015613398578160200160208202803883390190505b50945089516040519080825280602002602001820160405280156133c6578160200160208202803883390190505b509350600092505b88518310156136c257600a548951600160a060020a039091169063a3ff31b5908b90869081106133fa57fe5b906020019060200201516040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561344f57600080fd5b505af1158015613463573d6000803e3d6000fd5b505050506040513d602081101561347957600080fd5b5051806134a7575088516001908a908590811061349257fe5b90602001906020020151600160a060020a0316145b91508180156135815750600a548a51600160a060020a039091169063a3ff31b5908c90869081106134d457fe5b906020019060200201516040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561352957600080fd5b505af115801561353d573d6000803e3d6000fd5b505050506040513d602081101561355357600080fd5b505180613581575089516001908b908590811061356c57fe5b90602001906020020151600160a060020a0316145b9150811515613593576000975061370b565b88516001908a90859081106135a457fe5b90602001906020020151600160a060020a031614156136055789838151811015156135cb57fe5b9060200190602002015185888151811015156135e357fe5b600160a060020a039092166020928302909101909101526001909601956136b7565b89516001908b908590811061361657fe5b90602001906020020151600160a060020a0316141561367357888381518110151561363d57fe5b90602001906020020151858881518110151561365557fe5b600160a060020a039092166020928302909101909101526001909601955b888381518110151561368157fe5b90602001906020020151848781518110151561369957fe5b600160a060020a039092166020928302909101909101526001909501945b6001909201916133ce565b5060005b85811015613706576136ef8585838151811015156136e057fe5b90602001906020020151613a95565b15156136fe576000975061370b565b6001016136c6565b600197505b5050505050505092915050565b6060806060806000806060806000600360008d600160a060020a0316600160a060020a031681526020019081526020016000206003018054905060405190808252806020026020018201604052801561377b578160200160208202803883390190505b50600160a060020a038d16600090815260036020818152604092839020909101548251818152818302810190920190925291985080156137c5578160200160208202803883390190505b50955060009450600093505b600160a060020a038c166000908152600360208190526040909120015484101561395c57600160a060020a038c81166000908152600360208190526040909120018054918c16918690811061382257fe5b600091825260209091200154600160a060020a03161415806138835750600160a060020a038c811660009081526003602052604090206002018054918d16918690811061386b57fe5b600091825260209091200154600160a060020a031614155b1561395157600160a060020a038c1660009081526003602052604090206002018054859081106138af57fe5b6000918252602090912001548751600160a060020a03909116908890879081106138d557fe5b600160a060020a039283166020918202909201810191909152908d166000908152600391829052604090200180548590811061390d57fe5b6000918252602090912001548651600160a060020a039091169087908790811061393357fe5b600160a060020a039092166020928302909101909101526001909401935b6001909301926137d1565b600160a060020a038c16600090815260036020819052604090912001548514613a7f5760018651036040519080825280602002602001820160405280156139ad578160200160208202803883390190505b50925060018651036040519080825280602002602001820160405280156139de578160200160208202803883390190505b509150600090505b6001865103811015613a74578681815181101515613a0057fe5b906020019060200201518382815181101515613a1857fe5b600160a060020a039092166020928302909101909101528551869082908110613a3d57fe5b906020019060200201518282815181101515613a5557fe5b600160a060020a039092166020928302909101909101526001016139e6565b828298509850613a86565b8686985098505b50505050505050935093915050565b6000805b8351811015613ae45782600160a060020a03168482815181101515613aba57fe5b90602001906020020151600160a060020a03161415613adc5760019150613352565b600101613a99565b5060009392505050565b828054828255906000526020600020908101928215613b43579160200282015b82811115613b435782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190613b0e565b50613b4f929150613b74565b5090565b5080546000825590600052602060002090810190613b719190613b9b565b50565b613b9891905b80821115613b4f578054600160a060020a0319168155600101613b7a565b90565b613b9891905b80821115613b4f5760008155600101613ba1560052656c61796572204f776e6572204f6e6c792e000000000000000000000000005468652072656c6179657220686173206265656e2072657175657374656420745468652072656c61796572206d757374206265206e6f742063757272656e746ccaa8c94daf6ecfd00518cea95158f5273730574cca907eb0cd47e50732314c4f6f20636c6f73652e0000000000000000000000000000000000000000000000007920666f722053616c6500000000000000000000000000000000000000000000a165627a7a723058207d9c49eecfd59b2ae9911da7296be4a9f5e5d938cbf3dfb6327f454bc1c46a4f0029`

// DeployRelayerRegistration deploys a new Ethereum contract, binding an instance of RelayerRegistration to it.
func DeployRelayerRegistration(auth *bind.TransactOpts, backend bind.ContractBackend, XDCxListing common.Address, maxRelayers *big.Int, maxTokenList *big.Int, minDeposit *big.Int) (common.Address, *types.Transaction, *RelayerRegistration, error) {
	parsed, err := abi.JSON(strings.NewReader(RelayerRegistrationABI))
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(RelayerRegistrationBin), backend, XDCxListing, maxRelayers, maxTokenList, minDeposit)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &RelayerRegistration{RelayerRegistrationCaller: RelayerRegistrationCaller{contract: contract}, RelayerRegistrationTransactor: RelayerRegistrationTransactor{contract: contract}, RelayerRegistrationFilterer: RelayerRegistrationFilterer{contract: contract}}, nil
}

// RelayerRegistration is an auto generated Go binding around an Ethereum contract.
type RelayerRegistration struct {
	RelayerRegistrationCaller     // Read-only binding to the contract
	RelayerRegistrationTransactor // Write-only binding to the contract
	RelayerRegistrationFilterer   // Log filterer for contract events
}

// RelayerRegistrationCaller is an auto generated read-only Go binding around an Ethereum contract.
type RelayerRegistrationCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// RelayerRegistrationTransactor is an auto generated write-only Go binding around an Ethereum contract.
type RelayerRegistrationTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// RelayerRegistrationFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type RelayerRegistrationFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// RelayerRegistrationSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type RelayerRegistrationSession struct {
	Contract     *RelayerRegistration // Generic contract binding to set the session for
	CallOpts     bind.CallOpts        // Call options to use throughout this session
	TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
}

// RelayerRegistrationCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type RelayerRegistrationCallerSession struct {
	Contract *RelayerRegistrationCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts              // Call options to use throughout this session
}

// RelayerRegistrationTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type RelayerRegistrationTransactorSession struct {
	Contract     *RelayerRegistrationTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
}

// RelayerRegistrationRaw is an auto generated low-level Go binding around an Ethereum contract.
type RelayerRegistrationRaw struct {
	Contract *RelayerRegistration // Generic contract binding to access the raw methods on
}

// RelayerRegistrationCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type RelayerRegistrationCallerRaw struct {
	Contract *RelayerRegistrationCaller // Generic read-only contract binding to access the raw methods on
}

// RelayerRegistrationTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type RelayerRegistrationTransactorRaw struct {
	Contract *RelayerRegistrationTransactor // Generic write-only contract binding to access the raw methods on
}

// NewRelayerRegistration creates a new instance of RelayerRegistration, bound to a specific deployed contract.
func NewRelayerRegistration(address common.Address, backend bind.ContractBackend) (*RelayerRegistration, error) {
	contract, err := bindRelayerRegistration(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &RelayerRegistration{RelayerRegistrationCaller: RelayerRegistrationCaller{contract: contract}, RelayerRegistrationTransactor: RelayerRegistrationTransactor{contract: contract}, RelayerRegistrationFilterer: RelayerRegistrationFilterer{contract: contract}}, nil
}

// NewRelayerRegistrationCaller creates a new read-only instance of RelayerRegistration, bound to a specific deployed contract.
func NewRelayerRegistrationCaller(address common.Address, caller bind.ContractCaller) (*RelayerRegistrationCaller, error) {
	contract, err := bindRelayerRegistration(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationCaller{contract: contract}, nil
}

// NewRelayerRegistrationTransactor creates a new write-only instance of RelayerRegistration, bound to a specific deployed contract.
func NewRelayerRegistrationTransactor(address common.Address, transactor bind.ContractTransactor) (*RelayerRegistrationTransactor, error) {
	contract, err := bindRelayerRegistration(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationTransactor{contract: contract}, nil
}

// NewRelayerRegistrationFilterer creates a new log filterer instance of RelayerRegistration, bound to a specific deployed contract.
func NewRelayerRegistrationFilterer(address common.Address, filterer bind.ContractFilterer) (*RelayerRegistrationFilterer, error) {
	contract, err := bindRelayerRegistration(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationFilterer{contract: contract}, nil
}

// bindRelayerRegistration binds a generic wrapper to an already deployed contract.
func bindRelayerRegistration(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(RelayerRegistrationABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_RelayerRegistration *RelayerRegistrationRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _RelayerRegistration.Contract.RelayerRegistrationCaller.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_RelayerRegistration *RelayerRegistrationRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.RelayerRegistrationTransactor.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_RelayerRegistration *RelayerRegistrationRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.RelayerRegistrationTransactor.contract.Transact(opts, method, params...)
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_RelayerRegistration *RelayerRegistrationCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _RelayerRegistration.Contract.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_RelayerRegistration *RelayerRegistrationTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_RelayerRegistration *RelayerRegistrationTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.contract.Transact(opts, method, params...)
}

// ActiveRelayerCount is a free data retrieval call binding the contract method 0x735db683.
//
// Solidity: function ActiveRelayerCount() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCaller) ActiveRelayerCount(opts *bind.CallOpts) (*big.Int, error) {
	var (
		ret0 = new(*big.Int)
	)
	out := &[]interface{}{
		ret0,
	}
	err := _RelayerRegistration.contract.Call(opts, out, "ActiveRelayerCount")
	return *ret0, err
}

// ActiveRelayerCount is a free data retrieval call binding the contract method 0x735db683.
//
// Solidity: function ActiveRelayerCount() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationSession) ActiveRelayerCount() (*big.Int, error) {
	return _RelayerRegistration.Contract.ActiveRelayerCount(&_RelayerRegistration.CallOpts)
}

// ActiveRelayerCount is a free data retrieval call binding the contract method 0x735db683.
//
// Solidity: function ActiveRelayerCount() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCallerSession) ActiveRelayerCount() (*big.Int, error) {
	return _RelayerRegistration.Contract.ActiveRelayerCount(&_RelayerRegistration.CallOpts)
}

// CONTRACTOWNER is a free data retrieval call binding the contract method 0xfd301c49.
//
// Solidity: function CONTRACT_OWNER() constant returns(address)
func (_RelayerRegistration *RelayerRegistrationCaller) CONTRACTOWNER(opts *bind.CallOpts) (common.Address, error) {
	var (
		ret0 = new(common.Address)
	)
	out := &[]interface{}{
		ret0,
	}
	err := _RelayerRegistration.contract.Call(opts, out, "CONTRACT_OWNER")
	return *ret0, err
}

// CONTRACTOWNER is a free data retrieval call binding the contract method 0xfd301c49.
//
// Solidity: function CONTRACT_OWNER() constant returns(address)
func (_RelayerRegistration *RelayerRegistrationSession) CONTRACTOWNER() (common.Address, error) {
	return _RelayerRegistration.Contract.CONTRACTOWNER(&_RelayerRegistration.CallOpts)
}

// CONTRACTOWNER is a free data retrieval call binding the contract method 0xfd301c49.
//
// Solidity: function CONTRACT_OWNER() constant returns(address)
func (_RelayerRegistration *RelayerRegistrationCallerSession) CONTRACTOWNER() (common.Address, error) {
	return _RelayerRegistration.Contract.CONTRACTOWNER(&_RelayerRegistration.CallOpts)
}

// MaximumRelayers is a free data retrieval call binding the contract method 0x0e5c0fee.
//
// Solidity: function MaximumRelayers() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCaller) MaximumRelayers(opts *bind.CallOpts) (*big.Int, error) {
	var (
		ret0 = new(*big.Int)
	)
	out := &[]interface{}{
		ret0,
	}
	err := _RelayerRegistration.contract.Call(opts, out, "MaximumRelayers")
	return *ret0, err
}

// MaximumRelayers is a free data retrieval call binding the contract method 0x0e5c0fee.
//
// Solidity: function MaximumRelayers() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationSession) MaximumRelayers() (*big.Int, error) {
	return _RelayerRegistration.Contract.MaximumRelayers(&_RelayerRegistration.CallOpts)
}

// MaximumRelayers is a free data retrieval call binding the contract method 0x0e5c0fee.
//
// Solidity: function MaximumRelayers() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCallerSession) MaximumRelayers() (*big.Int, error) {
	return _RelayerRegistration.Contract.MaximumRelayers(&_RelayerRegistration.CallOpts)
}

// MaximumTokenList is a free data retrieval call binding the contract method 0xcfaece12.
//
// Solidity: function MaximumTokenList() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCaller) MaximumTokenList(opts *bind.CallOpts) (*big.Int, error) {
	var (
		ret0 = new(*big.Int)
	)
	out := &[]interface{}{
		ret0,
	}
	err := _RelayerRegistration.contract.Call(opts, out, "MaximumTokenList")
	return *ret0, err
}

// MaximumTokenList is a free data retrieval call binding the contract method 0xcfaece12.
//
// Solidity: function MaximumTokenList() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationSession) MaximumTokenList() (*big.Int, error) {
	return _RelayerRegistration.Contract.MaximumTokenList(&_RelayerRegistration.CallOpts)
}

// MaximumTokenList is a free data retrieval call binding the contract method 0xcfaece12.
//
// Solidity: function MaximumTokenList() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCallerSession) MaximumTokenList() (*big.Int, error) {
	return _RelayerRegistration.Contract.MaximumTokenList(&_RelayerRegistration.CallOpts)
}

// MinimumDeposit is a free data retrieval call binding the contract method 0xc635a9f2.
//
// Solidity: function MinimumDeposit() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCaller) MinimumDeposit(opts *bind.CallOpts) (*big.Int, error) {
	var (
		ret0 = new(*big.Int)
	)
	out := &[]interface{}{
		ret0,
	}
	err := _RelayerRegistration.contract.Call(opts, out, "MinimumDeposit")
	return *ret0, err
}

// MinimumDeposit is a free data retrieval call binding the contract method 0xc635a9f2.
//
// Solidity: function MinimumDeposit() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationSession) MinimumDeposit() (*big.Int, error) {
	return _RelayerRegistration.Contract.MinimumDeposit(&_RelayerRegistration.CallOpts)
}

// MinimumDeposit is a free data retrieval call binding the contract method 0xc635a9f2.
//
// Solidity: function MinimumDeposit() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCallerSession) MinimumDeposit() (*big.Int, error) {
	return _RelayerRegistration.Contract.MinimumDeposit(&_RelayerRegistration.CallOpts)
}

// RELAYERCOINBASES is a free data retrieval call binding the contract method 0x4fa33927.
//
// Solidity: function RELAYER_COINBASES( uint256) constant returns(address)
func (_RelayerRegistration *RelayerRegistrationCaller) RELAYERCOINBASES(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) {
	var (
		ret0 = new(common.Address)
	)
	out := &[]interface{}{
		ret0,
	}
	err := _RelayerRegistration.contract.Call(opts, out, "RELAYER_COINBASES", arg0)
	return *ret0, err
}

// RELAYERCOINBASES is a free data retrieval call binding the contract method 0x4fa33927.
//
// Solidity: function RELAYER_COINBASES( uint256) constant returns(address)
func (_RelayerRegistration *RelayerRegistrationSession) RELAYERCOINBASES(arg0 *big.Int) (common.Address, error) {
	return _RelayerRegistration.Contract.RELAYERCOINBASES(&_RelayerRegistration.CallOpts, arg0)
}

// RELAYERCOINBASES is a free data retrieval call binding the contract method 0x4fa33927.
//
// Solidity: function RELAYER_COINBASES( uint256) constant returns(address)
func (_RelayerRegistration *RelayerRegistrationCallerSession) RELAYERCOINBASES(arg0 *big.Int) (common.Address, error) {
	return _RelayerRegistration.Contract.RELAYERCOINBASES(&_RelayerRegistration.CallOpts, arg0)
}

// RELAYERLIST is a free data retrieval call binding the contract method 0x49ba1f70.
//
// Solidity: function RELAYER_LIST( address) constant returns(_deposit uint256, _tradeFee uint16, _index uint256, _owner address)
func (_RelayerRegistration *RelayerRegistrationCaller) RELAYERLIST(opts *bind.CallOpts, arg0 common.Address) (struct {
	Deposit  *big.Int
	TradeFee uint16
	Index    *big.Int
	Owner    common.Address
}, error) {
	ret := new(struct {
		Deposit  *big.Int
		TradeFee uint16
		Index    *big.Int
		Owner    common.Address
	})
	out := &[]interface{}{
		ret,
	}
	err := _RelayerRegistration.contract.Call(opts, out, "RELAYER_LIST", arg0)
	return *ret, err
}

// RELAYERLIST is a free data retrieval call binding the contract method 0x49ba1f70.
//
// Solidity: function RELAYER_LIST( address) constant returns(_deposit uint256, _tradeFee uint16, _index uint256, _owner address)
func (_RelayerRegistration *RelayerRegistrationSession) RELAYERLIST(arg0 common.Address) (struct {
	Deposit  *big.Int
	TradeFee uint16
	Index    *big.Int
	Owner    common.Address
}, error) {
	return _RelayerRegistration.Contract.RELAYERLIST(&_RelayerRegistration.CallOpts, arg0)
}

// RELAYERLIST is a free data retrieval call binding the contract method 0x49ba1f70.
//
// Solidity: function RELAYER_LIST( address) constant returns(_deposit uint256, _tradeFee uint16, _index uint256, _owner address)
func (_RelayerRegistration *RelayerRegistrationCallerSession) RELAYERLIST(arg0 common.Address) (struct {
	Deposit  *big.Int
	TradeFee uint16
	Index    *big.Int
	Owner    common.Address
}, error) {
	return _RelayerRegistration.Contract.RELAYERLIST(&_RelayerRegistration.CallOpts, arg0)
}

// RELAYERONSALELIST is a free data retrieval call binding the contract method 0x885b7137.
//
// Solidity: function RELAYER_ON_SALE_LIST( address) constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCaller) RELAYERONSALELIST(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
	var (
		ret0 = new(*big.Int)
	)
	out := &[]interface{}{
		ret0,
	}
	err := _RelayerRegistration.contract.Call(opts, out, "RELAYER_ON_SALE_LIST", arg0)
	return *ret0, err
}

// RELAYERONSALELIST is a free data retrieval call binding the contract method 0x885b7137.
//
// Solidity: function RELAYER_ON_SALE_LIST( address) constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationSession) RELAYERONSALELIST(arg0 common.Address) (*big.Int, error) {
	return _RelayerRegistration.Contract.RELAYERONSALELIST(&_RelayerRegistration.CallOpts, arg0)
}

// RELAYERONSALELIST is a free data retrieval call binding the contract method 0x885b7137.
//
// Solidity: function RELAYER_ON_SALE_LIST( address) constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCallerSession) RELAYERONSALELIST(arg0 common.Address) (*big.Int, error) {
	return _RelayerRegistration.Contract.RELAYERONSALELIST(&_RelayerRegistration.CallOpts, arg0)
}

// RESIGNREQUESTS is a free data retrieval call binding the contract method 0x500f99f7.
//
// Solidity: function RESIGN_REQUESTS( address) constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCaller) RESIGNREQUESTS(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
	var (
		ret0 = new(*big.Int)
	)
	out := &[]interface{}{
		ret0,
	}
	err := _RelayerRegistration.contract.Call(opts, out, "RESIGN_REQUESTS", arg0)
	return *ret0, err
}

// RESIGNREQUESTS is a free data retrieval call binding the contract method 0x500f99f7.
//
// Solidity: function RESIGN_REQUESTS( address) constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationSession) RESIGNREQUESTS(arg0 common.Address) (*big.Int, error) {
	return _RelayerRegistration.Contract.RESIGNREQUESTS(&_RelayerRegistration.CallOpts, arg0)
}

// RESIGNREQUESTS is a free data retrieval call binding the contract method 0x500f99f7.
//
// Solidity: function RESIGN_REQUESTS( address) constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCallerSession) RESIGNREQUESTS(arg0 common.Address) (*big.Int, error) {
	return _RelayerRegistration.Contract.RESIGNREQUESTS(&_RelayerRegistration.CallOpts, arg0)
}

// RelayerCount is a free data retrieval call binding the contract method 0x87d340ab.
//
// Solidity: function RelayerCount() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCaller) RelayerCount(opts *bind.CallOpts) (*big.Int, error) {
	var (
		ret0 = new(*big.Int)
	)
	out := &[]interface{}{
		ret0,
	}
	err := _RelayerRegistration.contract.Call(opts, out, "RelayerCount")
	return *ret0, err
}

// RelayerCount is a free data retrieval call binding the contract method 0x87d340ab.
//
// Solidity: function RelayerCount() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationSession) RelayerCount() (*big.Int, error) {
	return _RelayerRegistration.Contract.RelayerCount(&_RelayerRegistration.CallOpts)
}

// RelayerCount is a free data retrieval call binding the contract method 0x87d340ab.
//
// Solidity: function RelayerCount() constant returns(uint256)
func (_RelayerRegistration *RelayerRegistrationCallerSession) RelayerCount() (*big.Int, error) {
	return _RelayerRegistration.Contract.RelayerCount(&_RelayerRegistration.CallOpts)
}

// GetRelayerByCoinbase is a free data retrieval call binding the contract method 0x540105c7.
//
// Solidity: function getRelayerByCoinbase(coinbase address) constant returns(uint256, address, uint256, uint16, address[], address[])
func (_RelayerRegistration *RelayerRegistrationCaller) GetRelayerByCoinbase(opts *bind.CallOpts, coinbase common.Address) (*big.Int, common.Address, *big.Int, uint16, []common.Address, []common.Address, error) {
	var (
		ret0 = new(*big.Int)
		ret1 = new(common.Address)
		ret2 = new(*big.Int)
		ret3 = new(uint16)
		ret4 = new([]common.Address)
		ret5 = new([]common.Address)
	)
	out := &[]interface{}{
		ret0,
		ret1,
		ret2,
		ret3,
		ret4,
		ret5,
	}
	err := _RelayerRegistration.contract.Call(opts, out, "getRelayerByCoinbase", coinbase)
	return *ret0, *ret1, *ret2, *ret3, *ret4, *ret5, err
}

// GetRelayerByCoinbase is a free data retrieval call binding the contract method 0x540105c7.
//
// Solidity: function getRelayerByCoinbase(coinbase address) constant returns(uint256, address, uint256, uint16, address[], address[])
func (_RelayerRegistration *RelayerRegistrationSession) GetRelayerByCoinbase(coinbase common.Address) (*big.Int, common.Address, *big.Int, uint16, []common.Address, []common.Address, error) {
	return _RelayerRegistration.Contract.GetRelayerByCoinbase(&_RelayerRegistration.CallOpts, coinbase)
}

// GetRelayerByCoinbase is a free data retrieval call binding the contract method 0x540105c7.
//
// Solidity: function getRelayerByCoinbase(coinbase address) constant returns(uint256, address, uint256, uint16, address[], address[])
func (_RelayerRegistration *RelayerRegistrationCallerSession) GetRelayerByCoinbase(coinbase common.Address) (*big.Int, common.Address, *big.Int, uint16, []common.Address, []common.Address, error) {
	return _RelayerRegistration.Contract.GetRelayerByCoinbase(&_RelayerRegistration.CallOpts, coinbase)
}

// BuyRelayer is a paid mutator transaction binding the contract method 0xe699df0e.
//
// Solidity: function buyRelayer(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) BuyRelayer(opts *bind.TransactOpts, coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "buyRelayer", coinbase)
}

// BuyRelayer is a paid mutator transaction binding the contract method 0xe699df0e.
//
// Solidity: function buyRelayer(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationSession) BuyRelayer(coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.BuyRelayer(&_RelayerRegistration.TransactOpts, coinbase)
}

// BuyRelayer is a paid mutator transaction binding the contract method 0xe699df0e.
//
// Solidity: function buyRelayer(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) BuyRelayer(coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.BuyRelayer(&_RelayerRegistration.TransactOpts, coinbase)
}

// CancelSelling is a paid mutator transaction binding the contract method 0x5b673b1f.
//
// Solidity: function cancelSelling(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) CancelSelling(opts *bind.TransactOpts, coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "cancelSelling", coinbase)
}

// CancelSelling is a paid mutator transaction binding the contract method 0x5b673b1f.
//
// Solidity: function cancelSelling(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationSession) CancelSelling(coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.CancelSelling(&_RelayerRegistration.TransactOpts, coinbase)
}

// CancelSelling is a paid mutator transaction binding the contract method 0x5b673b1f.
//
// Solidity: function cancelSelling(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) CancelSelling(coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.CancelSelling(&_RelayerRegistration.TransactOpts, coinbase)
}

// ChangeContractOwner is a paid mutator transaction binding the contract method 0x3ead67b5.
//
// Solidity: function changeContractOwner(owner address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) ChangeContractOwner(opts *bind.TransactOpts, owner common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "changeContractOwner", owner)
}

// ChangeContractOwner is a paid mutator transaction binding the contract method 0x3ead67b5.
//
// Solidity: function changeContractOwner(owner address) returns()
func (_RelayerRegistration *RelayerRegistrationSession) ChangeContractOwner(owner common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.ChangeContractOwner(&_RelayerRegistration.TransactOpts, owner)
}

// ChangeContractOwner is a paid mutator transaction binding the contract method 0x3ead67b5.
//
// Solidity: function changeContractOwner(owner address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) ChangeContractOwner(owner common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.ChangeContractOwner(&_RelayerRegistration.TransactOpts, owner)
}

// DeListToken is a paid mutator transaction binding the contract method 0x7aa66730.
//
// Solidity: function deListToken(coinbase address, fromToken address, toToken address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) DeListToken(opts *bind.TransactOpts, coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "deListToken", coinbase, fromToken, toToken)
}

// DeListToken is a paid mutator transaction binding the contract method 0x7aa66730.
//
// Solidity: function deListToken(coinbase address, fromToken address, toToken address) returns()
func (_RelayerRegistration *RelayerRegistrationSession) DeListToken(coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.DeListToken(&_RelayerRegistration.TransactOpts, coinbase, fromToken, toToken)
}

// DeListToken is a paid mutator transaction binding the contract method 0x7aa66730.
//
// Solidity: function deListToken(coinbase address, fromToken address, toToken address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) DeListToken(coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.DeListToken(&_RelayerRegistration.TransactOpts, coinbase, fromToken, toToken)
}

// DepositMore is a paid mutator transaction binding the contract method 0x4ce69bf5.
//
// Solidity: function depositMore(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) DepositMore(opts *bind.TransactOpts, coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "depositMore", coinbase)
}

// DepositMore is a paid mutator transaction binding the contract method 0x4ce69bf5.
//
// Solidity: function depositMore(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationSession) DepositMore(coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.DepositMore(&_RelayerRegistration.TransactOpts, coinbase)
}

// DepositMore is a paid mutator transaction binding the contract method 0x4ce69bf5.
//
// Solidity: function depositMore(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) DepositMore(coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.DepositMore(&_RelayerRegistration.TransactOpts, coinbase)
}

// ListToken is a paid mutator transaction binding the contract method 0x08764b9d.
//
// Solidity: function listToken(coinbase address, fromToken address, toToken address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) ListToken(opts *bind.TransactOpts, coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "listToken", coinbase, fromToken, toToken)
}

// ListToken is a paid mutator transaction binding the contract method 0x08764b9d.
//
// Solidity: function listToken(coinbase address, fromToken address, toToken address) returns()
func (_RelayerRegistration *RelayerRegistrationSession) ListToken(coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.ListToken(&_RelayerRegistration.TransactOpts, coinbase, fromToken, toToken)
}

// ListToken is a paid mutator transaction binding the contract method 0x08764b9d.
//
// Solidity: function listToken(coinbase address, fromToken address, toToken address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) ListToken(coinbase common.Address, fromToken common.Address, toToken common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.ListToken(&_RelayerRegistration.TransactOpts, coinbase, fromToken, toToken)
}

// Reconfigure is a paid mutator transaction binding the contract method 0x57ea3c41.
//
// Solidity: function reconfigure(maxRelayer uint256, maxToken uint256, minDeposit uint256) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) Reconfigure(opts *bind.TransactOpts, maxRelayer *big.Int, maxToken *big.Int, minDeposit *big.Int) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "reconfigure", maxRelayer, maxToken, minDeposit)
}

// Reconfigure is a paid mutator transaction binding the contract method 0x57ea3c41.
//
// Solidity: function reconfigure(maxRelayer uint256, maxToken uint256, minDeposit uint256) returns()
func (_RelayerRegistration *RelayerRegistrationSession) Reconfigure(maxRelayer *big.Int, maxToken *big.Int, minDeposit *big.Int) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Reconfigure(&_RelayerRegistration.TransactOpts, maxRelayer, maxToken, minDeposit)
}

// Reconfigure is a paid mutator transaction binding the contract method 0x57ea3c41.
//
// Solidity: function reconfigure(maxRelayer uint256, maxToken uint256, minDeposit uint256) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) Reconfigure(maxRelayer *big.Int, maxToken *big.Int, minDeposit *big.Int) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Reconfigure(&_RelayerRegistration.TransactOpts, maxRelayer, maxToken, minDeposit)
}

// Refund is a paid mutator transaction binding the contract method 0xfa89401a.
//
// Solidity: function refund(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) Refund(opts *bind.TransactOpts, coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "refund", coinbase)
}

// Refund is a paid mutator transaction binding the contract method 0xfa89401a.
//
// Solidity: function refund(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationSession) Refund(coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Refund(&_RelayerRegistration.TransactOpts, coinbase)
}

// Refund is a paid mutator transaction binding the contract method 0xfa89401a.
//
// Solidity: function refund(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) Refund(coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Refund(&_RelayerRegistration.TransactOpts, coinbase)
}

// Register is a paid mutator transaction binding the contract method 0xc6c71aed.
//
// Solidity: function register(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) Register(opts *bind.TransactOpts, coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "register", coinbase, tradeFee, fromTokens, toTokens)
}

// Register is a paid mutator transaction binding the contract method 0xc6c71aed.
//
// Solidity: function register(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
func (_RelayerRegistration *RelayerRegistrationSession) Register(coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Register(&_RelayerRegistration.TransactOpts, coinbase, tradeFee, fromTokens, toTokens)
}

// Register is a paid mutator transaction binding the contract method 0xc6c71aed.
//
// Solidity: function register(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) Register(coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Register(&_RelayerRegistration.TransactOpts, coinbase, tradeFee, fromTokens, toTokens)
}

// Resign is a paid mutator transaction binding the contract method 0xae6e43f5.
//
// Solidity: function resign(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) Resign(opts *bind.TransactOpts, coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "resign", coinbase)
}

// Resign is a paid mutator transaction binding the contract method 0xae6e43f5.
//
// Solidity: function resign(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationSession) Resign(coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Resign(&_RelayerRegistration.TransactOpts, coinbase)
}

// Resign is a paid mutator transaction binding the contract method 0xae6e43f5.
//
// Solidity: function resign(coinbase address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) Resign(coinbase common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Resign(&_RelayerRegistration.TransactOpts, coinbase)
}

// SellRelayer is a paid mutator transaction binding the contract method 0x87c6bbcd.
//
// Solidity: function sellRelayer(coinbase address, price uint256) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) SellRelayer(opts *bind.TransactOpts, coinbase common.Address, price *big.Int) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "sellRelayer", coinbase, price)
}

// SellRelayer is a paid mutator transaction binding the contract method 0x87c6bbcd.
//
// Solidity: function sellRelayer(coinbase address, price uint256) returns()
func (_RelayerRegistration *RelayerRegistrationSession) SellRelayer(coinbase common.Address, price *big.Int) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.SellRelayer(&_RelayerRegistration.TransactOpts, coinbase, price)
}

// SellRelayer is a paid mutator transaction binding the contract method 0x87c6bbcd.
//
// Solidity: function sellRelayer(coinbase address, price uint256) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) SellRelayer(coinbase common.Address, price *big.Int) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.SellRelayer(&_RelayerRegistration.TransactOpts, coinbase, price)
}

// Transfer is a paid mutator transaction binding the contract method 0xba45b0b8.
//
// Solidity: function transfer(coinbase address, new_owner address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) Transfer(opts *bind.TransactOpts, coinbase common.Address, new_owner common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "transfer", coinbase, new_owner)
}

// Transfer is a paid mutator transaction binding the contract method 0xba45b0b8.
//
// Solidity: function transfer(coinbase address, new_owner address) returns()
func (_RelayerRegistration *RelayerRegistrationSession) Transfer(coinbase common.Address, new_owner common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Transfer(&_RelayerRegistration.TransactOpts, coinbase, new_owner)
}

// Transfer is a paid mutator transaction binding the contract method 0xba45b0b8.
//
// Solidity: function transfer(coinbase address, new_owner address) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) Transfer(coinbase common.Address, new_owner common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Transfer(&_RelayerRegistration.TransactOpts, coinbase, new_owner)
}

// Update is a paid mutator transaction binding the contract method 0x56246b68.
//
// Solidity: function update(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) Update(opts *bind.TransactOpts, coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "update", coinbase, tradeFee, fromTokens, toTokens)
}

// Update is a paid mutator transaction binding the contract method 0x56246b68.
//
// Solidity: function update(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
func (_RelayerRegistration *RelayerRegistrationSession) Update(coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Update(&_RelayerRegistration.TransactOpts, coinbase, tradeFee, fromTokens, toTokens)
}

// Update is a paid mutator transaction binding the contract method 0x56246b68.
//
// Solidity: function update(coinbase address, tradeFee uint16, fromTokens address[], toTokens address[]) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) Update(coinbase common.Address, tradeFee uint16, fromTokens []common.Address, toTokens []common.Address) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.Update(&_RelayerRegistration.TransactOpts, coinbase, tradeFee, fromTokens, toTokens)
}

// UpdateFee is a paid mutator transaction binding the contract method 0x3ea2391f.
//
// Solidity: function updateFee(coinbase address, tradeFee uint16) returns()
func (_RelayerRegistration *RelayerRegistrationTransactor) UpdateFee(opts *bind.TransactOpts, coinbase common.Address, tradeFee uint16) (*types.Transaction, error) {
	return _RelayerRegistration.contract.Transact(opts, "updateFee", coinbase, tradeFee)
}

// UpdateFee is a paid mutator transaction binding the contract method 0x3ea2391f.
//
// Solidity: function updateFee(coinbase address, tradeFee uint16) returns()
func (_RelayerRegistration *RelayerRegistrationSession) UpdateFee(coinbase common.Address, tradeFee uint16) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.UpdateFee(&_RelayerRegistration.TransactOpts, coinbase, tradeFee)
}

// UpdateFee is a paid mutator transaction binding the contract method 0x3ea2391f.
//
// Solidity: function updateFee(coinbase address, tradeFee uint16) returns()
func (_RelayerRegistration *RelayerRegistrationTransactorSession) UpdateFee(coinbase common.Address, tradeFee uint16) (*types.Transaction, error) {
	return _RelayerRegistration.Contract.UpdateFee(&_RelayerRegistration.TransactOpts, coinbase, tradeFee)
}

// RelayerRegistrationBuyEventIterator is returned from FilterBuyEvent and is used to iterate over the raw logs and unpacked data for BuyEvent events raised by the RelayerRegistration contract.
type RelayerRegistrationBuyEventIterator struct {
	Event *RelayerRegistrationBuyEvent // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *RelayerRegistrationBuyEventIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(RelayerRegistrationBuyEvent)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(RelayerRegistrationBuyEvent)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *RelayerRegistrationBuyEventIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *RelayerRegistrationBuyEventIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// RelayerRegistrationBuyEvent represents a BuyEvent event raised by the RelayerRegistration contract.
type RelayerRegistrationBuyEvent struct {
	Success  bool
	Coinbase common.Address
	Price    *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}

// FilterBuyEvent is a free log retrieval operation binding the contract event 0x07e248a3b3d2184a9491c3b45089a6e15aac742b9d974e691e7beb0f6e7c58c6.
//
// Solidity: event BuyEvent(success bool, coinbase address, price uint256)
func (_RelayerRegistration *RelayerRegistrationFilterer) FilterBuyEvent(opts *bind.FilterOpts) (*RelayerRegistrationBuyEventIterator, error) {

	logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "BuyEvent")
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationBuyEventIterator{contract: _RelayerRegistration.contract, event: "BuyEvent", logs: logs, sub: sub}, nil
}

// WatchBuyEvent is a free log subscription operation binding the contract event 0x07e248a3b3d2184a9491c3b45089a6e15aac742b9d974e691e7beb0f6e7c58c6.
//
// Solidity: event BuyEvent(success bool, coinbase address, price uint256)
func (_RelayerRegistration *RelayerRegistrationFilterer) WatchBuyEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationBuyEvent) (event.Subscription, error) {

	logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "BuyEvent")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(RelayerRegistrationBuyEvent)
				if err := _RelayerRegistration.contract.UnpackLog(event, "BuyEvent", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// RelayerRegistrationConfigEventIterator is returned from FilterConfigEvent and is used to iterate over the raw logs and unpacked data for ConfigEvent events raised by the RelayerRegistration contract.
type RelayerRegistrationConfigEventIterator struct {
	Event *RelayerRegistrationConfigEvent // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *RelayerRegistrationConfigEventIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(RelayerRegistrationConfigEvent)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(RelayerRegistrationConfigEvent)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *RelayerRegistrationConfigEventIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *RelayerRegistrationConfigEventIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// RelayerRegistrationConfigEvent represents a ConfigEvent event raised by the RelayerRegistration contract.
type RelayerRegistrationConfigEvent struct {
	MaxRelayer *big.Int
	MaxToken   *big.Int
	MinDeposit *big.Int
	Raw        types.Log // Blockchain specific contextual infos
}

// FilterConfigEvent is a free log retrieval operation binding the contract event 0x8f6bd709a98381db4e403a67ba106d598972dad177e946f19b54777f54d93923.
//
// Solidity: event ConfigEvent(max_relayer uint256, max_token uint256, min_deposit uint256)
func (_RelayerRegistration *RelayerRegistrationFilterer) FilterConfigEvent(opts *bind.FilterOpts) (*RelayerRegistrationConfigEventIterator, error) {

	logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "ConfigEvent")
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationConfigEventIterator{contract: _RelayerRegistration.contract, event: "ConfigEvent", logs: logs, sub: sub}, nil
}

// WatchConfigEvent is a free log subscription operation binding the contract event 0x8f6bd709a98381db4e403a67ba106d598972dad177e946f19b54777f54d93923.
//
// Solidity: event ConfigEvent(max_relayer uint256, max_token uint256, min_deposit uint256)
func (_RelayerRegistration *RelayerRegistrationFilterer) WatchConfigEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationConfigEvent) (event.Subscription, error) {

	logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "ConfigEvent")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(RelayerRegistrationConfigEvent)
				if err := _RelayerRegistration.contract.UnpackLog(event, "ConfigEvent", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// RelayerRegistrationRefundEventIterator is returned from FilterRefundEvent and is used to iterate over the raw logs and unpacked data for RefundEvent events raised by the RelayerRegistration contract.
type RelayerRegistrationRefundEventIterator struct {
	Event *RelayerRegistrationRefundEvent // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *RelayerRegistrationRefundEventIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(RelayerRegistrationRefundEvent)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(RelayerRegistrationRefundEvent)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *RelayerRegistrationRefundEventIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *RelayerRegistrationRefundEventIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// RelayerRegistrationRefundEvent represents a RefundEvent event raised by the RelayerRegistration contract.
type RelayerRegistrationRefundEvent struct {
	Success       bool
	RemainingTime *big.Int
	DepositAmount *big.Int
	Raw           types.Log // Blockchain specific contextual infos
}

// FilterRefundEvent is a free log retrieval operation binding the contract event 0xfaba1aac53309af4c1c439f38c29500d3828405ee1ca5e7641b0432d17d30250.
//
// Solidity: event RefundEvent(success bool, remaining_time uint256, deposit_amount uint256)
func (_RelayerRegistration *RelayerRegistrationFilterer) FilterRefundEvent(opts *bind.FilterOpts) (*RelayerRegistrationRefundEventIterator, error) {

	logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "RefundEvent")
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationRefundEventIterator{contract: _RelayerRegistration.contract, event: "RefundEvent", logs: logs, sub: sub}, nil
}

// WatchRefundEvent is a free log subscription operation binding the contract event 0xfaba1aac53309af4c1c439f38c29500d3828405ee1ca5e7641b0432d17d30250.
//
// Solidity: event RefundEvent(success bool, remaining_time uint256, deposit_amount uint256)
func (_RelayerRegistration *RelayerRegistrationFilterer) WatchRefundEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationRefundEvent) (event.Subscription, error) {

	logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "RefundEvent")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(RelayerRegistrationRefundEvent)
				if err := _RelayerRegistration.contract.UnpackLog(event, "RefundEvent", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// RelayerRegistrationRegisterEventIterator is returned from FilterRegisterEvent and is used to iterate over the raw logs and unpacked data for RegisterEvent events raised by the RelayerRegistration contract.
type RelayerRegistrationRegisterEventIterator struct {
	Event *RelayerRegistrationRegisterEvent // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *RelayerRegistrationRegisterEventIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(RelayerRegistrationRegisterEvent)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(RelayerRegistrationRegisterEvent)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *RelayerRegistrationRegisterEventIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *RelayerRegistrationRegisterEventIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// RelayerRegistrationRegisterEvent represents a RegisterEvent event raised by the RelayerRegistration contract.
type RelayerRegistrationRegisterEvent struct {
	Deposit    *big.Int
	TradeFee   uint16
	FromTokens []common.Address
	ToTokens   []common.Address
	Raw        types.Log // Blockchain specific contextual infos
}

// FilterRegisterEvent is a free log retrieval operation binding the contract event 0xcf24380d990b0bb3dd21518926bca48f81495ac131ee92655696db28c43b1b1b.
//
// Solidity: event RegisterEvent(deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
func (_RelayerRegistration *RelayerRegistrationFilterer) FilterRegisterEvent(opts *bind.FilterOpts) (*RelayerRegistrationRegisterEventIterator, error) {

	logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "RegisterEvent")
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationRegisterEventIterator{contract: _RelayerRegistration.contract, event: "RegisterEvent", logs: logs, sub: sub}, nil
}

// WatchRegisterEvent is a free log subscription operation binding the contract event 0xcf24380d990b0bb3dd21518926bca48f81495ac131ee92655696db28c43b1b1b.
//
// Solidity: event RegisterEvent(deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
func (_RelayerRegistration *RelayerRegistrationFilterer) WatchRegisterEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationRegisterEvent) (event.Subscription, error) {

	logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "RegisterEvent")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(RelayerRegistrationRegisterEvent)
				if err := _RelayerRegistration.contract.UnpackLog(event, "RegisterEvent", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// RelayerRegistrationResignEventIterator is returned from FilterResignEvent and is used to iterate over the raw logs and unpacked data for ResignEvent events raised by the RelayerRegistration contract.
type RelayerRegistrationResignEventIterator struct {
	Event *RelayerRegistrationResignEvent // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *RelayerRegistrationResignEventIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(RelayerRegistrationResignEvent)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(RelayerRegistrationResignEvent)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *RelayerRegistrationResignEventIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *RelayerRegistrationResignEventIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// RelayerRegistrationResignEvent represents a ResignEvent event raised by the RelayerRegistration contract.
type RelayerRegistrationResignEvent struct {
	DepositReleaseTime *big.Int
	DepositAmount      *big.Int
	Raw                types.Log // Blockchain specific contextual infos
}

// FilterResignEvent is a free log retrieval operation binding the contract event 0x2e821a4329d6351a6b13fe0c12fd7674cd0f4a2283685a4713e1325f36415ae5.
//
// Solidity: event ResignEvent(deposit_release_time uint256, deposit_amount uint256)
func (_RelayerRegistration *RelayerRegistrationFilterer) FilterResignEvent(opts *bind.FilterOpts) (*RelayerRegistrationResignEventIterator, error) {

	logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "ResignEvent")
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationResignEventIterator{contract: _RelayerRegistration.contract, event: "ResignEvent", logs: logs, sub: sub}, nil
}

// WatchResignEvent is a free log subscription operation binding the contract event 0x2e821a4329d6351a6b13fe0c12fd7674cd0f4a2283685a4713e1325f36415ae5.
//
// Solidity: event ResignEvent(deposit_release_time uint256, deposit_amount uint256)
func (_RelayerRegistration *RelayerRegistrationFilterer) WatchResignEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationResignEvent) (event.Subscription, error) {

	logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "ResignEvent")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(RelayerRegistrationResignEvent)
				if err := _RelayerRegistration.contract.UnpackLog(event, "ResignEvent", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// RelayerRegistrationSellEventIterator is returned from FilterSellEvent and is used to iterate over the raw logs and unpacked data for SellEvent events raised by the RelayerRegistration contract.
type RelayerRegistrationSellEventIterator struct {
	Event *RelayerRegistrationSellEvent // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *RelayerRegistrationSellEventIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(RelayerRegistrationSellEvent)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(RelayerRegistrationSellEvent)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *RelayerRegistrationSellEventIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *RelayerRegistrationSellEventIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// RelayerRegistrationSellEvent represents a SellEvent event raised by the RelayerRegistration contract.
type RelayerRegistrationSellEvent struct {
	IsOnSale bool
	Coinbase common.Address
	Price    *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}

// FilterSellEvent is a free log retrieval operation binding the contract event 0xdb3d5e65fcde89731529c01d62b87bab1c64471cffdd528fc1adbc1712b5d082.
//
// Solidity: event SellEvent(is_on_sale bool, coinbase address, price uint256)
func (_RelayerRegistration *RelayerRegistrationFilterer) FilterSellEvent(opts *bind.FilterOpts) (*RelayerRegistrationSellEventIterator, error) {

	logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "SellEvent")
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationSellEventIterator{contract: _RelayerRegistration.contract, event: "SellEvent", logs: logs, sub: sub}, nil
}

// WatchSellEvent is a free log subscription operation binding the contract event 0xdb3d5e65fcde89731529c01d62b87bab1c64471cffdd528fc1adbc1712b5d082.
//
// Solidity: event SellEvent(is_on_sale bool, coinbase address, price uint256)
func (_RelayerRegistration *RelayerRegistrationFilterer) WatchSellEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationSellEvent) (event.Subscription, error) {

	logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "SellEvent")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(RelayerRegistrationSellEvent)
				if err := _RelayerRegistration.contract.UnpackLog(event, "SellEvent", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// RelayerRegistrationTransferEventIterator is returned from FilterTransferEvent and is used to iterate over the raw logs and unpacked data for TransferEvent events raised by the RelayerRegistration contract.
type RelayerRegistrationTransferEventIterator struct {
	Event *RelayerRegistrationTransferEvent // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *RelayerRegistrationTransferEventIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(RelayerRegistrationTransferEvent)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(RelayerRegistrationTransferEvent)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *RelayerRegistrationTransferEventIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *RelayerRegistrationTransferEventIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// RelayerRegistrationTransferEvent represents a TransferEvent event raised by the RelayerRegistration contract.
type RelayerRegistrationTransferEvent struct {
	Owner      common.Address
	Deposit    *big.Int
	TradeFee   uint16
	FromTokens []common.Address
	ToTokens   []common.Address
	Raw        types.Log // Blockchain specific contextual infos
}

// FilterTransferEvent is a free log retrieval operation binding the contract event 0xc13ab794f75ba420a1f52192a8e35a2cf2c74ae31ed94f53f47ce7712011b662.
//
// Solidity: event TransferEvent(owner address, deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
func (_RelayerRegistration *RelayerRegistrationFilterer) FilterTransferEvent(opts *bind.FilterOpts) (*RelayerRegistrationTransferEventIterator, error) {

	logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "TransferEvent")
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationTransferEventIterator{contract: _RelayerRegistration.contract, event: "TransferEvent", logs: logs, sub: sub}, nil
}

// WatchTransferEvent is a free log subscription operation binding the contract event 0xc13ab794f75ba420a1f52192a8e35a2cf2c74ae31ed94f53f47ce7712011b662.
//
// Solidity: event TransferEvent(owner address, deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
func (_RelayerRegistration *RelayerRegistrationFilterer) WatchTransferEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationTransferEvent) (event.Subscription, error) {

	logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "TransferEvent")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(RelayerRegistrationTransferEvent)
				if err := _RelayerRegistration.contract.UnpackLog(event, "TransferEvent", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// RelayerRegistrationUpdateEventIterator is returned from FilterUpdateEvent and is used to iterate over the raw logs and unpacked data for UpdateEvent events raised by the RelayerRegistration contract.
type RelayerRegistrationUpdateEventIterator struct {
	Event *RelayerRegistrationUpdateEvent // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *RelayerRegistrationUpdateEventIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(RelayerRegistrationUpdateEvent)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(RelayerRegistrationUpdateEvent)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *RelayerRegistrationUpdateEventIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *RelayerRegistrationUpdateEventIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// RelayerRegistrationUpdateEvent represents a UpdateEvent event raised by the RelayerRegistration contract.
type RelayerRegistrationUpdateEvent struct {
	Deposit    *big.Int
	TradeFee   uint16
	FromTokens []common.Address
	ToTokens   []common.Address
	Raw        types.Log // Blockchain specific contextual infos
}

// FilterUpdateEvent is a free log retrieval operation binding the contract event 0xcaa8c94daf6ecfd00518cea95158f5273730574cca907eb0cd47e50732314c4f.
//
// Solidity: event UpdateEvent(deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
func (_RelayerRegistration *RelayerRegistrationFilterer) FilterUpdateEvent(opts *bind.FilterOpts) (*RelayerRegistrationUpdateEventIterator, error) {

	logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "UpdateEvent")
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationUpdateEventIterator{contract: _RelayerRegistration.contract, event: "UpdateEvent", logs: logs, sub: sub}, nil
}

// WatchUpdateEvent is a free log subscription operation binding the contract event 0xcaa8c94daf6ecfd00518cea95158f5273730574cca907eb0cd47e50732314c4f.
//
// Solidity: event UpdateEvent(deposit uint256, tradeFee uint16, fromTokens address[], toTokens address[])
func (_RelayerRegistration *RelayerRegistrationFilterer) WatchUpdateEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationUpdateEvent) (event.Subscription, error) {

	logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "UpdateEvent")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(RelayerRegistrationUpdateEvent)
				if err := _RelayerRegistration.contract.UnpackLog(event, "UpdateEvent", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// RelayerRegistrationUpdateFeeEventIterator is returned from FilterUpdateFeeEvent and is used to iterate over the raw logs and unpacked data for UpdateFeeEvent events raised by the RelayerRegistration contract.
type RelayerRegistrationUpdateFeeEventIterator struct {
	Event *RelayerRegistrationUpdateFeeEvent // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *RelayerRegistrationUpdateFeeEventIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(RelayerRegistrationUpdateFeeEvent)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(RelayerRegistrationUpdateFeeEvent)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *RelayerRegistrationUpdateFeeEventIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *RelayerRegistrationUpdateFeeEventIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// RelayerRegistrationUpdateFeeEvent represents a UpdateFeeEvent event raised by the RelayerRegistration contract.
type RelayerRegistrationUpdateFeeEvent struct {
	Coinbase common.Address
	TradeFee uint16
	Raw      types.Log // Blockchain specific contextual infos
}

// FilterUpdateFeeEvent is a free log retrieval operation binding the contract event 0x5a4f79c1a68f4f5ef7148ac4f279a5a6caeb3237082c64f692e92c9e02ffc459.
//
// Solidity: event UpdateFeeEvent(coinbase address, tradeFee uint16)
func (_RelayerRegistration *RelayerRegistrationFilterer) FilterUpdateFeeEvent(opts *bind.FilterOpts) (*RelayerRegistrationUpdateFeeEventIterator, error) {

	logs, sub, err := _RelayerRegistration.contract.FilterLogs(opts, "UpdateFeeEvent")
	if err != nil {
		return nil, err
	}
	return &RelayerRegistrationUpdateFeeEventIterator{contract: _RelayerRegistration.contract, event: "UpdateFeeEvent", logs: logs, sub: sub}, nil
}

// WatchUpdateFeeEvent is a free log subscription operation binding the contract event 0x5a4f79c1a68f4f5ef7148ac4f279a5a6caeb3237082c64f692e92c9e02ffc459.
//
// Solidity: event UpdateFeeEvent(coinbase address, tradeFee uint16)
func (_RelayerRegistration *RelayerRegistrationFilterer) WatchUpdateFeeEvent(opts *bind.WatchOpts, sink chan<- *RelayerRegistrationUpdateFeeEvent) (event.Subscription, error) {

	logs, sub, err := _RelayerRegistration.contract.WatchLogs(opts, "UpdateFeeEvent")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(RelayerRegistrationUpdateFeeEvent)
				if err := _RelayerRegistration.contract.UnpackLog(event, "UpdateFeeEvent", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// SafeMathABI is the input ABI used to generate the binding from.
const SafeMathABI = "[]"

// SafeMathBin is the compiled bytecode used for deploying new contracts.
const SafeMathBin = `0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146080604052600080fd00a165627a7a72305820c6c4834061dabec64e5ceac30b20029de90ad520415e80a05c3d6dd6fae00bc80029`

// DeploySafeMath deploys a new Ethereum contract, binding an instance of SafeMath to it.
func DeploySafeMath(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SafeMath, error) {
	parsed, err := abi.JSON(strings.NewReader(SafeMathABI))
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(SafeMathBin), backend)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil
}

// SafeMath is an auto generated Go binding around an Ethereum contract.
type SafeMath struct {
	SafeMathCaller     // Read-only binding to the contract
	SafeMathTransactor // Write-only binding to the contract
	SafeMathFilterer   // Log filterer for contract events
}

// SafeMathCaller is an auto generated read-only Go binding around an Ethereum contract.
type SafeMathCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// SafeMathTransactor is an auto generated write-only Go binding around an Ethereum contract.
type SafeMathTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// SafeMathFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type SafeMathFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// SafeMathSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type SafeMathSession struct {
	Contract     *SafeMath         // Generic contract binding to set the session for
	CallOpts     bind.CallOpts     // Call options to use throughout this session
	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}

// SafeMathCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type SafeMathCallerSession struct {
	Contract *SafeMathCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts   // Call options to use throughout this session
}

// SafeMathTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type SafeMathTransactorSession struct {
	Contract     *SafeMathTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts   // Transaction auth options to use throughout this session
}

// SafeMathRaw is an auto generated low-level Go binding around an Ethereum contract.
type SafeMathRaw struct {
	Contract *SafeMath // Generic contract binding to access the raw methods on
}

// SafeMathCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type SafeMathCallerRaw struct {
	Contract *SafeMathCaller // Generic read-only contract binding to access the raw methods on
}

// SafeMathTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type SafeMathTransactorRaw struct {
	Contract *SafeMathTransactor // Generic write-only contract binding to access the raw methods on
}

// NewSafeMath creates a new instance of SafeMath, bound to a specific deployed contract.
func NewSafeMath(address common.Address, backend bind.ContractBackend) (*SafeMath, error) {
	contract, err := bindSafeMath(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &SafeMath{SafeMathCaller: SafeMathCaller{contract: contract}, SafeMathTransactor: SafeMathTransactor{contract: contract}, SafeMathFilterer: SafeMathFilterer{contract: contract}}, nil
}

// NewSafeMathCaller creates a new read-only instance of SafeMath, bound to a specific deployed contract.
func NewSafeMathCaller(address common.Address, caller bind.ContractCaller) (*SafeMathCaller, error) {
	contract, err := bindSafeMath(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &SafeMathCaller{contract: contract}, nil
}

// NewSafeMathTransactor creates a new write-only instance of SafeMath, bound to a specific deployed contract.
func NewSafeMathTransactor(address common.Address, transactor bind.ContractTransactor) (*SafeMathTransactor, error) {
	contract, err := bindSafeMath(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &SafeMathTransactor{contract: contract}, nil
}

// NewSafeMathFilterer creates a new log filterer instance of SafeMath, bound to a specific deployed contract.
func NewSafeMathFilterer(address common.Address, filterer bind.ContractFilterer) (*SafeMathFilterer, error) {
	contract, err := bindSafeMath(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &SafeMathFilterer{contract: contract}, nil
}

// bindSafeMath binds a generic wrapper to an already deployed contract.
func bindSafeMath(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(SafeMathABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_SafeMath *SafeMathRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _SafeMath.Contract.SafeMathCaller.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SafeMath *SafeMathRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _SafeMath.Contract.SafeMathTransactor.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_SafeMath *SafeMathRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _SafeMath.Contract.SafeMathTransactor.contract.Transact(opts, method, params...)
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_SafeMath *SafeMathCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _SafeMath.Contract.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SafeMath *SafeMathTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _SafeMath.Contract.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_SafeMath *SafeMathTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _SafeMath.Contract.contract.Transact(opts, method, params...)
}
