Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 50 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 22711205 | 262 days ago | IN | 0 ETH | 0.00004585 | ||||
| Admin Withdraw | 9292978 | 2239 days ago | IN | 0 ETH | 0.00758176 | ||||
| Deposit | 9292941 | 2239 days ago | IN | 0.1 ETH | 0.00031875 | ||||
| Admin Withdraw | 9182638 | 2257 days ago | IN | 0 ETH | 0.00083984 | ||||
| Admin Withdraw | 8991106 | 2293 days ago | IN | 0 ETH | 0.00117523 | ||||
| Admin Withdraw | 8991104 | 2293 days ago | IN | 0 ETH | 0.00099523 | ||||
| Admin Withdraw | 8977319 | 2295 days ago | IN | 0 ETH | 0.00117523 | ||||
| Admin Withdraw | 8974005 | 2296 days ago | IN | 0 ETH | 0.001372 | ||||
| Admin Withdraw | 8968575 | 2296 days ago | IN | 0 ETH | 0.00093208 | ||||
| Admin Withdraw | 8968573 | 2296 days ago | IN | 0 ETH | 0.00129362 | ||||
| Admin Withdraw | 8958323 | 2298 days ago | IN | 0 ETH | 0.000996 | ||||
| Deposit | 8958315 | 2298 days ago | IN | 1 ETH | 0.00063182 | ||||
| Admin Withdraw | 8958206 | 2298 days ago | IN | 0 ETH | 0.000996 | ||||
| Deposit | 8958128 | 2298 days ago | IN | 10 ETH | 0.00031591 | ||||
| Admin Withdraw | 8955620 | 2299 days ago | IN | 0 ETH | 0.000996 | ||||
| Admin Withdraw | 8954942 | 2299 days ago | IN | 0 ETH | 0.001176 | ||||
| Deposit | 8951086 | 2299 days ago | IN | 10 ETH | 0.00022591 | ||||
| Admin Withdraw | 8951042 | 2299 days ago | IN | 0 ETH | 0.001176 | ||||
| Deposit | 8949547 | 2300 days ago | IN | 20 ETH | 0.00052652 | ||||
| Deposit | 8942982 | 2301 days ago | IN | 10 ETH | 0.00037652 | ||||
| Admin Withdraw | 8942977 | 2301 days ago | IN | 0 ETH | 0.00117523 | ||||
| Admin Withdraw | 8942154 | 2301 days ago | IN | 0 ETH | 0.00099753 | ||||
| Deposit | 8941898 | 2301 days ago | IN | 24.11636736 ETH | 0.00037652 | ||||
| Admin Withdraw | 8941875 | 2301 days ago | IN | 0 ETH | 0.00117676 | ||||
| Deposit | 8940533 | 2301 days ago | IN | 14 ETH | 0.0000753 |
Latest 19 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 22711205 | 262 days ago | 0.01220004 ETH | ||||
| - | 9292978 | 2239 days ago | 0.09 ETH | ||||
| - | 9182638 | 2257 days ago | 1.63919972 ETH | ||||
| - | 8991106 | 2293 days ago | 0.01726719 ETH | ||||
| - | 8991104 | 2293 days ago | 1.36913216 ETH | ||||
| - | 8977319 | 2295 days ago | 0.046507 ETH | ||||
| - | 8974005 | 2296 days ago | 4.78985845 ETH | ||||
| - | 8958323 | 2298 days ago | 10.1276587 ETH | ||||
| - | 8958206 | 2298 days ago | 13.30919297 ETH | ||||
| - | 8955620 | 2299 days ago | 20.8333031 ETH | ||||
| - | 8954942 | 2299 days ago | 0.29338636 ETH | ||||
| - | 8951042 | 2299 days ago | 1.96015786 ETH | ||||
| - | 8942977 | 2301 days ago | 10 ETH | ||||
| - | 8942154 | 2301 days ago | 24.38969541 ETH | ||||
| - | 8941875 | 2301 days ago | 23.95128471 ETH | ||||
| - | 8904293 | 2307 days ago | 2.90832244 ETH | ||||
| - | 8903990 | 2307 days ago | 0.21281557 ETH | ||||
| - | 8903874 | 2307 days ago | 6.5470241 ETH | ||||
| - | 8903821 | 2307 days ago | 22.50659783 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x4E33a667...4bAE567aF The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Exchange
Compiler Version
v0.4.25+commit.59dbf8f1
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2019-10-12
*/
pragma solidity ^0.4.19;
/* Interface for ERC20 Tokens */
contract Token {
bytes32 public standard;
bytes32 public name;
bytes32 public symbol;
uint256 public totalSupply;
uint8 public decimals;
bool public allowTransactions;
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;
function transfer(address _to, uint256 _value) returns (bool success);
function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success);
function approve(address _spender, uint256 _value) returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
}
// The DMEX base Contract
contract Exchange {
function assert(bool assertion) {
if (!assertion) throw;
}
// Safe Multiply Function - prevents integer overflow
function safeMul(uint a, uint b) returns (uint) {
uint c = a * b;
assert(a == 0 || c / a == b);
return c;
}
// Safe Subtraction Function - prevents integer overflow
function safeSub(uint a, uint b) returns (uint) {
assert(b <= a);
return a - b;
}
// Safe Addition Function - prevents integer overflow
function safeAdd(uint a, uint b) returns (uint) {
uint c = a + b;
assert(c>=a && c>=b);
return c;
}
address public owner; // holds the address of the contract owner
mapping (address => bool) public admins; // mapping of admin addresses
mapping (address => bool) public futuresContracts; // mapping of connected futures contracts
mapping (address => uint256) public futuresContractsAddedBlock; // mapping of connected futures contracts and connection block numbers
event SetFuturesContract(address futuresContract, bool isFuturesContract);
// Event fired when the owner of the contract is changed
event SetOwner(address indexed previousOwner, address indexed newOwner);
// Allows only the owner of the contract to execute the function
modifier onlyOwner {
assert(msg.sender == owner);
_;
}
// Changes the owner of the contract
function setOwner(address newOwner) onlyOwner {
SetOwner(owner, newOwner);
owner = newOwner;
}
// Owner getter function
function getOwner() returns (address out) {
return owner;
}
// Adds or disables an admin account
function setAdmin(address admin, bool isAdmin) onlyOwner {
admins[admin] = isAdmin;
}
// Adds or disables a futuresContract address
function setFuturesContract(address futuresContract, bool isFuturesContract) onlyOwner {
if (fistFuturesContract == address(0))
{
fistFuturesContract = futuresContract;
}
futuresContracts[futuresContract] = isFuturesContract;
futuresContractsAddedBlock[futuresContract] = block.number;
emit SetFuturesContract(futuresContract, isFuturesContract);
}
// Allows for admins only to call the function
modifier onlyAdmin {
if (msg.sender != owner && !admins[msg.sender]) throw;
_;
}
// Allows for futures contracts only to call the function
modifier onlyFuturesContract {
if (!futuresContracts[msg.sender]) throw;
_;
}
function() external {
throw;
}
//mapping (address => mapping (address => uint256)) public tokens; // mapping of token addresses to mapping of balances // tokens[token][user]
//mapping (address => mapping (address => uint256)) public reserve; // mapping of token addresses to mapping of reserved balances // reserve[token][user]
mapping (address => mapping (address => uint256)) public balances; // mapping of token addresses to mapping of balances and reserve (bitwise compressed) // balances[token][user]
mapping (address => uint256) public lastActiveTransaction; // mapping of user addresses to last transaction block
mapping (bytes32 => uint256) public orderFills; // mapping of orders to filled qunatity
mapping (address => mapping (address => bool)) public userAllowedFuturesContracts; // mapping of allowed futures smart contracts per user
mapping (address => uint256) public userFirstDeposits; // mapping of user addresses and block number of first deposit
address public feeAccount; // the account that receives the trading fees
address public EtmTokenAddress; // the address of the EtherMium token
address public fistFuturesContract; // 0x if there are no futures contracts set yet
uint256 public inactivityReleasePeriod; // period in blocks before a user can use the withdraw() function
mapping (bytes32 => bool) public withdrawn; // mapping of withdraw requests, makes sure the same withdrawal is not executed twice
uint256 public makerFee; // maker fee in percent expressed as a fraction of 1 ether (0.1 ETH = 10%)
uint256 public takerFee; // taker fee in percent expressed as a fraction of 1 ether (0.1 ETH = 10%)
enum Errors {
INVLID_PRICE, // Order prices don't match
INVLID_SIGNATURE, // Signature is invalid
TOKENS_DONT_MATCH, // Maker/taker tokens don't match
ORDER_ALREADY_FILLED, // Order was already filled
GAS_TOO_HIGH // Too high gas fee
}
// Trade event fired when a trade is executed
event Trade(
address takerTokenBuy, uint256 takerAmountBuy,
address takerTokenSell, uint256 takerAmountSell,
address maker, address indexed taker,
uint256 makerFee, uint256 takerFee,
uint256 makerAmountTaken, uint256 takerAmountTaken,
bytes32 indexed makerOrderHash, bytes32 indexed takerOrderHash
);
// Deposit event fired when a deposit took place
event Deposit(address indexed token, address indexed user, uint256 amount, uint256 balance);
// Withdraw event fired when a withdrawal was executed
event Withdraw(address indexed token, address indexed user, uint256 amount, uint256 balance, uint256 withdrawFee);
// Fee change event
event FeeChange(uint256 indexed makerFee, uint256 indexed takerFee);
// Allow futuresContract
event AllowFuturesContract(address futuresContract, address user);
// Log event, logs errors in contract execution (used for debugging)
event LogError(uint8 indexed errorId, bytes32 indexed makerOrderHash, bytes32 indexed takerOrderHash);
event LogUint(uint8 id, uint256 value);
event LogBool(uint8 id, bool value);
event LogAddress(uint8 id, address value);
// Change inactivity release period event
event InactivityReleasePeriodChange(uint256 value);
// Order cancelation event
event CancelOrder(
bytes32 indexed cancelHash,
bytes32 indexed orderHash,
address indexed user,
address tokenSell,
uint256 amountSell,
uint256 cancelFee
);
// Sets the inactivity period before a user can withdraw funds manually
function setInactivityReleasePeriod(uint256 expiry) onlyOwner returns (bool success) {
if (expiry > 1000000) throw;
inactivityReleasePeriod = expiry;
emit InactivityReleasePeriodChange(expiry);
return true;
}
// Constructor function, initializes the contract and sets the core variables
function Exchange(address feeAccount_, uint256 makerFee_, uint256 takerFee_, uint256 inactivityReleasePeriod_) {
owner = msg.sender;
feeAccount = feeAccount_;
inactivityReleasePeriod = inactivityReleasePeriod_;
makerFee = makerFee_;
takerFee = takerFee_;
}
// Changes the fees
function setFees(uint256 makerFee_, uint256 takerFee_) onlyOwner {
require(makerFee_ < 10 finney && takerFee_ < 10 finney); // The fees cannot be set higher then 1%
makerFee = makerFee_;
takerFee = takerFee_;
emit FeeChange(makerFee, takerFee);
}
function updateBalanceAndReserve (address token, address user, uint256 balance, uint256 reserve) private
{
uint256 character = uint256(balance);
character |= reserve<<128;
balances[token][user] = character;
}
function updateBalance (address token, address user, uint256 balance) private returns (bool)
{
uint256 character = uint256(balance);
character |= getReserve(token, user)<<128;
balances[token][user] = character;
return true;
}
function updateReserve (address token, address user, uint256 reserve) private
{
uint256 character = uint256(balanceOf(token, user));
character |= reserve<<128;
balances[token][user] = character;
}
function decodeBalanceAndReserve (address token, address user) returns (uint256[2])
{
uint256 character = balances[token][user];
uint256 balance = uint256(uint128(character));
uint256 reserve = uint256(uint128(character>>128));
return [balance, reserve];
}
function futuresContractAllowed (address futuresContract, address user) returns (bool)
{
if (fistFuturesContract == futuresContract) return true;
if (userAllowedFuturesContracts[user][futuresContract] == true) return true;
if (futuresContractsAddedBlock[futuresContract] < userFirstDeposits[user]) return true;
return false;
}
// Returns the balance of a specific token for a specific user
function balanceOf(address token, address user) view returns (uint256) {
//return tokens[token][user];
return decodeBalanceAndReserve(token, user)[0];
}
// Returns the reserved amound of token for user
function getReserve(address token, address user) public view returns (uint256) {
//return reserve[token][user];
return decodeBalanceAndReserve(token, user)[1];
}
// Sets reserved amount for specific token and user (can only be called by futures contract)
function setReserve(address token, address user, uint256 amount) onlyFuturesContract returns (bool success) {
if (!futuresContractAllowed(msg.sender, user)) throw;
updateReserve(token, user, amount);
return true;
}
function setBalance(address token, address user, uint256 amount) onlyFuturesContract returns (bool success) {
if (msg.sender != fistFuturesContract) throw;
updateBalance(token, user, amount);
return true;
}
function subBalanceAddReserve(address token, address user, uint256 subBalance, uint256 addReserve) onlyFuturesContract returns (bool)
{
if (msg.sender != fistFuturesContract) throw;
updateBalanceAndReserve(token, user, safeSub(balanceOf(token, user), subBalance), safeAdd(getReserve(token, user), addReserve));
}
function addBalanceSubReserve(address token, address user, uint256 addBalance, uint256 subReserve) onlyFuturesContract returns (bool)
{
if (msg.sender != fistFuturesContract) throw;
updateBalanceAndReserve(token, user, safeAdd(balanceOf(token, user), addBalance), safeSub(getReserve(token, user), subReserve));
}
function addBalanceAddReserve(address token, address user, uint256 addBalance, uint256 addReserve) onlyFuturesContract returns (bool)
{
if (msg.sender != fistFuturesContract) throw;
updateBalanceAndReserve(token, user, safeAdd(balanceOf(token, user), addBalance), safeAdd(getReserve(token, user), addReserve));
}
function subBalanceSubReserve(address token, address user, uint256 subBalance, uint256 subReserve) onlyFuturesContract returns (bool)
{
if (msg.sender != fistFuturesContract) throw;
updateBalanceAndReserve(token, user, safeSub(balanceOf(token, user), subBalance), safeSub(getReserve(token, user), subReserve));
}
// Returns the available balance of a specific token for a specific user
function availableBalanceOf(address token, address user) view returns (uint256) {
return safeSub(balanceOf(token, user), getReserve(token, user));
}
// Returns the inactivity release perios
function getInactivityReleasePeriod() view returns (uint256)
{
return inactivityReleasePeriod;
}
// Increases the user balance
function addBalance(address token, address user, uint256 amount) private
{
updateBalance(token, user, safeAdd(balanceOf(token, user), amount));
}
// Decreases user balance
function subBalance(address token, address user, uint256 amount) private
{
if (availableBalanceOf(token, user) < amount) throw;
updateBalance(token, user, safeSub(balanceOf(token, user), amount));
}
// Deposit ETH to contract
function deposit() payable {
//tokens[address(0)][msg.sender] = safeAdd(tokens[address(0)][msg.sender], msg.value); // adds the deposited amount to user balance
addBalance(address(0), msg.sender, msg.value); // adds the deposited amount to user balance
if (userFirstDeposits[msg.sender] == 0) userFirstDeposits[msg.sender] = block.number;
lastActiveTransaction[msg.sender] = block.number; // sets the last activity block for the user
emit Deposit(address(0), msg.sender, msg.value, balanceOf(address(0), msg.sender)); // fires the deposit event
}
// Deposit ETH to contract for a user
function depositForUser(address user) payable {
//tokens[address(0)][msg.sender] = safeAdd(tokens[address(0)][msg.sender], msg.value); // adds the deposited amount to user balance
addBalance(address(0), user, msg.value); // adds the deposited amount to user balance
if (userFirstDeposits[user] == 0) userFirstDeposits[user] = block.number;
lastActiveTransaction[user] = block.number; // sets the last activity block for the user
emit Deposit(address(0), user, msg.value, balanceOf(address(0), user)); // fires the deposit event
}
// Deposit token to contract
function depositToken(address token, uint128 amount) {
//tokens[token][msg.sender] = safeAdd(tokens[token][msg.sender], amount); // adds the deposited amount to user balance
//if (amount != uint128(amount) || safeAdd(amount, balanceOf(token, msg.sender)) != uint128(amount)) throw;
addBalance(token, msg.sender, amount); // adds the deposited amount to user balance
if (userFirstDeposits[msg.sender] == 0) userFirstDeposits[msg.sender] = block.number;
lastActiveTransaction[msg.sender] = block.number; // sets the last activity block for the user
if (!Token(token).transferFrom(msg.sender, this, amount)) throw; // attempts to transfer the token to this contract, if fails throws an error
emit Deposit(token, msg.sender, amount, balanceOf(token, msg.sender)); // fires the deposit event
}
// Deposit token to contract for a user
function depositToken(address token, uint128 amount, address user) {
//tokens[token][msg.sender] = safeAdd(tokens[token][msg.sender], amount); // adds the deposited amount to user balance
//if (amount != uint128(amount) || safeAdd(amount, balanceOf(token, msg.sender)) != uint128(amount)) throw;
addBalance(token, user, amount); // adds the deposited amount to user balance
if (userFirstDeposits[user] == 0) userFirstDeposits[user] = block.number;
lastActiveTransaction[user] = block.number; // sets the last activity block for the user
if (!Token(token).transferFrom(msg.sender, this, amount)) throw; // attempts to transfer the token to this contract, if fails throws an error
emit Deposit(token, user, amount, balanceOf(token, user)); // fires the deposit event
}
function withdraw(address token, uint256 amount) returns (bool success) {
//if (safeSub(block.number, lastActiveTransaction[msg.sender]) < inactivityReleasePeriod) throw; // checks if the inactivity period has passed
//if (tokens[token][msg.sender] < amount) throw; // checks that user has enough balance
if (availableBalanceOf(token, msg.sender) < amount) throw;
//tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
subBalance(token, msg.sender, amount); // subtracts the withdrawed amount from user balance
if (token == address(0)) { // checks if withdrawal is a token or ETH, ETH has address 0x00000...
if (!msg.sender.send(amount)) throw; // send ETH
} else {
if (!Token(token).transfer(msg.sender, amount)) throw; // Send token
}
emit Withdraw(token, msg.sender, amount, balanceOf(token, msg.sender), 0); // fires the Withdraw event
}
function userAllowFuturesContract(address futuresContract)
{
if (!futuresContracts[futuresContract]) throw;
userAllowedFuturesContracts[msg.sender][futuresContract] = true;
emit AllowFuturesContract(futuresContract, msg.sender);
}
function allowFuturesContractForUser(address futuresContract, address user, uint8 v, bytes32 r, bytes32 s) onlyAdmin
{
if (!futuresContracts[futuresContract]) throw;
bytes32 hash = keccak256(this, 'allow', futuresContract, user);
if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", hash), v, r, s) != user) throw; // checks that the provided signature is valid
userAllowedFuturesContracts[user][futuresContract] = true;
emit AllowFuturesContract(futuresContract, user);
}
// Withdrawal function used by the server to execute withdrawals
function adminWithdraw(
address token, // the address of the token to be withdrawn
uint256 amount, // the amount to be withdrawn
address user, // address of the user
uint256 nonce, // nonce to make the request unique
uint8 v, // part of user signature
bytes32 r, // part of user signature
bytes32 s, // part of user signature
uint256 feeWithdrawal // the transaction gas fee that will be deducted from the user balance
) onlyAdmin returns (bool success) {
bytes32 hash = keccak256(this, token, amount, user, nonce); // creates the hash for the withdrawal request
if (withdrawn[hash]) throw; // checks if the withdrawal was already executed, if true, throws an error
withdrawn[hash] = true; // sets the withdrawal as executed
if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", hash), v, r, s) != user) throw; // checks that the provided signature is valid
if (feeWithdrawal > 50 finney) feeWithdrawal = 50 finney; // checks that the gas fee is not higher than 0.05 ETH
//if (tokens[token][user] < amount) throw; // checks that user has enough balance
if (availableBalanceOf(token, user) < amount) throw; // checks that user has enough balance
//tokens[token][user] = safeSub(tokens[token][user], amount); // subtracts the withdrawal amount from the user balance
subBalance(token, user, amount); // subtracts the withdrawal amount from the user balance
//tokens[address(0)][user] = safeSub(tokens[address(0x0)][user], feeWithdrawal); // subtracts the gas fee from the user ETH balance
subBalance(address(0), user, feeWithdrawal); // subtracts the gas fee from the user ETH balance
//tokens[address(0)][feeAccount] = safeAdd(tokens[address(0)][feeAccount], feeWithdrawal); // moves the gas fee to the feeAccount
addBalance(address(0), feeAccount, feeWithdrawal); // moves the gas fee to the feeAccount
if (token == address(0)) { // checks if the withdrawal is in ETH or Tokens
if (!user.send(amount)) throw; // sends ETH
} else {
if (!Token(token).transfer(user, amount)) throw; // sends tokens
}
lastActiveTransaction[user] = block.number; // sets last user activity block
emit Withdraw(token, user, amount, balanceOf(token, user), feeWithdrawal); // fires the withdraw event
}
function batchAdminWithdraw(
address[] token, // the address of the token to be withdrawn
uint256[] amount, // the amount to be withdrawn
address[] user, // address of the user
uint256[] nonce, // nonce to make the request unique
uint8[] v, // part of user signature
bytes32[] r, // part of user signature
bytes32[] s, // part of user signature
uint256[] feeWithdrawal // the transaction gas fee that will be deducted from the user balance
) onlyAdmin
{
for (uint i = 0; i < amount.length; i++) {
adminWithdraw(
token[i],
amount[i],
user[i],
nonce[i],
v[i],
r[i],
s[i],
feeWithdrawal[i]
);
}
}
function getMakerTakerBalances(address token, address maker, address taker) view returns (uint256[4])
{
return [
balanceOf(token, maker),
balanceOf(token, taker),
getReserve(token, maker),
getReserve(token, taker)
];
}
function getUserBalances(address token, address user) view returns (uint256[2])
{
return [
balanceOf(token, user),
getReserve(token, user)
];
}
// Structure that holds order values, used inside the trade() function
struct OrderPair {
uint256 makerAmountBuy; // amount being bought by the maker
uint256 makerAmountSell; // amount being sold by the maker
uint256 makerNonce; // maker order nonce, makes the order unique
uint256 takerAmountBuy; // amount being bought by the taker
uint256 takerAmountSell; // amount being sold by the taker
uint256 takerNonce; // taker order nonce
uint256 takerGasFee; // taker gas fee, taker pays the gas
uint256 takerIsBuying; // true/false taker is the buyer
address makerTokenBuy; // token bought by the maker
address makerTokenSell; // token sold by the maker
address maker; // address of the maker
address takerTokenBuy; // token bought by the taker
address takerTokenSell; // token sold by the taker
address taker; // address of the taker
bytes32 makerOrderHash; // hash of the maker order
bytes32 takerOrderHash; // has of the taker order
}
// Structure that holds trade values, used inside the trade() function
struct TradeValues {
uint256 qty; // amount to be trade
uint256 invQty; // amount to be traded in the opposite token
uint256 makerAmountTaken; // final amount taken by the maker
uint256 takerAmountTaken; // final amount taken by the taker
}
// Trades balances between user accounts
function trade(
uint8[2] v,
bytes32[4] rs,
uint256[8] tradeValues,
address[6] tradeAddresses
) onlyAdmin returns (uint filledTakerTokenAmount)
{
/* tradeValues
[0] makerAmountBuy
[1] makerAmountSell
[2] makerNonce
[3] takerAmountBuy
[4] takerAmountSell
[5] takerNonce
[6] takerGasFee
[7] takerIsBuying
tradeAddresses
[0] makerTokenBuy
[1] makerTokenSell
[2] maker
[3] takerTokenBuy
[4] takerTokenSell
[5] taker
*/
OrderPair memory t = OrderPair({
makerAmountBuy : tradeValues[0],
makerAmountSell : tradeValues[1],
makerNonce : tradeValues[2],
takerAmountBuy : tradeValues[3],
takerAmountSell : tradeValues[4],
takerNonce : tradeValues[5],
takerGasFee : tradeValues[6],
takerIsBuying : tradeValues[7],
makerTokenBuy : tradeAddresses[0],
makerTokenSell : tradeAddresses[1],
maker : tradeAddresses[2],
takerTokenBuy : tradeAddresses[3],
takerTokenSell : tradeAddresses[4],
taker : tradeAddresses[5],
// tokenBuy amountBuy tokenSell amountSell nonce user
makerOrderHash : keccak256(this, tradeAddresses[0], tradeValues[0], tradeAddresses[1], tradeValues[1], tradeValues[2], tradeAddresses[2]),
takerOrderHash : keccak256(this, tradeAddresses[3], tradeValues[3], tradeAddresses[4], tradeValues[4], tradeValues[5], tradeAddresses[5])
});
// Checks the signature for the maker order
if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", t.makerOrderHash), v[0], rs[0], rs[1]) != t.maker)
{
emit LogError(uint8(Errors.INVLID_SIGNATURE), t.makerOrderHash, t.takerOrderHash);
return 0;
}
// Checks the signature for the taker order
if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", t.takerOrderHash), v[1], rs[2], rs[3]) != t.taker)
{
emit LogError(uint8(Errors.INVLID_SIGNATURE), t.makerOrderHash, t.takerOrderHash);
return 0;
}
// Checks that orders trade the right tokens
if (t.makerTokenBuy != t.takerTokenSell || t.makerTokenSell != t.takerTokenBuy)
{
emit LogError(uint8(Errors.TOKENS_DONT_MATCH), t.makerOrderHash, t.takerOrderHash);
return 0;
} // tokens don't match
// Cheks that gas fee is not higher than 10%
if (t.takerGasFee > 100 finney)
{
emit LogError(uint8(Errors.GAS_TOO_HIGH), t.makerOrderHash, t.takerOrderHash);
return 0;
} // takerGasFee too high
// Checks that the prices match.
// Taker always pays the maker price. This part checks that the taker price is as good or better than the maker price
if (!(
(t.takerIsBuying == 0 && safeMul(t.makerAmountSell, 1e18) / t.makerAmountBuy >= safeMul(t.takerAmountBuy, 1e18) / t.takerAmountSell)
||
(t.takerIsBuying > 0 && safeMul(t.makerAmountBuy, 1e18) / t.makerAmountSell <= safeMul(t.takerAmountSell, 1e18) / t.takerAmountBuy)
))
{
emit LogError(uint8(Errors.INVLID_PRICE), t.makerOrderHash, t.takerOrderHash);
return 0; // prices don't match
}
// Initializing trade values structure
TradeValues memory tv = TradeValues({
qty : 0,
invQty : 0,
makerAmountTaken : 0,
takerAmountTaken : 0
});
// maker buy, taker sell
if (t.takerIsBuying == 0)
{
// traded quantity is the smallest quantity between the maker and the taker, takes into account amounts already filled on the orders
tv.qty = min(safeSub(t.makerAmountBuy, orderFills[t.makerOrderHash]), safeSub(t.takerAmountSell, safeMul(orderFills[t.takerOrderHash], t.takerAmountSell) / t.takerAmountBuy));
if (tv.qty == 0)
{
// order was already filled
emit LogError(uint8(Errors.ORDER_ALREADY_FILLED), t.makerOrderHash, t.takerOrderHash);
return 0;
}
// the traded quantity in opposite token terms
tv.invQty = safeMul(tv.qty, t.makerAmountSell) / t.makerAmountBuy;
// take fee from Token balance
tv.makerAmountTaken = safeSub(tv.qty, safeMul(tv.qty, makerFee) / (1e18)); // net amount received by maker, excludes maker fee
//tokens[t.makerTokenBuy][feeAccount] = safeAdd(tokens[t.makerTokenBuy][feeAccount], safeMul(tv.qty, makerFee) / (1 ether)); // add maker fee to feeAccount
addBalance(t.makerTokenBuy, feeAccount, safeMul(tv.qty, makerFee) / (1e18)); // add maker fee to feeAccount
// take fee from Token balance
tv.takerAmountTaken = safeSub(safeSub(tv.invQty, safeMul(tv.invQty, takerFee) / (1e18)), safeMul(tv.invQty, t.takerGasFee) / (1e18)); // amount taken from taker minus taker fee
//tokens[t.takerTokenBuy][feeAccount] = safeAdd(tokens[t.takerTokenBuy][feeAccount], safeAdd(safeMul(tv.invQty, takerFee) / (1 ether), safeMul(tv.invQty, t.takerGasFee) / (1 ether))); // add taker fee to feeAccount
addBalance(t.takerTokenBuy, feeAccount, safeAdd(safeMul(tv.invQty, takerFee) / (1e18), safeMul(tv.invQty, t.takerGasFee) / (1e18))); // add taker fee to feeAccount
//tokens[t.makerTokenSell][t.maker] = safeSub(tokens[t.makerTokenSell][t.maker], tv.invQty); // subtract sold token amount from maker balance
subBalance(t.makerTokenSell, t.maker, tv.invQty); // subtract sold token amount from maker balance
//tokens[t.makerTokenBuy][t.maker] = safeAdd(tokens[t.makerTokenBuy][t.maker], tv.makerAmountTaken); // add bought token amount to maker
addBalance(t.makerTokenBuy, t.maker, tv.makerAmountTaken); // add bought token amount to maker
//tokens[t.makerTokenBuy][tv.makerReferrer] = safeAdd(tokens[t.makerTokenBuy][tv.makerReferrer], safeMul(tv.qty, makerAffiliateFee) / (1 ether)); // add affiliate commission to maker affiliate balance
//tokens[t.takerTokenSell][t.taker] = safeSub(tokens[t.takerTokenSell][t.taker], tv.qty); // subtract the sold token amount from taker
subBalance(t.takerTokenSell, t.taker, tv.qty); // subtract the sold token amount from taker
//tokens[t.takerTokenBuy][t.taker] = safeAdd(tokens[t.takerTokenBuy][t.taker], tv.takerAmountTaken); // amount received by taker, excludes taker fee
//tokens[t.takerTokenBuy][tv.takerReferrer] = safeAdd(tokens[t.takerTokenBuy][tv.takerReferrer], safeMul(tv.invQty, takerAffiliateFee) / (1 ether)); // add affiliate commission to taker affiliate balance
addBalance(t.takerTokenBuy, t.taker, tv.takerAmountTaken); // amount received by taker, excludes taker fee
orderFills[t.makerOrderHash] = safeAdd(orderFills[t.makerOrderHash], tv.qty); // increase the maker order filled amount
orderFills[t.takerOrderHash] = safeAdd(orderFills[t.takerOrderHash], safeMul(tv.qty, t.takerAmountBuy) / t.takerAmountSell); // increase the taker order filled amount
lastActiveTransaction[t.maker] = block.number; // set last activity block number for maker
lastActiveTransaction[t.taker] = block.number; // set last activity block number for taker
// fire Trade event
emit Trade(
t.takerTokenBuy, tv.qty,
t.takerTokenSell, tv.invQty,
t.maker, t.taker,
makerFee, takerFee,
tv.makerAmountTaken , tv.takerAmountTaken,
t.makerOrderHash, t.takerOrderHash
);
return tv.qty;
}
// maker sell, taker buy
else
{
// traded quantity is the smallest quantity between the maker and the taker, takes into account amounts already filled on the orders
tv.qty = min(safeSub(t.makerAmountSell, safeMul(orderFills[t.makerOrderHash], t.makerAmountSell) / t.makerAmountBuy), safeSub(t.takerAmountBuy, orderFills[t.takerOrderHash]));
if (tv.qty == 0)
{
// order was already filled
emit LogError(uint8(Errors.ORDER_ALREADY_FILLED), t.makerOrderHash, t.takerOrderHash);
return 0;
}
// the traded quantity in opposite token terms
tv.invQty = safeMul(tv.qty, t.makerAmountBuy) / t.makerAmountSell;
// take fee from ETH balance
tv.makerAmountTaken = safeSub(tv.invQty, safeMul(tv.invQty, makerFee) / 1e18); // net amount received by maker, excludes maker fee
//tokens[t.makerTokenBuy][feeAccount] = safeAdd(tokens[t.makerTokenBuy][feeAccount], safeMul(tv.invQty, makerFee) / (1 ether)); // add maker fee to feeAccount
addBalance(t.makerTokenBuy, feeAccount, safeMul(tv.invQty, makerFee) / 1e18); // add maker fee to feeAccount
// process fees for taker
// take fee from ETH balance
tv.takerAmountTaken = safeSub(safeSub(tv.qty, safeMul(tv.qty, takerFee) / 1e18), safeMul(tv.qty, t.takerGasFee) / 1e18); // amount taken from taker minus taker fee
//tokens[t.takerTokenBuy][feeAccount] = safeAdd(tokens[t.takerTokenBuy][feeAccount], safeAdd(safeMul(tv.qty, takerFee) / (1 ether), safeMul(tv.qty, t.takerGasFee) / (1 ether))); // add taker fee to feeAccount
addBalance(t.takerTokenBuy, feeAccount, safeAdd(safeMul(tv.qty, takerFee) / 1e18, safeMul(tv.qty, t.takerGasFee) / 1e18)); // add taker fee to feeAccount
//tokens[t.makerTokenSell][t.maker] = safeSub(tokens[t.makerTokenSell][t.maker], tv.qty); // subtract sold token amount from maker balance
subBalance(t.makerTokenSell, t.maker, tv.qty); // subtract sold token amount from maker balance
//tv.makerAmountTaken = safeSub(tv.invQty, safeMul(tv.invQty, makerFee) / (1 ether)); // net amount received by maker, excludes maker fee
//tokens[t.makerTokenBuy][t.maker] = safeAdd(tokens[t.makerTokenBuy][t.maker], tv.makerAmountTaken); // add bought token amount to maker
addBalance(t.makerTokenBuy, t.maker, tv.makerAmountTaken); // add bought token amount to maker
//tokens[t.makerTokenBuy][tv.makerReferrer] = safeAdd(tokens[t.makerTokenBuy][tv.makerReferrer], safeMul(tv.invQty, makerAffiliateFee) / (1 ether)); // add affiliate commission to maker affiliate balance
//tokens[t.takerTokenSell][t.taker] = safeSub(tokens[t.takerTokenSell][t.taker], tv.invQty); // subtract the sold token amount from taker
subBalance(t.takerTokenSell, t.taker, tv.invQty);
//tv.takerAmountTaken = safeSub(safeSub(tv.qty, safeMul(tv.qty, takerFee) / (1 ether)), safeMul(tv.qty, t.takerGasFee) / (1 ether)); // amount taken from taker minus taker fee
//tokens[t.takerTokenBuy][t.taker] = safeAdd(tokens[t.takerTokenBuy][t.taker], tv.takerAmountTaken); // amount received by taker, excludes taker fee
addBalance(t.takerTokenBuy, t.taker, tv.takerAmountTaken); // amount received by taker, excludes taker fee
//tokens[t.takerTokenBuy][tv.takerReferrer] = safeAdd(tokens[t.takerTokenBuy][tv.takerReferrer], safeMul(tv.qty, takerAffiliateFee) / (1 ether)); // add affiliate commission to taker affiliate balance
//tokens[t.makerTokenBuy][feeAccount] = safeAdd(tokens[t.makerTokenBuy][feeAccount], safeMul(tv.invQty, safeSub(makerFee, makerAffiliateFee)) / (1 ether)); // add maker fee excluding affiliate commission to feeAccount
//tokens[t.takerTokenBuy][feeAccount] = safeAdd(tokens[t.takerTokenBuy][feeAccount], safeAdd(safeMul(tv.qty, safeSub(takerFee, takerAffiliateFee)) / (1 ether), safeMul(tv.qty, t.takerGasFee) / (1 ether))); // add taker fee excluding affiliate commission to feeAccount
orderFills[t.makerOrderHash] = safeAdd(orderFills[t.makerOrderHash], tv.invQty); // increase the maker order filled amount
orderFills[t.takerOrderHash] = safeAdd(orderFills[t.takerOrderHash], tv.qty); // increase the taker order filled amount
lastActiveTransaction[t.maker] = block.number; // set last activity block number for maker
lastActiveTransaction[t.taker] = block.number; // set last activity block number for taker
// fire Trade event
emit Trade(
t.takerTokenBuy, tv.qty,
t.takerTokenSell, tv.invQty,
t.maker, t.taker,
makerFee, takerFee,
tv.makerAmountTaken , tv.takerAmountTaken,
t.makerOrderHash, t.takerOrderHash
);
return tv.qty;
}
}
// Executes multiple trades in one transaction, saves gas fees
function batchOrderTrade(
uint8[2][] v,
bytes32[4][] rs,
uint256[8][] tradeValues,
address[6][] tradeAddresses
) onlyAdmin
{
for (uint i = 0; i < tradeAddresses.length; i++) {
trade(
v[i],
rs[i],
tradeValues[i],
tradeAddresses[i]
);
}
}
// Cancels order by setting amount filled to toal order amount
function cancelOrder(
/*
[0] orderV
[1] cancelV
*/
uint8[2] v,
/*
[0] orderR
[1] orderS
[2] cancelR
[3] cancelS
*/
bytes32[4] rs,
/*
[0] orderAmountBuy
[1] orderAmountSell
[2] orderNonce
[3] cancelNonce
[4] cancelFee
*/
uint256[5] cancelValues,
/*
[0] orderTokenBuy
[1] orderTokenSell
[2] orderUser
[3] cancelUser
*/
address[4] cancelAddresses
) onlyAdmin {
// Order values should be valid and signed by order owner
bytes32 orderHash = keccak256(
this, cancelAddresses[0], cancelValues[0], cancelAddresses[1],
cancelValues[1], cancelValues[2], cancelAddresses[2]
);
require(ecrecover(keccak256("\x19Ethereum Signed Message:\n32", orderHash), v[0], rs[0], rs[1]) == cancelAddresses[2]);
// Cancel action should be signed by order owner
bytes32 cancelHash = keccak256(this, orderHash, cancelAddresses[3], cancelValues[3]);
require(ecrecover(keccak256("\x19Ethereum Signed Message:\n32", cancelHash), v[1], rs[2], rs[3]) == cancelAddresses[3]);
// Order owner should be the same as cancel's initiator
require(cancelAddresses[2] == cancelAddresses[3]);
// Do not allow to cancel already canceled or filled orders
require(orderFills[orderHash] != cancelValues[0]);
// Cancel gas fee cannot exceed 0.05 ETh
if (cancelValues[4] > 50 finney) {
cancelValues[4] = 50 finney;
}
// Take cancel fee
// This operation throws an error if fee amount is greater than the user balance
//tokens[address(0)][cancelAddresses[3]] = safeSub(tokens[address(0)][cancelAddresses[3]], cancelValues[4]);
subBalance(address(0), cancelAddresses[3], cancelValues[4]);
// Cancel order by setting amount filled to total order value, i.e. making the order filled
orderFills[orderHash] = cancelValues[0];
// Fire cancel order event
emit CancelOrder(cancelHash, orderHash, cancelAddresses[3], cancelAddresses[1], cancelValues[1], cancelValues[4]);
}
// Returns the smaller of two values
function min(uint a, uint b) private pure returns (uint) {
return a < b ? a : b;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"futuresContracts","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"assertion","type":"bool"}],"name":"assert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"makerFee_","type":"uint256"},{"name":"takerFee_","type":"uint256"}],"name":"setFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"subBalance","type":"uint256"},{"name":"addReserve","type":"uint256"}],"name":"subBalanceAddReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"futuresContract","type":"address"},{"name":"isFuturesContract","type":"bool"}],"name":"setFuturesContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"user","type":"address"},{"name":"nonce","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"feeWithdrawal","type":"uint256"}],"name":"adminWithdraw","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lastActiveTransaction","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"availableBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"futuresContract","type":"address"},{"name":"user","type":"address"}],"name":"futuresContractAllowed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"EtmTokenAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"withdrawn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"amount","type":"uint256"}],"name":"setReserve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"admins","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"takerFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"},{"name":"isAdmin","type":"bool"}],"name":"setAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"subBalance","type":"uint256"},{"name":"subReserve","type":"uint256"}],"name":"subBalanceSubReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"addBalance","type":"uint256"},{"name":"subReserve","type":"uint256"}],"name":"addBalanceSubReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint128"},{"name":"user","type":"address"}],"name":"depositToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeAccount","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"depositForUser","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address[]"},{"name":"amount","type":"uint256[]"},{"name":"user","type":"address[]"},{"name":"nonce","type":"uint256[]"},{"name":"v","type":"uint8[]"},{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"},{"name":"feeWithdrawal","type":"uint256[]"}],"name":"batchAdminWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8[2][]"},{"name":"rs","type":"bytes32[4][]"},{"name":"tradeValues","type":"uint256[8][]"},{"name":"tradeAddresses","type":"address[6][]"}],"name":"batchOrderTrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8[2]"},{"name":"rs","type":"bytes32[4]"},{"name":"cancelValues","type":"uint256[5]"},{"name":"cancelAddresses","type":"address[4]"}],"name":"cancelOrder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getOwner","outputs":[{"name":"out","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"maker","type":"address"},{"name":"taker","type":"address"}],"name":"getMakerTakerBalances","outputs":[{"name":"","type":"uint256[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"futuresContract","type":"address"}],"name":"userAllowFuturesContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeSub","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInactivityReleasePeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"addBalance","type":"uint256"},{"name":"addReserve","type":"uint256"}],"name":"addBalanceAddReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"userFirstDeposits","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint128"}],"name":"depositToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"amount","type":"uint256"}],"name":"setBalance","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getUserBalances","outputs":[{"name":"","type":"uint256[2]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getReserve","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"decodeBalanceAndReserve","outputs":[{"name":"","type":"uint256[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeMul","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"futuresContract","type":"address"},{"name":"user","type":"address"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"allowFuturesContractForUser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8[2]"},{"name":"rs","type":"bytes32[4]"},{"name":"tradeValues","type":"uint256[8]"},{"name":"tradeAddresses","type":"address[6]"}],"name":"trade","outputs":[{"name":"filledTakerTokenAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"expiry","type":"uint256"}],"name":"setInactivityReleasePeriod","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeAdd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"futuresContractsAddedBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"inactivityReleasePeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"orderFills","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"userAllowedFuturesContracts","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"makerFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fistFuturesContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"feeAccount_","type":"address"},{"name":"makerFee_","type":"uint256"},{"name":"takerFee_","type":"uint256"},{"name":"inactivityReleasePeriod_","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"futuresContract","type":"address"},{"indexed":false,"name":"isFuturesContract","type":"bool"}],"name":"SetFuturesContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"SetOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"takerTokenBuy","type":"address"},{"indexed":false,"name":"takerAmountBuy","type":"uint256"},{"indexed":false,"name":"takerTokenSell","type":"address"},{"indexed":false,"name":"takerAmountSell","type":"uint256"},{"indexed":false,"name":"maker","type":"address"},{"indexed":true,"name":"taker","type":"address"},{"indexed":false,"name":"makerFee","type":"uint256"},{"indexed":false,"name":"takerFee","type":"uint256"},{"indexed":false,"name":"makerAmountTaken","type":"uint256"},{"indexed":false,"name":"takerAmountTaken","type":"uint256"},{"indexed":true,"name":"makerOrderHash","type":"bytes32"},{"indexed":true,"name":"takerOrderHash","type":"bytes32"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"balance","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"balance","type":"uint256"},{"indexed":false,"name":"withdrawFee","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"makerFee","type":"uint256"},{"indexed":true,"name":"takerFee","type":"uint256"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"futuresContract","type":"address"},{"indexed":false,"name":"user","type":"address"}],"name":"AllowFuturesContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"errorId","type":"uint8"},{"indexed":true,"name":"makerOrderHash","type":"bytes32"},{"indexed":true,"name":"takerOrderHash","type":"bytes32"}],"name":"LogError","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint8"},{"indexed":false,"name":"value","type":"uint256"}],"name":"LogUint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint8"},{"indexed":false,"name":"value","type":"bool"}],"name":"LogBool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint8"},{"indexed":false,"name":"value","type":"address"}],"name":"LogAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"value","type":"uint256"}],"name":"InactivityReleasePeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cancelHash","type":"bytes32"},{"indexed":true,"name":"orderHash","type":"bytes32"},{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"tokenSell","type":"address"},{"indexed":false,"name":"amountSell","type":"uint256"},{"indexed":false,"name":"cancelFee","type":"uint256"}],"name":"CancelOrder","type":"event"}]Contract Creation Code
0x608060405234801561001057600080fd5b50604051608080613554833981016040908152815160208301519183015160609093015160008054600160a060020a0319908116331790915560098054600160a060020a039094169390911692909217909155600c55600e55600f556134d98061007b6000396000f3006080604052600436106102715763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166302ce8c4d81146102835780630674763c146102b85780630b78f9c0146102d457806313af4035146102ef5780631e452a901461031057806320a0851f1461033d5780632295115b14610363578063254dcfe2146103a05780632a7575ee146103d35780632b197ef3146103fa57806337fd5940146104215780633823d66c146104525780633aa9f9911461046a578063429b62e51461049457806343f0179b146104b55780634b0bddd2146104ca5780634e5978e1146104f05780635278366a1461051d578063600f30c31461054a57806365e17c9d1461057e5780636a523c5e146105935780637869a950146105a757806378f767791461078b5780637b68be8114610961578063893d20e814610a135780638da5cb5b14610a2857806392c6061114610a3d5780639dbe267014610aa2578063a293d1e814610ac3578063a7a278b114610ade578063a874fe2f14610af3578063a99463bc14610b20578063ad895d7e14610b41578063b5c9cbbe14610b6e578063c23f001f14610b98578063c719e57f14610bbf578063cbc3ab5314610bfd578063ce4ff5e914610c24578063d05c78da14610c4b578063d0e30db014610c66578063d150126314610c6e578063d305785914610ca1578063dd93c74a14610d54578063e6cb901314610d6c578063e8689bb814610d87578063f31174ee14610da8578063f3fef3a314610dbd578063f7213db614610de1578063f7888aec14610df9578063fc5ef05714610e20578063fc741c7c14610e47578063fe05377214610e5c575b34801561027d57600080fd5b50600080fd5b34801561028f57600080fd5b506102a4600160a060020a0360043516610e71565b604080519115158252519081900360200190f35b3480156102c457600080fd5b506102d26004351515610e86565b005b3480156102e057600080fd5b506102d2600435602435610e95565b3480156102fb57600080fd5b506102d2600160a060020a0360043516610f0e565b34801561031c57600080fd5b506102a4600160a060020a0360043581169060243516604435606435610f8d565b34801561034957600080fd5b506102d2600160a060020a03600435166024351515610ffa565b34801561036f57600080fd5b506102a4600160a060020a03600435811690602435906044351660643560ff6084351660a43560c43560e4356110bd565b3480156103ac57600080fd5b506103c1600160a060020a03600435166113e8565b60408051918252519081900360200190f35b3480156103df57600080fd5b506103c1600160a060020a03600435811690602435166113fa565b34801561040657600080fd5b506102a4600160a060020a0360043581169060243516611421565b34801561042d57600080fd5b506104366114be565b60408051600160a060020a039092168252519081900360200190f35b34801561045e57600080fd5b506102a46004356114cd565b34801561047657600080fd5b506102a4600160a060020a03600435811690602435166044356114e2565b3480156104a057600080fd5b506102a4600160a060020a036004351661152a565b3480156104c157600080fd5b506103c161153f565b3480156104d657600080fd5b506102d2600160a060020a03600435166024351515611545565b3480156104fc57600080fd5b506102a4600160a060020a0360043581169060243516604435606435611587565b34801561052957600080fd5b506102a4600160a060020a03600435811690602435166044356064356115db565b34801561055657600080fd5b506102d2600160a060020a036004358116906001608060020a03602435169060443516611622565b34801561058a57600080fd5b50610436611785565b6102d2600160a060020a0360043516611794565b3480156105b357600080fd5b50604080516020600480358082013583810280860185019096528085526102d295369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975061182b9650505050505050565b34801561079757600080fd5b506040805160048035808201356020818102850181019095528084526102d2943694602493909290840191819060009085015b828210156108035760408051808201825290808402870190600290839083908082843750505091835250506001909101906020016107ca565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b82821015610872576040805160808181019092529080840287019060049083908390808284375050509183525050600190910190602001610836565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b828210156108e2576040805161010081810190925290808402870190600890839083908082843750505091835250506001909101906020016108a5565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b82821015610951576040805160c08181019092529080840287019060069083908390808284375050509183525050600190910190602001610915565b5093965061194a95505050505050565b34801561096d57600080fd5b506040805180820182526102d29136916004916044919083906002908390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750506040805160a0818101909252949796958181019594509250600591508390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750939650611a0595505050505050565b348015610a1f57600080fd5b50610436611d48565b348015610a3457600080fd5b50610436611d57565b348015610a4957600080fd5b50610a6a600160a060020a0360043581169060243581169060443516611d66565b6040518082608080838360005b83811015610a8f578181015183820152602001610a77565b5050505090500191505060405180910390f35b348015610aae57600080fd5b506102d2600160a060020a0360043516611dbb565b348015610acf57600080fd5b506103c1600435602435611e4f565b348015610aea57600080fd5b506103c1611e63565b348015610aff57600080fd5b506102a4600160a060020a0360043581169060243516604435606435611e69565b348015610b2c57600080fd5b506103c1600160a060020a0360043516611eb0565b348015610b4d57600080fd5b506102d2600160a060020a03600435166001608060020a0360243516611ec2565b348015610b7a57600080fd5b506102a4600160a060020a0360043581169060243516604435612008565b348015610ba457600080fd5b506103c1600160a060020a0360043581169060243516612053565b348015610bcb57600080fd5b50610be6600160a060020a0360043581169060243516612070565b604080518251815290819083908083836020610a77565b348015610c0957600080fd5b506103c1600160a060020a03600435811690602435166120a5565b348015610c3057600080fd5b50610be6600160a060020a03600435811690602435166120c0565b348015610c5757600080fd5b506103c1600435602435612124565b6102d261214f565b348015610c7a57600080fd5b506102d2600160a060020a036004358116906024351660ff604435166064356084356121ca565b348015610cad57600080fd5b506040805180820182526103c19136916004916044919083906002908390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750506040805161010081810190925294979695818101959450925060089150839083908082843750506040805160c08181019092529497969581810195945092506006915083908390808284375093965061239895505050505050565b348015610d6057600080fd5b506102a4600435612fe8565b348015610d7857600080fd5b506103c1600435602435613050565b348015610d9357600080fd5b506103c1600160a060020a036004351661306c565b348015610db457600080fd5b506103c161307e565b348015610dc957600080fd5b506102a4600160a060020a0360043516602435613084565b348015610ded57600080fd5b506103c16004356131de565b348015610e0557600080fd5b506103c1600160a060020a03600435811690602435166131f0565b348015610e2c57600080fd5b506102a4600160a060020a0360043581169060243516613203565b348015610e5357600080fd5b506103c1613223565b348015610e6857600080fd5b50610436613229565b60026020526000908152604090205460ff1681565b801515610e9257600080fd5b50565b600054610eac90600160a060020a03163314610e86565b662386f26fc1000082108015610ec85750662386f26fc1000081105b1515610ed357600080fd5b600e829055600f819055604051819083907fa995ac7c2dc5fdc05b41983e69d4d9fbd224a8528bc7d86eabfd533cd3ca449790600090a35050565b600054610f2590600160a060020a03163314610e86565b60008054604051600160a060020a03808516939216917fcbf985117192c8f614a58aaf97226bb80a754772f5f6edf06f87c675f2e6c66391a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b3360009081526002602052604081205460ff161515610fab57600080fd5b600b54600160a060020a03163314610fc257600080fd5b610ff28585610fda610fd489896131f0565b87611e4f565b610fed610fe78a8a6120a5565b87613050565b613238565b949350505050565b60005461101190600160a060020a03163314610e86565b600b54600160a060020a0316151561104c57600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384161790555b600160a060020a0382166000818152600260209081526040808320805460ff1916861515908117909155600383529281902043905580519384529083019190915280517fd52650aadc7286c5cbc5259bdddd3d967821bd6bfd78babe1d68ba30a04743679281900390910190a15050565b600080548190600160a060020a031633148015906110eb57503360009081526001602052604090205460ff16155b156110f557600080fd5b50604080516c010000000000000000000000003081028252600160a060020a03808d1682026014840152602883018c90528a16026048820152605c8101889052815190819003607c0190206000818152600d602052919091205460ff161561115c57600080fd5b6000818152600d60209081526040808320805460ff19166001908117909155815160008051602061346e8339815191528152601c8101869052825190819003603c0181208582528185018085525260ff8b1681840152606081018a9052608081018990529151600160a060020a038d1694919360a0808501949193601f19840193928390039091019190865af11580156111fa573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561121957600080fd5b66b1a2bc2ec500008311156112335766b1a2bc2ec5000092505b8861123e8b8a6113fa565b101561124957600080fd5b6112548a898b61327c565b6112606000898561327c565b60095461127990600090600160a060020a0316856132b5565b600160a060020a038a1615156112be57604051600160a060020a038916908a156108fc02908b906000818181858888f1935050505015156112b957600080fd5b611371565b89600160a060020a031663a9059cbb898b6040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561133a57600080fd5b505af115801561134e573d6000803e3d6000fd5b505050506040513d602081101561136457600080fd5b5051151561137157600080fd5b600160a060020a038089166000818152600560205260409020439055908b167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8b6113bc8e8d6131f0565b604080519283526020830191909152818101889052519081900360600190a35098975050505050505050565b60056020526000908152604090205481565b600061141861140984846131f0565b61141385856120a5565b611e4f565b90505b92915050565b600b54600090600160a060020a03848116911614156114425750600161141b565b600160a060020a0380831660009081526007602090815260408083209387168352929052205460ff1615156001141561147d5750600161141b565b600160a060020a038083166000908152600860209081526040808320549387168352600390915290205410156114b55750600161141b565b50600092915050565b600a54600160a060020a031681565b600d6020526000908152604090205460ff1681565b3360009081526002602052604081205460ff16151561150057600080fd5b61150a3384611421565b151561151557600080fd5b6115208484846132cd565b5060019392505050565b60016020526000908152604090205460ff1681565b600f5481565b60005461155c90600160a060020a03163314610e86565b600160a060020a03919091166000908152600160205260409020805460ff1916911515919091179055565b3360009081526002602052604081205460ff1615156115a557600080fd5b600b54600160a060020a031633146115bc57600080fd5b610ff285856115ce610fd489896131f0565b610fed610fd48a8a6120a5565b3360009081526002602052604081205460ff1615156115f957600080fd5b600b54600160a060020a0316331461161057600080fd5b610ff285856115ce610fe789896131f0565b6116368382846001608060020a03166132b5565b600160a060020a038116600090815260086020526040902054151561167157600160a060020a03811660009081526008602052604090204390555b600160a060020a03808216600090815260056020908152604080832043905580517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526001608060020a03871660448201529051938716936323b872dd93606480840194938390030190829087803b1580156116f957600080fd5b505af115801561170d573d6000803e3d6000fd5b505050506040513d602081101561172357600080fd5b5051151561173057600080fd5b80600160a060020a031683600160a060020a031660008051602061348e8339815191528461175e87866131f0565b604080516001608060020a03909316835260208301919091528051918290030190a3505050565b600954600160a060020a031681565b6117a0600082346132b5565b600160a060020a03811660009081526008602052604090205415156117db57600160a060020a03811660009081526008602052604090204390555b600160a060020a038116600081815260056020526040812043905560008051602061348e8339815191523461181083866131f0565b6040805192835260208301919091528051918290030190a350565b60008054600160a060020a0316331480159061185757503360009081526001602052604090205460ff16155b1561186157600080fd5b5060005b875181101561193f57611936898281518110151561187f57fe5b90602001906020020151898381518110151561189757fe5b9060200190602002015189848151811015156118af57fe5b9060200190602002015189858151811015156118c757fe5b9060200190602002015189868151811015156118df57fe5b9060200190602002015189878151811015156118f757fe5b90602001906020020151898881518110151561190f57fe5b90602001906020020151898981518110151561192757fe5b906020019060200201516110bd565b50600101611865565b505050505050505050565b60008054600160a060020a0316331480159061197657503360009081526001602052604090205460ff16155b1561198057600080fd5b5060005b81518110156119fe576119f5858281518110151561199e57fe5b9060200190602002015185838151811015156119b657fe5b9060200190602002015185848151811015156119ce57fe5b9060200190602002015185858151811015156119e657fe5b90602001906020020151612398565b50600101611984565b5050505050565b600080548190600160a060020a03163314801590611a3357503360009081526001602052604090205460ff16155b15611a3d57600080fd5b82518451602080860151818801516040808a0151818a0180518351306c010000000000000000000000009081028252600160a060020a039a8b1681026014830152602882019990995295891688026048870152605c860194909452607c850191909152918616909402609c83015283519182900360b0018220905160008051602061346e8339815191528352601c8301829052845192839003603c0183208c518c518d8701516000808852878901808b529490945260ff909216868901526060860152608085015294519197509094169360019360a08084019493601f198401939081900390910191865af1158015611b3a573d6000803e3d6000fd5b50505060206040510351600160a060020a0316141515611b5957600080fd5b50606082810180518583015160408051306c01000000000000000000000000908102825260148201889052600160a060020a0394851602603482015260488101929092528051918290036068018220935160008051602061346e8339815191528352601c8301859052815192839003603c01832060208c8101518c8501518d8a015160008089528489018089529590955260ff909216878701529886019890985260808501979097529151949593169360019360a0808501949193601f19840193928390039091019190865af1158015611c37573d6000803e3d6000fd5b50505060206040510351600160a060020a0316141515611c5657600080fd5b60608301516040840151600160a060020a03908116911614611c7757600080fd5b83516000838152600660205260409020541415611c9357600080fd5b608084015166b1a2bc2ec500001015611cb45766b1a2bc2ec5000060808501525b60608301516080850151611cca9160009161327c565b835160008381526006602090815260409182902092909255606080860151868401518489015160808a01518551600160a060020a03938416815296870191909152858501529251921692859285927fd23bed568a5bf25c3577535afb4d173c4a6942e92812c0d105d94115d2beab72928290030190a4505050505050565b600054600160a060020a031690565b600054600160a060020a031681565b611d6e613386565b608060405190810160405280611d8486866131f0565b8152602001611d9386856131f0565b8152602001611da286866120a5565b8152602001611db186856120a5565b9052949350505050565b600160a060020a03811660009081526002602052604090205460ff161515611de257600080fd5b336000818152600760209081526040808320600160a060020a03861680855290835292819020805460ff1916600117905580519283529082019290925281517fd931e2079515b12dd08696feda19ddc7949c89cf653c724221d0482bc986d2bb929181900390910190a150565b6000611e5d83831115610e86565b50900390565b600c5490565b3360009081526002602052604081205460ff161515611e8757600080fd5b600b54600160a060020a03163314611e9e57600080fd5b610ff28585610fda610fe789896131f0565b60086020526000908152604090205481565b611ed68233836001608060020a03166132b5565b336000908152600860205260409020541515611eff573360009081526008602052604090204390555b33600081815260056020908152604080832043905580517f23b872dd00000000000000000000000000000000000000000000000000000000815260048101949094523060248501526001608060020a038516604485015251600160a060020a038616936323b872dd9360648083019493928390030190829087803b158015611f8657600080fd5b505af1158015611f9a573d6000803e3d6000fd5b505050506040513d6020811015611fb057600080fd5b50511515611fbd57600080fd5b33600160a060020a03831660008051602061348e83398151915283611fe286856131f0565b604080516001608060020a03909316835260208301919091528051918290030190a35050565b3360009081526002602052604081205460ff16151561202657600080fd5b600b54600160a060020a0316331461203d57600080fd5b612048848484613321565b506001949350505050565b600460209081526000928352604080842090915290825290205481565b6120786133a5565b604080519081016040528061208d85856131f0565b815260200161209c85856120a5565b90529392505050565b60006120b183836120c0565b60015b60200201519392505050565b6120c86133a5565b50600160a060020a0391821660009081526004602090815260408083209390941682529182528290205482518084019093526001608060020a038082168452700100000000000000000000000000000000909104169082015290565b6000828202612148841580612143575083858381151561214057fe5b04145b610e86565b9392505050565b61215b600033346132b5565b336000908152600860205260409020541515612184573360009081526008602052604090204390555b33600081815260056020526040812043905560008051602061348e833981519152346121b083856131f0565b6040805192835260208301919091528051918290030190a3565b60008054600160a060020a031633148015906121f657503360009081526001602052604090205460ff16155b1561220057600080fd5b600160a060020a03861660009081526002602052604090205460ff16151561222757600080fd5b50604080516c0100000000000000000000000030810282527f616c6c6f770000000000000000000000000000000000000000000000000000006014830152600160a060020a03808916820260198401528716908102602d830152825191829003604101822060008051602061346e8339815191528352601c8301819052835192839003603c018320600080855260208581018088529290925260ff891685870152606085018890526080850187905294519194929360019360a080830194601f1981019381900390910191865af1158015612306573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561232557600080fd5b600160a060020a038086166000818152600760209081526040808320948b1680845294825291829020805460ff19166001179055815193845283019190915280517fd931e2079515b12dd08696feda19ddc7949c89cf653c724221d0482bc986d2bb9281900390910190a1505050505050565b60006123a26133c0565b6123aa613444565b600054600160a060020a031633148015906123d557503360009081526001602052604090205460ff16155b156123df57600080fd5b60408051610200810190915280866000602090810291909101518252018660016020908102919091015182520186600260209081029190910151825201866003602090810291909101518252018660046020908102919091015182520186600560209081029190910151825201866006602090810291909101518252018660076020908102919091015182520185600060209081029190910151600160a060020a031682520185600160209081029190910151600160a060020a031682520185600260209081029190910151600160a060020a031682520185600360209081029190910151600160a060020a031682520185600460209081029190910151600160a060020a031682520185600560209081029190910151600160a060020a0316825201308660006020020151886000602002015188600160200201518a600160200201518b600260200201518b600260209081029190910151604080516c01000000000000000000000000600160a060020a039a8b1681028252988a1689026014820152602881019790975294881687026048870152605c860193909352607c8501919091529416909202609c82015290519081900360b0019020825201308660036020020151886003602002015188600460200201518a600460200201518b600560200201518b60056020020151604080516c01000000000000000000000000600160a060020a03998a168102825297891688026014820152602881019690965293871686026048860152605c850192909252607c8401528416909202609c82015281519081900360b00190209092526101408301516101c0840151835160008051602061346e8339815191528152601c810191909152925192839003603c019092209294501690600190896000602002015189600060200201518a6001602090810291909101516040805160008082528185018084529790975260ff9095168582015260608501939093526080840152905160a0808401949293601f19830193908390039091019190865af11580156126de573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561273f576101e08201516101c083015160015b60ff167f14301341d034ec3c62a1eabc804a79abf3b8c16e6245e82ec572346aa452fabb60405160405180910390a460009250612fde565b6101a08201516101e08301516040805160008051602061346e8339815191528152601c810192909252805191829003603c01822060208b8101518b8401516060808e015160008089528589018089529690965260ff9093168787015286015260808501529151600160a060020a039094169360019360a08082019493601f19840193928390039091019190865af11580156127de573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561280b576101e08201516101c08301516001612707565b816101800151600160a060020a0316826101000151600160a060020a03161415806128525750816101600151600160a060020a0316826101200151600160a060020a031614155b1561286a576101e08201516101c08301516002612707565b67016345785d8a00008260c001511115612891576101e08201516101c08301516004612707565b60e08201511580156128eb575081608001516128b98360600151670de0b6b3a7640000612124565b8115156128c257fe5b0482600001516128de8460200151670de0b6b3a7640000612124565b8115156128e757fe5b0410155b8061294d575060008260e0015111801561294d5750816060015161291b8360800151670de0b6b3a7640000612124565b81151561292457fe5b0482602001516129408460000151670de0b6b3a7640000612124565b81151561294957fe5b0411155b1515612966576101e08201516101c08301516000612707565b608060405190810160405280600081526020016000815260200160008152602001600081525090508160e0015160001415612d995781516101c0830151600090815260066020526040902054612a02916129bf91611e4f565b60808401805160608601516101e087015160009081526006602052604090205492516129fd936129ee91612124565b8115156129f757fe5b04611e4f565b613370565b8082521515612a1e576101e08201516101c08301516003612707565b815181516020840151612a319190612124565b811515612a3a57fe5b0460208201528051600e54612a5f9190670de0b6b3a7640000906129ee908390612124565b60408201526101008201516009548251600e54612aa49392600160a060020a031691670de0b6b3a764000091612a959190612124565b811515612a9e57fe5b046132b5565b612ae3612ac88260200151670de0b6b3a76400006129ee8560200151600f54612124565b670de0b6b3a76400006129ee84602001518660c00151612124565b60608201526101608201516009546020830151600f54612b589392600160a060020a031691612b5391670de0b6b3a764000091612b1f91612124565b811515612b2857fe5b04670de0b6b3a7640000612b4487602001518960c00151612124565b811515612b4d57fe5b04613050565b6132b5565b612b71826101200151836101400151836020015161327c565b612b8a82610100015183610140015183604001516132b5565b612ba3826101800151836101a00151836000015161327c565b612bbc826101600151836101a0015183606001516132b5565b6101c08201516000908152600660205260409020548151612bdd9190613050565b6101c0830151600090815260066020526040808220929092556101e084015181522054608083015182516060850151612c1b939291612b4491612124565b60066000846101e0015160001916600019168152602001908152602001600020819055504360056000846101400151600160a060020a0316600160a060020a03168152602001908152602001600020819055504360056000846101a00151600160a060020a0316600160a060020a0316815260200190815260200160002081905550816101e0015160001916826101c0015160001916836101a00151600160a060020a03167f710a89c2739b2b7124e035c0dfff8b26a1de0ef61edf2851d794b32df317655985610160015185600001518761018001518760200151896101400151600e54600f548b604001518c60600151604051808a600160a060020a0316600160a060020a0316815260200189815260200188600160a060020a0316600160a060020a0316815260200187815260200186600160a060020a0316600160a060020a03168152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390a480519250612fde565b6020808301805184516101c0860151600090815260069094526040909320549151612df293612dce9390916129ee9190612124565b60608401516101e08501516000908152600660205260409020546129fd9190611e4f565b8082521515612e0e576101e08201516101c08301516003612707565b602082015181518351612e219190612124565b811515612e2a57fe5b0460208201819052600e54612e4f9190670de0b6b3a7640000906129ee908390612124565b60408201526101008201516009546020830151600e54612e889392600160a060020a031691670de0b6b3a764000091612a959190612124565b612ec7612eac8260000151670de0b6b3a76400006129ee8560000151600f54612124565b670de0b6b3a76400006129ee84600001518660c00151612124565b60608201526101608201516009548251600f54612f259392600160a060020a031691612b5391670de0b6b3a764000091612f0091612124565b811515612f0957fe5b04670de0b6b3a7640000612b4487600001518960c00151612124565b612f3e826101200151836101400151836000015161327c565b612f5782610100015183610140015183604001516132b5565b612f70826101800151836101a00151836020015161327c565b612f89826101600151836101a0015183606001516132b5565b6101c082015160009081526006602090815260409091205490820151612faf9190613050565b6101c0830151600090815260066020526040808220929092556101e0840151815220548151612c1b9190613050565b5050949350505050565b6000805461300090600160a060020a03163314610e86565b620f424082111561301057600080fd5b600c8290556040805183815290517f19ead489622e1c2974a8b824d87f439caa95e609c9ec1beff8e3641b546781d39181900360200190a1506001919050565b6000828201612148848210801590612143575083821015610e86565b60036020526000908152604090205481565b600c5481565b60008161309184336113fa565b101561309c57600080fd5b6130a783338461327c565b600160a060020a03831615156130e357604051339083156108fc029084906000818181858888f1935050505015156130de57600080fd5b613182565b604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051600160a060020a0385169163a9059cbb9160448083019260209291908290030181600087803b15801561314b57600080fd5b505af115801561315f573d6000803e3d6000fd5b505050506040513d602081101561317557600080fd5b5051151561318257600080fd5b33600160a060020a0384167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f846131b987856131f0565b604080519283526020830191909152600082820152519081900360600190a392915050565b60066020526000908152604090205481565b60006131fc83836120c0565b60006120b4565b600760209081526000928352604080842090915290825290205460ff1681565b600e5481565b600b54600160a060020a031681565b600160a060020a0393841660009081526004602090815260408083209590961682529390935292909120700100000000000000000000000000000000909202179055565b8061328784846113fa565b101561329257600080fd5b6132af83836132aa6132a487876131f0565b85611e4f565b613321565b50505050565b6132af83836132aa6132c787876131f0565b85613050565b60006132d984846131f0565b600160a060020a039485166000908152600460209081526040808320969097168252949094529390922070010000000000000000000000000000000090910290921790915550565b600081608061333086866120a5565b600160a060020a038088166000908152600460209081526040808320938a1683529290522060029290920a02919091179081905560019150509392505050565b600081831061337f5781611418565b5090919050565b6080604051908101604052806004906020820280388339509192915050565b60408051808201825290600290829080388339509192915050565b6040805161020081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081019190915290565b608060405190810160405280600081526020016000815260200160008152602001600081525090560019457468657265756d205369676e6564204d6573736167653a0a333200000000dcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7a165627a7a72305820cb1c3dc490c6a6ea119cd0477e7024bb62462b62300e7b16a5d4573051b5bbea002900000000000000000000000095445852148540acb6fcb9e39856d15f1c416381000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000001f4
Deployed Bytecode
0x6080604052600436106102715763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166302ce8c4d81146102835780630674763c146102b85780630b78f9c0146102d457806313af4035146102ef5780631e452a901461031057806320a0851f1461033d5780632295115b14610363578063254dcfe2146103a05780632a7575ee146103d35780632b197ef3146103fa57806337fd5940146104215780633823d66c146104525780633aa9f9911461046a578063429b62e51461049457806343f0179b146104b55780634b0bddd2146104ca5780634e5978e1146104f05780635278366a1461051d578063600f30c31461054a57806365e17c9d1461057e5780636a523c5e146105935780637869a950146105a757806378f767791461078b5780637b68be8114610961578063893d20e814610a135780638da5cb5b14610a2857806392c6061114610a3d5780639dbe267014610aa2578063a293d1e814610ac3578063a7a278b114610ade578063a874fe2f14610af3578063a99463bc14610b20578063ad895d7e14610b41578063b5c9cbbe14610b6e578063c23f001f14610b98578063c719e57f14610bbf578063cbc3ab5314610bfd578063ce4ff5e914610c24578063d05c78da14610c4b578063d0e30db014610c66578063d150126314610c6e578063d305785914610ca1578063dd93c74a14610d54578063e6cb901314610d6c578063e8689bb814610d87578063f31174ee14610da8578063f3fef3a314610dbd578063f7213db614610de1578063f7888aec14610df9578063fc5ef05714610e20578063fc741c7c14610e47578063fe05377214610e5c575b34801561027d57600080fd5b50600080fd5b34801561028f57600080fd5b506102a4600160a060020a0360043516610e71565b604080519115158252519081900360200190f35b3480156102c457600080fd5b506102d26004351515610e86565b005b3480156102e057600080fd5b506102d2600435602435610e95565b3480156102fb57600080fd5b506102d2600160a060020a0360043516610f0e565b34801561031c57600080fd5b506102a4600160a060020a0360043581169060243516604435606435610f8d565b34801561034957600080fd5b506102d2600160a060020a03600435166024351515610ffa565b34801561036f57600080fd5b506102a4600160a060020a03600435811690602435906044351660643560ff6084351660a43560c43560e4356110bd565b3480156103ac57600080fd5b506103c1600160a060020a03600435166113e8565b60408051918252519081900360200190f35b3480156103df57600080fd5b506103c1600160a060020a03600435811690602435166113fa565b34801561040657600080fd5b506102a4600160a060020a0360043581169060243516611421565b34801561042d57600080fd5b506104366114be565b60408051600160a060020a039092168252519081900360200190f35b34801561045e57600080fd5b506102a46004356114cd565b34801561047657600080fd5b506102a4600160a060020a03600435811690602435166044356114e2565b3480156104a057600080fd5b506102a4600160a060020a036004351661152a565b3480156104c157600080fd5b506103c161153f565b3480156104d657600080fd5b506102d2600160a060020a03600435166024351515611545565b3480156104fc57600080fd5b506102a4600160a060020a0360043581169060243516604435606435611587565b34801561052957600080fd5b506102a4600160a060020a03600435811690602435166044356064356115db565b34801561055657600080fd5b506102d2600160a060020a036004358116906001608060020a03602435169060443516611622565b34801561058a57600080fd5b50610436611785565b6102d2600160a060020a0360043516611794565b3480156105b357600080fd5b50604080516020600480358082013583810280860185019096528085526102d295369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975061182b9650505050505050565b34801561079757600080fd5b506040805160048035808201356020818102850181019095528084526102d2943694602493909290840191819060009085015b828210156108035760408051808201825290808402870190600290839083908082843750505091835250506001909101906020016107ca565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b82821015610872576040805160808181019092529080840287019060049083908390808284375050509183525050600190910190602001610836565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b828210156108e2576040805161010081810190925290808402870190600890839083908082843750505091835250506001909101906020016108a5565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b82821015610951576040805160c08181019092529080840287019060069083908390808284375050509183525050600190910190602001610915565b5093965061194a95505050505050565b34801561096d57600080fd5b506040805180820182526102d29136916004916044919083906002908390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750506040805160a0818101909252949796958181019594509250600591508390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750939650611a0595505050505050565b348015610a1f57600080fd5b50610436611d48565b348015610a3457600080fd5b50610436611d57565b348015610a4957600080fd5b50610a6a600160a060020a0360043581169060243581169060443516611d66565b6040518082608080838360005b83811015610a8f578181015183820152602001610a77565b5050505090500191505060405180910390f35b348015610aae57600080fd5b506102d2600160a060020a0360043516611dbb565b348015610acf57600080fd5b506103c1600435602435611e4f565b348015610aea57600080fd5b506103c1611e63565b348015610aff57600080fd5b506102a4600160a060020a0360043581169060243516604435606435611e69565b348015610b2c57600080fd5b506103c1600160a060020a0360043516611eb0565b348015610b4d57600080fd5b506102d2600160a060020a03600435166001608060020a0360243516611ec2565b348015610b7a57600080fd5b506102a4600160a060020a0360043581169060243516604435612008565b348015610ba457600080fd5b506103c1600160a060020a0360043581169060243516612053565b348015610bcb57600080fd5b50610be6600160a060020a0360043581169060243516612070565b604080518251815290819083908083836020610a77565b348015610c0957600080fd5b506103c1600160a060020a03600435811690602435166120a5565b348015610c3057600080fd5b50610be6600160a060020a03600435811690602435166120c0565b348015610c5757600080fd5b506103c1600435602435612124565b6102d261214f565b348015610c7a57600080fd5b506102d2600160a060020a036004358116906024351660ff604435166064356084356121ca565b348015610cad57600080fd5b506040805180820182526103c19136916004916044919083906002908390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750506040805161010081810190925294979695818101959450925060089150839083908082843750506040805160c08181019092529497969581810195945092506006915083908390808284375093965061239895505050505050565b348015610d6057600080fd5b506102a4600435612fe8565b348015610d7857600080fd5b506103c1600435602435613050565b348015610d9357600080fd5b506103c1600160a060020a036004351661306c565b348015610db457600080fd5b506103c161307e565b348015610dc957600080fd5b506102a4600160a060020a0360043516602435613084565b348015610ded57600080fd5b506103c16004356131de565b348015610e0557600080fd5b506103c1600160a060020a03600435811690602435166131f0565b348015610e2c57600080fd5b506102a4600160a060020a0360043581169060243516613203565b348015610e5357600080fd5b506103c1613223565b348015610e6857600080fd5b50610436613229565b60026020526000908152604090205460ff1681565b801515610e9257600080fd5b50565b600054610eac90600160a060020a03163314610e86565b662386f26fc1000082108015610ec85750662386f26fc1000081105b1515610ed357600080fd5b600e829055600f819055604051819083907fa995ac7c2dc5fdc05b41983e69d4d9fbd224a8528bc7d86eabfd533cd3ca449790600090a35050565b600054610f2590600160a060020a03163314610e86565b60008054604051600160a060020a03808516939216917fcbf985117192c8f614a58aaf97226bb80a754772f5f6edf06f87c675f2e6c66391a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b3360009081526002602052604081205460ff161515610fab57600080fd5b600b54600160a060020a03163314610fc257600080fd5b610ff28585610fda610fd489896131f0565b87611e4f565b610fed610fe78a8a6120a5565b87613050565b613238565b949350505050565b60005461101190600160a060020a03163314610e86565b600b54600160a060020a0316151561104c57600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384161790555b600160a060020a0382166000818152600260209081526040808320805460ff1916861515908117909155600383529281902043905580519384529083019190915280517fd52650aadc7286c5cbc5259bdddd3d967821bd6bfd78babe1d68ba30a04743679281900390910190a15050565b600080548190600160a060020a031633148015906110eb57503360009081526001602052604090205460ff16155b156110f557600080fd5b50604080516c010000000000000000000000003081028252600160a060020a03808d1682026014840152602883018c90528a16026048820152605c8101889052815190819003607c0190206000818152600d602052919091205460ff161561115c57600080fd5b6000818152600d60209081526040808320805460ff19166001908117909155815160008051602061346e8339815191528152601c8101869052825190819003603c0181208582528185018085525260ff8b1681840152606081018a9052608081018990529151600160a060020a038d1694919360a0808501949193601f19840193928390039091019190865af11580156111fa573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561121957600080fd5b66b1a2bc2ec500008311156112335766b1a2bc2ec5000092505b8861123e8b8a6113fa565b101561124957600080fd5b6112548a898b61327c565b6112606000898561327c565b60095461127990600090600160a060020a0316856132b5565b600160a060020a038a1615156112be57604051600160a060020a038916908a156108fc02908b906000818181858888f1935050505015156112b957600080fd5b611371565b89600160a060020a031663a9059cbb898b6040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561133a57600080fd5b505af115801561134e573d6000803e3d6000fd5b505050506040513d602081101561136457600080fd5b5051151561137157600080fd5b600160a060020a038089166000818152600560205260409020439055908b167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8b6113bc8e8d6131f0565b604080519283526020830191909152818101889052519081900360600190a35098975050505050505050565b60056020526000908152604090205481565b600061141861140984846131f0565b61141385856120a5565b611e4f565b90505b92915050565b600b54600090600160a060020a03848116911614156114425750600161141b565b600160a060020a0380831660009081526007602090815260408083209387168352929052205460ff1615156001141561147d5750600161141b565b600160a060020a038083166000908152600860209081526040808320549387168352600390915290205410156114b55750600161141b565b50600092915050565b600a54600160a060020a031681565b600d6020526000908152604090205460ff1681565b3360009081526002602052604081205460ff16151561150057600080fd5b61150a3384611421565b151561151557600080fd5b6115208484846132cd565b5060019392505050565b60016020526000908152604090205460ff1681565b600f5481565b60005461155c90600160a060020a03163314610e86565b600160a060020a03919091166000908152600160205260409020805460ff1916911515919091179055565b3360009081526002602052604081205460ff1615156115a557600080fd5b600b54600160a060020a031633146115bc57600080fd5b610ff285856115ce610fd489896131f0565b610fed610fd48a8a6120a5565b3360009081526002602052604081205460ff1615156115f957600080fd5b600b54600160a060020a0316331461161057600080fd5b610ff285856115ce610fe789896131f0565b6116368382846001608060020a03166132b5565b600160a060020a038116600090815260086020526040902054151561167157600160a060020a03811660009081526008602052604090204390555b600160a060020a03808216600090815260056020908152604080832043905580517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526001608060020a03871660448201529051938716936323b872dd93606480840194938390030190829087803b1580156116f957600080fd5b505af115801561170d573d6000803e3d6000fd5b505050506040513d602081101561172357600080fd5b5051151561173057600080fd5b80600160a060020a031683600160a060020a031660008051602061348e8339815191528461175e87866131f0565b604080516001608060020a03909316835260208301919091528051918290030190a3505050565b600954600160a060020a031681565b6117a0600082346132b5565b600160a060020a03811660009081526008602052604090205415156117db57600160a060020a03811660009081526008602052604090204390555b600160a060020a038116600081815260056020526040812043905560008051602061348e8339815191523461181083866131f0565b6040805192835260208301919091528051918290030190a350565b60008054600160a060020a0316331480159061185757503360009081526001602052604090205460ff16155b1561186157600080fd5b5060005b875181101561193f57611936898281518110151561187f57fe5b90602001906020020151898381518110151561189757fe5b9060200190602002015189848151811015156118af57fe5b9060200190602002015189858151811015156118c757fe5b9060200190602002015189868151811015156118df57fe5b9060200190602002015189878151811015156118f757fe5b90602001906020020151898881518110151561190f57fe5b90602001906020020151898981518110151561192757fe5b906020019060200201516110bd565b50600101611865565b505050505050505050565b60008054600160a060020a0316331480159061197657503360009081526001602052604090205460ff16155b1561198057600080fd5b5060005b81518110156119fe576119f5858281518110151561199e57fe5b9060200190602002015185838151811015156119b657fe5b9060200190602002015185848151811015156119ce57fe5b9060200190602002015185858151811015156119e657fe5b90602001906020020151612398565b50600101611984565b5050505050565b600080548190600160a060020a03163314801590611a3357503360009081526001602052604090205460ff16155b15611a3d57600080fd5b82518451602080860151818801516040808a0151818a0180518351306c010000000000000000000000009081028252600160a060020a039a8b1681026014830152602882019990995295891688026048870152605c860194909452607c850191909152918616909402609c83015283519182900360b0018220905160008051602061346e8339815191528352601c8301829052845192839003603c0183208c518c518d8701516000808852878901808b529490945260ff909216868901526060860152608085015294519197509094169360019360a08084019493601f198401939081900390910191865af1158015611b3a573d6000803e3d6000fd5b50505060206040510351600160a060020a0316141515611b5957600080fd5b50606082810180518583015160408051306c01000000000000000000000000908102825260148201889052600160a060020a0394851602603482015260488101929092528051918290036068018220935160008051602061346e8339815191528352601c8301859052815192839003603c01832060208c8101518c8501518d8a015160008089528489018089529590955260ff909216878701529886019890985260808501979097529151949593169360019360a0808501949193601f19840193928390039091019190865af1158015611c37573d6000803e3d6000fd5b50505060206040510351600160a060020a0316141515611c5657600080fd5b60608301516040840151600160a060020a03908116911614611c7757600080fd5b83516000838152600660205260409020541415611c9357600080fd5b608084015166b1a2bc2ec500001015611cb45766b1a2bc2ec5000060808501525b60608301516080850151611cca9160009161327c565b835160008381526006602090815260409182902092909255606080860151868401518489015160808a01518551600160a060020a03938416815296870191909152858501529251921692859285927fd23bed568a5bf25c3577535afb4d173c4a6942e92812c0d105d94115d2beab72928290030190a4505050505050565b600054600160a060020a031690565b600054600160a060020a031681565b611d6e613386565b608060405190810160405280611d8486866131f0565b8152602001611d9386856131f0565b8152602001611da286866120a5565b8152602001611db186856120a5565b9052949350505050565b600160a060020a03811660009081526002602052604090205460ff161515611de257600080fd5b336000818152600760209081526040808320600160a060020a03861680855290835292819020805460ff1916600117905580519283529082019290925281517fd931e2079515b12dd08696feda19ddc7949c89cf653c724221d0482bc986d2bb929181900390910190a150565b6000611e5d83831115610e86565b50900390565b600c5490565b3360009081526002602052604081205460ff161515611e8757600080fd5b600b54600160a060020a03163314611e9e57600080fd5b610ff28585610fda610fe789896131f0565b60086020526000908152604090205481565b611ed68233836001608060020a03166132b5565b336000908152600860205260409020541515611eff573360009081526008602052604090204390555b33600081815260056020908152604080832043905580517f23b872dd00000000000000000000000000000000000000000000000000000000815260048101949094523060248501526001608060020a038516604485015251600160a060020a038616936323b872dd9360648083019493928390030190829087803b158015611f8657600080fd5b505af1158015611f9a573d6000803e3d6000fd5b505050506040513d6020811015611fb057600080fd5b50511515611fbd57600080fd5b33600160a060020a03831660008051602061348e83398151915283611fe286856131f0565b604080516001608060020a03909316835260208301919091528051918290030190a35050565b3360009081526002602052604081205460ff16151561202657600080fd5b600b54600160a060020a0316331461203d57600080fd5b612048848484613321565b506001949350505050565b600460209081526000928352604080842090915290825290205481565b6120786133a5565b604080519081016040528061208d85856131f0565b815260200161209c85856120a5565b90529392505050565b60006120b183836120c0565b60015b60200201519392505050565b6120c86133a5565b50600160a060020a0391821660009081526004602090815260408083209390941682529182528290205482518084019093526001608060020a038082168452700100000000000000000000000000000000909104169082015290565b6000828202612148841580612143575083858381151561214057fe5b04145b610e86565b9392505050565b61215b600033346132b5565b336000908152600860205260409020541515612184573360009081526008602052604090204390555b33600081815260056020526040812043905560008051602061348e833981519152346121b083856131f0565b6040805192835260208301919091528051918290030190a3565b60008054600160a060020a031633148015906121f657503360009081526001602052604090205460ff16155b1561220057600080fd5b600160a060020a03861660009081526002602052604090205460ff16151561222757600080fd5b50604080516c0100000000000000000000000030810282527f616c6c6f770000000000000000000000000000000000000000000000000000006014830152600160a060020a03808916820260198401528716908102602d830152825191829003604101822060008051602061346e8339815191528352601c8301819052835192839003603c018320600080855260208581018088529290925260ff891685870152606085018890526080850187905294519194929360019360a080830194601f1981019381900390910191865af1158015612306573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561232557600080fd5b600160a060020a038086166000818152600760209081526040808320948b1680845294825291829020805460ff19166001179055815193845283019190915280517fd931e2079515b12dd08696feda19ddc7949c89cf653c724221d0482bc986d2bb9281900390910190a1505050505050565b60006123a26133c0565b6123aa613444565b600054600160a060020a031633148015906123d557503360009081526001602052604090205460ff16155b156123df57600080fd5b60408051610200810190915280866000602090810291909101518252018660016020908102919091015182520186600260209081029190910151825201866003602090810291909101518252018660046020908102919091015182520186600560209081029190910151825201866006602090810291909101518252018660076020908102919091015182520185600060209081029190910151600160a060020a031682520185600160209081029190910151600160a060020a031682520185600260209081029190910151600160a060020a031682520185600360209081029190910151600160a060020a031682520185600460209081029190910151600160a060020a031682520185600560209081029190910151600160a060020a0316825201308660006020020151886000602002015188600160200201518a600160200201518b600260200201518b600260209081029190910151604080516c01000000000000000000000000600160a060020a039a8b1681028252988a1689026014820152602881019790975294881687026048870152605c860193909352607c8501919091529416909202609c82015290519081900360b0019020825201308660036020020151886003602002015188600460200201518a600460200201518b600560200201518b60056020020151604080516c01000000000000000000000000600160a060020a03998a168102825297891688026014820152602881019690965293871686026048860152605c850192909252607c8401528416909202609c82015281519081900360b00190209092526101408301516101c0840151835160008051602061346e8339815191528152601c810191909152925192839003603c019092209294501690600190896000602002015189600060200201518a6001602090810291909101516040805160008082528185018084529790975260ff9095168582015260608501939093526080840152905160a0808401949293601f19830193908390039091019190865af11580156126de573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561273f576101e08201516101c083015160015b60ff167f14301341d034ec3c62a1eabc804a79abf3b8c16e6245e82ec572346aa452fabb60405160405180910390a460009250612fde565b6101a08201516101e08301516040805160008051602061346e8339815191528152601c810192909252805191829003603c01822060208b8101518b8401516060808e015160008089528589018089529690965260ff9093168787015286015260808501529151600160a060020a039094169360019360a08082019493601f19840193928390039091019190865af11580156127de573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561280b576101e08201516101c08301516001612707565b816101800151600160a060020a0316826101000151600160a060020a03161415806128525750816101600151600160a060020a0316826101200151600160a060020a031614155b1561286a576101e08201516101c08301516002612707565b67016345785d8a00008260c001511115612891576101e08201516101c08301516004612707565b60e08201511580156128eb575081608001516128b98360600151670de0b6b3a7640000612124565b8115156128c257fe5b0482600001516128de8460200151670de0b6b3a7640000612124565b8115156128e757fe5b0410155b8061294d575060008260e0015111801561294d5750816060015161291b8360800151670de0b6b3a7640000612124565b81151561292457fe5b0482602001516129408460000151670de0b6b3a7640000612124565b81151561294957fe5b0411155b1515612966576101e08201516101c08301516000612707565b608060405190810160405280600081526020016000815260200160008152602001600081525090508160e0015160001415612d995781516101c0830151600090815260066020526040902054612a02916129bf91611e4f565b60808401805160608601516101e087015160009081526006602052604090205492516129fd936129ee91612124565b8115156129f757fe5b04611e4f565b613370565b8082521515612a1e576101e08201516101c08301516003612707565b815181516020840151612a319190612124565b811515612a3a57fe5b0460208201528051600e54612a5f9190670de0b6b3a7640000906129ee908390612124565b60408201526101008201516009548251600e54612aa49392600160a060020a031691670de0b6b3a764000091612a959190612124565b811515612a9e57fe5b046132b5565b612ae3612ac88260200151670de0b6b3a76400006129ee8560200151600f54612124565b670de0b6b3a76400006129ee84602001518660c00151612124565b60608201526101608201516009546020830151600f54612b589392600160a060020a031691612b5391670de0b6b3a764000091612b1f91612124565b811515612b2857fe5b04670de0b6b3a7640000612b4487602001518960c00151612124565b811515612b4d57fe5b04613050565b6132b5565b612b71826101200151836101400151836020015161327c565b612b8a82610100015183610140015183604001516132b5565b612ba3826101800151836101a00151836000015161327c565b612bbc826101600151836101a0015183606001516132b5565b6101c08201516000908152600660205260409020548151612bdd9190613050565b6101c0830151600090815260066020526040808220929092556101e084015181522054608083015182516060850151612c1b939291612b4491612124565b60066000846101e0015160001916600019168152602001908152602001600020819055504360056000846101400151600160a060020a0316600160a060020a03168152602001908152602001600020819055504360056000846101a00151600160a060020a0316600160a060020a0316815260200190815260200160002081905550816101e0015160001916826101c0015160001916836101a00151600160a060020a03167f710a89c2739b2b7124e035c0dfff8b26a1de0ef61edf2851d794b32df317655985610160015185600001518761018001518760200151896101400151600e54600f548b604001518c60600151604051808a600160a060020a0316600160a060020a0316815260200189815260200188600160a060020a0316600160a060020a0316815260200187815260200186600160a060020a0316600160a060020a03168152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390a480519250612fde565b6020808301805184516101c0860151600090815260069094526040909320549151612df293612dce9390916129ee9190612124565b60608401516101e08501516000908152600660205260409020546129fd9190611e4f565b8082521515612e0e576101e08201516101c08301516003612707565b602082015181518351612e219190612124565b811515612e2a57fe5b0460208201819052600e54612e4f9190670de0b6b3a7640000906129ee908390612124565b60408201526101008201516009546020830151600e54612e889392600160a060020a031691670de0b6b3a764000091612a959190612124565b612ec7612eac8260000151670de0b6b3a76400006129ee8560000151600f54612124565b670de0b6b3a76400006129ee84600001518660c00151612124565b60608201526101608201516009548251600f54612f259392600160a060020a031691612b5391670de0b6b3a764000091612f0091612124565b811515612f0957fe5b04670de0b6b3a7640000612b4487600001518960c00151612124565b612f3e826101200151836101400151836000015161327c565b612f5782610100015183610140015183604001516132b5565b612f70826101800151836101a00151836020015161327c565b612f89826101600151836101a0015183606001516132b5565b6101c082015160009081526006602090815260409091205490820151612faf9190613050565b6101c0830151600090815260066020526040808220929092556101e0840151815220548151612c1b9190613050565b5050949350505050565b6000805461300090600160a060020a03163314610e86565b620f424082111561301057600080fd5b600c8290556040805183815290517f19ead489622e1c2974a8b824d87f439caa95e609c9ec1beff8e3641b546781d39181900360200190a1506001919050565b6000828201612148848210801590612143575083821015610e86565b60036020526000908152604090205481565b600c5481565b60008161309184336113fa565b101561309c57600080fd5b6130a783338461327c565b600160a060020a03831615156130e357604051339083156108fc029084906000818181858888f1935050505015156130de57600080fd5b613182565b604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051600160a060020a0385169163a9059cbb9160448083019260209291908290030181600087803b15801561314b57600080fd5b505af115801561315f573d6000803e3d6000fd5b505050506040513d602081101561317557600080fd5b5051151561318257600080fd5b33600160a060020a0384167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f846131b987856131f0565b604080519283526020830191909152600082820152519081900360600190a392915050565b60066020526000908152604090205481565b60006131fc83836120c0565b60006120b4565b600760209081526000928352604080842090915290825290205460ff1681565b600e5481565b600b54600160a060020a031681565b600160a060020a0393841660009081526004602090815260408083209590961682529390935292909120700100000000000000000000000000000000909202179055565b8061328784846113fa565b101561329257600080fd5b6132af83836132aa6132a487876131f0565b85611e4f565b613321565b50505050565b6132af83836132aa6132c787876131f0565b85613050565b60006132d984846131f0565b600160a060020a039485166000908152600460209081526040808320969097168252949094529390922070010000000000000000000000000000000090910290921790915550565b600081608061333086866120a5565b600160a060020a038088166000908152600460209081526040808320938a1683529290522060029290920a02919091179081905560019150509392505050565b600081831061337f5781611418565b5090919050565b6080604051908101604052806004906020820280388339509192915050565b60408051808201825290600290829080388339509192915050565b6040805161020081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081019190915290565b608060405190810160405280600081526020016000815260200160008152602001600081525090560019457468657265756d205369676e6564204d6573736167653a0a333200000000dcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7a165627a7a72305820cb1c3dc490c6a6ea119cd0477e7024bb62462b62300e7b16a5d4573051b5bbea0029
Deployed Bytecode Sourcemap
774:39920:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;774:39920:0;3512:5;;;1606:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1606:49:0;-1:-1:-1;;;;;1606:49:0;;;;;;;;;;;;;;;;;;;;;;;799:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;799:72:0;;;;;;;;;7945:289;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7945:289:0;;;;;;;2265:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2265:117:0;-1:-1:-1;;;;;2265:117:0;;;;;10841:340;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10841:340:0;-1:-1:-1;;;;;10841:340:0;;;;;;;;;;;;;;2703:436;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2703:436:0;-1:-1:-1;;;;;2703:436:0;;;;;;;;;18062:2466;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18062:2466:0;-1:-1:-1;;;;;18062:2466:0;;;;;;;;;;;;;;;;;;;;;;;;;4027:57;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4027:57:0;-1:-1:-1;;;;;4027:57:0;;;;;;;;;;;;;;;;;;;;;12311:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12311:162:0;-1:-1:-1;;;;;12311:162:0;;;;;;;;;;9345:374;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9345:374:0;-1:-1:-1;;;;;9345:374:0;;;;;;;;;;4591:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4591:30:0;;;;;;;;-1:-1:-1;;;;;4591:30:0;;;;;;;;;;;;;;4868:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4868:42:0;;;;;10325:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10325:248:0;-1:-1:-1;;;;;10325:248:0;;;;;;;;;;;;1530:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1530:39:0;-1:-1:-1;;;;;1530:39:0;;;;;5108:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5108:23:0;;;;2543:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2543:99:0;-1:-1:-1;;;;;2543:99:0;;;;;;;;;11885:340;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11885:340:0;-1:-1:-1;;;;;11885:340:0;;;;;;;;;;;;;;11189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11189:340:0;-1:-1:-1;;;;;11189:340:0;;;;;;;;;;;;;;15336:836;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15336:836:0;-1:-1:-1;;;;;15336:836:0;;;;;-1:-1:-1;;;;;15336:836:0;;;;;;;;;4513:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4513:25:0;;;;13804:579;;-1:-1:-1;;;;;13804:579:0;;;;;20536:861;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;-1:-1:-1;;;;;;;20536:861:0;37909:399;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37909:399:0;;;-1:-1:-1;;37909:399:0;;;;;;;;;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37909:399:0;;;-1:-1:-1;37909:399:0;-1:-1:-1;37909:399:0;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37909:399:0;;;-1:-1:-1;;37909:399:0;;;;;;;;;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37909:399:0;;;-1:-1:-1;37909:399:0;-1:-1:-1;37909:399:0;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37909:399:0;;;-1:-1:-1;;37909:399:0;;;;;;;;;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37909:399:0;;;-1:-1:-1;37909:399:0;-1:-1:-1;37909:399:0;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37909:399:0;;;-1:-1:-1;;37909:399:0;;;;;;;;;;-1:-1:-1;37909:399:0;;-1:-1:-1;37909:399:0;;-1:-1:-1;;;;;;37909:399:0;38384:2161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38384:2161:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38384:2161:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;38384:2161:0;-1:-1:-1;38384:2161:0;;-1:-1:-1;38384:2161:0;;;;;;;;-1:-1:-1;;38384:2161:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;38384:2161:0;-1:-1:-1;38384:2161:0;;-1:-1:-1;38384:2161:0;;;;;;;;-1:-1:-1;;38384:2161:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;38384:2161:0;-1:-1:-1;38384:2161:0;;-1:-1:-1;38384:2161:0;;;;;;;;-1:-1:-1;38384:2161:0;;-1:-1:-1;38384:2161:0;;-1:-1:-1;;;;;;38384:2161:0;2420:73;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2420:73:0;;;;1460:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1460:20:0;;;;21410:298;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21410:298:0;-1:-1:-1;;;;;21410:298:0;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;21410:298:0;;;;;;;;;;;;;;;;17166:269;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17166:269:0;-1:-1:-1;;;;;17166:269:0;;;;;1149:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1149:104:0;;;;;;;12527:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12527:115:0;;;;11537:340;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11537:340:0;-1:-1:-1;;;;;11537:340:0;;;;;;;;;;;;;;4388:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4388:53:0;-1:-1:-1;;;;;4388:53:0;;;;;14425:858;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14425:858:0;-1:-1:-1;;;;;14425:858:0;;;-1:-1:-1;;;;;14425:858:0;;;;;10581:252;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10581:252:0;-1:-1:-1;;;;;10581:252:0;;;;;;;;;;;;3842:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3842:65:0;-1:-1:-1;;;;;3842:65:0;;;;;;;;;;21716:197;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21716:197:0;-1:-1:-1;;;;;21716:197:0;;;;;;;;;;;;;;84:18:-1;;64:39;;21716:197:0;;;;;;;;52:2:-1;8:100;;10032:187:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10032:187:0;-1:-1:-1;;;;;10032:187:0;;;;;;;;;;9033:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9033:304:0;-1:-1:-1;;;;;9033:304:0;;;;;;;;;;939:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;939:139:0;;;;;;;13157:596;;;;17443:537;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17443:537:0;-1:-1:-1;;;;;17443:537:0;;;;;;;;;;;;;;;;;;23565:14266;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23565:14266:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23565:14266:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;23565:14266:0;-1:-1:-1;23565:14266:0;;-1:-1:-1;23565:14266:0;;;;;;;;-1:-1:-1;;23565:14266:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;23565:14266:0;-1:-1:-1;23565:14266:0;;-1:-1:-1;23565:14266:0;;;;;;;;-1:-1:-1;;23565:14266:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;23565:14266:0;-1:-1:-1;23565:14266:0;;-1:-1:-1;23565:14266:0;;;;;;;;-1:-1:-1;23565:14266:0;;-1:-1:-1;23565:14266:0;;-1:-1:-1;;;;;;23565:14266:0;7264:251;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7264:251:0;;;;;1321:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1321:131:0;;;;;;;1704:62;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1704:62:0;-1:-1:-1;;;;;1704:62:0;;;;;4757:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4757:38:0;;;;16180:978;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16180:978:0;-1:-1:-1;;;;;16180:978:0;;;;;;;4146:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4146:46:0;;;;;9795:175;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9795:175:0;-1:-1:-1;;;;;9795:175:0;;;;;;;;;;4245:81;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4245:81:0;-1:-1:-1;;;;;4245:81:0;;;;;;;;;;5003:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5003:23:0;;;;4666:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4666:34:0;;;;1606:49;;;;;;;;;;;;;;;:::o;799:72::-;847:9;846:10;842:21;;;858:5;;;842:21;799:72;:::o;7945:289::-;2189:5;;2168:27;;-1:-1:-1;;;;;2189:5:0;2175:10;:19;2168:6;:27::i;:::-;8041:9;8029;:21;:46;;;;;8066:9;8054;:21;8029:46;8021:55;;;;;;;;8128:8;:20;;;8159:8;:20;;;8197:29;;8170:9;;8139;;8197:29;;-1:-1:-1;;8197:29:0;7945:289;;:::o;2265:117::-;2189:5;;2168:27;;-1:-1:-1;;;;;2189:5:0;2175:10;:19;2168:6;:27::i;:::-;2331:5;;;2322:25;;-1:-1:-1;;;;;2322:25:0;;;;2331:5;;;2322:25;;;2358:5;:16;;-1:-1:-1;;2358:16:0;-1:-1:-1;;;;;2358:16:0;;;;;;;;;;2265:117::o;10841:340::-;3435:10;10969:4;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;11009:19;;-1:-1:-1;;;;;11009:19:0;10995:10;:33;10991:44;;11030:5;;;10991:44;11046:127;11070:5;11077:4;11083:43;11091:22;11101:5;11108:4;11091:9;:22::i;:::-;11115:10;11083:7;:43::i;:::-;11128:44;11136:23;11147:5;11154:4;11136:10;:23::i;:::-;11161:10;11128:7;:44::i;:::-;11046:23;:127::i;:::-;10841:340;;;;;;:::o;2703:436::-;2189:5;;2168:27;;-1:-1:-1;;;;;2189:5:0;2175:10;:19;2168:6;:27::i;:::-;2805:19;;-1:-1:-1;;;;;2805:19:0;:33;2801:124;;;2864:19;:37;;-1:-1:-1;;2864:37:0;-1:-1:-1;;;;;2864:37:0;;;;;2801:124;-1:-1:-1;;;;;2937:33:0;;;;;;:16;:33;;;;;;;;:53;;-1:-1:-1;;2937:53:0;;;;;;;;;;3003:26;:43;;;;;;3049:12;3003:58;;3077:54;;;;;;;;;;;;;;;;;;;;;;;;2703:436;;:::o;18062:2466::-;18579:12;3247:5;;18579:12;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;-1:-1:-1;18619:43:0;;;;18629:4;18619:43;;;;-1:-1:-1;;;;;18619:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18724:15:0;;;:9;18619:43;18724:15;;;;;;;;18720:26;;;18741:5;;;18720:26;18832:15;;;;:9;:15;;;;;;;;:22;;-1:-1:-1;;18832:22:0;18850:4;18832:22;;;;;;18914:51;;-1:-1:-1;;;;;;;;;;;18914:51:0;;;;;;;;;;;;;;;;;;18904:71;;;;;;;;;;18832:22;18904:71;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18904:79:0;;;18850:4;;18904:71;;;;;18832:15;;-1:-1:-1;;18904:71:0;;;;;;;;;;;;18850:4;18904:71;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18904:71:0;;;;;;;;-1:-1:-1;;;;;18904:79:0;;;18900:90;;;18985:5;;;18900:90;19068:9;19052:13;:25;19048:56;;;19095:9;19079:25;;19048:56;19303:6;19269:31;19288:5;19295:4;19269:18;:31::i;:::-;:40;19265:51;;;19311:5;;;19265:51;19496:31;19507:5;19514:4;19520:6;19496:10;:31::i;:::-;19738:43;19757:1;19761:4;19767:13;19738:10;:43::i;:::-;20007:10;;19984:49;;20003:1;;-1:-1:-1;;;;;20007:10:0;20019:13;19984:10;:49::i;:::-;-1:-1:-1;;;;;20089:19:0;;;20085:238;;;20178:17;;-1:-1:-1;;;;;20178:9:0;;;:17;;;;;20188:6;;20178:17;;;;20188:6;20178:9;:17;;;;;;;20177:18;20173:29;;;20197:5;;;20173:29;20085:238;;;20259:5;-1:-1:-1;;;;;20253:21:0;;20275:4;20281:6;20253:35;;;;;;;;;;;;;-1:-1:-1;;;;;20253:35:0;-1:-1:-1;;;;;20253:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20253:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20253:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20253:35:0;20252:36;20248:47;;;20290:5;;;20248:47;-1:-1:-1;;;;;20333:27:0;;;;;;;:21;:27;;;;;20363:12;20333:42;;:27;20424:68;;;20446:6;20454:22;20433:5;20355:4;20454:9;:22::i;:::-;20424:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;18062:2466;;;;;;;;;;;:::o;4027:57::-;;;;;;;;;;;;;:::o;12311:162::-;12382:7;12409:56;12417:22;12427:5;12434:4;12417:9;:22::i;:::-;12441:23;12452:5;12459:4;12441:10;:23::i;:::-;12409:7;:56::i;:::-;12402:63;;12311:162;;;;;:::o;9345:374::-;9452:19;;9426:4;;-1:-1:-1;;;;;9452:38:0;;;:19;;:38;9448:55;;;-1:-1:-1;9499:4:0;9492:11;;9448:55;-1:-1:-1;;;;;9518:33:0;;;;;;;:27;:33;;;;;;;;:50;;;;;;;;;;;;:58;;:50;:58;9514:75;;;-1:-1:-1;9585:4:0;9578:11;;9514:75;-1:-1:-1;;;;;9650:23:0;;;;;;;:17;:23;;;;;;;;;9604:43;;;;;:26;:43;;;;;;:69;9600:86;;;-1:-1:-1;9682:4:0;9675:11;;9600:86;-1:-1:-1;9706:5:0;9345:374;;;;:::o;4591:30::-;;;-1:-1:-1;;;;;4591:30:0;;:::o;4868:42::-;;;;;;;;;;;;;;;:::o;10325:248::-;3435:10;10419:12;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;10450;10473:10;10485:4;10450:22;:40::i;:::-;10449:41;10445:52;;;10492:5;;;10445:52;10508:34;10522:5;10529:4;10535:6;10508:13;:34::i;:::-;-1:-1:-1;10560:4:0;10325:248;;;;;:::o;1530:39::-;;;;;;;;;;;;;;;:::o;5108:23::-;;;;:::o;2543:99::-;2189:5;;2168:27;;-1:-1:-1;;;;;2189:5:0;2175:10;:19;2168:6;:27::i;:::-;-1:-1:-1;;;;;2611:13:0;;;;;;;;:6;:13;;;;;:23;;-1:-1:-1;;2611:23:0;;;;;;;;;;2543:99::o;11885:340::-;3435:10;12013:4;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;12053:19;;-1:-1:-1;;;;;12053:19:0;12039:10;:33;12035:44;;12074:5;;;12035:44;12090:127;12114:5;12121:4;12127:43;12135:22;12145:5;12152:4;12135:9;:22::i;12127:43::-;12172:44;12180:23;12191:5;12198:4;12180:10;:23::i;11189:340::-;3435:10;11317:4;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;11357:19;;-1:-1:-1;;;;;11357:19:0;11343:10;:33;11339:44;;11378:5;;;11339:44;11394:127;11418:5;11425:4;11431:43;11439:22;11449:5;11456:4;11439:9;:22::i;15336:836::-;15659:31;15670:5;15677:4;15683:6;-1:-1:-1;;;;;15659:31:0;:10;:31::i;:::-;-1:-1:-1;;;;;15752:23:0;;;;;;:17;:23;;;;;;:28;15748:72;;;-1:-1:-1;;;;;15782:23:0;;;;;;:17;:23;;;;;15808:12;15782:38;;15748:72;-1:-1:-1;;;;;15831:27:0;;;;;;;:21;:27;;;;;;;;15861:12;15831:42;;15934:51;;;;;15960:10;15934:51;;;;15972:4;15934:51;;;;-1:-1:-1;;;;;15934:51:0;;;;;;;;:25;;;;;;:51;;;;;15831:27;15934:51;;;;;;;:25;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;15934:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15934:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15934:51:0;15933:52;15929:63;;;15987:5;;;15929:63;16100:4;-1:-1:-1;;;;;16085:52:0;16093:5;-1:-1:-1;;;;;16085:52:0;-1:-1:-1;;;;;;;;;;;16106:6:0;16114:22;16124:5;16131:4;16114:9;:22::i;:::-;16085:52;;;-1:-1:-1;;;;;16085:52:0;;;;;;;;;;;;;;;;;;;;;15336:836;;;:::o;4513:25::-;;;-1:-1:-1;;;;;4513:25:0;;:::o;13804:579::-;14002:39;14021:1;14025:4;14031:9;14002:10;:39::i;:::-;-1:-1:-1;;;;;14101:23:0;;;;;;:17;:23;;;;;;:28;14097:72;;;-1:-1:-1;;;;;14131:23:0;;;;;;:17;:23;;;;;14157:12;14131:38;;14097:72;-1:-1:-1;;;;;14180:27:0;;;;;;:21;:27;;;;;14210:12;14180:42;;-1:-1:-1;;;;;;;;;;;14309:9:0;14320:27;14180;14202:4;14320:9;:27::i;:::-;14283:65;;;;;;;;;;;;;;;;;;;;;;13804:579;:::o;20536:861::-;21087:6;3247:5;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;-1:-1:-1;21096:1:0;21082:308;21103:6;:13;21099:1;:17;21082:308;;;21138:240;21170:5;21176:1;21170:8;;;;;;;;;;;;;;;;;;21197:6;21204:1;21197:9;;;;;;;;;;;;;;;;;;21225:4;21230:1;21225:7;;;;;;;;;;;;;;;;;;21251:5;21257:1;21251:8;;;;;;;;;;;;;;;;;;21278:1;21280;21278:4;;;;;;;;;;;;;;;;;;21301:1;21303;21301:4;;;;;;;;;;;;;;;;;;21324:1;21326;21324:4;;;;;;;;;;;;;;;;;;21347:13;21361:1;21347:16;;;;;;;;;;;;;;;;;;21138:13;:240::i;:::-;-1:-1:-1;21118:3:0;;21082:308;;;20536:861;;;;;;;;;:::o;37909:399::-;38094:6;3247:5;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;-1:-1:-1;38103:1:0;38089:212;38110:14;:21;38106:1;:25;38089:212;;;38153:136;38177:1;38179;38177:4;;;;;;;;;;;;;;;;;;38200:2;38203:1;38200:5;;;;;;;;;;;;;;;;;;38224:11;38236:1;38224:14;;;;;;;;;;;;;;;;;;38257;38272:1;38257:17;;;;;;;;;;;;;;;;;;38153:5;:136::i;:::-;-1:-1:-1;38133:3:0;;38089:212;;;37909:399;;;;;:::o;38384:2161::-;38916:17;3247:5;;38916:17;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;38963:18;;38983:15;;38963:18;39000;;;;39030:15;;;;39047;;;;;39064:18;;;;;38936:157;;38957:4;38936:157;;;;;;-1:-1:-1;;;;;38936:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39203:18;;-1:-1:-1;;;;;;;;;;;39122:56:0;;;;;;;;;;;;;;;;;;39180:4;;39186:5;;39193;;;;-1:-1:-1;39112:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38936:157;;-1:-1:-1;39112:109:0;;;;39016:1;;39112:87;;;;;38963:18;-1:-1:-1;;39112:87:0;;;;;;;;;;;39016:1;39112:87;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39112:87:0;;;;;;;;-1:-1:-1;;;;;39112:109:0;;39104:118;;;;;;;;-1:-1:-1;39341:18:0;;;;;;39361:15;;;;39314:63;;;39324:4;39314:63;;;;;;;;;;;;-1:-1:-1;;;;;39314:63:0;;;;;;;;;;;;;;;;;;;;;;;;;39488:18;;-1:-1:-1;;;;;;;;;;;39406:57:0;;;;;;;;;;;;;;;;;;39341:18;39465:4;;;;39471:5;;;;39478;;;;-1:-1:-1;39396:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39314:63;;39396:110;;;:88;;;;;;;39341:18;;-1:-1:-1;;39396:88:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39396:88:0;;;;;;;;-1:-1:-1;;;;;39396:110:0;;39388:119;;;;;;;;39615:18;;;;39593;;;;-1:-1:-1;;;;;39593:40:0;;;;;;39585:49;;;;;;39749:15;;39762:1;39724:21;;;:10;39749:15;39724:21;;;;;:40;;39716:49;;;;;;39832:15;;;;39850:9;-1:-1:-1;39828:87:0;;;39894:9;39876:15;;;:27;39828:87;40186:18;;;;40206:15;;;;40163:59;;40182:1;;40163:10;:59::i;:::-;40360:15;;40373:1;40336:21;;;:10;40360:15;40336:21;;;;;;;;:39;;;;40464:18;;;;;40484;;;;40504:15;;;;40521;;;;40429:108;;-1:-1:-1;;;;;40429:108:0;;;;;;;;;;;;;;;;;;;;;40336:21;;40441:10;;40429:108;;;;;;;;38384:2161;;;;;;:::o;2420:73::-;2449:11;2480:5;-1:-1:-1;;;;;2480:5:0;2420:73;:::o;1460:20::-;;;-1:-1:-1;;;;;1460:20:0;;:::o;21410:298::-;21500:10;;:::i;:::-;21528:172;;;;;;;;;21550:23;21560:5;21567;21550:9;:23::i;:::-;21528:172;;;;21588:23;21598:5;21605;21588:9;:23::i;:::-;21528:172;;;;21626:24;21637:5;21644;21626:10;:24::i;:::-;21528:172;;;;21665:24;21676:5;21683;21665:10;:24::i;:::-;21528:172;;;21410:298;-1:-1:-1;;;;21410:298:0:o;17166:269::-;-1:-1:-1;;;;;17246:33:0;;;;;;:16;:33;;;;;;;;17245:34;17241:45;;;17281:5;;;17241:45;17325:10;17297:39;;;;:27;:39;;;;;;;;-1:-1:-1;;;;;17297:56:0;;;;;;;;;;;;:63;;-1:-1:-1;;17297:63:0;17356:4;17297:63;;;17378:49;;;;;;;;;;;;;;;;;;;;;;;;;17166:269;:::o;1149:104::-;1191:4;1208:14;1220:1;1215;:6;;1208;:14::i;:::-;-1:-1:-1;1240:5:0;;;1149:104::o;12527:115::-;12611:23;;12527:115;:::o;11537:340::-;3435:10;11665:4;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;11705:19;;-1:-1:-1;;;;;11705:19:0;11691:10;:33;11687:44;;11726:5;;;11687:44;11742:127;11766:5;11773:4;11779:43;11787:22;11797:5;11804:4;11787:9;:22::i;4388:53::-;;;;;;;;;;;;;:::o;14425:858::-;14734:37;14745:5;14752:10;14764:6;-1:-1:-1;;;;;14734:37:0;:10;:37::i;:::-;14851:10;14833:29;;;;:17;:29;;;;;;:34;14829:84;;;14887:10;14869:29;;;;:17;:29;;;;;14901:12;14869:44;;14829:84;14946:10;14924:33;;;;:21;:33;;;;;;;;14960:12;14924:48;;15033:51;;;;;;;;;;;;15071:4;15033:51;;;;-1:-1:-1;;;;;15033:51:0;;;;;;;-1:-1:-1;;;;;15033:25:0;;;;;:51;;;;;14924:33;15033:51;;;;;;;;:25;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;15033:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15033:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15033:51:0;15032:52;15028:63;;;15086:5;;;15028:63;15199:10;-1:-1:-1;;;;;15184:64:0;;-1:-1:-1;;;;;;;;;;;15211:6:0;15219:28;15192:5;15199:10;15219:9;:28::i;:::-;15184:64;;;-1:-1:-1;;;;;15184:64:0;;;;;;;;;;;;;;;;;;;;;14425:858;;:::o;10581:252::-;3435:10;10675:12;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;10722:19;;-1:-1:-1;;;;;10722:19:0;10708:10;:33;10704:44;;10743:5;;;10704:44;10759:34;10773:5;10780:4;10786:6;10759:13;:34::i;:::-;-1:-1:-1;10811:4:0;;10581:252;-1:-1:-1;;;;10581:252:0:o;3842:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;21716:197::-;21784:10;;:::i;:::-;21812:93;;;;;;;;;21834:22;21844:5;21851:4;21834:9;:22::i;:::-;21812:93;;;;21871:23;21882:5;21889:4;21871:10;:23::i;:::-;21812:93;;;21716:197;-1:-1:-1;;;21716:197:0:o;10032:187::-;10102:7;10172:36;10196:5;10203:4;10172:23;:36::i;:::-;10209:1;10172:39;;;;;;10032:187;-1:-1:-1;;;10032:187:0:o;9033:304::-;9105:10;;:::i;:::-;-1:-1:-1;;;;;;9153:15:0;;;9133:17;9153:15;;;:8;:15;;;;;;;;:21;;;;;;;;;;;;;9304:25;;;;;;;;-1:-1:-1;;;;;9203:27:0;;;9304:25;;9275:14;;;;9259:32;9304:25;;;;;9033:304::o;939:139::-;981:4;1007:5;;;1023:28;1030:6;;;:20;;;1049:1;1044;1040;:5;;;;;;;;:10;1030:20;1023:6;:28::i;:::-;1069:1;939:139;-1:-1:-1;;;939:139:0:o;13157:596::-;13336:45;13355:1;13359:10;13371:9;13336:10;:45::i;:::-;13459:10;13441:29;;;;:17;:29;;;;;;:34;13437:84;;;13495:10;13477:29;;;;:17;:29;;;;;13509:12;13477:44;;13437:84;13554:10;13532:33;;;;:21;:33;;;;;13568:12;13532:48;;-1:-1:-1;;;;;;;;;;;13673:9:0;13684:33;13532;13554:10;13684:9;:33::i;:::-;13641:77;;;;;;;;;;;;;;;;;;;;;;13157:596::o;17443:537::-;17632:12;3247:5;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;-1:-1:-1;;;;;17581:33:0;;;;;;:16;:33;;;;;;;;17580:34;17576:45;;;17616:5;;;17576:45;-1:-1:-1;17647:47:0;;;;17657:4;17647:47;;;;;;;;;-1:-1:-1;;;;;17647:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17720:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;17710:71:0;;;17720:51;17710:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17647:47;;;;17710:71;;;;;;;-1:-1:-1;;17710:71:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17710:71:0;;;;;;;;-1:-1:-1;;;;;17710:79:0;;;17706:90;;;17791:5;;;17706:90;-1:-1:-1;;;;;17854:33:0;;;;;;;:27;:33;;;;;;;;:50;;;;;;;;;;;;;:57;;-1:-1:-1;;17854:57:0;17907:4;17854:57;;;17929:43;;;;;;;;;;;;;;;;;;;;;;;17443:537;;;;;;:::o;23565:14266::-;23720:27;24223:18;;:::i;:::-;27316:21;;:::i;:::-;3247:5;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;24245:1146;;;;;;;;;;24288:11;-1:-1:-1;24288:14:0;;;;;;;;;24245:1146;;;24335:11;24347:1;24335:14;;;;;;;;;24245:1146;;;24382:11;24394:1;24382:14;;;;;;;;;24245:1146;;;24429:11;24441:1;24429:14;;;;;;;;;24245:1146;;;24476:11;24488:1;24476:14;;;;;;;;;24245:1146;;;24523:11;24535:1;24523:14;;;;;;;;;24245:1146;;;24570:11;24582:1;24570:14;;;;;;;;;24245:1146;;;24617:11;24629:1;24617:14;;;;;;;;;24245:1146;;;24666:14;24681:1;24666:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;24716:14;24731:1;24716:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;24766:14;24781:1;24766:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;24816:14;24831:1;24816:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;24866:14;24881:1;24866:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;24916:14;24931:1;24916:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;25116:4;25122:14;25137:1;25122:17;;;;25141:11;25153:1;25141:14;;;;25157;25172:1;25157:17;;;;25176:11;25188:1;25176:14;;;;25192:11;25204:1;25192:14;;;;25208;25223:1;25208:17;;;;;;;;;25106:120;;;;-1:-1:-1;;;;;25106:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24245:1146;;;25269:4;25275:14;25290:1;25275:17;;;;25294:11;25306:1;25294:14;;;;25310;25325:1;25310:17;;;;25329:11;25341:1;25329:14;;;;25345:11;25357:1;25345:14;;;;25361;25376:1;25361:17;;;;25259:120;;;;-1:-1:-1;;;;;25259:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24245:1146;;;25559:7;;;;25517:16;;;;25471:63;;-1:-1:-1;;;;;;;;;;;25471:63:0;;;;;;;;;;;;;;;;;;;;24223:1168;;-1:-1:-1;25461:105:0;;:94;;25536:1;-1:-1:-1;25536:4:0;;;;25542:2;25545:1;25542:5;;;;25549:2;25552:1;25549:5;;;;;;;;;25461:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25549:5;;-1:-1:-1;;25461:94:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25461:94:0;;;;;;;;-1:-1:-1;;;;;25461:105:0;;;25457:251;;;25656:16;;;;25638;;;;25612:23;25606:30;25597:76;;;;;;;;;;;;25695:1;25688:8;;;;25457:251;25881:7;;;;25839:16;;;;25793:63;;;-1:-1:-1;;;;;;;;;;;25793:63:0;;;;;;;;;;;;;;;;;;;25858:4;;;;;25864:5;;;;25871;;;;;-1:-1:-1;25783:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25783:105:0;;;;:94;;;;;;;25858:4;-1:-1:-1;;25783:94:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25783:94:0;;;;;;;;-1:-1:-1;;;;;25783:105:0;;;25779:251;;;25978:16;;;;25960;;;;25934:23;25928:30;;25779:251;26121:1;:16;;;-1:-1:-1;;;;;26102:35:0;:1;:15;;;-1:-1:-1;;;;;26102:35:0;;;:74;;;;26161:1;:15;;;-1:-1:-1;;;;;26141:35:0;:1;:16;;;-1:-1:-1;;;;;26141:35:0;;;26102:74;26098:221;;;26267:16;;;;26249;;;;26222:24;26216:31;;26098:221;26429:10;26413:1;:13;;;:26;26409:168;;;26525:16;;;;26507;;;;26485:19;26479:26;;26409:168;26801:15;;;;:20;:130;;;;;26914:1;:17;;;26880:31;26888:1;:16;;;26906:4;26880:7;:31::i;:::-;:51;;;;;;;;26860:1;:16;;;26825:32;26833:1;:17;;;26852:4;26825:7;:32::i;:::-;:51;;;;;;;;:106;;26801:130;26800:285;;;;26973:1;26955;:15;;;:19;:129;;;;;27068:1;:16;;;27033:32;27041:1;:17;;;27060:4;27033:7;:32::i;:::-;:51;;;;;;;;27012:1;:17;;;26978:31;26986:1;:16;;;27004:4;26978:7;:31::i;:::-;:51;;;;;;;;:106;;26955:129;26788:308;26784:472;;;27182:16;;;;27164;;;;27127:72;27136:26;;26784:472;27340:176;;;;;;;;;27389:1;27340:176;;;;27427:1;27340:176;;;;27465:1;27340:176;;;;27503:1;27340:176;;;27316:200;;27575:1;:15;;;27594:1;27575:20;27571:10253;;;27788:16;;27817;;;;27788;27806:28;;;:10;:28;;;;;;27776:165;;27780:55;;:7;:55::i;:::-;27845:17;;;;;27923:16;;;;27883;;;;27872:28;;;;:10;:28;;;;;;27902:17;;27837:103;;27864:56;;:7;:56::i;:::-;:75;;;;;;;;27837:7;:103::i;:::-;27776:3;:165::i;:::-;27767:174;;;27960:11;27956:222;;;28118:16;;;;28100;;;;28070:27;28064:34;;27956:222;28303:16;;28274:6;;28282:17;;;;28266:34;;28274:6;28266:7;:34::i;:::-;:53;;;;;;;;28254:9;;;:65;28447:6;;28471:8;;28439:51;;28447:6;28484:4;;28455:25;;28447:6;;28455:7;:25::i;28439:51::-;28393:19;;;:97;28792:15;;;;28809:10;;28829:6;;28837:8;;28781:75;;28792:15;-1:-1:-1;;;;;28809:10:0;;28850:4;;28821:25;;28829:6;28821:7;:25::i;:::-;:34;;;;;;;;28781:10;:75::i;:::-;29014:110;29022:57;29030:2;:9;;;29073:4;29041:28;29049:2;:9;;;29060:8;;29041:7;:28::i;29022:57::-;29118:4;29081:33;29089:2;:9;;;29100:1;:13;;;29081:7;:33::i;29014:110::-;28968:19;;;:156;29459:15;;;;29476:10;;29504:9;;;;29515:8;;29448:131;;29459:15;-1:-1:-1;;;;;29476:10:0;;29488:90;;29528:4;;29496:28;;:7;:28::i;:::-;:37;;;;;;;;29572:4;29535:33;29543:2;:9;;;29554:1;:13;;;29535:7;:33::i;:::-;:42;;;;;;;;29488:7;:90::i;:::-;29448:10;:131::i;:::-;29833:48;29844:1;:16;;;29862:1;:7;;;29871:2;:9;;;29833:10;:48::i;:::-;30138:57;30149:1;:15;;;30166:1;:7;;;30175:2;:19;;;30138:10;:57::i;:::-;30673:45;30684:1;:16;;;30702:1;:7;;;30711:2;:6;;;30673:10;:45::i;:::-;31204:57;31215:1;:15;;;31232:1;:7;;;31241:2;:19;;;31204:10;:57::i;:::-;31399:16;;;;31388:28;;;;:10;:28;;;;;;31418:6;;31380:45;;31388:28;31380:7;:45::i;:::-;31345:16;;;;31334:28;;;;:10;:28;;;;;;:91;;;;31594:16;;;;31583:28;;;;31649:17;;;;31621:6;;31629:16;;;;31575:92;;31583:28;31649:17;31613:33;;:7;:33::i;31575:92::-;31529:10;:28;31540:1;:16;;;31529:28;;;;;;;;;;;;;;;;;:138;;;;31770:12;31724:21;:30;31746:1;:7;;;-1:-1:-1;;;;;31724:30:0;-1:-1:-1;;;;;31724:30:0;;;;;;;;;;;;:58;;;;31887:12;31841:21;:30;31863:1;:7;;;-1:-1:-1;;;;;31841:30:0;-1:-1:-1;;;;;31841:30:0;;;;;;;;;;;;:58;;;;32260:1;:16;;;31998:293;;;32242:1;:16;;;31998:293;;;32119:1;:7;;;-1:-1:-1;;;;;31998:293:0;;32022:1;:15;;;32039:2;:6;;;32064:1;:16;;;32082:2;:9;;;32110:1;:7;;;32145:8;;32155;;32182:2;:19;;;32204:2;:19;;;31998:293;;;;-1:-1:-1;;;;;31998:293:0;-1:-1:-1;;;;;31998:293:0;;;;;;;;;;;-1:-1:-1;;;;;31998:293:0;-1:-1:-1;;;;;31998:293:0;;;;;;;;;;;-1:-1:-1;;;;;31998:293:0;-1:-1:-1;;;;;31998:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32313:6;;;-1:-1:-1;32306:13:0;;27571:10253;32571:17;;;;;;32650:16;;32610;;;;32650;32599:28;;;:10;:28;;;;;;;;32629:17;;32559:166;;32563:104;;32650:16;;32591:56;;32599:28;32591:7;:56::i;32563:104::-;32677:16;;;;32706;;;;32695:28;;;;:10;:28;;;;;;32669:55;;32677:16;32669:7;:55::i;32559:166::-;32550:175;;;32744:11;32740:222;;;32902:16;;;;32884;;;;32854:27;32848:34;;32740:222;33098:17;;;;33070:6;;33078:16;;33062:33;;33070:6;33062:7;:33::i;:::-;:53;;;;;;;;33050:9;;;:65;;;33283:8;;33245:55;;33062:53;33295:4;;33264:28;;33062:53;;33264:7;:28::i;33245:55::-;33199:19;;;:101;33596:15;;;;33613:10;;33633:9;;;;33644:8;;33585:76;;33596:15;-1:-1:-1;;;;;33613:10:0;;33656:4;;33625:28;;33633:9;33625:7;:28::i;33585:76::-;33857:97;33865:49;33873:2;:6;;;33909:4;33881:25;33889:2;:6;;;33897:8;;33881:7;:25::i;33865:49::-;33949:4;33916:30;33924:2;:6;;;33932:1;:13;;;33916:7;:30::i;33857:97::-;33811:19;;;:143;34290:15;;;;34307:10;;34335:6;;34343:8;;34279:121;;34290:15;-1:-1:-1;;;;;34307:10:0;;34319:80;;34355:4;;34327:25;;:7;:25::i;:::-;:32;;;;;;;;34394:4;34361:30;34369:2;:6;;;34377:1;:13;;;34361:7;:30::i;34279:121::-;34624:45;34635:1;:16;;;34653:1;:7;;;34662:2;:6;;;34624:10;:45::i;:::-;35084:57;35095:1;:15;;;35112:1;:7;;;35121:2;:19;;;35084:10;:57::i;:::-;35588:48;35599:1;:16;;;35617:1;:7;;;35626:2;:9;;;35588:10;:48::i;:::-;36053:57;36064:1;:15;;;36081:1;:7;;;36090:2;:19;;;36053:10;:57::i;:::-;36994:16;;;;36983:28;;;;:10;:28;;;;;;;;;37013:9;;;;36975:48;;36983:28;36975:7;:48::i;:::-;36944:16;;;;36933:28;;;;:10;:28;;;;;;:90;;;;37141:16;;;;37130:28;;;;37160:6;;37122:45;;37130:28;37122:7;:45::i;27571:10253::-;23565:14266;;;;;;;;:::o;7264:251::-;7335:12;2189:5;;2168:27;;-1:-1:-1;;;;;2189:5:0;2175:10;:19;2168:6;:27::i;:::-;7373:7;7364:6;:16;7360:27;;;7382:5;;;7360:27;7398:23;:32;;;7448:37;;;;;;;;;;;;;;;;;-1:-1:-1;7503:4:0;7264:251;;;:::o;1321:131::-;1363:4;1389:5;;;1405:20;1412:4;;;;;;:12;;;1423:1;1420;:4;;1405:6;:20::i;1704:62::-;;;;;;;;;;;;;:::o;4757:38::-;;;;:::o;16180:978::-;16238:12;16556:6;16516:37;16535:5;16542:10;16516:18;:37::i;:::-;:46;16512:57;;;16564:5;;;16512:57;16666:37;16677:5;16684:10;16696:6;16666:10;:37::i;:::-;-1:-1:-1;;;;;16773:19:0;;;16769:270;;;16885:23;;:10;;:23;;;;;16901:6;;16885:23;;;;16901:6;16885:10;:23;;;;;;;16884:24;16880:35;;;16910:5;;;16880:35;16769:270;;;16965:41;;;;;;16987:10;16965:41;;;;;;;;;;;;-1:-1:-1;;;;;16965:21:0;;;;;:41;;;;;;;;;;;;;;-1:-1:-1;16965:21:0;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;16965:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16965:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16965:41:0;16964:42;16960:53;;;17008:5;;;16960:53;17070:10;-1:-1:-1;;;;;17054:68:0;;;17082:6;17090:28;17063:5;17070:10;17090:9;:28::i;:::-;17054:68;;;;;;;;;;;;;17120:1;17054:68;;;;;;;;;;;;;16180:978;;;;:::o;4146:46::-;;;;;;;;;;;;;:::o;9795:175::-;9857:7;9923:36;9947:5;9954:4;9923:23;:36::i;:::-;9960:1;9923:39;;4245:81;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5003:23::-;;;;:::o;4666:34::-;;;-1:-1:-1;;;;;4666:34:0;;:::o;8254:247::-;-1:-1:-1;;;;;8460:15:0;;;8375:17;8460:15;;;:8;:15;;;;;;;;:21;;;;;;;;;;;;;;8435:12;;;;8422:25;8460:33;;8254:247::o;12888:227::-;13015:6;12981:31;13000:5;13007:4;12981:18;:31::i;:::-;:40;12977:51;;;13023:5;;;12977:51;13040:67;13054:5;13061:4;13067:39;13075:22;13085:5;13092:4;13075:9;:22::i;:::-;13099:6;13067:7;:39::i;:::-;13040:13;:67::i;:::-;;12888:227;;;:::o;12685:164::-;12774:67;12788:5;12795:4;12801:39;12809:22;12819:5;12826:4;12809:9;:22::i;:::-;12833:6;12801:7;:39::i;8790:235::-;8884:17;8912:22;8922:5;8929:4;8912:9;:22::i;:::-;-1:-1:-1;;;;;8984:15:0;;;;;;;:8;:15;;;;;;;;:21;;;;;;;;;;;;;;8959:12;;;;8946:25;;;8984:33;;;-1:-1:-1;8790:235:0:o;8509:273::-;8596:4;8646:7;8703:3;8678:23;8689:5;8696:4;8678:10;:23::i;:::-;-1:-1:-1;;;;;8719:15:0;;;;;;;:8;:15;;;;;;;;:21;;;;;;;;;8678:28;;;;;;8665:41;;;;8719:33;;;;8770:4;;-1:-1:-1;8509:273:0;;;;;;:::o;40595:96::-;40646:4;40674:1;40670;:5;:13;;40682:1;40670:13;;;-1:-1:-1;40678:1:0;;40595:96;-1:-1:-1;40595:96:0:o;774:39920::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;774:39920:0;;;-1:-1:-1;;774:39920:0:o;:::-;;;;;;;;;;;;;;;105:10:-1;774:39920:0;88:34:-1;-1:-1;774:39920:0;;;-1:-1:-1;;774:39920:0:o;:::-;;;;;;;;;-1:-1:-1;774:39920:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://cb1c3dc490c6a6ea119cd0477e7024bb62462b62300e7b16a5d4573051b5bbea
Loading...
Loading
Loading...
Loading
Net Worth in USD
$7,768.45
Net Worth in ETH
3.619212
Token Allocations
ETH
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,142.67 | 3.6256 | $7,768.45 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.