[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AlreadyInitialized", "type": "error" }, { "inputs": [], "name": "AmountMustBeGreaterThanZero", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "minimumAmount", "type": "uint256" } ], "name": "AmountOfTokensLessThanMinimumRequired", "type": "error" }, { "inputs": [], "name": "AutoSwapPrevented", "type": "error" }, { "inputs": [], "name": "BoughtAmountTooLow", "type": "error" }, { "inputs": [], "name": "ContractIsNotInitialized", "type": "error" }, { "inputs": [], "name": "DecreasesK", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "allowance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientAllowance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "needed", "type": "uint256" } ], "name": "ERC20InsufficientBalance", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "approver", "type": "address" } ], "name": "ERC20InvalidApprover", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "ERC20InvalidReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "ERC20InvalidSender", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" } ], "name": "ERC20InvalidSpender", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "ERC2612ExpiredSignature", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "signer", "type": "address" }, { "internalType": "address", "name": "owner", "type": "address" } ], "name": "ERC2612InvalidSigner", "type": "error" }, { "inputs": [], "name": "FailedToSendNativeCurrency", "type": "error" }, { "inputs": [], "name": "InsufficientLiquidity", "type": "error" }, { "inputs": [], "name": "InsufficientLiquidityMinted", "type": "error" }, { "inputs": [], "name": "InvalidAddress", "type": "error" }, { "inputs": [], "name": "InvalidFeeRate", "type": "error" }, { "inputs": [], "name": "InvalidMaxWalletPercent", "type": "error" }, { "inputs": [], "name": "InvalidOwner", "type": "error" }, { "inputs": [], "name": "InvalidRecipient", "type": "error" }, { "inputs": [], "name": "InvalidReserves", "type": "error" }, { "inputs": [], "name": "MaxWalletAmountExceeded", "type": "error" }, { "inputs": [], "name": "NameAndSymbolAlreadySet", "type": "error" }, { "inputs": [], "name": "NameAndSymbolMustNotBeEmpty", "type": "error" }, { "inputs": [], "name": "NativeRepaymentFailed", "type": "error" }, { "inputs": [], "name": "NoFeesToClaim", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardReentrantCall", "type": "error" }, { "inputs": [], "name": "SlippageToleranceExceeded", "type": "error" }, { "inputs": [], "name": "StillBonding", "type": "error" }, { "inputs": [], "name": "SupplyAlreadyMinted", "type": "error" }, { "inputs": [], "name": "SwapNotEnabled", "type": "error" }, { "inputs": [], "name": "TokenRepaymentFailed", "type": "error" }, { "inputs": [], "name": "TransactionExpired", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" } ], "name": "Unauthorized", "type": "error" }, { "inputs": [], "name": "YouHaveNoLiquidity", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "provider", "type": "address" }, { "indexed": true, "internalType": "address", "name": "toAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "liquidityMinted", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "AddLiquidity", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amountNative", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountToken", "type": "uint256" } ], "name": "FeesCollected", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "feeTo", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "FeesDistributed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "tokenPriceInNative", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "nativePriceInToken", "type": "uint256" }, { "indexed": false, "internalType": "uint32", "name": "blockTimestampLast", "type": "uint32" } ], "name": "PricesUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "provider", "type": "address" }, { "indexed": true, "internalType": "address", "name": "toAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "liquidityBurned", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "RemoveLiquidity", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amountTokenIn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountNativeIn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountTokenOut", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountNativeOut", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "flashSwap", "type": "bool" } ], "name": "Swap", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [], "name": "BASE_SWAP_RATE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "DEAD_ADDRESS", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "DOMAIN_SEPARATOR", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "FLASHSWAP_FEE_RATE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_FEE_RATE", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MINIMUM_LIQUIDITY", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "PERMIT_TYPEHASH", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "SCALE_FACTOR", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedNativeFactoryFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedNativeTradingFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedTokenFactoryFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accruedTokenTradingFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amountToken_", "type": "uint256" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "addLiquidity", "outputs": [ { "internalType": "uint256", "name": "liquidity", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "blockTimestampLast", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "burnFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "burstFactory", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "claimFees", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "completeTheCurve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "curveComplete", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "factory", "outputs": [ { "internalType": "contract IBIFKN314Factory", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "feeCollector", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amountNativeOut", "type": "uint256" }, { "internalType": "uint256", "name": "amountTokenOut", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "flashSwap", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "outputAmount", "type": "uint256" }, { "internalType": "uint256", "name": "inputReserve", "type": "uint256" }, { "internalType": "uint256", "name": "outputReserve", "type": "uint256" } ], "name": "getAmountIn", "outputs": [ { "internalType": "uint256", "name": "inputAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "inputAmount", "type": "uint256" }, { "internalType": "uint256", "name": "inputReserve", "type": "uint256" }, { "internalType": "uint256", "name": "outputReserve", "type": "uint256" } ], "name": "getAmountOut", "outputs": [ { "internalType": "uint256", "name": "outputAmount", "type": "uint256" }, { "internalType": "uint256", "name": "factoryFee", "type": "uint256" }, { "internalType": "uint256", "name": "tradingFee", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "getAmountsForLP", "outputs": [ { "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getReserves", "outputs": [ { "internalType": "uint256", "name": "amountNative", "type": "uint256" }, { "internalType": "uint256", "name": "amountToken", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTokensInContract", "outputs": [ { "internalType": "uint256", "name": "tokenBalance", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "tokenName", "type": "string" }, { "internalType": "string", "name": "tokenSymbol", "type": "string" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "burstFactory_", "type": "address" } ], "name": "initializeBurstToken", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "initializeFactory", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "isInitialized", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "isMaxWalletExempt", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "liquidityToken", "outputs": [ { "internalType": "contract BIFKN314LP", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxWalletEnabled", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxWalletPercent", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "metadataURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "permit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "price0CumulativeLast", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "price1CumulativeLast", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "removeLiquidity", "outputs": [ { "internalType": "uint256", "name": "nativeAmount", "type": "uint256" }, { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "feeCollector_", "type": "address" } ], "name": "setFeeCollector", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "enabled", "type": "bool" } ], "name": "setMaxWalletEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "addressToChange", "type": "address" }, { "internalType": "bool", "name": "isExempt", "type": "bool" } ], "name": "setMaxWalletExempt", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "maxWalletPercent_", "type": "uint256" } ], "name": "setMaxWalletPercent", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "newURI", "type": "string" } ], "name": "setMetadataURI", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "totalSupply_", "type": "uint256" }, { "internalType": "address", "name": "owner_", "type": "address" }, { "internalType": "uint256", "name": "feeRate_", "type": "uint256" }, { "internalType": "uint256", "name": "maxWalletPercent_", "type": "uint256" }, { "internalType": "string", "name": "metadataURI_", "type": "string" } ], "name": "setSupplyAndMint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "setTradingEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "feeRate", "type": "uint256" } ], "name": "setTradingFeeRate", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "minimumTokensOut", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "swapNativeToToken", "outputs": [ { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokensSold", "type": "uint256" }, { "internalType": "uint256", "name": "minimumNativeOut", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" } ], "name": "swapTokenToNative", "outputs": [ { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tradingEnabled", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tradingFeeRate", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "success", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "success", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ]
60806040523480156200001157600080fd5b5060016007553362000023816200002a565b506200007c565b601780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b615074806200008c6000396000f3fe60806040526004361061035c5760003560e01c80635a3d5493116101bd578063a42dce80116100f8578063ce4b5bbe1161009b578063ce4b5bbe14610a72578063d045a32914610a88578063d294f09314610aa2578063d505accf14610ab7578063dd62ed3e14610ad7578063e01df1a814610af7578063e156afd514610b0d578063e6cb316614610b22578063f2fde38b14610b4257600080fd5b8063a42dce8014610963578063a614ff7514610983578063a9059cbb146109a3578063ba9a7a56146109c3578063c415b95c146109d9578063c45a0155146109f9578063c4ccdeea14610a20578063c5700a0214610a4057600080fd5b806385f8c2591161016057806385f8c2591461088f5780638b19d6cf146108af5780638da5cb5b146108cf5780638f017f92146108ef57806392f6576e1461090557806395d89b411461091b5780639aa5d46214610930578063a10d2e3d1461094357600080fd5b80635a3d54931461079757806370a08231146107ad578063715018a6146107cd578063750521f5146107e25780637537ccb61461080257806379cc6790146108225780637ecebe001461084257806382bf293c1461086f57600080fd5b8063355cf34b1161029857806343cd8f7e1161023b57806343cd8f7e146106875780634ada218b146106b45780634b224583146106d55780634cd88b76146106f55780634dacb623146107155780634e6fd6c414610735578063538a3f0e1461074b5780635909c0d51461076b5780635a2b6c071461078157600080fd5b8063355cf34b1461039f5780633644e515146105da578063392e53cd146105f05780633a244650146106115780633c2f1806146106265780633d9a3d191461063b57806340ed04c71461065157806342966c681461066757600080fd5b80631091f67c116103005780631091f67c146104de57806318160ddd146104fe5780631ab52a6c1461051357806320f1b9121461052957806323b872dd1461054a5780632783b5ba1461056a57806330adf81f1461058a578063313ce567146105be57600080fd5b80628133711461039f57806303ee438c146103c7578063054d50d4146103e957806306fdde03146104245780630902f1ac14610439578063095ea7b3146104635780630b52820a146104935780630bd11f8a146104ae57600080fd5b3661039a573360009081526008602052604090205460ff1661039857610396610386346001610b62565b6103914260b4613619565b610bbc565b505b005b600080fd5b3480156103ab57600080fd5b506103b4601e81565b6040519081526020015b60405180910390f35b3480156103d357600080fd5b506103dc610d0d565b6040516103be919061367c565b3480156103f557600080fd5b5061040961040436600461368f565b610d9b565b604080519384526020840192909252908201526060016103be565b34801561043057600080fd5b506103dc610e95565b34801561044557600080fd5b5061044e610f27565b604080519283526020830191909152016103be565b34801561046f57600080fd5b5061048361047e3660046136d0565b610fa1565b60405190151581526020016103be565b6104a16103913660046136fc565b6040516103be919061371e565b3480156104ba57600080fd5b506104836104c9366004613762565b600b6020526000908152604090205460ff1681565b3480156104ea57600080fd5b506103986104f936600461377f565b610fb9565b34801561050a57600080fd5b506002546103b4565b34801561051f57600080fd5b506103b460115481565b34801561053557600080fd5b5060185461048390600160a01b900460ff1681565b34801561055657600080fd5b50610483610565366004613798565b611021565b34801561057657600080fd5b50610398610585366004613762565b611059565b34801561059657600080fd5b506103b47f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156105ca57600080fd5b50604051601281526020016103be565b3480156105e657600080fd5b506103b460055481565b3480156105fc57600080fd5b50600a5461048390600160a01b900460ff1681565b34801561061d57600080fd5b506103986110ec565b34801561063257600080fd5b506103b461112e565b34801561064757600080fd5b506103b4600f5481565b34801561065d57600080fd5b506103b460125481565b34801561067357600080fd5b5061039861068236600461377f565b61113e565b34801561069357600080fd5b50600a546106a7906001600160a01b031681565b6040516103be91906137d9565b3480156106c057600080fd5b50600a5461048390600160a81b900460ff1681565b3480156106e157600080fd5b506104a16106f036600461368f565b61114b565b34801561070157600080fd5b5061039861071036600461388f565b611291565b34801561072157600080fd5b506018546106a7906001600160a01b031681565b34801561074157600080fd5b506106a761dead81565b34801561075757600080fd5b50610398610766366004613762565b611393565b34801561077757600080fd5b506103b4600c5481565b34801561078d57600080fd5b506103b460145481565b3480156107a357600080fd5b506103b4600d5481565b3480156107b957600080fd5b506103b46107c8366004613762565b6113fa565b3480156107d957600080fd5b50610398611415565b3480156107ee57600080fd5b506103986107fd3660046138f2565b611442565b34801561080e57600080fd5b5061039861081d36600461393e565b611473565b34801561082e57600080fd5b5061039861083d3660046136d0565b611510565b34801561084e57600080fd5b506103b461085d366004613762565b60066020526000908152604090205481565b34801561087b57600080fd5b5061039861088a36600461377f565b611525565b34801561089b57600080fd5b506103b46108aa36600461368f565b61159c565b3480156108bb57600080fd5b506103986108ca366004613973565b611641565b3480156108db57600080fd5b506017546106a7906001600160a01b031681565b3480156108fb57600080fd5b506103b460155481565b34801561091157600080fd5b506103b46101f481565b34801561092757600080fd5b506103dc61173b565b6103b461093e3660046139df565b61174a565b34801561094f57600080fd5b5061044e61095e36600461377f565b611b22565b34801561096f57600080fd5b5061039861097e366004613762565b611c70565b34801561098f57600080fd5b5061039861099e366004613a06565b611cda565b3480156109af57600080fd5b506104836109be3660046136d0565b611d39565b3480156109cf57600080fd5b506103b46103e881565b3480156109e557600080fd5b506016546106a7906001600160a01b031681565b348015610a0557600080fd5b50600e546106a790600160201b90046001600160a01b031681565b348015610a2c57600080fd5b5061044e610a3b3660046139df565b611d66565b348015610a4c57600080fd5b50600e54610a5d9063ffffffff1681565b60405163ffffffff90911681526020016103be565b348015610a7e57600080fd5b506103b461271081565b348015610a9457600080fd5b506010546104839060ff1681565b348015610aae57600080fd5b50610398611f68565b348015610ac357600080fd5b50610398610ad2366004613a21565b61203c565b348015610ae357600080fd5b506103b4610af2366004613a98565b612213565b348015610b0357600080fd5b506103b460135481565b348015610b1957600080fd5b5061039861223e565b348015610b2e57600080fd5b50610398610b3d366004613ad1565b612274565b348015610b4e57600080fd5b50610398610b5d366004613762565b6125f5565b6000806000610b6f610f27565b915091506000610b978686610b845783610b86565b845b87610b915785610d9b565b84610d9b565b50509050601481610ba89190613b7c565b610bb29082613b90565b9695505050505050565b6060610bc6612646565b81804210610be7576040516338e5e54b60e21b815260040160405180910390fd5b600080610bf2610f27565b90925090503433610c038285613b90565b93506000806000610c16858c8989612670565b9250925092508060146000828254610c2e9190613619565b90915550610c3f905082600161274a565b610c4984846128b2565b610c5430858561297f565b610c5c6129de565b60408051600280825260608201835290916020830190803683370190505098508489600081518110610c9057610c90613ba3565b6020026020010181815250508289600181518110610cb057610cb0613ba3565b602002602001018181525050836001600160a01b031660008051602061501f83398151915260008786600080604051610ced959493929190613bb9565b60405180910390a25050505050505050610d076001600755565b92915050565b60098054610d1a90613bde565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4690613bde565b8015610d935780601f10610d6857610100808354040283529160200191610d93565b820191906000526020600020905b815481529060010190602001808311610d7657829003601f168201915b505050505081565b60008060008061271090506000601354601e610db79190613619565b610dc390612710613b90565b90506000610dd1838a613c18565b9050600088118015610de35750600087115b15610e705782610df282612b58565b610dfc9190613b7c565b945082610e0882612c10565b610e129190613b7c565b93506000610e208383613c18565b90506000610e2e8983613c18565b905060008286610e406127108e613c18565b610e4a9190613c18565b610e549190613619565b9050808281610e6557610e65613b66565b049850505050610e89565b604051633dce448b60e11b815260040160405180910390fd5b50505093509350939050565b606060038054610ea490613bde565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed090613bde565b8015610f1d5780601f10610ef257610100808354040283529160200191610f1d565b820191906000526020600020905b815481529060010190602001808311610f0057829003601f168201915b5050505050905090565b60008060004790506000601154601454610f419190613619565b90506000610f4d61112e565b90506000601254601554610f619190613619565b905082841015610f72576000610f7c565b610f7c8385613b90565b955080821015610f8d576000610f97565b610f978183613b90565b9450505050509091565b600033610faf818585612c35565b5060019392505050565b6017546001600160a01b0316336001600160a01b031614610ff957335b60405163472511eb60e11b8152600401610ff091906137d9565b60405180910390fd5b6101f481111561101c57604051630adad23360e31b815260040160405180910390fd5b601355565b600061102d8383612c42565b1561103a57506001611052565b61104483836128b2565b61104f848484612c8b565b90505b9392505050565b6017546001600160a01b0316336001600160a01b03161461107a5733610fd6565b6001600160a01b0381166110a15760405163e6c4247b60e01b815260040160405180910390fd5b6018546001600160a01b0316156110ca5760405162dc149f60e41b815260040160405180910390fd5b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6018546001600160a01b03163314611119573360405163472511eb60e11b8152600401610ff091906137d9565b6018805460ff60a01b1916600160a01b179055565b6000611139306113fa565b905090565b6111483382612caf565b50565b6060611155612646565b81804210611176576040516338e5e54b60e21b815260040160405180910390fd5b600080611181610f27565b91509150600061118e3390565b905060008060006111a18b8b8789612670565b92509250925080601560008282546111b99190613619565b909155506111ca905082600061274a565b6111d584308d612ce5565b6111df8484612cf0565b6111e76129de565b60408051600280825260608201835290916020830190803683370190505097508a8860008151811061121b5761121b613ba3565b602002602001018181525050828860018151811061123b5761123b613ba3565b602002602001018181525050836001600160a01b031660008051602061501f8339815191528c600080876000604051611278959493929190613bb9565b60405180910390a2505050505050506110526001600755565b6017546001600160a01b0316336001600160a01b0316146112b25733610fd6565b6112bc8282612da2565b6040516112c8906135f6565b604051809103906000f0801580156112e4573d6000803e3d6000fd5b50600a80546001600160a01b0319166001600160a01b03929092169182179055604051634cd88b769061131b908590602001613c2f565b60408051601f19818403018152828201825260038352620424c560ec1b602084015290516001600160e01b031960e085901b16815261135d9290600401613c5c565b600060405180830381600087803b15801561137757600080fd5b505af115801561138b573d6000803e3d6000fd5b505050505050565b600e54600160201b90046001600160a01b0316156113c35760405162dc149f60e41b815260040160405180910390fd5b600e8054640100000000600160c01b031916600160201b6001600160a01b0384811682029290921792839055611148920416612edf565b6001600160a01b031660009081526020819052604090205490565b6017546001600160a01b0316336001600160a01b0316146114365733610fd6565b6114406000612edf565b565b6017546001600160a01b0316336001600160a01b0316146114635733610fd6565b600961146f8282613cd0565b5050565b6017546001600160a01b0316336001600160a01b0316146114945733610fd6565b6001600160a01b03821615806114b257506001600160a01b03821630145b806114c757506001600160a01b03821661dead145b156114e55760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b61151b823383612f31565b61146f8282612caf565b6017546001600160a01b0316336001600160a01b0316146115465733610fd6565b612710811115611569576040516326dd075560e01b815260040160405180910390fd5b60105460ff168015611579575080155b15611597576040516326dd075560e01b815260040160405180910390fd5b600f55565b6013546000906127109082906115b390601e613619565b6115bf90612710613b90565b90506115cb8282613c18565b90506000841180156115dd5750600085115b15610e70576000826127106115f28989613c18565b6115fc9190613c18565b6116069190613c18565b90506000826116158988613b90565b61161f9190613c18565b905080828161163057611630613b66565b046001019450505050509392505050565b6017546001600160a01b0316336001600160a01b0316146116625733610fd6565b8460000361168357604051635e85ae7360e01b815260040160405180910390fd5b600061168e60025490565b11156116ad57604051630a87463f60e21b815260040160405180910390fd5b6001600160a01b0384166116d4576040516349e27cff60e01b815260040160405180910390fd5b81156116f0576010805460ff191660011790556116f082611525565b60096116fc8282613cd0565b5061170683610fb9565b61170f84612edf565b601680546001600160a01b0319166001600160a01b0386161790556117348486612f7e565b5050505050565b606060048054610ea490613bde565b6000611754612646565b81804210611775576040516338e5e54b60e21b815260040160405180910390fd5b600a543390600160a01b900460ff1615801561179f57506017546001600160a01b03828116911614155b156117bd5760405163aae677e160e01b815260040160405180910390fd5b8515806117c8575034155b156117e657604051635e85ae7360e01b815260040160405180910390fd5b6000806117f1610f27565b90925090506118003483613b90565b91506000600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611857573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187b9190613d8f565b90503489600083900361192d57600061189c6118978385613c18565b612fb4565b90506118aa6103e882613b90565b600a546040516340c10f1960e01b8152919a506001600160a01b0316906340c10f19906118e19061dead906103e890600401613da8565b600060405180830381600087803b1580156118fb57600080fd5b505af115801561190f573d6000803e3d6000fd5b5050600a805460ff60a01b1916600160a01b17905550611a29915050565b841580611938575083155b1561195657604051633dce448b60e11b815260040160405180910390fd5b846119618584613c18565b61196b9190613b7c565b90506000611979868661309c565b9050818c10156119a657604051633885308960e21b8152600481018d905260248101839052604401610ff0565b6119d8866119b48686613c18565b6119be9190613b7c565b866119c98786613c18565b6119d39190613b7c565b6130a8565b985060006119e68488613619565b905060006119f48488613619565b90506000611a028383613c18565b905083811015611a245760405162bfbd3d60e31b815260040160405180910390fd5b505050505b87600003611a4a57604051633489be7560e21b815260040160405180910390fd5b600a546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990611a7c908d908c90600401613da8565b600060405180830381600087803b158015611a9657600080fd5b505af1158015611aaa573d6000803e3d6000fd5b50505050611ab9863083612ce5565b611ac16129de565b604080518981523460208201529081018290526001600160a01b03808c1691908816907f2f3289d16dbc3007471d28c4936df3a95222bc938112449400d049637e3309ce9060600160405180910390a3505050505050506110526001600755565b60008082600003611b4657604051635e85ae7360e01b815260040160405180910390fd5b600080611b51610f27565b915091508160001480611b62575080155b15611b8057604051633dce448b60e11b815260040160405180910390fd5b600a54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015611bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bee9190613d8f565b905080600003611c115760405163bb55fd2760e01b815260040160405180910390fd5b80611c1c8488613c18565b611c269190613b7c565b945080611c338388613c18565b611c3d9190613b7c565b9350841580611c4a575083155b15611c685760405163bb55fd2760e01b815260040160405180910390fd5b505050915091565b6017546001600160a01b0316336001600160a01b031614611c915733610fd6565b6001600160a01b038116611cb85760405163e6c4247b60e01b815260040160405180910390fd5b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6017546001600160a01b0316336001600160a01b031614611cfb5733610fd6565b808015611d085750600f54155b15611d26576040516326dd075560e01b815260040160405180910390fd5b6010805460ff1916911515919091179055565b6000611d458383612c42565b15611d5257506001610d07565b611d5c83836128b2565b61105283836130be565b600080611d71612646565b82804210611d92576040516338e5e54b60e21b815260040160405180910390fd5b600a543390600160a01b900460ff16611dbe5760405163aae677e160e01b815260040160405180910390fd5b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611def9085906004016137d9565b602060405180830381865afa158015611e0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e309190613d8f565b905080600003611e5357604051635a5ec44f60e01b815260040160405180910390fd5b80881115611e745760405163bb55fd2760e01b815260040160405180910390fd5b611e7d88611b22565b600a5460405163079cc67960e41b81529297509095506001600160a01b0316906379cc679090611eb39085908c90600401613da8565b600060405180830381600087803b158015611ecd57600080fd5b505af1158015611ee1573d6000803e3d6000fd5b50505050611eef8786612cf0565b611efa30888661297f565b60408051898152602081018790529081018590526001600160a01b0380891691908416907feb755d537a0caac69ccb1ac1dc2b7397a32bb19f93bd06013c57ac0b2e5dd69c9060600160405180910390a3611f536129de565b505050611f606001600755565b935093915050565b6016546001600160a01b0316336001600160a01b031614611f895733610fd6565b6014546015543382158015611f9c575081155b15611fba5760405163211b631760e21b815260040160405180910390fd5b6000601455611fc761112e565b821115611fd957611fd661112e565b91505b6000601555611fe88184612cf0565b611ff330828461297f565b60408051848152602081018490526001600160a01b038316917f2e4fb6077d4acf86e12bb7411fb82b2b3eaa6a49787f4b1e17b423e7ea841169910160405180910390a2505050565b428410156120605760405163313c898160e11b815260048101859052602401610ff0565b6005546001600160a01b038816600090815260066020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9190876120b383613dc1565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161212c92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015612197573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615806121cc5750886001600160a01b0316816001600160a01b031614155b156121fd576040516325c0072360e11b81526001600160a01b0380831660048301528a166024820152604401610ff0565b612208898989612c35565b505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6017546001600160a01b0316336001600160a01b03161461225f5733610fd6565b600a805460ff60a81b1916600160a81b179055565b61227c612646565b6122846130cc565b600a54600160a01b900460ff166122ae5760405163aae677e160e01b815260040160405180910390fd5b600a54600160a81b900460ff166122d857604051637e99d8bb60e01b815260040160405180910390fd5b831580156122e4575082155b1561230257604051635e85ae7360e01b815260040160405180910390fd5b6001600160a01b038516158061232057506001600160a01b03851630145b1561233e57604051634e46966960e11b815260040160405180910390fd5b600080612349610f27565b915091508186118061235a57508085115b156123785760405163bb55fd2760e01b815260040160405180910390fd5b338615612389576123898888612cf0565b85156123a45761239988876128b2565b6123a430898861297f565b60405163f3438c1760e01b81526001600160a01b0389169063f3438c17906123d89084908b908b908b908b90600401613dda565b600060405180830381600087803b1580156123f257600080fd5b505af1158015612406573d6000803e3d6000fd5b50505050600080612415610f27565b915091506000858311612429576000612433565b6124338684613b90565b9050600085831161244557600061244f565b61244f8684613b90565b90508115801561245d575080155b1561247b5760405163e2ddc74960e01b815260040160405180910390fd5b6000601354601e61248c9190613619565b9050600061249a8285613c18565b6124a661271088613c18565b6124b09190613b90565b905060006124be8385613c18565b6124ca61271088613c18565b6124d49190613b90565b90506124e36002612710613f0a565b6124ed8a8c613c18565b6124f79190613c18565b6125018284613c18565b101561251f5760405162bfbd3d60e31b815260040160405180910390fd5b50505061252b82612c10565b6014600082825461253c9190613619565b9091555061254b905081612c10565b6015600082825461255c9190613619565b90915550612575905061256e83612b58565b600161274a565b61258861258182612b58565b600061274a565b6125906129de565b846001600160a01b031660008051602061501f83398151915282848d8f60016040516125c0959493929190613bb9565b60405180910390a2505050505050506125eb336000908152600860205260409020805460ff19169055565b6117346001600755565b6017546001600160a01b0316336001600160a01b0316146126165733610fd6565b6001600160a01b03811661263d576040516349e27cff60e01b815260040160405180910390fd5b61114881612edf565b60026007540361266957604051633ee5aeb560e01b815260040160405180910390fd5b6002600755565b6000806000612680878686613119565b600061268c868661309c565b9050612699888787610d9b565b9195509350915060008490036126c25760405163271a700960e01b815260040160405180910390fd5b868410156126e35760405163339454fb60e11b815260040160405180910390fd5b6000836126f0848b613b90565b6126fa9190613b90565b6127049088613619565b905060006127128688613b90565b90508261271f838361309c565b101561273d5760405162bfbd3d60e31b815260040160405180910390fd5b5050509450945094915050565b600e54600160201b90046001600160a01b03161561146f576000600e60049054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127db9190613f19565b90506000600e60049054906101000a90046001600160a01b03166001600160a01b031663ef973d476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128569190613d8f565b90506001600160a01b038216156128ac57821561288a57836011600082825461287f9190613619565b909155506128a29050565b836012600082825461289c9190613619565b90915550505b6128ac82826131b7565b50505050565b60105460ff166128c0575050565b6001600160a01b0382163014806128de57506001600160a01b038216155b806128f357506001600160a01b03821661dead145b8061291657506001600160a01b0382166000908152600b602052604090205460ff165b1561291f575050565b6000612710600f5461293060025490565b61293a9190613c18565b6129449190613b7c565b90508082612951856113fa565b61295b9190613619565b111561297a5760405163a9a44dff60e01b815260040160405180910390fd5b505050565b6001600160a01b0383166129a9576000604051634b637e8f60e11b8152600401610ff091906137d9565b6001600160a01b0382166129d357600060405163ec442f0560e01b8152600401610ff091906137d9565b61297a8383836132d1565b6000806129e9610f27565b9150915081600014806129fa575080155b15612a1857604051633dce448b60e11b815260040160405180910390fd5b6000612a28600160201b42613f36565b600e54909150600090612a419063ffffffff1683613f4a565b905060008163ffffffff16118015612a5857508315155b8015612a6357508215155b15612b0557600160701b600084612a7a8388613c18565b612a849190613b7c565b9050600086612a938488613c18565b612a9d9190613b7c565b9050612aaf63ffffffff851683613c18565b600c6000828254612ac09190613619565b90915550612ad6905063ffffffff851682613c18565b600d6000828254612ae79190613619565b9091555050600e805463ffffffff191663ffffffff87161790555050505b600c54600d54600e5460408051938452602084019290925263ffffffff1682820152517f1d0b407d784b19534f95cb221efeda97b16fcb4171eb57280723bad5ccfce40d9181900360600190a150505050565b600e54600090600160201b90046001600160a01b0316612b7a57506000919050565b612710600e60049054906101000a90046001600160a01b03166001600160a01b031663978bbdb96040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf49190613d8f565b612bfe9084613c18565b612c089190613b7c565b90505b919050565b6000601354600003612c2457506000919050565b61271060135483612bfe9190613c18565b61297a8383836001613376565b60006001600160a01b03831630148015612c6c57503360009081526008602052604090205460ff16155b15610d0757610faf82612c80846000610b62565b6106f04260b4613619565b600033612c99858285612f31565b612ca485858561297f565b506001949350505050565b6001600160a01b038216612cd9576000604051634b637e8f60e11b8152600401610ff091906137d9565b61146f826000836132d1565b61297a83838361297f565b80600003612cfc575050565b6001600160a01b038216612d235760405163e6c4247b60e01b815260040160405180910390fd5b47811115612d2e5750475b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612d7b576040519150601f19603f3d011682016040523d82523d6000602084013e612d80565b606091505b505090508061297a57604051634173d3a560e11b815260040160405180910390fd5b81511580612daf57508051155b15612dcd576040516379db2df160e11b815260040160405180910390fd5b60038054612dda90613bde565b1515905080612df6575060048054612df190613bde565b151590505b15612e1457604051634a8cdeb560e01b815260040160405180910390fd5b6003612e208382613cd0565b506004612e2d8282613cd0565b507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6003604051612e5e9190613f6e565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f1981840301815291905280516020909101206005555050565b601780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612f3d8484612213565b905060001981146128ac5781811015612f6f57828183604051637dc7a0d960e11b8152600401610ff093929190613fe4565b6128ac84848484036000613376565b6001600160a01b038216612fa857600060405163ec442f0560e01b8152600401610ff091906137d9565b61146f600083836132d1565b600081600003612fc657506000919050565b60006001612fd38461344b565b901c6001901b90506001818481612fec57612fec613b66565b048201901c9050600181848161300457613004613b66565b048201901c9050600181848161301c5761301c613b66565b048201901c9050600181848161303457613034613b66565b048201901c9050600181848161304c5761304c613b66565b048201901c9050600181848161306457613064613b66565b048201901c9050600181848161307c5761307c613b66565b048201901c90506110528182858161309657613096613b66565b046130a8565b60006110528284613c18565b60008183106130b75781611052565b5090919050565b600033610faf81858561297f565b3360009081526008602052604090205460ff16156130fd57604051631584469560e11b815260040160405180910390fd5b336000908152600860205260409020805460ff19166001179055565b600a54600160a01b900460ff166131435760405163aae677e160e01b815260040160405180910390fd5b600a54600160a81b900460ff1661316d57604051637e99d8bb60e01b815260040160405180910390fd5b8260000361318e57604051635e85ae7360e01b815260040160405180910390fd5b811580613199575080155b1561297a57604051633dce448b60e11b815260040160405180910390fd5b601154601254600080831580156131cc575082155b156131d957505050505050565b6000841180156131e95750848410155b156131f8576000601155600191505b821561325657600080613209610f27565b909250905060008161321b8488613c18565b6132259190613b7c565b90508781106132525761323661112e565b8611156132485761324561112e565b95505b6000601255600193505b5050505b8115613266576132668685612cf0565b80156132775761327730878561297f565b81806132805750805b1561138b5760408051858152602081018590526001600160a01b038816917f85da6ab72d2b48932522aea80adb8ca4fab6cdeb87bc2e7f6c03fd78d3b2100e910160405180910390a2505050505050565b6132dc8383836134df565b601854600160a01b900460ff1661297a576018546001600160a01b0384811691161480159061331357506001600160a01b03831615155b801561332d57506018546001600160a01b03838116911614155b801561334457506001600160a01b03821661dead14155b801561335857506001600160a01b03821615155b1561297a5760405163188acae760e11b815260040160405180910390fd5b6001600160a01b0384166133a057600060405163e602df0560e01b8152600401610ff091906137d9565b6001600160a01b0383166133ca576000604051634a1406b160e11b8152600401610ff091906137d9565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156128ac57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161343d91815260200190565b60405180910390a350505050565b600080608083901c1561346057608092831c92015b604083901c1561347257604092831c92015b602083901c1561348457602092831c92015b601083901c1561349657601092831c92015b600883901c156134a857600892831c92015b600483901c156134ba57600492831c92015b600283901c156134cc57600292831c92015b600183901c15610d075760010192915050565b6001600160a01b03831661350a5780600260008282546134ff9190613619565b909155506135699050565b6001600160a01b0383166000908152602081905260409020548181101561354a5783818360405163391434e360e21b8152600401610ff093929190613fe4565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216613585576002805482900390556135a4565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516135e991815260200190565b60405180910390a3505050565b6110198061400683390190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610d0757610d07613603565b60005b8381101561364757818101518382015260200161362f565b50506000910152565b6000815180845261366881602086016020860161362c565b601f01601f19169290920160200192915050565b6020815260006110526020830184613650565b6000806000606084860312156136a457600080fd5b505081359360208301359350604090920135919050565b6001600160a01b038116811461114857600080fd5b600080604083850312156136e357600080fd5b82356136ee816136bb565b946020939093013593505050565b6000806040838503121561370f57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156137565783518352928401929184019160010161373a565b50909695505050505050565b60006020828403121561377457600080fd5b8135611052816136bb565b60006020828403121561379157600080fd5b5035919050565b6000806000606084860312156137ad57600080fd5b83356137b8816136bb565b925060208401356137c8816136bb565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261381457600080fd5b81356001600160401b038082111561382e5761382e6137ed565b604051601f8301601f19908116603f01168101908282118183101715613856576138566137ed565b8160405283815286602085880101111561386f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156138a257600080fd5b82356001600160401b03808211156138b957600080fd5b6138c586838701613803565b935060208501359150808211156138db57600080fd5b506138e885828601613803565b9150509250929050565b60006020828403121561390457600080fd5b81356001600160401b0381111561391a57600080fd5b61392684828501613803565b949350505050565b80358015158114612c0b57600080fd5b6000806040838503121561395157600080fd5b823561395c816136bb565b915061396a6020840161392e565b90509250929050565b600080600080600060a0868803121561398b57600080fd5b85359450602086013561399d816136bb565b9350604086013592506060860135915060808601356001600160401b038111156139c657600080fd5b6139d288828901613803565b9150509295509295909350565b6000806000606084860312156139f457600080fd5b8335925060208401356137c8816136bb565b600060208284031215613a1857600080fd5b6110528261392e565b600080600080600080600060e0888a031215613a3c57600080fd5b8735613a47816136bb565b96506020880135613a57816136bb565b95506040880135945060608801359350608088013560ff81168114613a7b57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215613aab57600080fd5b8235613ab6816136bb565b91506020830135613ac6816136bb565b809150509250929050565b600080600080600060808688031215613ae957600080fd5b8535613af4816136bb565b9450602086013593506040860135925060608601356001600160401b0380821115613b1e57600080fd5b818801915088601f830112613b3257600080fd5b813581811115613b4157600080fd5b896020828501011115613b5357600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052601260045260246000fd5b600082613b8b57613b8b613b66565b500490565b81810381811115610d0757610d07613603565b634e487b7160e01b600052603260045260246000fd5b9485526020850193909352604084019190915260608301521515608082015260a00190565b600181811c90821680613bf257607f821691505b602082108103613c1257634e487b7160e01b600052602260045260246000fd5b50919050565b8082028115828204841417610d0757610d07613603565b60008251613c4181846020870161362c565b68102628102a37b5b2b760b91b920191825250600901919050565b604081526000613c6f6040830185613650565b8281036020840152613c818185613650565b95945050505050565b601f82111561297a57600081815260208120601f850160051c81016020861015613cb15750805b601f850160051c820191505b8181101561138b57828155600101613cbd565b81516001600160401b03811115613ce957613ce96137ed565b613cfd81613cf78454613bde565b84613c8a565b602080601f831160018114613d325760008415613d1a5750858301515b600019600386901b1c1916600185901b17855561138b565b600085815260208120601f198616915b82811015613d6157888601518255948401946001909101908401613d42565b5085821015613d7f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215613da157600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060018201613dd357613dd3613603565b5060010190565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b600181815b80851115613e61578160001904821115613e4757613e47613603565b80851615613e5457918102915b93841c9390800290613e2b565b509250929050565b600082613e7857506001610d07565b81613e8557506000610d07565b8160018114613e9b5760028114613ea557613ec1565b6001915050610d07565b60ff841115613eb657613eb6613603565b50506001821b610d07565b5060208310610133831016604e8410600b8410161715613ee4575081810a610d07565b613eee8383613e26565b8060001904821115613f0257613f02613603565b029392505050565b600061105260ff841683613e69565b600060208284031215613f2b57600080fd5b8151611052816136bb565b600082613f4557613f45613b66565b500690565b63ffffffff828116828216039080821115613f6757613f67613603565b5092915050565b6000808354613f7c81613bde565b60018281168015613f945760018114613fa957613fd8565b60ff1984168752821515830287019450613fd8565b8760005260208060002060005b85811015613fcf5781548a820152908401908201613fb6565b50505082870194505b50929695505050505050565b6001600160a01b03939093168352602083019190915260408201526060019056fe60a060405234801561001057600080fd5b50336080819052610fdc61003d600039600081816101cd0152818161037f01526103ef0152610fdc6000f3fe608060405234801561001057600080fd5b50600436106100f65760003560e01c80634837e204116100925780634837e204146101c85780634cd88b76146101fc57806370a082311461020f57806379cc6790146102385780637ecebe001461024b57806395d89b411461026b578063a9059cbb14610273578063d505accf14610286578063dd62ed3e1461029957600080fd5b806306fdde03146100fb578063095ea7b31461011957806318160ddd1461013c57806323b872dd1461014e57806330adf81f14610161578063313ce567146101885780633644e5151461019757806340c10f19146101a057806342966c68146101b5575b600080fd5b6101036102ac565b6040516101109190610ab9565b60405180910390f35b61012c610127366004610b23565b61033e565b6040519015158152602001610110565b6002545b604051908152602001610110565b61012c61015c366004610b4d565b610358565b6101407f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160128152602001610110565b61014060055481565b6101b36101ae366004610b23565b61037c565b005b6101b36101c3366004610b89565b6103df565b6101ef7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101109190610ba2565b6101b361020a366004610c59565b6103ec565b61014061021d366004610cbd565b6001600160a01b031660009081526020819052604090205490565b6101b3610246366004610b23565b61042c565b610140610259366004610cbd565b60066020526000908152604090205481565b610103610441565b61012c610281366004610b23565b610450565b6101b3610294366004610cdf565b61045e565b6101406102a7366004610d52565b610635565b6060600380546102bb90610d85565b80601f01602080910402602001604051908101604052809291908181526020018280546102e790610d85565b80156103345780601f1061030957610100808354040283529160200191610334565b820191906000526020600020905b81548152906001019060200180831161031757829003601f168201915b5050505050905090565b60003361034c818585610660565b60019150505b92915050565b600033610366858285610672565b6103718585856106c5565b506001949350505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146103d157335b60405163472511eb60e11b81526004016103c89190610ba2565b60405180910390fd5b6103db8282610724565b5050565b6103e9338261075a565b50565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461042257336103ae565b6103db8282610790565b610437823383610672565b6103db828261075a565b6060600480546102bb90610d85565b60003361034c8185856106c5565b428410156104825760405163313c898160e11b8152600481018590526024016103c8565b6005546001600160a01b038816600090815260066020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9190876104d583610dd5565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161054e92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156105b9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615806105ee5750886001600160a01b0316816001600160a01b031614155b1561061f576040516325c0072360e11b81526001600160a01b0380831660048301528a1660248201526044016103c8565b61062a898989610660565b505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61066d83838360016108cd565b505050565b600061067e8484610635565b905060001981146106bf57818110156106b057828183604051637dc7a0d960e11b81526004016103c893929190610dee565b6106bf848484840360006108cd565b50505050565b6001600160a01b0383166106ef576000604051634b637e8f60e11b81526004016103c89190610ba2565b6001600160a01b03821661071957600060405163ec442f0560e01b81526004016103c89190610ba2565b61066d8383836109a2565b6001600160a01b03821661074e57600060405163ec442f0560e01b81526004016103c89190610ba2565b6103db600083836109a2565b6001600160a01b038216610784576000604051634b637e8f60e11b81526004016103c89190610ba2565b6103db826000836109a2565b8151158061079d57508051155b156107bb576040516379db2df160e11b815260040160405180910390fd5b600380546107c890610d85565b15159050806107e45750600480546107df90610d85565b151590505b1561080257604051634a8cdeb560e01b815260040160405180910390fd5b600361080e8382610e5d565b50600461081b8282610e5d565b507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600360405161084c9190610f1d565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f1981840301815291905280516020909101206005555050565b6001600160a01b0384166108f757600060405163e602df0560e01b81526004016103c89190610ba2565b6001600160a01b038316610921576000604051634a1406b160e11b81526004016103c89190610ba2565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156106bf57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161099491815260200190565b60405180910390a350505050565b6001600160a01b0383166109cd5780600260008282546109c29190610f93565b90915550610a2c9050565b6001600160a01b03831660009081526020819052604090205481811015610a0d5783818360405163391434e360e21b81526004016103c893929190610dee565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610a4857600280548290039055610a67565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610aac91815260200190565b60405180910390a3505050565b600060208083528351808285015260005b81811015610ae657858101830151858201604001528201610aca565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610b1e57600080fd5b919050565b60008060408385031215610b3657600080fd5b610b3f83610b07565b946020939093013593505050565b600080600060608486031215610b6257600080fd5b610b6b84610b07565b9250610b7960208501610b07565b9150604084013590509250925092565b600060208284031215610b9b57600080fd5b5035919050565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610bdd57600080fd5b813567ffffffffffffffff80821115610bf857610bf8610bb6565b604051601f8301601f19908116603f01168101908282118183101715610c2057610c20610bb6565b81604052838152866020858801011115610c3957600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215610c6c57600080fd5b823567ffffffffffffffff80821115610c8457600080fd5b610c9086838701610bcc565b93506020850135915080821115610ca657600080fd5b50610cb385828601610bcc565b9150509250929050565b600060208284031215610ccf57600080fd5b610cd882610b07565b9392505050565b600080600080600080600060e0888a031215610cfa57600080fd5b610d0388610b07565b9650610d1160208901610b07565b95506040880135945060608801359350608088013560ff81168114610d3557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610d6557600080fd5b610d6e83610b07565b9150610d7c60208401610b07565b90509250929050565b600181811c90821680610d9957607f821691505b602082108103610db957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600060018201610de757610de7610dbf565b5060010190565b6001600160a01b039390931683526020830191909152604082015260600190565b601f82111561066d57600081815260208120601f850160051c81016020861015610e365750805b601f850160051c820191505b81811015610e5557828155600101610e42565b505050505050565b815167ffffffffffffffff811115610e7757610e77610bb6565b610e8b81610e858454610d85565b84610e0f565b602080601f831160018114610ec05760008415610ea85750858301515b600019600386901b1c1916600185901b178555610e55565b600085815260208120601f198616915b82811015610eef57888601518255948401946001909101908401610ed0565b5085821015610f0d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354610f2b81610d85565b60018281168015610f435760018114610f5857610f87565b60ff1984168752821515830287019450610f87565b8760005260208060002060005b85811015610f7e5781548a820152908401908201610f65565b50505082870194505b50929695505050505050565b8082018082111561035257610352610dbf56fea2646970667358221220926f32d9ccd0b0e0016b302e43ae94cf0d0bc86d8bb2a06238ff8affbe7ed29964736f6c63430008140033d44b536c8222cd875ef4b7f421435c474a3e1035e29c64e5f039af6944de4beaa2646970667358221220d354ad2c78cf832a19c89521b5ed4c8f9508f5dfc1ee291bdf79194068df0ef764736f6c63430008140033