[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "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": "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": "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": "claimFees", "outputs": [], "stateMutability": "nonpayable", "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": [], "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": [], "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": [], "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": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ]
60a06040523480156200001157600080fd5b5060016007553380803b63ffffffff166200002a575060005b6001600160a01b03811660805262000042826200004a565b50506200009c565b601780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b608051614c49620000db600039600081816108ce0152818161244301528181612474015281816124fa0152818161287c01526128b50152614c496000f3fe6080604052600436106102da5760003560e01c8063750521f51161017c578063a9059cbb116100d2578063a9059cbb14610866578063ba9a7a5614610886578063c415b95c1461089c578063c45a0155146108bc578063c4ccdeea146108f0578063c5700a0214610910578063ce4b5bbe14610942578063d045a32914610958578063d294f09314610972578063d505accf14610987578063dd62ed3e146109a7578063e01df1a8146109c7578063e156afd5146109dd578063e6cb3166146109f2578063f2fde38b14610a1257600080fd5b8063750521f5146106a55780637537ccb6146106c557806379cc6790146106e55780637ecebe001461070557806382bf293c1461073257806385f8c259146107525780638b19d6cf146107725780638da5cb5b146107925780638f017f92146107b257806392f6576e146107c857806395d89b41146107de5780639aa5d462146107f3578063a10d2e3d14610806578063a42dce8014610826578063a614ff751461084657600080fd5b80633644e515116102315780633644e51514610508578063392e53cd1461051e5780633c2f18061461053f5780633d9a3d191461055457806340ed04c71461056a57806342966c681461058057806343cd8f7e146105a05780634ada218b146105cd5780634b224583146105ee5780634cd88b761461060e5780635909c0d51461062e5780635a2b6c07146106445780635a3d54931461065a57806370a0823114610670578063715018a61461069057600080fd5b80628133711461031b57806303ee438c14610343578063054d50d41461036557806306fdde03146103a05780630902f1ac146103b5578063095ea7b3146103df5780630b52820a1461040f5780630bd11f8a1461041d5780631091f67c1461044d57806318160ddd1461046d5780631ab52a6c1461048257806323b872dd1461049857806330adf81f146104b8578063313ce567146104ec578063355cf34b1461031b57600080fd5b36610316573360009081526008602052604090205460ff1661031457610314610304346001610a32565b61030f4260b4613248565b610a8c565b005b600080fd5b34801561032757600080fd5b50610330601e81565b6040519081526020015b60405180910390f35b34801561034f57600080fd5b50610358610b79565b60405161033a91906132ab565b34801561037157600080fd5b506103856103803660046132be565b610c07565b6040805193845260208401929092529082015260600161033a565b3480156103ac57600080fd5b50610358610d01565b3480156103c157600080fd5b506103ca610d93565b6040805192835260208301919091520161033a565b3480156103eb57600080fd5b506103ff6103fa3660046132ff565b610e0d565b604051901515815260200161033a565b61031461030f36600461332b565b34801561042957600080fd5b506103ff61043836600461334d565b600b6020526000908152604090205460ff1681565b34801561045957600080fd5b5061031461046836600461336a565b610e27565b34801561047957600080fd5b50600254610330565b34801561048e57600080fd5b5061033060115481565b3480156104a457600080fd5b506103ff6104b3366004613383565b610e8f565b3480156104c457600080fd5b506103307f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156104f857600080fd5b506040516012815260200161033a565b34801561051457600080fd5b5061033060055481565b34801561052a57600080fd5b50600a546103ff90600160a01b900460ff1681565b34801561054b57600080fd5b50610330610eb5565b34801561056057600080fd5b50610330600f5481565b34801561057657600080fd5b5061033060125481565b34801561058c57600080fd5b5061031461059b36600461336a565b610ec5565b3480156105ac57600080fd5b50600a546105c0906001600160a01b031681565b60405161033a91906133c4565b3480156105d957600080fd5b50600a546103ff90600160a81b900460ff1681565b3480156105fa57600080fd5b506103146106093660046132be565b610ed2565b34801561061a57600080fd5b5061031461062936600461347a565b610fbb565b34801561063a57600080fd5b50610330600c5481565b34801561065057600080fd5b5061033060145481565b34801561066657600080fd5b50610330600d5481565b34801561067c57600080fd5b5061033061068b36600461334d565b6110bd565b34801561069c57600080fd5b506103146110d8565b3480156106b157600080fd5b506103146106c03660046134dd565b611105565b3480156106d157600080fd5b506103146106e0366004613529565b611132565b3480156106f157600080fd5b506103146107003660046132ff565b6111cf565b34801561071157600080fd5b5061033061072036600461334d565b60066020526000908152604090205481565b34801561073e57600080fd5b5061031461074d36600461336a565b6111e4565b34801561075e57600080fd5b5061033061076d3660046132be565b61125b565b34801561077e57600080fd5b5061031461078d36600461355e565b611300565b34801561079e57600080fd5b506017546105c0906001600160a01b031681565b3480156107be57600080fd5b5061033060155481565b3480156107d457600080fd5b506103306101f481565b3480156107ea57600080fd5b506103586113fa565b6103306108013660046135ca565b611409565b34801561081257600080fd5b506103ca61082136600461336a565b6117e1565b34801561083257600080fd5b5061031461084136600461334d565b61192f565b34801561085257600080fd5b506103146108613660046135f1565b611999565b34801561087257600080fd5b506103ff6108813660046132ff565b6119f8565b34801561089257600080fd5b506103306103e881565b3480156108a857600080fd5b506016546105c0906001600160a01b031681565b3480156108c857600080fd5b506105c07f000000000000000000000000000000000000000000000000000000000000000081565b3480156108fc57600080fd5b506103ca61090b3660046135ca565b611a5d565b34801561091c57600080fd5b50600e5461092d9063ffffffff1681565b60405163ffffffff909116815260200161033a565b34801561094e57600080fd5b5061033061271081565b34801561096457600080fd5b506010546103ff9060ff1681565b34801561097e57600080fd5b50610314611c5f565b34801561099357600080fd5b506103146109a236600461360c565b611d33565b3480156109b357600080fd5b506103306109c2366004613683565b611f0a565b3480156109d357600080fd5b5061033060135481565b3480156109e957600080fd5b50610314611f35565b3480156109fe57600080fd5b50610314610a0d3660046136bc565b611f6b565b348015610a1e57600080fd5b50610314610a2d36600461334d565b6122ec565b6000806000610a3f610d93565b915091506000610a678686610a545783610a56565b845b87610a615785610c07565b84610c07565b50509050601481610a789190613767565b610a82908261377b565b9695505050505050565b610a9461233d565b80804210610ab5576040516338e5e54b60e21b815260040160405180910390fd5b600080610ac0610d93565b90925090503433610ad1828561377b565b93506000806000610ae4858b8989612367565b9250925092508060146000828254610afc9190613248565b90915550610b0d9050826001612441565b610b1784846125d6565b610b2230858561269e565b610b2a6126fd565b836001600160a01b0316600080516020614bf483398151915260008786600080604051610b5b95949392919061378e565b60405180910390a25050505050505050610b756001600755565b5050565b60098054610b86906137b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb2906137b3565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b505050505081565b60008060008061271090506000601354601e610c239190613248565b610c2f9061271061377b565b90506000610c3d838a6137ed565b9050600088118015610c4f5750600087115b15610cdc5782610c5e82612878565b610c689190613767565b945082610c7482612951565b610c7e9190613767565b93506000610c8c83836137ed565b90506000610c9a89836137ed565b905060008286610cac6127108e6137ed565b610cb691906137ed565b610cc09190613248565b9050808281610cd157610cd1613751565b049850505050610cf5565b604051633dce448b60e11b815260040160405180910390fd5b50505093509350939050565b606060038054610d10906137b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3c906137b3565b8015610d895780601f10610d5e57610100808354040283529160200191610d89565b820191906000526020600020905b815481529060010190602001808311610d6c57829003601f168201915b5050505050905090565b60008060004790506000601154601454610dad9190613248565b90506000610db9610eb5565b90506000601254601554610dcd9190613248565b905082841015610dde576000610de8565b610de8838561377b565b955080821015610df9576000610e03565b610e03818361377b565b9450505050509091565b600033610e1b818585612976565b60019150505b92915050565b6017546001600160a01b0316336001600160a01b031614610e6757335b60405163472511eb60e11b8152600401610e5e91906133c4565b60405180910390fd5b6101f4811115610e8a57604051630adad23360e31b815260040160405180910390fd5b601355565b600033610e9d858285612983565b610ea885858561269e565b60019150505b9392505050565b6000610ec0306110bd565b905090565b610ecf33826129d0565b50565b610eda61233d565b80804210610efb576040516338e5e54b60e21b815260040160405180910390fd5b600080610f06610d93565b915091506000610f133390565b90506000806000610f268a8a8789612367565b9250925092508060156000828254610f3e9190613248565b90915550610f4f9050826000612441565b610f5a84308c612a06565b610f648484612a11565b610f6c6126fd565b836001600160a01b0316600080516020614bf48339815191528b600080876000604051610f9d95949392919061378e565b60405180910390a250505050505050610fb66001600755565b505050565b6017546001600160a01b0316336001600160a01b031614610fdc5733610e44565b610fe68282612ac3565b604051610ff290613225565b604051809103906000f08015801561100e573d6000803e3d6000fd5b50600a80546001600160a01b0319166001600160a01b03929092169182179055604051634cd88b7690611045908590602001613804565b60408051601f19818403018152828201825260038352620424c560ec1b602084015290516001600160e01b031960e085901b1681526110879290600401613831565b600060405180830381600087803b1580156110a157600080fd5b505af11580156110b5573d6000803e3d6000fd5b505050505050565b6001600160a01b031660009081526020819052604090205490565b6017546001600160a01b0316336001600160a01b0316146110f95733610e44565b6111036000612c00565b565b6017546001600160a01b0316336001600160a01b0316146111265733610e44565b6009610b7582826138a5565b6017546001600160a01b0316336001600160a01b0316146111535733610e44565b6001600160a01b038216158061117157506001600160a01b03821630145b8061118657506001600160a01b03821661dead145b156111a45760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03919091166000908152600b60205260409020805460ff1916911515919091179055565b6111da823383612983565b610b7582826129d0565b6017546001600160a01b0316336001600160a01b0316146112055733610e44565b612710811115611228576040516326dd075560e01b815260040160405180910390fd5b60105460ff168015611238575080155b15611256576040516326dd075560e01b815260040160405180910390fd5b600f55565b60135460009061271090829061127290601e613248565b61127e9061271061377b565b905061128a82826137ed565b905060008411801561129c5750600085115b15610cdc576000826127106112b189896137ed565b6112bb91906137ed565b6112c591906137ed565b90506000826112d4898861377b565b6112de91906137ed565b90508082816112ef576112ef613751565b046001019450505050509392505050565b6017546001600160a01b0316336001600160a01b0316146113215733610e44565b8460000361134257604051635e85ae7360e01b815260040160405180910390fd5b600061134d60025490565b111561136c57604051630a87463f60e21b815260040160405180910390fd5b6001600160a01b038416611393576040516349e27cff60e01b815260040160405180910390fd5b81156113af576010805460ff191660011790556113af826111e4565b60096113bb82826138a5565b506113c583610e27565b6113ce84612c00565b601680546001600160a01b0319166001600160a01b0386161790556113f38486612c52565b5050505050565b606060048054610d10906137b3565b600061141361233d565b81804210611434576040516338e5e54b60e21b815260040160405180910390fd5b600a543390600160a01b900460ff1615801561145e57506017546001600160a01b03828116911614155b1561147c5760405163aae677e160e01b815260040160405180910390fd5b851580611487575034155b156114a557604051635e85ae7360e01b815260040160405180910390fd5b6000806114b0610d93565b90925090506114bf348361377b565b91506000600a60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611516573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153a9190613964565b9050348960008390036115ec57600061155b61155683856137ed565b612c88565b90506115696103e88261377b565b600a546040516340c10f1960e01b8152919a506001600160a01b0316906340c10f19906115a09061dead906103e89060040161397d565b600060405180830381600087803b1580156115ba57600080fd5b505af11580156115ce573d6000803e3d6000fd5b5050600a805460ff60a01b1916600160a01b179055506116e8915050565b8415806115f7575083155b1561161557604051633dce448b60e11b815260040160405180910390fd5b8461162085846137ed565b61162a9190613767565b905060006116388686612d70565b9050818c101561166557604051633885308960e21b8152600481018d905260248101839052604401610e5e565b6116978661167386866137ed565b61167d9190613767565b8661168887866137ed565b6116929190613767565b612d7c565b985060006116a58488613248565b905060006116b38488613248565b905060006116c183836137ed565b9050838110156116e35760405162bfbd3d60e31b815260040160405180910390fd5b505050505b8760000361170957604051633489be7560e21b815260040160405180910390fd5b600a546040516340c10f1960e01b81526001600160a01b03909116906340c10f199061173b908d908c9060040161397d565b600060405180830381600087803b15801561175557600080fd5b505af1158015611769573d6000803e3d6000fd5b50505050611778863083612a06565b6117806126fd565b604080518981523460208201529081018290526001600160a01b03808c1691908816907f2f3289d16dbc3007471d28c4936df3a95222bc938112449400d049637e3309ce9060600160405180910390a350505050505050610eae6001600755565b6000808260000361180557604051635e85ae7360e01b815260040160405180910390fd5b600080611810610d93565b915091508160001480611821575080155b1561183f57604051633dce448b60e11b815260040160405180910390fd5b600a54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015611889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ad9190613964565b9050806000036118d05760405163bb55fd2760e01b815260040160405180910390fd5b806118db84886137ed565b6118e59190613767565b9450806118f283886137ed565b6118fc9190613767565b9350841580611909575083155b156119275760405163bb55fd2760e01b815260040160405180910390fd5b505050915091565b6017546001600160a01b0316336001600160a01b0316146119505733610e44565b6001600160a01b0381166119775760405163e6c4247b60e01b815260040160405180910390fd5b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6017546001600160a01b0316336001600160a01b0316146119ba5733610e44565b8080156119c75750600f54155b156119e5576040516326dd075560e01b815260040160405180910390fd5b6010805460ff1916911515919091179055565b60006001600160a01b03831630148015611a2257503360009081526008602052604090205460ff16155b15611a4957611a4182611a36846000610a32565b6106094260b4613248565b506001610e21565b611a5383836125d6565b610eae8383612d92565b600080611a6861233d565b82804210611a89576040516338e5e54b60e21b815260040160405180910390fd5b600a543390600160a01b900460ff16611ab55760405163aae677e160e01b815260040160405180910390fd5b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611ae69085906004016133c4565b602060405180830381865afa158015611b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b279190613964565b905080600003611b4a57604051635a5ec44f60e01b815260040160405180910390fd5b80881115611b6b5760405163bb55fd2760e01b815260040160405180910390fd5b611b74886117e1565b600a5460405163079cc67960e41b81529297509095506001600160a01b0316906379cc679090611baa9085908c9060040161397d565b600060405180830381600087803b158015611bc457600080fd5b505af1158015611bd8573d6000803e3d6000fd5b50505050611be68786612a11565b611bf130888661269e565b60408051898152602081018790529081018590526001600160a01b0380891691908416907feb755d537a0caac69ccb1ac1dc2b7397a32bb19f93bd06013c57ac0b2e5dd69c9060600160405180910390a3611c4a6126fd565b505050611c576001600755565b935093915050565b6016546001600160a01b0316336001600160a01b031614611c805733610e44565b6014546015543382158015611c93575081155b15611cb15760405163211b631760e21b815260040160405180910390fd5b6000601455611cbe610eb5565b821115611cd057611ccd610eb5565b91505b6000601555611cdf8184612a11565b611cea30828461269e565b60408051848152602081018490526001600160a01b038316917f2e4fb6077d4acf86e12bb7411fb82b2b3eaa6a49787f4b1e17b423e7ea841169910160405180910390a2505050565b42841015611d575760405163313c898160e11b815260048101859052602401610e5e565b6005546001600160a01b038816600090815260066020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611daa83613996565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611e2392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611e8e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580611ec35750886001600160a01b0316816001600160a01b031614155b15611ef4576040516325c0072360e11b81526001600160a01b0380831660048301528a166024820152604401610e5e565b611eff898989612976565b505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6017546001600160a01b0316336001600160a01b031614611f565733610e44565b600a805460ff60a81b1916600160a81b179055565b611f7361233d565b611f7b612da0565b600a54600160a01b900460ff16611fa55760405163aae677e160e01b815260040160405180910390fd5b600a54600160a81b900460ff16611fcf57604051637e99d8bb60e01b815260040160405180910390fd5b83158015611fdb575082155b15611ff957604051635e85ae7360e01b815260040160405180910390fd5b6001600160a01b038516158061201757506001600160a01b03851630145b1561203557604051634e46966960e11b815260040160405180910390fd5b600080612040610d93565b915091508186118061205157508085115b1561206f5760405163bb55fd2760e01b815260040160405180910390fd5b338615612080576120808888612a11565b851561209b5761209088876125d6565b61209b30898861269e565b60405163f3438c1760e01b81526001600160a01b0389169063f3438c17906120cf9084908b908b908b908b906004016139af565b600060405180830381600087803b1580156120e957600080fd5b505af11580156120fd573d6000803e3d6000fd5b5050505060008061210c610d93565b91509150600085831161212057600061212a565b61212a868461377b565b9050600085831161213c576000612146565b612146868461377b565b905081158015612154575080155b156121725760405163e2ddc74960e01b815260040160405180910390fd5b6000601354601e6121839190613248565b9050600061219182856137ed565b61219d612710886137ed565b6121a7919061377b565b905060006121b583856137ed565b6121c1612710886137ed565b6121cb919061377b565b90506121da6002612710613adf565b6121e48a8c6137ed565b6121ee91906137ed565b6121f882846137ed565b10156122165760405162bfbd3d60e31b815260040160405180910390fd5b50505061222282612951565b601460008282546122339190613248565b90915550612242905081612951565b601560008282546122539190613248565b9091555061226c905061226583612878565b6001612441565b61227f61227882612878565b6000612441565b6122876126fd565b846001600160a01b0316600080516020614bf483398151915282848d8f60016040516122b795949392919061378e565b60405180910390a2505050505050506122e2336000908152600860205260409020805460ff19169055565b6113f36001600755565b6017546001600160a01b0316336001600160a01b03161461230d5733610e44565b6001600160a01b038116612334576040516349e27cff60e01b815260040160405180910390fd5b610ecf81612c00565b60026007540361236057604051633ee5aeb560e01b815260040160405180910390fd5b6002600755565b6000806000612377878686612ded565b60006123838686612d70565b9050612390888787610c07565b9195509350915060008490036123b95760405163271a700960e01b815260040160405180910390fd5b868410156123da5760405163339454fb60e11b815260040160405180910390fd5b6000836123e7848b61377b565b6123f1919061377b565b6123fb9088613248565b90506000612409868861377b565b9050826124168383612d70565b10156124345760405162bfbd3d60e31b815260040160405180910390fd5b5050509450945094915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615610b755760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663017e7e586040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f49190613aee565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ef973d476040518163ffffffff1660e01b8152600401602060405180830381865afa158015612556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257a9190613964565b90506001600160a01b038216156125d05782156125ae5783601160008282546125a39190613248565b909155506125c69050565b83601260008282546125c09190613248565b90915550505b6125d08282612e8b565b50505050565b60105460ff166125e4575050565b6001600160a01b03821630148061260257506001600160a01b038216155b8061261757506001600160a01b03821661dead145b8061263a57506001600160a01b0382166000908152600b602052604090205460ff165b15612643575050565b6000612710600f5461265460025490565b61265e91906137ed565b6126689190613767565b90508082612675856110bd565b61267f9190613248565b1115610fb65760405163a9a44dff60e01b815260040160405180910390fd5b6001600160a01b0383166126c8576000604051634b637e8f60e11b8152600401610e5e91906133c4565b6001600160a01b0382166126f257600060405163ec442f0560e01b8152600401610e5e91906133c4565b610fb6838383612fa5565b600080612708610d93565b915091508160001480612719575080155b1561273757604051633dce448b60e11b815260040160405180910390fd5b600061274864010000000042613b0b565b600e549091506000906127619063ffffffff1683613b1f565b905060008163ffffffff1611801561277857508315155b801561278357508215155b1561282557600160701b60008461279a83886137ed565b6127a49190613767565b90506000866127b384886137ed565b6127bd9190613767565b90506127cf63ffffffff8516836137ed565b600c60008282546127e09190613248565b909155506127f6905063ffffffff8516826137ed565b600d60008282546128079190613248565b9091555050600e805463ffffffff191663ffffffff87161790555050505b600c54600d54600e5460408051938452602084019290925263ffffffff1682820152517f1d0b407d784b19534f95cb221efeda97b16fcb4171eb57280723bad5ccfce40d9181900360600190a150505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166128b057506000919050565b6127107f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663978bbdb96040518163ffffffff1660e01b8152600401602060405180830381865afa158015612911573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129359190613964565b61293f90846137ed565b6129499190613767565b90505b919050565b600060135460000361296557506000919050565b6127106013548361293f91906137ed565b610fb683838360016130bc565b600061298f8484611f0a565b905060001981146125d057818110156129c157828183604051637dc7a0d960e11b8152600401610e5e93929190613b43565b6125d0848484840360006130bc565b6001600160a01b0382166129fa576000604051634b637e8f60e11b8152600401610e5e91906133c4565b610b7582600083612fa5565b610fb683838361269e565b80600003612a1d575050565b6001600160a01b038216612a445760405163e6c4247b60e01b815260040160405180910390fd5b47811115612a4f5750475b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612a9c576040519150601f19603f3d011682016040523d82523d6000602084013e612aa1565b606091505b5050905080610fb657604051634173d3a560e11b815260040160405180910390fd5b81511580612ad057508051155b15612aee576040516379db2df160e11b815260040160405180910390fd5b60038054612afb906137b3565b1515905080612b17575060048054612b12906137b3565b151590505b15612b3557604051634a8cdeb560e01b815260040160405180910390fd5b6003612b4183826138a5565b506004612b4e82826138a5565b507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6003604051612b7f9190613b64565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f1981840301815291905280516020909101206005555050565b601780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216612c7c57600060405163ec442f0560e01b8152600401610e5e91906133c4565b610b7560008383612fa5565b600081600003612c9a57506000919050565b60006001612ca784613191565b901c6001901b90506001818481612cc057612cc0613751565b048201901c90506001818481612cd857612cd8613751565b048201901c90506001818481612cf057612cf0613751565b048201901c90506001818481612d0857612d08613751565b048201901c90506001818481612d2057612d20613751565b048201901c90506001818481612d3857612d38613751565b048201901c90506001818481612d5057612d50613751565b048201901c9050610eae81828581612d6a57612d6a613751565b04612d7c565b6000610eae82846137ed565b6000818310612d8b5781610eae565b5090919050565b600033610e1b81858561269e565b3360009081526008602052604090205460ff1615612dd157604051631584469560e11b815260040160405180910390fd5b336000908152600860205260409020805460ff19166001179055565b600a54600160a01b900460ff16612e175760405163aae677e160e01b815260040160405180910390fd5b600a54600160a81b900460ff16612e4157604051637e99d8bb60e01b815260040160405180910390fd5b82600003612e6257604051635e85ae7360e01b815260040160405180910390fd5b811580612e6d575080155b15610fb657604051633dce448b60e11b815260040160405180910390fd5b60115460125460008083158015612ea0575082155b15612ead57505050505050565b600084118015612ebd5750848410155b15612ecc576000601155600191505b8215612f2a57600080612edd610d93565b9092509050600081612eef84886137ed565b612ef99190613767565b9050878110612f2657612f0a610eb5565b861115612f1c57612f19610eb5565b95505b6000601255600193505b5050505b8115612f3a57612f3a8685612a11565b8015612f4b57612f4b30878561269e565b8180612f545750805b156110b55760408051858152602081018590526001600160a01b038816917f85da6ab72d2b48932522aea80adb8ca4fab6cdeb87bc2e7f6c03fd78d3b2100e910160405180910390a2505050505050565b6001600160a01b038316612fd0578060026000828254612fc59190613248565b9091555061302f9050565b6001600160a01b038316600090815260208190526040902054818110156130105783818360405163391434e360e21b8152600401610e5e93929190613b43565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661304b5760028054829003905561306a565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516130af91815260200190565b60405180910390a3505050565b6001600160a01b0384166130e657600060405163e602df0560e01b8152600401610e5e91906133c4565b6001600160a01b038316613110576000604051634a1406b160e11b8152600401610e5e91906133c4565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156125d057826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161318391815260200190565b60405180910390a350505050565b600080608083901c156131a657608092831c92015b604083901c156131b857604092831c92015b602083901c156131ca57602092831c92015b601083901c156131dc57601092831c92015b600883901c156131ee57600892831c92015b600483901c1561320057600492831c92015b600283901c1561321257600292831c92015b600183901c15610e215760010192915050565b61101980613bdb83390190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e2157610e21613232565b60005b8381101561327657818101518382015260200161325e565b50506000910152565b6000815180845261329781602086016020860161325b565b601f01601f19169290920160200192915050565b602081526000610eae602083018461327f565b6000806000606084860312156132d357600080fd5b505081359360208301359350604090920135919050565b6001600160a01b0381168114610ecf57600080fd5b6000806040838503121561331257600080fd5b823561331d816132ea565b946020939093013593505050565b6000806040838503121561333e57600080fd5b50508035926020909101359150565b60006020828403121561335f57600080fd5b8135610eae816132ea565b60006020828403121561337c57600080fd5b5035919050565b60008060006060848603121561339857600080fd5b83356133a3816132ea565b925060208401356133b3816132ea565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126133ff57600080fd5b81356001600160401b0380821115613419576134196133d8565b604051601f8301601f19908116603f01168101908282118183101715613441576134416133d8565b8160405283815286602085880101111561345a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561348d57600080fd5b82356001600160401b03808211156134a457600080fd5b6134b0868387016133ee565b935060208501359150808211156134c657600080fd5b506134d3858286016133ee565b9150509250929050565b6000602082840312156134ef57600080fd5b81356001600160401b0381111561350557600080fd5b613511848285016133ee565b949350505050565b8035801515811461294c57600080fd5b6000806040838503121561353c57600080fd5b8235613547816132ea565b915061355560208401613519565b90509250929050565b600080600080600060a0868803121561357657600080fd5b853594506020860135613588816132ea565b9350604086013592506060860135915060808601356001600160401b038111156135b157600080fd5b6135bd888289016133ee565b9150509295509295909350565b6000806000606084860312156135df57600080fd5b8335925060208401356133b3816132ea565b60006020828403121561360357600080fd5b610eae82613519565b600080600080600080600060e0888a03121561362757600080fd5b8735613632816132ea565b96506020880135613642816132ea565b95506040880135945060608801359350608088013560ff8116811461366657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561369657600080fd5b82356136a1816132ea565b915060208301356136b1816132ea565b809150509250929050565b6000806000806000608086880312156136d457600080fd5b85356136df816132ea565b9450602086013593506040860135925060608601356001600160401b038082111561370957600080fd5b818801915088601f83011261371d57600080fd5b81358181111561372c57600080fd5b89602082850101111561373e57600080fd5b9699959850939650602001949392505050565b634e487b7160e01b600052601260045260246000fd5b60008261377657613776613751565b500490565b81810381811115610e2157610e21613232565b9485526020850193909352604084019190915260608301521515608082015260a00190565b600181811c908216806137c757607f821691505b6020821081036137e757634e487b7160e01b600052602260045260246000fd5b50919050565b8082028115828204841417610e2157610e21613232565b6000825161381681846020870161325b565b68102628102a37b5b2b760b91b920191825250600901919050565b604081526000613844604083018561327f565b8281036020840152613856818561327f565b95945050505050565b601f821115610fb657600081815260208120601f850160051c810160208610156138865750805b601f850160051c820191505b818110156110b557828155600101613892565b81516001600160401b038111156138be576138be6133d8565b6138d2816138cc84546137b3565b8461385f565b602080601f83116001811461390757600084156138ef5750858301515b600019600386901b1c1916600185901b1785556110b5565b600085815260208120601f198616915b8281101561393657888601518255948401946001909101908401613917565b50858210156139545787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561397657600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6000600182016139a8576139a8613232565b5060010190565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b600181815b80851115613a36578160001904821115613a1c57613a1c613232565b80851615613a2957918102915b93841c9390800290613a00565b509250929050565b600082613a4d57506001610e21565b81613a5a57506000610e21565b8160018114613a705760028114613a7a57613a96565b6001915050610e21565b60ff841115613a8b57613a8b613232565b50506001821b610e21565b5060208310610133831016604e8410600b8410161715613ab9575081810a610e21565b613ac383836139fb565b8060001904821115613ad757613ad7613232565b029392505050565b6000610eae60ff841683613a3e565b600060208284031215613b0057600080fd5b8151610eae816132ea565b600082613b1a57613b1a613751565b500690565b63ffffffff828116828216039080821115613b3c57613b3c613232565b5092915050565b6001600160a01b039390931683526020830191909152604082015260600190565b6000808354613b72816137b3565b60018281168015613b8a5760018114613b9f57613bce565b60ff1984168752821515830287019450613bce565b8760005260208060002060005b85811015613bc55781548a820152908401908201613bac565b50505082870194505b5092969550505050505056fe60a060405234801561001057600080fd5b50336080819052610fdc61003d600039600081816101cd0152818161037f01526103ef0152610fdc6000f3fe608060405234801561001057600080fd5b50600436106100f65760003560e01c80634837e204116100925780634837e204146101c85780634cd88b76146101fc57806370a082311461020f57806379cc6790146102385780637ecebe001461024b57806395d89b411461026b578063a9059cbb14610273578063d505accf14610286578063dd62ed3e1461029957600080fd5b806306fdde03146100fb578063095ea7b31461011957806318160ddd1461013c57806323b872dd1461014e57806330adf81f14610161578063313ce567146101885780633644e5151461019757806340c10f19146101a057806342966c68146101b5575b600080fd5b6101036102ac565b6040516101109190610ab9565b60405180910390f35b61012c610127366004610b23565b61033e565b6040519015158152602001610110565b6002545b604051908152602001610110565b61012c61015c366004610b4d565b610358565b6101407f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160128152602001610110565b61014060055481565b6101b36101ae366004610b23565b61037c565b005b6101b36101c3366004610b89565b6103df565b6101ef7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101109190610ba2565b6101b361020a366004610c59565b6103ec565b61014061021d366004610cbd565b6001600160a01b031660009081526020819052604090205490565b6101b3610246366004610b23565b61042c565b610140610259366004610cbd565b60066020526000908152604090205481565b610103610441565b61012c610281366004610b23565b610450565b6101b3610294366004610cdf565b61045e565b6101406102a7366004610d52565b610635565b6060600380546102bb90610d85565b80601f01602080910402602001604051908101604052809291908181526020018280546102e790610d85565b80156103345780601f1061030957610100808354040283529160200191610334565b820191906000526020600020905b81548152906001019060200180831161031757829003601f168201915b5050505050905090565b60003361034c818585610660565b60019150505b92915050565b600033610366858285610672565b6103718585856106c5565b506001949350505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146103d157335b60405163472511eb60e11b81526004016103c89190610ba2565b60405180910390fd5b6103db8282610724565b5050565b6103e9338261075a565b50565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461042257336103ae565b6103db8282610790565b610437823383610672565b6103db828261075a565b6060600480546102bb90610d85565b60003361034c8185856106c5565b428410156104825760405163313c898160e11b8152600481018590526024016103c8565b6005546001600160a01b038816600090815260066020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9190876104d583610dd5565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161054e92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156105b9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615806105ee5750886001600160a01b0316816001600160a01b031614155b1561061f576040516325c0072360e11b81526001600160a01b0380831660048301528a1660248201526044016103c8565b61062a898989610660565b505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61066d83838360016108cd565b505050565b600061067e8484610635565b905060001981146106bf57818110156106b057828183604051637dc7a0d960e11b81526004016103c893929190610dee565b6106bf848484840360006108cd565b50505050565b6001600160a01b0383166106ef576000604051634b637e8f60e11b81526004016103c89190610ba2565b6001600160a01b03821661071957600060405163ec442f0560e01b81526004016103c89190610ba2565b61066d8383836109a2565b6001600160a01b03821661074e57600060405163ec442f0560e01b81526004016103c89190610ba2565b6103db600083836109a2565b6001600160a01b038216610784576000604051634b637e8f60e11b81526004016103c89190610ba2565b6103db826000836109a2565b8151158061079d57508051155b156107bb576040516379db2df160e11b815260040160405180910390fd5b600380546107c890610d85565b15159050806107e45750600480546107df90610d85565b151590505b1561080257604051634a8cdeb560e01b815260040160405180910390fd5b600361080e8382610e5d565b50600461081b8282610e5d565b507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600360405161084c9190610f1d565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f1981840301815291905280516020909101206005555050565b6001600160a01b0384166108f757600060405163e602df0560e01b81526004016103c89190610ba2565b6001600160a01b038316610921576000604051634a1406b160e11b81526004016103c89190610ba2565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156106bf57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161099491815260200190565b60405180910390a350505050565b6001600160a01b0383166109cd5780600260008282546109c29190610f93565b90915550610a2c9050565b6001600160a01b03831660009081526020819052604090205481811015610a0d5783818360405163391434e360e21b81526004016103c893929190610dee565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610a4857600280548290039055610a67565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610aac91815260200190565b60405180910390a3505050565b600060208083528351808285015260005b81811015610ae657858101830151858201604001528201610aca565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610b1e57600080fd5b919050565b60008060408385031215610b3657600080fd5b610b3f83610b07565b946020939093013593505050565b600080600060608486031215610b6257600080fd5b610b6b84610b07565b9250610b7960208501610b07565b9150604084013590509250925092565b600060208284031215610b9b57600080fd5b5035919050565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610bdd57600080fd5b813567ffffffffffffffff80821115610bf857610bf8610bb6565b604051601f8301601f19908116603f01168101908282118183101715610c2057610c20610bb6565b81604052838152866020858801011115610c3957600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215610c6c57600080fd5b823567ffffffffffffffff80821115610c8457600080fd5b610c9086838701610bcc565b93506020850135915080821115610ca657600080fd5b50610cb385828601610bcc565b9150509250929050565b600060208284031215610ccf57600080fd5b610cd882610b07565b9392505050565b600080600080600080600060e0888a031215610cfa57600080fd5b610d0388610b07565b9650610d1160208901610b07565b95506040880135945060608801359350608088013560ff81168114610d3557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610d6557600080fd5b610d6e83610b07565b9150610d7c60208401610b07565b90509250929050565b600181811c90821680610d9957607f821691505b602082108103610db957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600060018201610de757610de7610dbf565b5060010190565b6001600160a01b039390931683526020830191909152604082015260600190565b601f82111561066d57600081815260208120601f850160051c81016020861015610e365750805b601f850160051c820191505b81811015610e5557828155600101610e42565b505050505050565b815167ffffffffffffffff811115610e7757610e77610bb6565b610e8b81610e858454610d85565b84610e0f565b602080601f831160018114610ec05760008415610ea85750858301515b600019600386901b1c1916600185901b178555610e55565b600085815260208120601f198616915b82811015610eef57888601518255948401946001909101908401610ed0565b5085821015610f0d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354610f2b81610d85565b60018281168015610f435760018114610f5857610f87565b60ff1984168752821515830287019450610f87565b8760005260208060002060005b85811015610f7e5781548a820152908401908201610f65565b50505082870194505b50929695505050505050565b8082018082111561035257610352610dbf56fea2646970667358221220926f32d9ccd0b0e0016b302e43ae94cf0d0bc86d8bb2a06238ff8affbe7ed29964736f6c63430008140033d44b536c8222cd875ef4b7f421435c474a3e1035e29c64e5f039af6944de4beaa2646970667358221220e71baa02c984e861d809f7e3f59a225d09c39af87f22fc60261463cac29ba39164736f6c63430008140033