Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DONDIDelegate
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-15 */ pragma solidity 0.5.17; pragma experimental ABIEncoderV2; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // Storage for a DONDI token contract DONDITokenStorage { using SafeMath for uint256; /** * @dev Guard variable for re-entrancy checks. Not currently used */ bool internal _notEntered; /** * @notice EIP-20 token name for this token */ string public name; /** * @notice EIP-20 token symbol for this token */ string public symbol; /** * @notice EIP-20 token decimals for this token */ uint8 public decimals; /** * @notice Governor for this contract */ address public gov; /** * @notice Pending governance for this contract */ address public pendingGov; /** * @notice Approved rebaser for this contract */ address public rebaser; mapping(address => bool) public minter; /** * @notice Reserve address of DONDI protocol */ address public incentivizer; /** * @notice Total supply of DONDIs */ uint256 public totalSupply; /** * @notice Internal decimals used to handle scaling factor */ uint256 public constant internalDecimals = 10**24; /** * @notice Used for percentage maths */ uint256 public constant BASE = 10**18; /** * @notice Scaling factor that adjusts everyone's balances */ uint256 public dondisScalingFactor; mapping (address => uint256) internal _dondiBalances; mapping (address => mapping (address => uint256)) internal _allowedFragments; uint256 public initSupply; } contract DONDIGovernanceStorage { /// @notice A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; } contract DONDITokenInterface is DONDITokenStorage, DONDIGovernanceStorage { /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @notice Event emitted when tokens are rebased */ event Rebase(uint256 epoch, uint256 prevDondisScalingFactor, uint256 newDondisScalingFactor); /*** Gov Events ***/ /** * @notice Event emitted when pendingGov is changed */ event NewPendingGov(address oldPendingGov, address newPendingGov); /** * @notice Event emitted when gov is changed */ event NewGov(address oldGov, address newGov); /** * @notice Sets the rebaser contract */ event NewRebaser(address oldRebaser, address newRebaser); /** * @notice Sets the incentivizer contract */ event NewIncentivizer(address oldIncentivizer, address newIncentivizer); event NewMinter(address newMinter); event RemoveMinter(address removeMinter); /* - ERC20 Events - */ /** * @notice EIP20 Transfer event */ event Transfer(address indexed from, address indexed to, uint amount); /** * @notice EIP20 Approval event */ event Approval(address indexed owner, address indexed spender, uint amount); /* - Extra Events - */ /** * @notice Tokens minted event */ event Mint(address to, uint256 amount); // Public functions function transfer(address to, uint256 value) external returns(bool); function transferFrom(address from, address to, uint256 value) external returns(bool); function balanceOf(address who) external view returns(uint256); function balanceOfUnderlying(address who) external view returns(uint256); function allowance(address owner_, address spender) external view returns(uint256); function approve(address spender, uint256 value) external returns (bool); function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); function maxScalingFactor() external view returns (uint256); /* - Governance Functions - */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256); function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) external; function delegate(address delegatee) external; function delegates(address delegator) external view returns (address); function getCurrentVotes(address account) external view returns (uint256); /* - Permissioned/Governance functions - */ function mint(address to, uint256 amount) external returns (bool); function rebase(uint256 epoch, uint256 indexDelta, bool positive) external returns (uint256); function _setRebaser(address rebaser_) external; function _setIncentivizer(address incentivizer_) external; function _setMinter(address minter_) external; function _setPendingGov(address pendingGov_) external; function _acceptGov() external; } contract DONDIGovernanceToken is DONDITokenInterface { /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "DONDI::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "DONDI::delegateBySig: invalid nonce"); require(now <= expiry, "DONDI::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "DONDI::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = _dondiBalances[delegator]; // balance of underlying DONDIs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "DONDI::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } } contract DONDIToken is DONDIGovernanceToken { // Modifiers modifier onlyGov() { require(msg.sender == gov); _; } modifier onlyRebaser() { require(msg.sender == rebaser); _; } modifier onlyMinter() { require(msg.sender == rebaser || msg.sender == incentivizer || msg.sender == gov || minter[msg.sender] == true, "not minter"); _; } modifier validRecipient(address to) { require(to != address(0x0)); require(to != address(this)); _; } function initialize( string memory name_, string memory symbol_, uint8 decimals_ ) public { require(dondisScalingFactor == 0, "already initialized"); name = name_; symbol = symbol_; decimals = decimals_; } /** * @notice Computes the current max scaling factor */ function maxScalingFactor() external view returns (uint256) { return _maxScalingFactor(); } function _maxScalingFactor() internal view returns (uint256) { // scaling factor can only go up to 2**256-1 = initSupply * dondisScalingFactor // this is used to check if dondisScalingFactor will be too high to compute balances when rebasing. return uint256(-1) / initSupply; } /** * @notice Mints new tokens, increasing totalSupply, initSupply, and a users balance. * @dev Limited to onlyMinter modifier */ function mint(address to, uint256 amount) external onlyMinter returns (bool) { _mint(to, amount); return true; } function _mint(address to, uint256 amount) internal { // increase totalSupply totalSupply = totalSupply.add(amount); // get underlying value uint256 dondiValue = amount.mul(internalDecimals).div(dondisScalingFactor); // increase initSupply initSupply = initSupply.add(dondiValue); // make sure the mint didnt push maxScalingFactor too low require(dondisScalingFactor <= _maxScalingFactor(), "max scaling factor too low"); // add balance _dondiBalances[to] = _dondiBalances[to].add(dondiValue); // add delegates to the minter _moveDelegates(address(0), _delegates[to], dondiValue); emit Mint(to, amount); } /* - ERC20 functionality - */ /** * @dev Transfer tokens to a specified address. * @param to The address to transfer to. * @param value The amount to be transferred. * @return True on success, false otherwise. */ function transfer(address to, uint256 value) external validRecipient(to) returns (bool) { // underlying balance is stored in dondis, so divide by current scaling factor // note, this means as scaling factor grows, dust will be untransferrable. // minimum transfer value == dondisScalingFactor / 1e24; // get amount in underlying uint256 dondiValue = value.mul(internalDecimals).div(dondisScalingFactor); // sub from balance of sender _dondiBalances[msg.sender] = _dondiBalances[msg.sender].sub(dondiValue); // add to balance of receiver _dondiBalances[to] = _dondiBalances[to].add(dondiValue); emit Transfer(msg.sender, to, value); _moveDelegates(_delegates[msg.sender], _delegates[to], dondiValue); return true; } /** * @dev Transfer tokens from one address to another. * @param from The address you want to send tokens from. * @param to The address you want to transfer to. * @param value The amount of tokens to be transferred. */ function transferFrom(address from, address to, uint256 value) external validRecipient(to) returns (bool) { // decrease allowance _allowedFragments[from][msg.sender] = _allowedFragments[from][msg.sender].sub(value); // get value in dondis uint256 dondiValue = value.mul(internalDecimals).div(dondisScalingFactor); // sub from from _dondiBalances[from] = _dondiBalances[from].sub(dondiValue); _dondiBalances[to] = _dondiBalances[to].add(dondiValue); emit Transfer(from, to, value); _moveDelegates(_delegates[from], _delegates[to], dondiValue); return true; } /** * @param who The address to query. * @return The balance of the specified address. */ function balanceOf(address who) external view returns (uint256) { return _dondiBalances[who].mul(dondisScalingFactor).div(internalDecimals); } /** @notice Currently returns the internal storage amount * @param who The address to query. * @return The underlying balance of the specified address. */ function balanceOfUnderlying(address who) external view returns (uint256) { return _dondiBalances[who]; } /** * @dev Function to check the amount of tokens that an owner has allowed to a spender. * @param owner_ The address which owns the funds. * @param spender The address which will spend the funds. * @return The number of tokens still available for the spender. */ function allowance(address owner_, address spender) external view returns (uint256) { return _allowedFragments[owner_][spender]; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of * msg.sender. This method is included for ERC20 compatibility. * increaseAllowance and decreaseAllowance should be used instead. * Changing an allowance with this method brings the risk that someone may transfer both * the old and the new allowance - if they are both greater than zero - if a transfer * transaction is mined before the later approve() call is mined. * * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) external returns (bool) { _allowedFragments[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } /** * @dev Increase the amount of tokens that an owner has allowed to a spender. * This method should be used instead of approve() to avoid the double approval vulnerability * described above. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance(address spender, uint256 addedValue) external returns (bool) { _allowedFragments[msg.sender][spender] = _allowedFragments[msg.sender][spender].add(addedValue); emit Approval(msg.sender, spender, _allowedFragments[msg.sender][spender]); return true; } /** * @dev Decrease the amount of tokens that an owner has allowed to a spender. * * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) { uint256 oldValue = _allowedFragments[msg.sender][spender]; if (subtractedValue >= oldValue) { _allowedFragments[msg.sender][spender] = 0; } else { _allowedFragments[msg.sender][spender] = oldValue.sub(subtractedValue); } emit Approval(msg.sender, spender, _allowedFragments[msg.sender][spender]); return true; } /* - Governance Functions - */ /** @notice sets the rebaser * @param rebaser_ The address of the rebaser contract to use for authentication. */ function _setRebaser(address rebaser_) external onlyGov { address oldRebaser = rebaser; rebaser = rebaser_; emit NewRebaser(oldRebaser, rebaser_); } /** @notice sets the incentivizer * @param incentivizer_ The address of the rebaser contract to use for authentication. */ function _setIncentivizer(address incentivizer_) external onlyGov { address oldIncentivizer = incentivizer; incentivizer = incentivizer_; emit NewIncentivizer(oldIncentivizer, incentivizer_); } function _setMinter(address minter_) external onlyGov { minter[minter_] = true; emit NewMinter(minter_); } function _removeMinter(address minter_) external onlyGov { minter[minter_] = false; emit RemoveMinter(minter_); } /** @notice sets the pendingGov * @param pendingGov_ The address of the rebaser contract to use for authentication. */ function _setPendingGov(address pendingGov_) external onlyGov { address oldPendingGov = pendingGov; pendingGov = pendingGov_; emit NewPendingGov(oldPendingGov, pendingGov_); } /** @notice lets msg.sender accept governance * */ function _acceptGov() external { require(msg.sender == pendingGov, "!pending"); address oldGov = gov; gov = pendingGov; pendingGov = address(0); emit NewGov(oldGov, gov); } /* - Extras - */ /** * @notice Initiates a new rebase operation, provided the minimum time period has elapsed. * * @dev The supply adjustment equals (totalSupply * DeviationFromTargetRate) / rebaseLag * Where DeviationFromTargetRate is (MarketOracleRate - targetRate) / targetRate * and targetRate is CpiOracleRate / baseCpi */ function rebase( uint256 epoch, uint256 indexDelta, bool positive ) external onlyRebaser returns (uint256) { if (indexDelta == 0) { emit Rebase(epoch, dondisScalingFactor, dondisScalingFactor); return totalSupply; } uint256 prevDondisScalingFactor = dondisScalingFactor; if (!positive) { dondisScalingFactor = dondisScalingFactor.mul(BASE.sub(indexDelta)).div(BASE); } else { uint256 newScalingFactor = dondisScalingFactor.mul(BASE.add(indexDelta)).div(BASE); if (newScalingFactor < _maxScalingFactor()) { dondisScalingFactor = newScalingFactor; } else { dondisScalingFactor = _maxScalingFactor(); } } totalSupply = initSupply.mul(dondisScalingFactor); emit Rebase(epoch, prevDondisScalingFactor, dondisScalingFactor); return totalSupply; } } contract DONDI is DONDIToken { /** * @notice Initialize the new money market * @param name_ ERC-20 name of this token * @param symbol_ ERC-20 symbol of this token * @param decimals_ ERC-20 decimal precision of this token */ function initialize( string memory name_, string memory symbol_, uint8 decimals_, address initial_owner, uint256 initSupply_ ) public { require(initSupply_ > 0, "0 init supply"); super.initialize(name_, symbol_, decimals_); initSupply = initSupply_.mul(10**24/ (BASE)); totalSupply = initSupply_; dondisScalingFactor = BASE; _dondiBalances[initial_owner] = initSupply_.mul(10**24 / (BASE)); // owner renounces ownership after deployment as they need to set // rebaser and incentivizer // gov = gov_; } } contract DONDIDelegationStorage { /** * @notice Implementation address for this contract */ address public implementation; } contract DONDIDelegatorInterface is DONDIDelegationStorage { /** * @notice Emitted when implementation is changed */ event NewImplementation(address oldImplementation, address newImplementation); /** * @notice Called by the gov to update the implementation of the delegator * @param implementation_ The address of the new implementation for delegation * @param allowResign Flag to indicate whether to call _resignImplementation on the old implementation * @param becomeImplementationData The encoded bytes data to be passed to _becomeImplementation */ function _setImplementation(address implementation_, bool allowResign, bytes memory becomeImplementationData) public; } contract DONDIDelegateInterface is DONDIDelegationStorage { /** * @notice Called by the delegator on a delegate to initialize it for duty * @dev Should revert if any issues arise which make it unfit for delegation * @param data The encoded bytes data for any initialization */ function _becomeImplementation(bytes memory data) public; /** * @notice Called by the delegator on a delegate to forfeit its responsibility */ function _resignImplementation() public; } contract DONDIDelegate is DONDI, DONDIDelegateInterface { /** * @notice Construct an empty delegate */ constructor() public {} /** * @notice Called by the delegator on a delegate to initialize it for duty * @param data The encoded bytes data for any initialization */ function _becomeImplementation(bytes memory data) public { // Shh -- currently unused data; // Shh -- we don't ever want this hook to be marked pure if (false) { implementation = address(0); } require(msg.sender == gov, "only the gov may call _becomeImplementation"); } /** * @notice Called by the delegator on a delegate to forfeit its responsibility */ function _resignImplementation() public { // Shh -- we don't ever want this hook to be marked pure if (false) { implementation = address(0); } require(msg.sender == gov, "only the gov may call _resignImplementation"); } } contract DONDIDelegator is DONDITokenInterface, DONDIDelegatorInterface { /** * @notice Construct a new DONDI * @param name_ ERC-20 name of this token * @param symbol_ ERC-20 symbol of this token * @param decimals_ ERC-20 decimal precision of this token * @param initSupply_ Initial token amount * @param implementation_ The address of the implementation the contract delegates to * @param becomeImplementationData The encoded args for becomeImplementation */ constructor( string memory name_, string memory symbol_, uint8 decimals_, uint256 initSupply_, address implementation_, bytes memory becomeImplementationData ) public { // Creator of the contract is gov during initialization gov = msg.sender; // First delegate gets to initialize the delegator (i.e. storage contract) delegateTo( implementation_, abi.encodeWithSignature( "initialize(string,string,uint8,address,uint256)", name_, symbol_, decimals_, msg.sender, initSupply_ ) ); // New implementations always get set via the settor (post-initialize) _setImplementation(implementation_, false, becomeImplementationData); } /** * @notice Called by the gov to update the implementation of the delegator * @param implementation_ The address of the new implementation for delegation * @param allowResign Flag to indicate whether to call _resignImplementation on the old implementation * @param becomeImplementationData The encoded bytes data to be passed to _becomeImplementation */ function _setImplementation(address implementation_, bool allowResign, bytes memory becomeImplementationData) public { require(msg.sender == gov, "DONDIDelegator::_setImplementation: Caller must be gov"); if (allowResign) { delegateToImplementation(abi.encodeWithSignature("_resignImplementation()")); } address oldImplementation = implementation; implementation = implementation_; delegateToImplementation(abi.encodeWithSignature("_becomeImplementation(bytes)", becomeImplementationData)); emit NewImplementation(oldImplementation, implementation); } /** * @notice Sender supplies assets into the market and receives cTokens in exchange * @dev Accrues interest whether or not the operation succeeds, unless reverted * @param mintAmount The amount of the underlying asset to supply * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function mint(address to, uint256 mintAmount) external returns (bool) { to; mintAmount; // Shh delegateAndReturn(); } /** * @notice Transfer `amount` tokens from `msg.sender` to `dst` * @param dst The address of the destination account * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ function transfer(address dst, uint256 amount) external returns (bool) { dst; amount; // Shh delegateAndReturn(); } /** * @notice Transfer `amount` tokens from `src` to `dst` * @param src The address of the source account * @param dst The address of the destination account * @param amount The number of tokens to transfer * @return Whether or not the transfer succeeded */ function transferFrom( address src, address dst, uint256 amount ) external returns (bool) { src; dst; amount; // Shh delegateAndReturn(); } /** * @notice Approve `spender` to transfer up to `amount` from `src` * @dev This will overwrite the approval amount for `spender` * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) * @param spender The address of the account which may transfer tokens * @param amount The number of tokens that are approved (-1 means infinite) * @return Whether or not the approval succeeded */ function approve( address spender, uint256 amount ) external returns (bool) { spender; amount; // Shh delegateAndReturn(); } /** * @dev Increase the amount of tokens that an owner has allowed to a spender. * This method should be used instead of approve() to avoid the double approval vulnerability * described above. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance( address spender, uint256 addedValue ) external returns (bool) { spender; addedValue; // Shh delegateAndReturn(); } function maxScalingFactor() external view returns (uint256) { delegateToViewAndReturn(); } function rebase( uint256 epoch, uint256 indexDelta, bool positive ) external returns (uint256) { epoch; indexDelta; positive; delegateAndReturn(); } /** * @dev Decrease the amount of tokens that an owner has allowed to a spender. * * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance( address spender, uint256 subtractedValue ) external returns (bool) { spender; subtractedValue; // Shh delegateAndReturn(); } /** * @notice Get the current allowance from `owner` for `spender` * @param owner The address of the account which owns the tokens to be spent * @param spender The address of the account which may transfer tokens * @return The number of tokens allowed to be spent (-1 means infinite) */ function allowance( address owner, address spender ) external view returns (uint256) { owner; spender; // Shh delegateToViewAndReturn(); } /** * @notice Get the current allowance from `owner` for `spender` * @param delegator The address of the account which has designated a delegate * @return Address of delegatee */ function delegates( address delegator ) external view returns (address) { delegator; // Shh delegateToViewAndReturn(); } /** * @notice Get the token balance of the `owner` * @param owner The address of the account to query * @return The number of tokens owned by `owner` */ function balanceOf(address owner) external view returns (uint256) { owner; // Shh delegateToViewAndReturn(); } /** * @notice Currently unused. For future compatability * @param owner The address of the account to query * @return The number of underlying tokens owned by `owner` */ function balanceOfUnderlying(address owner) external view returns (uint256) { owner; // Shh delegateToViewAndReturn(); } /*** Gov Functions ***/ /** * @notice Begins transfer of gov rights. The newPendingGov must call `_acceptGov` to finalize the transfer. * @dev Gov function to begin change of gov. The newPendingGov must call `_acceptGov` to finalize the transfer. * @param newPendingGov New pending gov. */ function _setPendingGov(address newPendingGov) external { newPendingGov; // Shh delegateAndReturn(); } function _setRebaser(address rebaser_) external { rebaser_; // Shh delegateAndReturn(); } function _setIncentivizer(address incentivizer_) external { incentivizer_; // Shh delegateAndReturn(); } function _setMinter(address minter_) external { minter_; delegateAndReturn(); } /** * @notice Accepts transfer of gov rights. msg.sender must be pendingGov * @dev Gov function for pending gov to accept role and update gov * @return uint 0=success, otherwise a failure (see ErrorReporter.sol for details) */ function _acceptGov() external { delegateAndReturn(); } function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { account; blockNumber; delegateToViewAndReturn(); } function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { delegatee; nonce; expiry; v; r; s; delegateAndReturn(); } function delegate(address delegatee) external { delegatee; delegateAndReturn(); } function getCurrentVotes(address account) external view returns (uint256) { account; delegateToViewAndReturn(); } /** * @notice Internal method to delegate execution to another contract * @dev It returns to the external caller whatever the implementation returns or forwards reverts * @param callee The contract to delegatecall * @param data The raw data to delegatecall * @return The returned bytes from the delegatecall */ function delegateTo(address callee, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returnData) = callee.delegatecall(data); assembly { if eq(success, 0) { revert(add(returnData, 0x20), returndatasize) } } return returnData; } /** * @notice Delegates execution to the implementation contract * @dev It returns to the external caller whatever the implementation returns or forwards reverts * @param data The raw data to delegatecall * @return The returned bytes from the delegatecall */ function delegateToImplementation(bytes memory data) public returns (bytes memory) { return delegateTo(implementation, data); } /** * @notice Delegates execution to an implementation contract * @dev It returns to the external caller whatever the implementation returns or forwards reverts * There are an additional 2 prefix uints from the wrapper returndata, which we ignore since we make an extra hop. * @param data The raw data to delegatecall * @return The returned bytes from the delegatecall */ function delegateToViewImplementation(bytes memory data) public view returns (bytes memory) { (bool success, bytes memory returnData) = address(this).staticcall(abi.encodeWithSignature("delegateToImplementation(bytes)", data)); assembly { if eq(success, 0) { revert(add(returnData, 0x20), returndatasize) } } return abi.decode(returnData, (bytes)); } function delegateToViewAndReturn() private view returns (bytes memory) { (bool success, ) = address(this).staticcall(abi.encodeWithSignature("delegateToImplementation(bytes)", msg.data)); assembly { let free_mem_ptr := mload(0x40) returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { revert(free_mem_ptr, returndatasize) } default { return(add(free_mem_ptr, 0x40), returndatasize) } } } function delegateAndReturn() private returns (bytes memory) { (bool success, ) = implementation.delegatecall(msg.data); assembly { let free_mem_ptr := mload(0x40) returndatacopy(free_mem_ptr, 0, returndatasize) switch success case 0 { revert(free_mem_ptr, returndatasize) } default { return(free_mem_ptr, returndatasize) } } } /** * @notice Delegates execution to an implementation contract * @dev It returns to the external caller whatever the implementation returns or forwards reverts */ function () external payable { require(msg.value == 0,"DONDIDelegator:fallback: cannot send value to fallback"); // delegate all other functions to current implementation delegateAndReturn(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldGov","type":"address"},{"indexed":false,"internalType":"address","name":"newGov","type":"address"}],"name":"NewGov","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldIncentivizer","type":"address"},{"indexed":false,"internalType":"address","name":"newIncentivizer","type":"address"}],"name":"NewIncentivizer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMinter","type":"address"}],"name":"NewMinter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPendingGov","type":"address"},{"indexed":false,"internalType":"address","name":"newPendingGov","type":"address"}],"name":"NewPendingGov","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRebaser","type":"address"},{"indexed":false,"internalType":"address","name":"newRebaser","type":"address"}],"name":"NewRebaser","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"prevDondisScalingFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDondisScalingFactor","type":"uint256"}],"name":"Rebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"removeMinter","type":"address"}],"name":"RemoveMinter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"_acceptGov","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"_becomeImplementation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"_removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"_resignImplementation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"incentivizer_","type":"address"}],"name":"_setIncentivizer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"_setMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"pendingGov_","type":"address"}],"name":"_setPendingGov","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"rebaser_","type":"address"}],"name":"_setRebaser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOfUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dondisScalingFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"incentivizer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address","name":"initial_owner","type":"address"},{"internalType":"uint256","name":"initSupply_","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"internalDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxScalingFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingGov","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"indexDelta","type":"uint256"},{"internalType":"bool","name":"positive","type":"bool"}],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rebaser","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612a72806100206000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c80635c60da1b1161015c57806397d63f93116100ce578063c3cda52011610087578063c3cda52014610512578063dd62ed3e14610525578063e7a324dc14610538578063ec342ad014610540578063f1127ed814610548578063fa8f3455146105695761027f565b806397d63f93146104b657806398dca210146104be578063a1a88ff7146104d1578063a457c2d7146104d9578063a9059cbb146104ec578063b4b5ea57146104ff5761027f565b806370a082311161012057806370a082311461044f57806373f03dff14610462578063782d6fe1146104755780637af548c1146104885780637ecebe001461049b57806395d89b41146104ae5761027f565b80635c60da1b1461040457806364dd48f51461040c5780636c945221146104145780636fc6407c146104275780636fcfff451461042f5761027f565b806323b872dd116101f55780633dd08c38116101b95780633dd08c381461039d57806340c10f19146103b05780634bda2e20146103c357806356e67728146103cb578063587cde1e146103de5780635c19a95c146103f15761027f565b806323b872dd14610347578063252408101461035a578063313ce5671461036257806339509351146103775780633af9e6691461038a5761027f565b8063153ab50511610247578063153ab505146102f45780631624f6c6146102fe57806318160ddd1461031157806320606b7014610319578063210c5a56146103215780632373f091146103345761027f565b806306fdde0314610284578063095ea7b3146102a257806311d3e6c4146102c257806311fd8a83146102d757806312d43a51146102ec575b600080fd5b61028c61057c565b60405161029991906127a7565b60405180910390f35b6102b56102b0366004611ef4565b610609565b60405161029991906126fd565b6102ca610674565b604051610299919061270b565b6102df610684565b60405161029991906126b9565b6102df610693565b6102fc6106a7565b005b6102fc61030c366004612010565b6106e1565b6102ca610741565b6102ca610747565b6102fc61032f366004611e47565b61075e565b6102fc610342366004611e47565b6107d5565b6102b5610355366004611ea7565b610844565b6102df6109f1565b61036a610a00565b60405161029991906128da565b6102b5610385366004611ef4565b610a09565b6102ca610398366004611e47565b610a95565b6102b56103ab366004611e47565b610ab0565b6102b56103be366004611ef4565b610ac5565b6102fc610b53565b6102fc6103d9366004611fdb565b610bf4565b6102df6103ec366004611e47565b610c26565b6102fc6103ff366004611e47565b610c44565b6102df610c4e565b6102ca610c5d565b6102fc610422366004612082565b610c6b565b6102df610d0a565b61044261043d366004611e47565b610d19565b60405161029991906128be565b6102ca61045d366004611e47565b610d31565b6102fc610470366004611e47565b610d6f565b6102ca610483366004611ef4565b610dea565b6102ca610496366004612126565b610fd3565b6102ca6104a9366004611e47565b611124565b61028c611136565b6102ca61118e565b6102fc6104cc366004611e47565b611194565b6102ca611203565b6102b56104e7366004611ef4565b611209565b6102b56104fa366004611ef4565b6112fb565b6102ca61050d366004611e47565b611433565b6102fc610520366004611f24565b611496565b6102ca610533366004611e6d565b611655565b6102ca611680565b6102ca61168c565b61055b610556366004611fab565b611698565b6040516102999291906128cc565b6102fc610577366004611e47565b6116c5565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106015780601f106105d657610100808354040283529160200191610601565b820191906000526020600020905b8154815290600101906020018083116105e457829003601f168201915b505050505081565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061066290869061270b565b60405180910390a35060015b92915050565b600061067e611734565b90505b90565b6005546001600160a01b031681565b60035461010090046001600160a01b031681565b60035461010090046001600160a01b031633146106df5760405162461bcd60e51b81526004016106d6906127f8565b60405180910390fd5b565b600954156107015760405162461bcd60e51b81526004016106d690612818565b8251610714906001906020860190611d0d565b508151610728906002906020850190611d0d565b506003805460ff191660ff929092169190911790555050565b60085481565b604051610753906126a3565b604051809103902081565b60035461010090046001600160a01b0316331461077a57600080fd5b6001600160a01b03811660009081526006602052604090819020805460ff19169055517f2f91b591fc56ac0917953ad01ec225524ee5ef0555213e4c8a9d8c9728ee7ffb906107ca9083906126b9565b60405180910390a150565b60035461010090046001600160a01b031633146107f157600080fd5b6001600160a01b03811660009081526006602052604090819020805460ff19166001179055517f6adffd5c93085d835dac6f3b40adf7c242ca4b3284048d20c3d8a501748dc973906107ca9083906126b9565b6000826001600160a01b03811661085a57600080fd5b6001600160a01b03811630141561087057600080fd5b6001600160a01b0385166000908152600b602090815260408083203384529091529020546108a4908463ffffffff61174916565b6001600160a01b0386166000908152600b602090815260408083203384529091528120919091556009546108f8906108ec8669d3c21bcecceda100000063ffffffff61178b16565b9063ffffffff6117c516565b6001600160a01b0387166000908152600a6020526040902054909150610924908263ffffffff61174916565b6001600160a01b038088166000908152600a60205260408082209390935590871681522054610959908263ffffffff61180716565b6001600160a01b038087166000818152600a602052604090819020939093559151908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109ab90889061270b565b60405180910390a36001600160a01b038087166000908152600d60205260408082205488841683529120546109e59291821691168361182c565b50600195945050505050565b6004546001600160a01b031681565b60035460ff1681565b336000908152600b602090815260408083206001600160a01b0386168452909152812054610a3d908363ffffffff61180716565b336000818152600b602090815260408083206001600160a01b038916808552925291829020849055905190927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591610662919061270b565b6001600160a01b03166000908152600a602052604090205490565b60066020526000908152604090205460ff1681565b6005546000906001600160a01b0316331480610aeb57506007546001600160a01b031633145b80610b05575060035461010090046001600160a01b031633145b80610b2457503360009081526006602052604090205460ff1615156001145b610b405760405162461bcd60e51b81526004016106d690612858565b610b4a838361197a565b50600192915050565b6004546001600160a01b03163314610b7d5760405162461bcd60e51b81526004016106d690612848565b60038054600480546001600160a01b03818116610100908102610100600160a81b0319861617958690556001600160a01b0319909216909255604051928190048216937f1f14cfc03e486d23acee577b07bc0b3b23f4888c91fcdba5e0fef5a2549d5523936107ca938693909204909116906126c7565b60035461010090046001600160a01b03163314610c235760405162461bcd60e51b81526004016106d690612828565b50565b6001600160a01b039081166000908152600d60205260409020541690565b610c233382611a91565b6011546001600160a01b031681565b69d3c21bcecceda100000081565b60008111610c8b5760405162461bcd60e51b81526004016106d6906127c8565b610c968585856106e1565b610cbd670de0b6b3a764000069d3c21bcecceda10000005b8391900463ffffffff61178b16565b600c556008819055670de0b6b3a76400006009819055610ce79069d3c21bcecceda1000000610cae565b6001600160a01b039092166000908152600a602052604090209190915550505050565b6007546001600160a01b031681565b600f6020526000908152604090205463ffffffff1681565b6009546001600160a01b0382166000908152600a6020526040812054909161066e9169d3c21bcecceda1000000916108ec919063ffffffff61178b16565b60035461010090046001600160a01b03163314610d8b57600080fd5b600480546001600160a01b038381166001600160a01b03198316179092556040519116907f6163d5b9efd962645dd649e6e48a61bcb0f9df00997a2398b80d135a9ab0c61e90610dde90839085906126c7565b60405180910390a15050565b6000438210610e0b5760405162461bcd60e51b81526004016106d6906127d8565b6001600160a01b0383166000908152600f602052604090205463ffffffff1680610e3957600091505061066e565b6001600160a01b0384166000908152600e6020908152604080832063ffffffff600019860181168552925290912054168310610ea8576001600160a01b0384166000908152600e602090815260408083206000199490940163ffffffff1683529290522060010154905061066e565b6001600160a01b0384166000908152600e6020908152604080832083805290915290205463ffffffff16831015610ee357600091505061066e565b600060001982015b8163ffffffff168163ffffffff161115610f9c57600282820363ffffffff16048103610f15611d8b565b506001600160a01b0387166000908152600e6020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415610f775760200151945061066e9350505050565b805163ffffffff16871115610f8e57819350610f95565b6001820392505b5050610eeb565b506001600160a01b0385166000908152600e6020908152604080832063ffffffff9094168352929052206001015491505092915050565b6005546000906001600160a01b03163314610fed57600080fd5b8261103a577fc6642d24d84e7f3d36ca39f5cce10e75639d9b158d5193aa350e2f900653e4c08460095460095460405161102993929190612896565b60405180910390a15060085461111d565b6009548261107857611070670de0b6b3a76400006108ec611061828863ffffffff61174916565b6009549063ffffffff61178b16565b6009556110c2565b6000611099670de0b6b3a76400006108ec611061828963ffffffff61180716565b90506110a3611734565b8110156110b45760098190556110c0565b6110bc611734565b6009555b505b600954600c546110d79163ffffffff61178b16565b6008556009546040517fc6642d24d84e7f3d36ca39f5cce10e75639d9b158d5193aa350e2f900653e4c09161110f9188918591612896565b60405180910390a150506008545b9392505050565b60106020526000908152604090205481565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156106015780601f106105d657610100808354040283529160200191610601565b600c5481565b60035461010090046001600160a01b031633146111b057600080fd5b600780546001600160a01b038381166001600160a01b03198316179092556040519116907f2ee668ca7d17a9122dc00c0bfd73b684f2f7d681f17733cc02b294f69f1b389690610dde90839085906126c7565b60095481565b336000908152600b602090815260408083206001600160a01b038616845290915281205480831061125d57336000908152600b602090815260408083206001600160a01b0388168452909152812055611292565b61126d818463ffffffff61174916565b336000908152600b602090815260408083206001600160a01b03891684529091529020555b336000818152600b602090815260408083206001600160a01b0389168085529252918290205491519092917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925916112e9919061270b565b60405180910390a35060019392505050565b6000826001600160a01b03811661131157600080fd5b6001600160a01b03811630141561132757600080fd5b60095460009061134b906108ec8669d3c21bcecceda100000063ffffffff61178b16565b336000908152600a602052604090205490915061136e908263ffffffff61174916565b336000908152600a6020526040808220929092556001600160a01b038716815220546113a0908263ffffffff61180716565b6001600160a01b0386166000818152600a60205260409081902092909255905133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906113ef90889061270b565b60405180910390a3336000908152600d6020526040808220546001600160a01b038881168452919092205461142892821691168361182c565b506001949350505050565b6001600160a01b0381166000908152600f602052604081205463ffffffff168061145e57600061111d565b6001600160a01b0383166000908152600e6020908152604080832063ffffffff60001986011684529091529020600101549392505050565b60006040516114a4906126a3565b604051809103902060016040516114bb9190612666565b60405180910390206114cb611b11565b306040516020016114df9493929190612757565b6040516020818303038152906040528051906020012090506000604051611505906126ae565b604051908190038120611520918a908a908a90602001612719565b6040516020818303038152906040528051906020012090506000828260405160200161154d929190612672565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161158a949392919061278c565b6020604051602081039080840390855afa1580156115ac573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115df5760405162461bcd60e51b81526004016106d690612868565b6001600160a01b0381166000908152601060205260409020805460018101909155891461161e5760405162461bcd60e51b81526004016106d6906127b8565b8742111561163e5760405162461bcd60e51b81526004016106d690612808565b611648818b611a91565b505050505b505050505050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b604051610753906126ae565b670de0b6b3a764000081565b600e6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b60035461010090046001600160a01b031633146116e157600080fd5b600580546001600160a01b038381166001600160a01b03198316179092556040519116907f51f448520e2183de499e224808a409ee01a1f380edb2e8497572320c1503054590610dde90839085906126c7565b6000600c546000198161174357fe5b04905090565b600061111d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b15565b60008261179a5750600061066e565b828202828482816117a757fe5b041461111d5760405162461bcd60e51b81526004016106d690612838565b600061111d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611b41565b60008282018381101561111d5760405162461bcd60e51b81526004016106d6906127e8565b816001600160a01b0316836001600160a01b03161415801561184e5750600081115b15611975576001600160a01b038316156118e6576001600160a01b0383166000908152600f602052604081205463ffffffff16908161188e5760006118c0565b6001600160a01b0385166000908152600e6020908152604080832063ffffffff60001987011684529091529020600101545b905060006118d4828563ffffffff61174916565b90506118e286848484611b78565b5050505b6001600160a01b03821615611975576001600160a01b0382166000908152600f602052604081205463ffffffff169081611921576000611953565b6001600160a01b0384166000908152600e6020908152604080832063ffffffff60001987011684529091529020600101545b90506000611967828563ffffffff61180716565b905061164d85848484611b78565b505050565b60085461198d908263ffffffff61180716565b6008556009546000906119b4906108ec8469d3c21bcecceda100000063ffffffff61178b16565b600c549091506119ca908263ffffffff61180716565b600c556119d5611734565b60095411156119f65760405162461bcd60e51b81526004016106d690612878565b6001600160a01b0383166000908152600a6020526040902054611a1f908263ffffffff61180716565b6001600160a01b038085166000908152600a6020908152604080832094909455600d905291822054611a539291168361182c565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858383604051611a849291906126e2565b60405180910390a1505050565b6001600160a01b038083166000818152600d602081815260408084208054600a845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611b0b82848361182c565b50505050565b4690565b60008184841115611b395760405162461bcd60e51b81526004016106d691906127a7565b505050900390565b60008183611b625760405162461bcd60e51b81526004016106d691906127a7565b506000838581611b6e57fe5b0495945050505050565b6000611b9c436040518060600160405280603581526020016129fb60359139611cdd565b905060008463ffffffff16118015611be557506001600160a01b0385166000908152600e6020908152604080832063ffffffff6000198901811685529252909120548282169116145b15611c22576001600160a01b0385166000908152600e6020908152604080832063ffffffff60001989011684529091529020600101829055611c93565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600e84528681208b8616825284528681209551865490861663ffffffff199182161787559251600196870155908152600f9092529390208054928801909116919092161790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611cce929190612888565b60405180910390a25050505050565b6000816401000000008410611d055760405162461bcd60e51b81526004016106d691906127a7565b509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611d4e57805160ff1916838001178555611d7b565b82800160010185558215611d7b579182015b82811115611d7b578251825591602001919060010190611d60565b50611d87929150611da2565b5090565b604080518082019091526000808252602082015290565b61068191905b80821115611d875760008155600101611da8565b803561066e816129c2565b803561066e816129d6565b803561066e816129df565b600082601f830112611dee57600080fd5b8135611e01611dfc8261290f565b6128e8565b91508082526020830160208301858383011115611e1d57600080fd5b611e28838284612980565b50505092915050565b803561066e816129e8565b803561066e816129f1565b600060208284031215611e5957600080fd5b6000611e658484611dbc565b949350505050565b60008060408385031215611e8057600080fd5b6000611e8c8585611dbc565b9250506020611e9d85828601611dbc565b9150509250929050565b600080600060608486031215611ebc57600080fd5b6000611ec88686611dbc565b9350506020611ed986828701611dbc565b9250506040611eea86828701611dd2565b9150509250925092565b60008060408385031215611f0757600080fd5b6000611f138585611dbc565b9250506020611e9d85828601611dd2565b60008060008060008060c08789031215611f3d57600080fd5b6000611f498989611dbc565b9650506020611f5a89828a01611dd2565b9550506040611f6b89828a01611dd2565b9450506060611f7c89828a01611e3c565b9350506080611f8d89828a01611dd2565b92505060a0611f9e89828a01611dd2565b9150509295509295509295565b60008060408385031215611fbe57600080fd5b6000611fca8585611dbc565b9250506020611e9d85828601611e31565b600060208284031215611fed57600080fd5b813567ffffffffffffffff81111561200457600080fd5b611e6584828501611ddd565b60008060006060848603121561202557600080fd5b833567ffffffffffffffff81111561203c57600080fd5b61204886828701611ddd565b935050602084013567ffffffffffffffff81111561206557600080fd5b61207186828701611ddd565b9250506040611eea86828701611e3c565b600080600080600060a0868803121561209a57600080fd5b853567ffffffffffffffff8111156120b157600080fd5b6120bd88828901611ddd565b955050602086013567ffffffffffffffff8111156120da57600080fd5b6120e688828901611ddd565b94505060406120f788828901611e3c565b935050606061210888828901611dbc565b925050608061211988828901611dd2565b9150509295509295909350565b60008060006060848603121561213b57600080fd5b60006121478686611dd2565b935050602061215886828701611dd2565b9250506040611eea86828701611dc7565b61217281612955565b82525050565b61217281612960565b61217281610681565b61217261219682610681565b610681565b6000815460018116600081146121b857600181146121db5761221a565b607f60028304166121c98187612947565b60ff198416815295508501925061221a565b600282046121e98187612947565b95506121f485612937565b60005b82811015612213578154888201526001909101906020016121f7565b5050850192505b505092915050565b600061222d82612943565b612237818561294c565b935061224781856020860161298c565b612250816129b8565b9093019392505050565b600061226760238361294c565b7f444f4e44493a3a64656c656761746542795369673a20696e76616c6964206e6f8152626e636560e81b602082015260400192915050565b60006122ac600d8361294c565b6c3020696e697420737570706c7960981b815260200192915050565b60006122d560288361294c565b7f444f4e44493a3a6765745072696f72566f7465733a206e6f74207965742064658152671d195c9b5a5b995960c21b602082015260400192915050565b600061231f600283612947565b61190160f01b815260020192915050565b600061233d601b8361294c565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000612376602b8361294c565b7f6f6e6c792074686520676f76206d61792063616c6c205f72657369676e496d7081526a3632b6b2b73a30ba34b7b760a91b602082015260400192915050565b60006123c360278361294c565b7f444f4e44493a3a64656c656761746542795369673a207369676e617475726520815266195e1c1a5c995960ca1b602082015260400192915050565b600061240c60138361294c565b72185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b815260200192915050565b600061243b602b8361294c565b7f6f6e6c792074686520676f76206d61792063616c6c205f6265636f6d65496d7081526a3632b6b2b73a30ba34b7b760a91b602082015260400192915050565b6000612488604383612947565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b60006124f360218361294c565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061253660088361294c565b672170656e64696e6760c01b815260200192915050565b600061255a600a8361294c565b693737ba1036b4b73a32b960b11b815260200192915050565b600061258060278361294c565b7f444f4e44493a3a64656c656761746542795369673a20696e76616c6964207369815266676e617475726560c81b602082015260400192915050565b60006125c9603a83612947565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020820152603a0192915050565b6000612628601a8361294c565b7f6d6178207363616c696e6720666163746f7220746f6f206c6f77000000000000815260200192915050565b61217281612971565b6121728161297a565b600061111d828461219b565b600061267d82612312565b9150612689828561218a565b602082019150612699828461218a565b5060200192915050565b600061066e8261247b565b600061066e826125bc565b6020810161066e8284612169565b604081016126d58285612169565b61111d6020830184612169565b604081016126f08285612169565b61111d6020830184612181565b6020810161066e8284612178565b6020810161066e8284612181565b608081016127278287612181565b6127346020830186612169565b6127416040830185612181565b61274e6060830184612181565b95945050505050565b608081016127658287612181565b6127726020830186612181565b61277f6040830185612181565b61274e6060830184612169565b6080810161279a8287612181565b612734602083018661265d565b6020808252810161111d8184612222565b6020808252810161066e8161225a565b6020808252810161066e8161229f565b6020808252810161066e816122c8565b6020808252810161066e81612330565b6020808252810161066e81612369565b6020808252810161066e816123b6565b6020808252810161066e816123ff565b6020808252810161066e8161242e565b6020808252810161066e816124e6565b6020808252810161066e81612529565b6020808252810161066e8161254d565b6020808252810161066e81612573565b6020808252810161066e8161261b565b604081016126f08285612181565b606081016128a48286612181565b6128b16020830185612181565b611e656040830184612181565b6020810161066e8284612654565b604081016126f08285612654565b6020810161066e828461265d565b60405181810167ffffffffffffffff8111828210171561290757600080fd5b604052919050565b600067ffffffffffffffff82111561292657600080fd5b506020601f91909101601f19160190565b60009081526020902090565b5190565b919050565b90815260200190565b600061066e82612965565b151590565b6001600160a01b031690565b63ffffffff1690565b60ff1690565b82818337506000910152565b60005b838110156129a757818101518382015260200161298f565b83811115611b0b5750506000910152565b601f01601f191690565b6129cb81612955565b8114610c2357600080fd5b6129cb81612960565b6129cb81610681565b6129cb81612971565b6129cb8161297a56fe444f4e44493a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a365627a7a7231582018bf2dbd31cd926562b9039a54c3502ed5798ba1dfff61b52f450e89a2dad31e6c6578706572696d656e74616cf564736f6c63430005110040
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061027f5760003560e01c80635c60da1b1161015c57806397d63f93116100ce578063c3cda52011610087578063c3cda52014610512578063dd62ed3e14610525578063e7a324dc14610538578063ec342ad014610540578063f1127ed814610548578063fa8f3455146105695761027f565b806397d63f93146104b657806398dca210146104be578063a1a88ff7146104d1578063a457c2d7146104d9578063a9059cbb146104ec578063b4b5ea57146104ff5761027f565b806370a082311161012057806370a082311461044f57806373f03dff14610462578063782d6fe1146104755780637af548c1146104885780637ecebe001461049b57806395d89b41146104ae5761027f565b80635c60da1b1461040457806364dd48f51461040c5780636c945221146104145780636fc6407c146104275780636fcfff451461042f5761027f565b806323b872dd116101f55780633dd08c38116101b95780633dd08c381461039d57806340c10f19146103b05780634bda2e20146103c357806356e67728146103cb578063587cde1e146103de5780635c19a95c146103f15761027f565b806323b872dd14610347578063252408101461035a578063313ce5671461036257806339509351146103775780633af9e6691461038a5761027f565b8063153ab50511610247578063153ab505146102f45780631624f6c6146102fe57806318160ddd1461031157806320606b7014610319578063210c5a56146103215780632373f091146103345761027f565b806306fdde0314610284578063095ea7b3146102a257806311d3e6c4146102c257806311fd8a83146102d757806312d43a51146102ec575b600080fd5b61028c61057c565b60405161029991906127a7565b60405180910390f35b6102b56102b0366004611ef4565b610609565b60405161029991906126fd565b6102ca610674565b604051610299919061270b565b6102df610684565b60405161029991906126b9565b6102df610693565b6102fc6106a7565b005b6102fc61030c366004612010565b6106e1565b6102ca610741565b6102ca610747565b6102fc61032f366004611e47565b61075e565b6102fc610342366004611e47565b6107d5565b6102b5610355366004611ea7565b610844565b6102df6109f1565b61036a610a00565b60405161029991906128da565b6102b5610385366004611ef4565b610a09565b6102ca610398366004611e47565b610a95565b6102b56103ab366004611e47565b610ab0565b6102b56103be366004611ef4565b610ac5565b6102fc610b53565b6102fc6103d9366004611fdb565b610bf4565b6102df6103ec366004611e47565b610c26565b6102fc6103ff366004611e47565b610c44565b6102df610c4e565b6102ca610c5d565b6102fc610422366004612082565b610c6b565b6102df610d0a565b61044261043d366004611e47565b610d19565b60405161029991906128be565b6102ca61045d366004611e47565b610d31565b6102fc610470366004611e47565b610d6f565b6102ca610483366004611ef4565b610dea565b6102ca610496366004612126565b610fd3565b6102ca6104a9366004611e47565b611124565b61028c611136565b6102ca61118e565b6102fc6104cc366004611e47565b611194565b6102ca611203565b6102b56104e7366004611ef4565b611209565b6102b56104fa366004611ef4565b6112fb565b6102ca61050d366004611e47565b611433565b6102fc610520366004611f24565b611496565b6102ca610533366004611e6d565b611655565b6102ca611680565b6102ca61168c565b61055b610556366004611fab565b611698565b6040516102999291906128cc565b6102fc610577366004611e47565b6116c5565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156106015780601f106105d657610100808354040283529160200191610601565b820191906000526020600020905b8154815290600101906020018083116105e457829003601f168201915b505050505081565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061066290869061270b565b60405180910390a35060015b92915050565b600061067e611734565b90505b90565b6005546001600160a01b031681565b60035461010090046001600160a01b031681565b60035461010090046001600160a01b031633146106df5760405162461bcd60e51b81526004016106d6906127f8565b60405180910390fd5b565b600954156107015760405162461bcd60e51b81526004016106d690612818565b8251610714906001906020860190611d0d565b508151610728906002906020850190611d0d565b506003805460ff191660ff929092169190911790555050565b60085481565b604051610753906126a3565b604051809103902081565b60035461010090046001600160a01b0316331461077a57600080fd5b6001600160a01b03811660009081526006602052604090819020805460ff19169055517f2f91b591fc56ac0917953ad01ec225524ee5ef0555213e4c8a9d8c9728ee7ffb906107ca9083906126b9565b60405180910390a150565b60035461010090046001600160a01b031633146107f157600080fd5b6001600160a01b03811660009081526006602052604090819020805460ff19166001179055517f6adffd5c93085d835dac6f3b40adf7c242ca4b3284048d20c3d8a501748dc973906107ca9083906126b9565b6000826001600160a01b03811661085a57600080fd5b6001600160a01b03811630141561087057600080fd5b6001600160a01b0385166000908152600b602090815260408083203384529091529020546108a4908463ffffffff61174916565b6001600160a01b0386166000908152600b602090815260408083203384529091528120919091556009546108f8906108ec8669d3c21bcecceda100000063ffffffff61178b16565b9063ffffffff6117c516565b6001600160a01b0387166000908152600a6020526040902054909150610924908263ffffffff61174916565b6001600160a01b038088166000908152600a60205260408082209390935590871681522054610959908263ffffffff61180716565b6001600160a01b038087166000818152600a602052604090819020939093559151908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109ab90889061270b565b60405180910390a36001600160a01b038087166000908152600d60205260408082205488841683529120546109e59291821691168361182c565b50600195945050505050565b6004546001600160a01b031681565b60035460ff1681565b336000908152600b602090815260408083206001600160a01b0386168452909152812054610a3d908363ffffffff61180716565b336000818152600b602090815260408083206001600160a01b038916808552925291829020849055905190927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591610662919061270b565b6001600160a01b03166000908152600a602052604090205490565b60066020526000908152604090205460ff1681565b6005546000906001600160a01b0316331480610aeb57506007546001600160a01b031633145b80610b05575060035461010090046001600160a01b031633145b80610b2457503360009081526006602052604090205460ff1615156001145b610b405760405162461bcd60e51b81526004016106d690612858565b610b4a838361197a565b50600192915050565b6004546001600160a01b03163314610b7d5760405162461bcd60e51b81526004016106d690612848565b60038054600480546001600160a01b03818116610100908102610100600160a81b0319861617958690556001600160a01b0319909216909255604051928190048216937f1f14cfc03e486d23acee577b07bc0b3b23f4888c91fcdba5e0fef5a2549d5523936107ca938693909204909116906126c7565b60035461010090046001600160a01b03163314610c235760405162461bcd60e51b81526004016106d690612828565b50565b6001600160a01b039081166000908152600d60205260409020541690565b610c233382611a91565b6011546001600160a01b031681565b69d3c21bcecceda100000081565b60008111610c8b5760405162461bcd60e51b81526004016106d6906127c8565b610c968585856106e1565b610cbd670de0b6b3a764000069d3c21bcecceda10000005b8391900463ffffffff61178b16565b600c556008819055670de0b6b3a76400006009819055610ce79069d3c21bcecceda1000000610cae565b6001600160a01b039092166000908152600a602052604090209190915550505050565b6007546001600160a01b031681565b600f6020526000908152604090205463ffffffff1681565b6009546001600160a01b0382166000908152600a6020526040812054909161066e9169d3c21bcecceda1000000916108ec919063ffffffff61178b16565b60035461010090046001600160a01b03163314610d8b57600080fd5b600480546001600160a01b038381166001600160a01b03198316179092556040519116907f6163d5b9efd962645dd649e6e48a61bcb0f9df00997a2398b80d135a9ab0c61e90610dde90839085906126c7565b60405180910390a15050565b6000438210610e0b5760405162461bcd60e51b81526004016106d6906127d8565b6001600160a01b0383166000908152600f602052604090205463ffffffff1680610e3957600091505061066e565b6001600160a01b0384166000908152600e6020908152604080832063ffffffff600019860181168552925290912054168310610ea8576001600160a01b0384166000908152600e602090815260408083206000199490940163ffffffff1683529290522060010154905061066e565b6001600160a01b0384166000908152600e6020908152604080832083805290915290205463ffffffff16831015610ee357600091505061066e565b600060001982015b8163ffffffff168163ffffffff161115610f9c57600282820363ffffffff16048103610f15611d8b565b506001600160a01b0387166000908152600e6020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915290871415610f775760200151945061066e9350505050565b805163ffffffff16871115610f8e57819350610f95565b6001820392505b5050610eeb565b506001600160a01b0385166000908152600e6020908152604080832063ffffffff9094168352929052206001015491505092915050565b6005546000906001600160a01b03163314610fed57600080fd5b8261103a577fc6642d24d84e7f3d36ca39f5cce10e75639d9b158d5193aa350e2f900653e4c08460095460095460405161102993929190612896565b60405180910390a15060085461111d565b6009548261107857611070670de0b6b3a76400006108ec611061828863ffffffff61174916565b6009549063ffffffff61178b16565b6009556110c2565b6000611099670de0b6b3a76400006108ec611061828963ffffffff61180716565b90506110a3611734565b8110156110b45760098190556110c0565b6110bc611734565b6009555b505b600954600c546110d79163ffffffff61178b16565b6008556009546040517fc6642d24d84e7f3d36ca39f5cce10e75639d9b158d5193aa350e2f900653e4c09161110f9188918591612896565b60405180910390a150506008545b9392505050565b60106020526000908152604090205481565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156106015780601f106105d657610100808354040283529160200191610601565b600c5481565b60035461010090046001600160a01b031633146111b057600080fd5b600780546001600160a01b038381166001600160a01b03198316179092556040519116907f2ee668ca7d17a9122dc00c0bfd73b684f2f7d681f17733cc02b294f69f1b389690610dde90839085906126c7565b60095481565b336000908152600b602090815260408083206001600160a01b038616845290915281205480831061125d57336000908152600b602090815260408083206001600160a01b0388168452909152812055611292565b61126d818463ffffffff61174916565b336000908152600b602090815260408083206001600160a01b03891684529091529020555b336000818152600b602090815260408083206001600160a01b0389168085529252918290205491519092917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925916112e9919061270b565b60405180910390a35060019392505050565b6000826001600160a01b03811661131157600080fd5b6001600160a01b03811630141561132757600080fd5b60095460009061134b906108ec8669d3c21bcecceda100000063ffffffff61178b16565b336000908152600a602052604090205490915061136e908263ffffffff61174916565b336000908152600a6020526040808220929092556001600160a01b038716815220546113a0908263ffffffff61180716565b6001600160a01b0386166000818152600a60205260409081902092909255905133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906113ef90889061270b565b60405180910390a3336000908152600d6020526040808220546001600160a01b038881168452919092205461142892821691168361182c565b506001949350505050565b6001600160a01b0381166000908152600f602052604081205463ffffffff168061145e57600061111d565b6001600160a01b0383166000908152600e6020908152604080832063ffffffff60001986011684529091529020600101549392505050565b60006040516114a4906126a3565b604051809103902060016040516114bb9190612666565b60405180910390206114cb611b11565b306040516020016114df9493929190612757565b6040516020818303038152906040528051906020012090506000604051611505906126ae565b604051908190038120611520918a908a908a90602001612719565b6040516020818303038152906040528051906020012090506000828260405160200161154d929190612672565b60405160208183030381529060405280519060200120905060006001828888886040516000815260200160405260405161158a949392919061278c565b6020604051602081039080840390855afa1580156115ac573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115df5760405162461bcd60e51b81526004016106d690612868565b6001600160a01b0381166000908152601060205260409020805460018101909155891461161e5760405162461bcd60e51b81526004016106d6906127b8565b8742111561163e5760405162461bcd60e51b81526004016106d690612808565b611648818b611a91565b505050505b505050505050565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b604051610753906126ae565b670de0b6b3a764000081565b600e6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b60035461010090046001600160a01b031633146116e157600080fd5b600580546001600160a01b038381166001600160a01b03198316179092556040519116907f51f448520e2183de499e224808a409ee01a1f380edb2e8497572320c1503054590610dde90839085906126c7565b6000600c546000198161174357fe5b04905090565b600061111d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b15565b60008261179a5750600061066e565b828202828482816117a757fe5b041461111d5760405162461bcd60e51b81526004016106d690612838565b600061111d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611b41565b60008282018381101561111d5760405162461bcd60e51b81526004016106d6906127e8565b816001600160a01b0316836001600160a01b03161415801561184e5750600081115b15611975576001600160a01b038316156118e6576001600160a01b0383166000908152600f602052604081205463ffffffff16908161188e5760006118c0565b6001600160a01b0385166000908152600e6020908152604080832063ffffffff60001987011684529091529020600101545b905060006118d4828563ffffffff61174916565b90506118e286848484611b78565b5050505b6001600160a01b03821615611975576001600160a01b0382166000908152600f602052604081205463ffffffff169081611921576000611953565b6001600160a01b0384166000908152600e6020908152604080832063ffffffff60001987011684529091529020600101545b90506000611967828563ffffffff61180716565b905061164d85848484611b78565b505050565b60085461198d908263ffffffff61180716565b6008556009546000906119b4906108ec8469d3c21bcecceda100000063ffffffff61178b16565b600c549091506119ca908263ffffffff61180716565b600c556119d5611734565b60095411156119f65760405162461bcd60e51b81526004016106d690612878565b6001600160a01b0383166000908152600a6020526040902054611a1f908263ffffffff61180716565b6001600160a01b038085166000908152600a6020908152604080832094909455600d905291822054611a539291168361182c565b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858383604051611a849291906126e2565b60405180910390a1505050565b6001600160a01b038083166000818152600d602081815260408084208054600a845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611b0b82848361182c565b50505050565b4690565b60008184841115611b395760405162461bcd60e51b81526004016106d691906127a7565b505050900390565b60008183611b625760405162461bcd60e51b81526004016106d691906127a7565b506000838581611b6e57fe5b0495945050505050565b6000611b9c436040518060600160405280603581526020016129fb60359139611cdd565b905060008463ffffffff16118015611be557506001600160a01b0385166000908152600e6020908152604080832063ffffffff6000198901811685529252909120548282169116145b15611c22576001600160a01b0385166000908152600e6020908152604080832063ffffffff60001989011684529091529020600101829055611c93565b60408051808201825263ffffffff808416825260208083018681526001600160a01b038a166000818152600e84528681208b8616825284528681209551865490861663ffffffff199182161787559251600196870155908152600f9092529390208054928801909116919092161790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611cce929190612888565b60405180910390a25050505050565b6000816401000000008410611d055760405162461bcd60e51b81526004016106d691906127a7565b509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611d4e57805160ff1916838001178555611d7b565b82800160010185558215611d7b579182015b82811115611d7b578251825591602001919060010190611d60565b50611d87929150611da2565b5090565b604080518082019091526000808252602082015290565b61068191905b80821115611d875760008155600101611da8565b803561066e816129c2565b803561066e816129d6565b803561066e816129df565b600082601f830112611dee57600080fd5b8135611e01611dfc8261290f565b6128e8565b91508082526020830160208301858383011115611e1d57600080fd5b611e28838284612980565b50505092915050565b803561066e816129e8565b803561066e816129f1565b600060208284031215611e5957600080fd5b6000611e658484611dbc565b949350505050565b60008060408385031215611e8057600080fd5b6000611e8c8585611dbc565b9250506020611e9d85828601611dbc565b9150509250929050565b600080600060608486031215611ebc57600080fd5b6000611ec88686611dbc565b9350506020611ed986828701611dbc565b9250506040611eea86828701611dd2565b9150509250925092565b60008060408385031215611f0757600080fd5b6000611f138585611dbc565b9250506020611e9d85828601611dd2565b60008060008060008060c08789031215611f3d57600080fd5b6000611f498989611dbc565b9650506020611f5a89828a01611dd2565b9550506040611f6b89828a01611dd2565b9450506060611f7c89828a01611e3c565b9350506080611f8d89828a01611dd2565b92505060a0611f9e89828a01611dd2565b9150509295509295509295565b60008060408385031215611fbe57600080fd5b6000611fca8585611dbc565b9250506020611e9d85828601611e31565b600060208284031215611fed57600080fd5b813567ffffffffffffffff81111561200457600080fd5b611e6584828501611ddd565b60008060006060848603121561202557600080fd5b833567ffffffffffffffff81111561203c57600080fd5b61204886828701611ddd565b935050602084013567ffffffffffffffff81111561206557600080fd5b61207186828701611ddd565b9250506040611eea86828701611e3c565b600080600080600060a0868803121561209a57600080fd5b853567ffffffffffffffff8111156120b157600080fd5b6120bd88828901611ddd565b955050602086013567ffffffffffffffff8111156120da57600080fd5b6120e688828901611ddd565b94505060406120f788828901611e3c565b935050606061210888828901611dbc565b925050608061211988828901611dd2565b9150509295509295909350565b60008060006060848603121561213b57600080fd5b60006121478686611dd2565b935050602061215886828701611dd2565b9250506040611eea86828701611dc7565b61217281612955565b82525050565b61217281612960565b61217281610681565b61217261219682610681565b610681565b6000815460018116600081146121b857600181146121db5761221a565b607f60028304166121c98187612947565b60ff198416815295508501925061221a565b600282046121e98187612947565b95506121f485612937565b60005b82811015612213578154888201526001909101906020016121f7565b5050850192505b505092915050565b600061222d82612943565b612237818561294c565b935061224781856020860161298c565b612250816129b8565b9093019392505050565b600061226760238361294c565b7f444f4e44493a3a64656c656761746542795369673a20696e76616c6964206e6f8152626e636560e81b602082015260400192915050565b60006122ac600d8361294c565b6c3020696e697420737570706c7960981b815260200192915050565b60006122d560288361294c565b7f444f4e44493a3a6765745072696f72566f7465733a206e6f74207965742064658152671d195c9b5a5b995960c21b602082015260400192915050565b600061231f600283612947565b61190160f01b815260020192915050565b600061233d601b8361294c565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000612376602b8361294c565b7f6f6e6c792074686520676f76206d61792063616c6c205f72657369676e496d7081526a3632b6b2b73a30ba34b7b760a91b602082015260400192915050565b60006123c360278361294c565b7f444f4e44493a3a64656c656761746542795369673a207369676e617475726520815266195e1c1a5c995960ca1b602082015260400192915050565b600061240c60138361294c565b72185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b815260200192915050565b600061243b602b8361294c565b7f6f6e6c792074686520676f76206d61792063616c6c205f6265636f6d65496d7081526a3632b6b2b73a30ba34b7b760a91b602082015260400192915050565b6000612488604383612947565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b60006124f360218361294c565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061253660088361294c565b672170656e64696e6760c01b815260200192915050565b600061255a600a8361294c565b693737ba1036b4b73a32b960b11b815260200192915050565b600061258060278361294c565b7f444f4e44493a3a64656c656761746542795369673a20696e76616c6964207369815266676e617475726560c81b602082015260400192915050565b60006125c9603a83612947565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206e6f6e63652c75696e7432353620657870697279290000000000006020820152603a0192915050565b6000612628601a8361294c565b7f6d6178207363616c696e6720666163746f7220746f6f206c6f77000000000000815260200192915050565b61217281612971565b6121728161297a565b600061111d828461219b565b600061267d82612312565b9150612689828561218a565b602082019150612699828461218a565b5060200192915050565b600061066e8261247b565b600061066e826125bc565b6020810161066e8284612169565b604081016126d58285612169565b61111d6020830184612169565b604081016126f08285612169565b61111d6020830184612181565b6020810161066e8284612178565b6020810161066e8284612181565b608081016127278287612181565b6127346020830186612169565b6127416040830185612181565b61274e6060830184612181565b95945050505050565b608081016127658287612181565b6127726020830186612181565b61277f6040830185612181565b61274e6060830184612169565b6080810161279a8287612181565b612734602083018661265d565b6020808252810161111d8184612222565b6020808252810161066e8161225a565b6020808252810161066e8161229f565b6020808252810161066e816122c8565b6020808252810161066e81612330565b6020808252810161066e81612369565b6020808252810161066e816123b6565b6020808252810161066e816123ff565b6020808252810161066e8161242e565b6020808252810161066e816124e6565b6020808252810161066e81612529565b6020808252810161066e8161254d565b6020808252810161066e81612573565b6020808252810161066e8161261b565b604081016126f08285612181565b606081016128a48286612181565b6128b16020830185612181565b611e656040830184612181565b6020810161066e8284612654565b604081016126f08285612654565b6020810161066e828461265d565b60405181810167ffffffffffffffff8111828210171561290757600080fd5b604052919050565b600067ffffffffffffffff82111561292657600080fd5b506020601f91909101601f19160190565b60009081526020902090565b5190565b919050565b90815260200190565b600061066e82612965565b151590565b6001600160a01b031690565b63ffffffff1690565b60ff1690565b82818337506000910152565b60005b838110156129a757818101518382015260200161298f565b83811115611b0b5750506000910152565b601f01601f191690565b6129cb81612955565b8114610c2357600080fd5b6129cb81612960565b6129cb81610681565b6129cb81612971565b6129cb8161297a56fe444f4e44493a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a365627a7a7231582018bf2dbd31cd926562b9039a54c3502ed5798ba1dfff61b52f450e89a2dad31e6c6578706572696d656e74616cf564736f6c63430005110040
Deployed Bytecode Sourcemap
32294:1053:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32294:1053:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5657:18;;;:::i;:::-;;;;;;;;;;;;;;;;25020:235;;;;;;;;;:::i;:::-;;;;;;;;19653:137;;;:::i;:::-;;;;;;;;6145:22;;;:::i;:::-;;;;;;;;5944:18;;;:::i;33069:275::-;;;:::i;:::-;;19279:292;;;;;;;;;:::i;6384:26::-;;;:::i;7616:122::-;;;:::i;27692:159::-;;;;;;;;;:::i;27532:152::-;;;;;;;;;:::i;22581:690::-;;;;;;;;;:::i;6042:25::-;;;:::i;5853:21::-;;;:::i;:::-;;;;;;;;25628:345;;;;;;;;;:::i;23752:143::-;;;;;;;;;:::i;6176:38::-;;;;;;;;;:::i;20297:167::-;;;;;;;;;:::i;28301:236::-;;;:::i;32614:345::-;;;;;;;;;:::i;12099:149::-;;;;;;;;;:::i;12392:104::-;;;;;;;;;:::i;30990:29::-;;;:::i;6501:49::-;;;:::i;30210:657::-;;;;;;;;;:::i;6291:27::-;;;:::i;7494:49::-;;;;;;;;;:::i;:::-;;;;;;;;23389:180;;;;;;;;;:::i;27995:230::-;;;;;;;;;:::i;14996:1254::-;;;;;;;;;:::i;28925:1014::-;;;;;;;;;:::i;8030:39::-;;;;;;;;;:::i;5753:20::-;;;:::i;6936:25::-;;;:::i;27276:248::-;;;;;;;;;:::i;6747:34::-;;;:::i;26235:514::-;;;;;;;;;:::i;21455:869::-;;;;;;;;;:::i;14310:255::-;;;;;;;;;:::i;12930:1179::-;;;;;;;;;:::i;24202:176::-;;;;;;;;;:::i;7832:117::-;;;:::i;6619:37::-;;;:::i;7355:70::-;;;;;;;;;:::i;:::-;;;;;;;;;26925:203;;;;;;;;;:::i;5657:18::-;;;;;;;;;;;;;;;-1:-1:-1;;5657:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25020:235::-;25145:10;25105:4;25127:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;25127:38:0;;;;;;;;;;:46;;;25189:36;25105:4;;25127:38;;25189:36;;;;25168:5;;25189:36;;;;;;;;;;-1:-1:-1;25243:4:0;25020:235;;;;;:::o;19653:137::-;19731:7;19763:19;:17;:19::i;:::-;19756:26;;19653:137;;:::o;6145:22::-;;;-1:-1:-1;;;;;6145:22:0;;:::o;5944:18::-;;;;;;-1:-1:-1;;;;;5944:18:0;;:::o;33069:275::-;33285:3;;;;;-1:-1:-1;;;;;33285:3:0;33271:10;:17;33263:73;;;;-1:-1:-1;;;33263:73:0;;;;;;;;;;;;;;;;;33069:275::o;19279:292::-;19434:19;;:24;19426:56;;;;-1:-1:-1;;;19426:56:0;;;;;;;;;19493:12;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;19516:16:0;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;19543:8:0;:20;;-1:-1:-1;;19543:20:0;;;;;;;;;;;;-1:-1:-1;;19279:292:0:o;6384:26::-;;;;:::o;7616:122::-;7658:80;;;;;;;;;;;;;;7616:122;:::o;27692:159::-;18828:3;;;;;-1:-1:-1;;;;;18828:3:0;18814:10;:17;18806:26;;;;;;-1:-1:-1;;;;;27783:15:0;;27801:5;27783:15;;;:6;:15;;;;;;;:23;;-1:-1:-1;;27783:23:0;;;27822:21;;;;;27790:7;;27822:21;;;;;;;;;;27692:159;:::o;27532:152::-;18828:3;;;;;-1:-1:-1;;;;;18828:3:0;18814:10;:17;18806:26;;;;;;-1:-1:-1;;;;;27620:15:0;;;;;;:6;:15;;;;;;;:22;;-1:-1:-1;;27620:22:0;27638:4;27620:22;;;27658:18;;;;;27627:7;;27658:18;;22581:690;22708:4;22686:2;-1:-1:-1;;;;;19193:18:0;;19185:27;;;;;;-1:-1:-1;;;;;19231:19:0;;19245:4;19231:19;;19223:28;;;;;;-1:-1:-1;;;;;22799:23:0;;;;;;:17;:23;;;;;;;;22823:10;22799:35;;;;;;;;:46;;22839:5;22799:46;:39;:46;:::i;:::-;-1:-1:-1;;;;;22761:23:0;;;;;;:17;:23;;;;;;;;22785:10;22761:35;;;;;;;:84;;;;22943:19;;22911:52;;:27;:5;6544:6;22911:27;:9;:27;:::i;:::-;:31;:52;:31;:52;:::i;:::-;-1:-1:-1;;;;;23025:20:0;;;;;;:14;:20;;;;;;22890:73;;-1:-1:-1;23025:36:0;;22890:73;23025:36;:24;:36;:::i;:::-;-1:-1:-1;;;;;23002:20:0;;;;;;;:14;:20;;;;;;:59;;;;23093:18;;;;;;;:34;;23116:10;23093:34;:22;:34;:::i;:::-;-1:-1:-1;;;;;23072:18:0;;;;;;;:14;:18;;;;;;;:55;;;;23143:25;;;;;;;;;;23162:5;;23143:25;;;;;;;;;;-1:-1:-1;;;;;23196:16:0;;;;;;;:10;:16;;;;;;;23214:14;;;;;;;;23181:60;;23196:16;;;;23214:14;23230:10;23181:14;:60::i;:::-;-1:-1:-1;23259:4:0;;22581:690;-1:-1:-1;;;;;22581:690:0:o;6042:25::-;;;-1:-1:-1;;;;;6042:25:0;;:::o;5853:21::-;;;;;;:::o;25628:345::-;25822:10;25728:4;25804:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;25804:38:0;;;;;;;;;;:54;;25847:10;25804:54;:42;:54;:::i;:::-;25768:10;25750:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;25750:38:0;;;;;;;;;;;:108;;;25874:69;;25750:38;;25874:69;;;;25750:108;25874:69;;23752:143;-1:-1:-1;;;;;23868:19:0;23838:7;23868:19;;;:14;:19;;;;;;;23752:143::o;6176:38::-;;;;;;;;;;;;;;;:::o;20297:167::-;19007:7;;20395:4;;-1:-1:-1;;;;;19007:7:0;18993:10;:21;;:51;;-1:-1:-1;19032:12:0;;-1:-1:-1;;;;;19032:12:0;19018:10;:26;18993:51;:72;;;-1:-1:-1;19062:3:0;;;;;-1:-1:-1;;;;;19062:3:0;19048:10;:17;18993:72;:102;;;-1:-1:-1;19076:10:0;19069:18;;;;:6;:18;;;;;;;;:26;;:18;:26;18993:102;18985:125;;;;-1:-1:-1;;;18985:125:0;;;;;;;;;20417:17;20423:2;20427:6;20417:5;:17::i;:::-;-1:-1:-1;20452:4:0;20297:167;;;;:::o;28301:236::-;28379:10;;-1:-1:-1;;;;;28379:10:0;28365;:24;28357:45;;;;-1:-1:-1;;;28357:45:0;;;;;;;;;28430:3;;;28450:10;;;-1:-1:-1;;;;;28450:10:0;;;28430:3;28444:16;;;-1:-1:-1;;;;;;28444:16:0;;;;;;;-1:-1:-1;;;;;;28471:23:0;;;;;;28510:19;;28430:3;;;;;;;28510:19;;;;28430:3;;28525;;;;;;;28510:19;;32614:345;32900:3;;;;;-1:-1:-1;;;;;32900:3:0;32886:10;:17;32878:73;;;;-1:-1:-1;;;32878:73:0;;;;;;;;;32614:345;:::o;12099:149::-;-1:-1:-1;;;;;12219:21:0;;;12187:7;12219:21;;;:10;:21;;;;;;;;12099:149::o;12392:104::-;12456:32;12466:10;12478:9;12456;:32::i;30990:29::-;;;-1:-1:-1;;;;;30990:29:0;;:::o;6501:49::-;6544:6;6501:49;:::o;30210:657::-;30441:1;30427:11;:15;30419:41;;;;-1:-1:-1;;;30419:41:0;;;;;;;;;30473:43;30490:5;30497:7;30506:9;30473:16;:43::i;:::-;30542:31;6650:6;30558;:14;30542:11;;30558:14;;30542:31;:15;:31;:::i;:::-;30529:10;:44;30584:11;:25;;;6650:6;30620:19;:26;;;30689:32;;30705:6;:15;;30689:32;-1:-1:-1;;;;;30657:29:0;;;;;;;:14;:29;;;;;:64;;;;-1:-1:-1;;;;30210:657:0:o;6291:27::-;;;-1:-1:-1;;;;;6291:27:0;;:::o;7494:49::-;;;;;;;;;;;;;;;:::o;23389:180::-;23519:19;;-1:-1:-1;;;;;23495:19:0;;23465:7;23495:19;;;:14;:19;;;;;;23465:7;;23495:66;;6544:6;;23495:44;;:19;:44;:23;:44;:::i;27995:230::-;18828:3;;;;;-1:-1:-1;;;;;18828:3:0;18814:10;:17;18806:26;;;;;;28115:10;;;-1:-1:-1;;;;;28136:24:0;;;-1:-1:-1;;;;;;28136:24:0;;;;;;28176:41;;28115:10;;;28176:41;;;;28115:10;;28149:11;;28176:41;;;;;;;;;;18843:1;27995:230;:::o;14996:1254::-;15104:7;15151:12;15137:11;:26;15129:79;;;;-1:-1:-1;;;15129:79:0;;;;;;;;;-1:-1:-1;;;;;15243:23:0;;15221:19;15243:23;;;:14;:23;;;;;;;;15281:17;15277:58;;15322:1;15315:8;;;;;15277:58;-1:-1:-1;;;;;15395:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;15416:16:0;;15395:38;;;;;;;;;:48;;:63;-1:-1:-1;15391:147:0;;-1:-1:-1;;;;;15482:20:0;;;;;;:11;:20;;;;;;;;-1:-1:-1;;15503:16:0;;;;15482:38;;;;;;;;15518:1;15482:44;;;-1:-1:-1;15475:51:0;;15391:147;-1:-1:-1;;;;;15599:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;15595:88:0;;;15670:1;15663:8;;;;;15595:88;15695:12;-1:-1:-1;;15737:16:0;;15764:428;15779:5;15771:13;;:5;:13;;;15764:428;;;15843:1;15826:13;;;15825:19;;;15817:27;;15886:20;;:::i;:::-;-1:-1:-1;;;;;;15909:20:0;;;;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;15886:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15956:27;;15952:229;;;16011:8;;;;-1:-1:-1;16004:15:0;;-1:-1:-1;;;;16004:15:0;15952:229;16045:12;;:26;;;-1:-1:-1;16041:140:0;;;16100:6;16092:14;;16041:140;;;16164:1;16155:6;:10;16147:18;;16041:140;15764:428;;;;;-1:-1:-1;;;;;;16209:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;14996:1254:0;;;;:::o;28925:1014::-;18916:7;;29082;;-1:-1:-1;;;;;18916:7:0;18902:10;:21;18894:30;;;;;;29111:15;29107:137;;29146:55;29153:5;29160:19;;29181;;29146:55;;;;;;;;;;;;;;;;;-1:-1:-1;29221:11:0;;29214:18;;29107:137;29290:19;;29327:8;29322:444;;29373:55;6650:6;29373:45;29397:20;6650:6;29406:10;29397:20;:8;:20;:::i;:::-;29373:19;;;:45;:23;:45;:::i;:55::-;29351:19;:77;29322:444;;;29461:24;29488:55;6650:6;29488:45;29512:20;6650:6;29521:10;29512:20;:8;:20;:::i;29488:55::-;29461:82;;29581:19;:17;:19::i;:::-;29562:16;:38;29558:197;;;29621:19;:38;;;29558:197;;;29720:19;:17;:19::i;:::-;29698;:41;29558:197;29322:444;;29807:19;;29792:10;;:35;;;:14;:35;:::i;:::-;29778:11;:49;29882:19;;29843:59;;;;;;29850:5;;29857:23;;29843:59;;;;;;;;;;-1:-1:-1;;29920:11:0;;18935:1;28925:1014;;;;;:::o;8030:39::-;;;;;;;;;;;;;:::o;5753:20::-;;;;;;;;;;;;;;-1:-1:-1;;5753:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6936:25;;;;:::o;27276:248::-;18828:3;;;;;-1:-1:-1;;;;;18828:3:0;18814:10;:17;18806:26;;;;;;27402:12;;;-1:-1:-1;;;;;27425:28:0;;;-1:-1:-1;;;;;;27425:28:0;;;;;;27469:47;;27402:12;;;27469:47;;;;27402:12;;27440:13;;27469:47;;6747:34;;;;:::o;26235:514::-;26399:10;26340:4;26381:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;26381:38:0;;;;;;;;;;26434:27;;;26430:205;;26496:10;26519:1;26478:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;26478:38:0;;;;;;;;;:42;26430:205;;;26594:29;:8;26607:15;26594:29;:12;:29;:::i;:::-;26571:10;26553:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;26553:38:0;;;;;;;;;:70;26430:205;26659:10;26680:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;26650:69:0;;26680:38;;;;;;;;;;26650:69;;;;26659:10;26650:69;;;;26680:38;26650:69;;;;;;;;;;-1:-1:-1;26737:4:0;;26235:514;-1:-1:-1;;;26235:514:0:o;21455:869::-;21564:4;21542:2;-1:-1:-1;;;;;19193:18:0;;19185:27;;;;;;-1:-1:-1;;;;;19231:19:0;;19245:4;19231:19;;19223:28;;;;;;21918:19;;21865:18;;21886:52;;:27;:5;6544:6;21886:27;:9;:27;:::i;:52::-;22034:10;22019:26;;;;:14;:26;;;;;;21865:73;;-1:-1:-1;22019:42:0;;21865:73;22019:42;:30;:42;:::i;:::-;22005:10;21990:26;;;;:14;:26;;;;;;:71;;;;-1:-1:-1;;;;;22134:18:0;;;;;;:34;;22157:10;22134:34;:22;:34;:::i;:::-;-1:-1:-1;;;;;22113:18:0;;;;;;:14;:18;;;;;;;:55;;;;22184:31;;22193:10;;22184:31;;;;22209:5;;22184:31;;;;;;;;;;22254:10;22243:22;;;;:10;:22;;;;;;;-1:-1:-1;;;;;22267:14:0;;;;;;;;;;22228:66;;22243:22;;;22267:14;22283:10;22228:14;:66::i;:::-;-1:-1:-1;22312:4:0;;21455:869;-1:-1:-1;;;;21455:869:0:o;14310:255::-;-1:-1:-1;;;;;14449:23:0;;14402:7;14449:23;;;:14;:23;;;;;;;;14490:16;:67;;14556:1;14490:67;;;-1:-1:-1;;;;;14509:20:0;;;;;;:11;:20;;;;;;;;:38;-1:-1:-1;;14530:16:0;;14509:38;;;;;;;;14545:1;14509:44;;14483:74;14310:255;-1:-1:-1;;;14310:255:0:o;12930:1179::-;13123:23;7658:80;;;;;;;;;;;;;;13252:4;13236:22;;;;;;;;;;;;;;;13277:12;:10;:12::i;:::-;13316:4;13173:163;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;13173:163:0;;;13149:198;;;;;;13123:224;;13360:18;7878:71;;;;;;;;;;;;;;;13405:140;;13472:9;;13500:5;;13524:6;;13405:140;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;13405:140:0;;;13381:175;;;;;;13360:196;;13569:14;13674:15;13708:10;13610:123;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;13610:123:0;;;13586:158;;;;;;13569:175;;13757:17;13777:26;13787:6;13795:1;13798;13801;13777:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;13777:26:0;;-1:-1:-1;;13777:26:0;;;-1:-1:-1;;;;;;;13822:23:0;;13814:75;;;;-1:-1:-1;;;13814:75:0;;;;;;;;;-1:-1:-1;;;;;13917:17:0;;;;;;:6;:17;;;;;:19;;;;;;;;13908:28;;13900:76;;;;-1:-1:-1;;;13900:76:0;;;;;;;;;14002:6;13995:3;:13;;13987:65;;;;-1:-1:-1;;;13987:65:0;;;;;;;;;14070:31;14080:9;14091;14070;:31::i;:::-;14063:38;;;;12930:1179;;;;;;;:::o;24202:176::-;-1:-1:-1;;;;;24336:25:0;;;24304:7;24336:25;;;:17;:25;;;;;;;;:34;;;;;;;;;;;;;24202:176::o;7832:117::-;7878:71;;;;;;6619:37;6650:6;6619:37;:::o;7355:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26925:203::-;18828:3;;;;;-1:-1:-1;;;;;18828:3:0;18814:10;:17;18806:26;;;;;;27036:7;;;-1:-1:-1;;;;;27054:18:0;;;-1:-1:-1;;;;;;27054:18:0;;;;;;27088:32;;27036:7;;;27088:32;;;;27036:7;;27064:8;;27088:32;;19798:341;19877:7;20121:10;;-1:-1:-1;;20107:24:0;;;;;;20100:31;;19798:341;:::o;1368:136::-;1426:7;1453:43;1457:1;1460;1453:43;;;;;;;;;;;;;;;;;:3;:43::i;2258:471::-;2316:7;2561:6;2557:47;;-1:-1:-1;2591:1:0;2584:8;;2557:47;2628:5;;;2632:1;2628;:5;:1;2652:5;;;;;:10;2644:56;;;;-1:-1:-1;;;2644:56:0;;;;;;;;3205:132;3263:7;3290:39;3294:1;3297;3290:39;;;;;;;;;;;;;;;;;:3;:39::i;904:181::-;962:7;994:5;;;1018:6;;;;1010:46;;;;-1:-1:-1;;;1010:46:0;;;;;;;;16710:947;16816:6;-1:-1:-1;;;;;16806:16:0;:6;-1:-1:-1;;;;;16806:16:0;;;:30;;;;;16835:1;16826:6;:10;16806:30;16802:848;;;-1:-1:-1;;;;;16857:20:0;;;16853:385;;-1:-1:-1;;;;;16965:22:0;;16946:16;16965:22;;;:14;:22;;;;;;;;;17026:13;:60;;17085:1;17026:60;;;-1:-1:-1;;;;;17042:19:0;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;17062:13:0;;17042:34;;;;;;;;17074:1;17042:40;;17026:60;17006:80;-1:-1:-1;17105:17:0;17125:21;17006:80;17139:6;17125:21;:13;:21;:::i;:::-;17105:41;;17165:57;17182:6;17190:9;17201;17212;17165:16;:57::i;:::-;16853:385;;;;-1:-1:-1;;;;;17258:20:0;;;17254:385;;-1:-1:-1;;;;;17366:22:0;;17347:16;17366:22;;;:14;:22;;;;;;;;;17427:13;:60;;17486:1;17427:60;;;-1:-1:-1;;;;;17443:19:0;;;;;;:11;:19;;;;;;;;:34;-1:-1:-1;;17463:13:0;;17443:34;;;;;;;;17475:1;17443:40;;17427:60;17407:80;-1:-1:-1;17506:17:0;17526:21;17407:80;17540:6;17526:21;:13;:21;:::i;:::-;17506:41;;17566:57;17583:6;17591:9;17602;17613;17566:16;:57::i;17254:385::-;16710:947;;;:::o;20472:725::-;20592:11;;:23;;20608:6;20592:23;:15;:23;:::i;:::-;20578:11;:37;20711:19;;20657:18;;20678:53;;:28;:6;6544;20678:28;:10;:28;:::i;:53::-;20785:10;;20657:74;;-1:-1:-1;20785:26:0;;20657:74;20785:26;:14;:26;:::i;:::-;20772:10;:39;20918:19;:17;:19::i;:::-;20895;;:42;;20887:81;;;;-1:-1:-1;;;20887:81:0;;;;;;;;;-1:-1:-1;;;;;21022:18:0;;;;;;:14;:18;;;;;;:34;;21045:10;21022:34;:22;:34;:::i;:::-;-1:-1:-1;;;;;21001:18:0;;;;;;;:14;:18;;;;;;;;:55;;;;21132:10;:14;;;;;;21105:54;;21001:18;21132:14;21148:10;21105:14;:54::i;:::-;21173:16;21178:2;21182:6;21173:16;;;;;;;;;;;;;;;;20472:725;;;:::o;16258:444::-;-1:-1:-1;;;;;16375:21:0;;;16349:23;16375:21;;;:10;:21;;;;;;;;;;16434:14;:25;;;;;;16516:21;;;;:33;;;-1:-1:-1;;;;;;16516:33:0;;;;;;;16567:54;;16375:21;;;;;16434:25;;16516:33;;16375:21;;;16567:54;;16349:23;16567:54;16634:60;16649:15;16666:9;16677:16;16634:14;:60::i;:::-;16258:444;;;;:::o;18547:153::-;18657:9;18547:153;:::o;1807:192::-;1893:7;1929:12;1921:6;;;;1913:29;;;;-1:-1:-1;;;1913:29:0;;;;;;;;;;-1:-1:-1;;;1965:5:0;;;1807:192::o;3833:278::-;3919:7;3954:12;3947:5;3939:28;;;;-1:-1:-1;;;3939:28:0;;;;;;;;;;;3978:9;3994:1;3990;:5;;;;;;;3833:278;-1:-1:-1;;;;;3833:278:0:o;17665:705::-;17844:18;17865:77;17872:12;17865:77;;;;;;;;;;;;;;;;;:6;:77::i;:::-;17844:98;;17974:1;17959:12;:16;;;:85;;;;-1:-1:-1;;;;;;17979:22:0;;;;;;:11;:22;;;;;;;;:65;-1:-1:-1;;18002:16:0;;17979:40;;;;;;;;;:50;:65;;;:50;;:65;17959:85;17955:339;;;-1:-1:-1;;;;;18061:22:0;;;;;;:11;:22;;;;;;;;:40;-1:-1:-1;;18084:16:0;;18061:40;;;;;;;;18099:1;18061:46;:57;;;17955:339;;;18190:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18151:22:0;;-1:-1:-1;18151:22:0;;;:11;:22;;;;;:36;;;;;;;;;;:72;;;;;;;-1:-1:-1;;18151:72:0;;;;;;;;;;;;;18238:25;;;:14;:25;;;;;;:44;;18266:16;;;18238:44;;;;;;;;;;17955:339;18332:9;-1:-1:-1;;;;;18311:51:0;;18343:8;18353;18311:51;;;;;;;;;;;;;;;;17665:705;;;;;:::o;18378:161::-;18453:6;18491:12;18484:5;18480:9;;18472:32;;;;-1:-1:-1;;;18472:32:0;;;;;;;;;;-1:-1:-1;18529:1:0;;18378:161;-1:-1:-1;;18378:161:0:o;32294:1053::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32294:1053:0;;;-1:-1:-1;32294:1053:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;-1:-1:-1;32294:1053:0;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;5:130:-1;72:20;;97:33;72:20;97:33;;142:124;206:20;;231:30;206:20;231:30;;273:130;340:20;;365:33;340:20;365:33;;411:440;;512:3;505:4;497:6;493:17;489:27;479:2;;530:1;527;520:12;479:2;567:6;554:20;589:64;604:48;645:6;604:48;;;589:64;;;580:73;;673:6;666:5;659:21;709:4;701:6;697:17;742:4;735:5;731:16;777:3;768:6;763:3;759:16;756:25;753:2;;;794:1;791;784:12;753:2;804:41;838:6;833:3;828;804:41;;;472:379;;;;;;;;1447:128;1513:20;;1538:32;1513:20;1538:32;;1582:126;1647:20;;1672:31;1647:20;1672:31;;1715:241;;1819:2;1807:9;1798:7;1794:23;1790:32;1787:2;;;1835:1;1832;1825:12;1787:2;1870:1;1887:53;1932:7;1912:9;1887:53;;;1877:63;1781:175;-1:-1;;;;1781:175;1963:366;;;2084:2;2072:9;2063:7;2059:23;2055:32;2052:2;;;2100:1;2097;2090:12;2052:2;2135:1;2152:53;2197:7;2177:9;2152:53;;;2142:63;;2114:97;2242:2;2260:53;2305:7;2296:6;2285:9;2281:22;2260:53;;;2250:63;;2221:98;2046:283;;;;;;2336:491;;;;2474:2;2462:9;2453:7;2449:23;2445:32;2442:2;;;2490:1;2487;2480:12;2442:2;2525:1;2542:53;2587:7;2567:9;2542:53;;;2532:63;;2504:97;2632:2;2650:53;2695:7;2686:6;2675:9;2671:22;2650:53;;;2640:63;;2611:98;2740:2;2758:53;2803:7;2794:6;2783:9;2779:22;2758:53;;;2748:63;;2719:98;2436:391;;;;;;2834:366;;;2955:2;2943:9;2934:7;2930:23;2926:32;2923:2;;;2971:1;2968;2961:12;2923:2;3006:1;3023:53;3068:7;3048:9;3023:53;;;3013:63;;2985:97;3113:2;3131:53;3176:7;3167:6;3156:9;3152:22;3131:53;;3207:865;;;;;;;3394:3;3382:9;3373:7;3369:23;3365:33;3362:2;;;3411:1;3408;3401:12;3362:2;3446:1;3463:53;3508:7;3488:9;3463:53;;;3453:63;;3425:97;3553:2;3571:53;3616:7;3607:6;3596:9;3592:22;3571:53;;;3561:63;;3532:98;3661:2;3679:53;3724:7;3715:6;3704:9;3700:22;3679:53;;;3669:63;;3640:98;3769:2;3787:51;3830:7;3821:6;3810:9;3806:22;3787:51;;;3777:61;;3748:96;3875:3;3894:53;3939:7;3930:6;3919:9;3915:22;3894:53;;;3884:63;;3854:99;3984:3;4003:53;4048:7;4039:6;4028:9;4024:22;4003:53;;;3993:63;;3963:99;3356:716;;;;;;;;;4079:364;;;4199:2;4187:9;4178:7;4174:23;4170:32;4167:2;;;4215:1;4212;4205:12;4167:2;4250:1;4267:53;4312:7;4292:9;4267:53;;;4257:63;;4229:97;4357:2;4375:52;4419:7;4410:6;4399:9;4395:22;4375:52;;4450:345;;4563:2;4551:9;4542:7;4538:23;4534:32;4531:2;;;4579:1;4576;4569:12;4531:2;4614:31;;4665:18;4654:30;;4651:2;;;4697:1;4694;4687:12;4651:2;4717:62;4771:7;4762:6;4751:9;4747:22;4717:62;;4802:699;;;;4958:2;4946:9;4937:7;4933:23;4929:32;4926:2;;;4974:1;4971;4964:12;4926:2;5009:31;;5060:18;5049:30;;5046:2;;;5092:1;5089;5082:12;5046:2;5112:63;5167:7;5158:6;5147:9;5143:22;5112:63;;;5102:73;;4988:193;5240:2;5229:9;5225:18;5212:32;5264:18;5256:6;5253:30;5250:2;;;5296:1;5293;5286:12;5250:2;5316:63;5371:7;5362:6;5351:9;5347:22;5316:63;;;5306:73;;5191:194;5416:2;5434:51;5477:7;5468:6;5457:9;5453:22;5434:51;;5508:951;;;;;;5698:3;5686:9;5677:7;5673:23;5669:33;5666:2;;;5715:1;5712;5705:12;5666:2;5750:31;;5801:18;5790:30;;5787:2;;;5833:1;5830;5823:12;5787:2;5853:63;5908:7;5899:6;5888:9;5884:22;5853:63;;;5843:73;;5729:193;5981:2;5970:9;5966:18;5953:32;6005:18;5997:6;5994:30;5991:2;;;6037:1;6034;6027:12;5991:2;6057:63;6112:7;6103:6;6092:9;6088:22;6057:63;;;6047:73;;5932:194;6157:2;6175:51;6218:7;6209:6;6198:9;6194:22;6175:51;;;6165:61;;6136:96;6263:2;6281:53;6326:7;6317:6;6306:9;6302:22;6281:53;;;6271:63;;6242:98;6371:3;6390:53;6435:7;6426:6;6415:9;6411:22;6390:53;;;6380:63;;6350:99;5660:799;;;;;;;;;6466:485;;;;6601:2;6589:9;6580:7;6576:23;6572:32;6569:2;;;6617:1;6614;6607:12;6569:2;6652:1;6669:53;6714:7;6694:9;6669:53;;;6659:63;;6631:97;6759:2;6777:53;6822:7;6813:6;6802:9;6798:22;6777:53;;;6767:63;;6738:98;6867:2;6885:50;6927:7;6918:6;6907:9;6903:22;6885:50;;6958:113;7041:24;7059:5;7041:24;;;7036:3;7029:37;7023:48;;;7078:104;7155:21;7170:5;7155:21;;7189:113;7272:24;7290:5;7272:24;;7309:152;7410:45;7430:24;7448:5;7430:24;;;7410:45;;7491:887;;7630:5;7624:12;7664:1;7653:9;7649:17;7677:1;7672:267;;;;7950:1;7945:427;;;;7642:730;;7672:267;7750:4;7746:1;7735:9;7731:17;7727:28;7769:88;7850:6;7845:3;7769:88;;;-1:-1;;7876:25;;7864:38;;7762:95;-1:-1;7916:16;;;-1:-1;7672:267;;7945:427;8014:1;8003:9;7999:17;8030:88;8111:6;8106:3;8030:88;;;8023:95;;8140:41;8175:5;8140:41;;;8197:1;8205:130;8219:6;8216:1;8213:13;8205:130;;;8278:14;;8265:11;;;8258:35;8325:1;8312:15;;;;8241:4;8234:12;8205:130;;;-1:-1;;8349:16;;;-1:-1;7642:730;;7600:778;;;;;;8386:347;;8498:39;8531:5;8498:39;;;8549:71;8613:6;8608:3;8549:71;;;8542:78;;8625:52;8670:6;8665:3;8658:4;8651:5;8647:16;8625:52;;;8698:29;8720:6;8698:29;;;8689:39;;;;8478:255;-1:-1;;;8478:255;9087:372;;9247:67;9311:2;9306:3;9247:67;;;9347:34;9327:55;;-1:-1;;;9411:2;9402:12;;9395:27;9450:2;9441:12;;9233:226;-1:-1;;9233:226;9468:313;;9628:67;9692:2;9687:3;9628:67;;;-1:-1;;;9708:36;;9772:2;9763:12;;9614:167;-1:-1;;9614:167;9790:377;;9950:67;10014:2;10009:3;9950:67;;;10050:34;10030:55;;-1:-1;;;10114:2;10105:12;;10098:32;10158:2;10149:12;;9936:231;-1:-1;;9936:231;10176:398;;10354:84;10436:1;10431:3;10354:84;;;-1:-1;;;10451:87;;10566:1;10557:11;;10340:234;-1:-1;;10340:234;10583:327;;10743:67;10807:2;10802:3;10743:67;;;10843:29;10823:50;;10901:2;10892:12;;10729:181;-1:-1;;10729:181;10919:380;;11079:67;11143:2;11138:3;11079:67;;;11179:34;11159:55;;-1:-1;;;11243:2;11234:12;;11227:35;11290:2;11281:12;;11065:234;-1:-1;;11065:234;11308:376;;11468:67;11532:2;11527:3;11468:67;;;11568:34;11548:55;;-1:-1;;;11632:2;11623:12;;11616:31;11675:2;11666:12;;11454:230;-1:-1;;11454:230;11693:319;;11853:67;11917:2;11912:3;11853:67;;;-1:-1;;;11933:42;;12003:2;11994:12;;11839:173;-1:-1;;11839:173;12021:380;;12181:67;12245:2;12240:3;12181:67;;;12281:34;12261:55;;-1:-1;;;12345:2;12336:12;;12329:35;12392:2;12383:12;;12167:234;-1:-1;;12167:234;12410:477;;12588:85;12670:2;12665:3;12588:85;;;12706:34;12686:55;;12775:34;12770:2;12761:12;;12754:56;-1:-1;;;12839:2;12830:12;;12823:27;12878:2;12869:12;;12574:313;-1:-1;;12574:313;12896:370;;13056:67;13120:2;13115:3;13056:67;;;13156:34;13136:55;;-1:-1;;;13220:2;13211:12;;13204:25;13257:2;13248:12;;13042:224;-1:-1;;13042:224;13275:307;;13435:66;13499:1;13494:3;13435:66;;;-1:-1;;;13514:31;;13573:2;13564:12;;13421:161;-1:-1;;13421:161;13591:310;;13751:67;13815:2;13810:3;13751:67;;;-1:-1;;;13831:33;;13892:2;13883:12;;13737:164;-1:-1;;13737:164;13910:376;;14070:67;14134:2;14129:3;14070:67;;;14170:34;14150:55;;-1:-1;;;14234:2;14225:12;;14218:31;14277:2;14268:12;;14056:230;-1:-1;;14056:230;14295:431;;14473:85;14555:2;14550:3;14473:85;;;14591:34;14571:55;;14660:28;14655:2;14646:12;;14639:50;14717:2;14708:12;;14459:267;-1:-1;;14459:267;14735:326;;14895:67;14959:2;14954:3;14895:67;;;14995:28;14975:49;;15052:2;15043:12;;14881:180;-1:-1;;14881:180;15189:110;15270:23;15287:5;15270:23;;15306:107;15385:22;15401:5;15385:22;;15420:264;;15565:94;15655:3;15646:6;15565:94;;15691:650;;15946:148;16090:3;15946:148;;;15939:155;;16105:75;16176:3;16167:6;16105:75;;;16202:2;16197:3;16193:12;16186:19;;16216:75;16287:3;16278:6;16216:75;;;-1:-1;16313:2;16304:12;;15927:414;-1:-1;;15927:414;16348:372;;16547:148;16691:3;16547:148;;16727:372;;16926:148;17070:3;16926:148;;17106:213;17224:2;17209:18;;17238:71;17213:9;17282:6;17238:71;;17326:324;17472:2;17457:18;;17486:71;17461:9;17530:6;17486:71;;;17568:72;17636:2;17625:9;17621:18;17612:6;17568:72;;17657:324;17803:2;17788:18;;17817:71;17792:9;17861:6;17817:71;;;17899:72;17967:2;17956:9;17952:18;17943:6;17899:72;;17988:201;18100:2;18085:18;;18114:65;18089:9;18152:6;18114:65;;18196:213;18314:2;18299:18;;18328:71;18303:9;18372:6;18328:71;;18416:547;18618:3;18603:19;;18633:71;18607:9;18677:6;18633:71;;;18715:72;18783:2;18772:9;18768:18;18759:6;18715:72;;;18798;18866:2;18855:9;18851:18;18842:6;18798:72;;;18881;18949:2;18938:9;18934:18;18925:6;18881:72;;;18589:374;;;;;;;;18970:547;19172:3;19157:19;;19187:71;19161:9;19231:6;19187:71;;;19269:72;19337:2;19326:9;19322:18;19313:6;19269:72;;;19352;19420:2;19409:9;19405:18;19396:6;19352:72;;;19435;19503:2;19492:9;19488:18;19479:6;19435:72;;19524:539;19722:3;19707:19;;19737:71;19711:9;19781:6;19737:71;;;19819:68;19883:2;19872:9;19868:18;19859:6;19819:68;;20070:293;20204:2;20218:47;;;20189:18;;20279:74;20189:18;20339:6;20279:74;;20678:407;20869:2;20883:47;;;20854:18;;20944:131;20854:18;20944:131;;21092:407;21283:2;21297:47;;;21268:18;;21358:131;21268:18;21358:131;;21506:407;21697:2;21711:47;;;21682:18;;21772:131;21682:18;21772:131;;21920:407;22111:2;22125:47;;;22096:18;;22186:131;22096:18;22186:131;;22334:407;22525:2;22539:47;;;22510:18;;22600:131;22510:18;22600:131;;22748:407;22939:2;22953:47;;;22924:18;;23014:131;22924:18;23014:131;;23162:407;23353:2;23367:47;;;23338:18;;23428:131;23338:18;23428:131;;23576:407;23767:2;23781:47;;;23752:18;;23842:131;23752:18;23842:131;;23990:407;24181:2;24195:47;;;24166:18;;24256:131;24166:18;24256:131;;24404:407;24595:2;24609:47;;;24580:18;;24670:131;24580:18;24670:131;;24818:407;25009:2;25023:47;;;24994:18;;25084:131;24994:18;25084:131;;25232:407;25423:2;25437:47;;;25408:18;;25498:131;25408:18;25498:131;;25646:407;25837:2;25851:47;;;25822:18;;25912:131;25822:18;25912:131;;26280:324;26426:2;26411:18;;26440:71;26415:9;26484:6;26440:71;;26611:435;26785:2;26770:18;;26799:71;26774:9;26843:6;26799:71;;;26881:72;26949:2;26938:9;26934:18;26925:6;26881:72;;;26964;27032:2;27021:9;27017:18;27008:6;26964:72;;27053:209;27169:2;27154:18;;27183:69;27158:9;27225:6;27183:69;;27269:320;27413:2;27398:18;;27427:69;27402:9;27469:6;27427:69;;27596:205;27710:2;27695:18;;27724:67;27699:9;27764:6;27724:67;;27808:256;27870:2;27864:9;27896:17;;;27971:18;27956:34;;27992:22;;;27953:62;27950:2;;;28028:1;28025;28018:12;27950:2;28044;28037:22;27848:216;;-1:-1;27848:216;28071:321;;28214:18;28206:6;28203:30;28200:2;;;28246:1;28243;28236:12;28200:2;-1:-1;28377:4;28313;28290:17;;;;-1:-1;;28286:33;28367:15;;28137:255;28728:161;;28826:14;;;28868:4;28855:18;;;28785:104;28896:118;28980:12;;28951:63;29151:144;29286:3;29264:31;-1:-1;29264:31;29304:163;29407:19;;;29456:4;29447:14;;29400:67;29629:91;;29691:24;29709:5;29691:24;;29727:85;29793:13;29786:21;;29769:43;29898:121;-1:-1;;;;;29960:54;;29943:76;30105:88;30177:10;30166:22;;30149:44;30200:81;30271:4;30260:16;;30243:38;30289:145;30370:6;30365:3;30360;30347:30;-1:-1;30426:1;30408:16;;30401:27;30340:94;30443:268;30508:1;30515:101;30529:6;30526:1;30523:13;30515:101;;;30596:11;;;30590:18;30577:11;;;30570:39;30551:2;30544:10;30515:101;;;30631:6;30628:1;30625:13;30622:2;;;-1:-1;;30696:1;30678:16;;30671:27;30492:219;30800:97;30888:2;30868:14;-1:-1;;30864:28;;30848:49;30905:117;30974:24;30992:5;30974:24;;;30967:5;30964:35;30954:2;;31013:1;31010;31003:12;31029:111;31095:21;31110:5;31095:21;;31147:117;31216:24;31234:5;31216:24;;31395:115;31463:23;31480:5;31463:23;;31517:113;31584:22;31600:5;31584:22;
Swarm Source
bzzr://18bf2dbd31cd926562b9039a54c3502ed5798ba1dfff61b52f450e89a2dad31e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.