ETH Price: $1,976.55 (+0.73%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw235081312025-10-05 0:56:59140 days ago1759625819IN
Fractal Protocol: Vault
0 ETH0.000857770.3
Compute231342662025-08-13 19:37:23192 days ago1755113843IN
Fractal Protocol: Vault
0 ETH0.011129754.0083053
Withdraw224584322025-05-11 6:51:47287 days ago1746946307IN
Fractal Protocol: Vault
0 ETH0.010546973.68871929
Withdraw209051062024-10-06 7:45:47503 days ago1728200747IN
Fractal Protocol: Vault
0 ETH0.011542124.03
Withdraw207068432024-09-08 15:39:11531 days ago1725809951IN
Fractal Protocol: Vault
0 ETH0.007477922.61534425
Deposit206502062024-08-31 18:00:47539 days ago1725127247IN
Fractal Protocol: Vault
0 ETH0.004837961.69526314
Withdraw195011632024-03-24 1:31:11700 days ago1711243871IN
Fractal Protocol: Vault
0 ETH0.0415793514.54204893
Withdraw194895132024-03-22 10:16:35701 days ago1711102595IN
Fractal Protocol: Vault
0 ETH0.0589109520.60363818
Withdraw190551662024-01-21 12:14:11762 days ago1705839251IN
Fractal Protocol: Vault
0 ETH0.0061218813
Withdraw190287332024-01-17 19:38:23766 days ago1705520303IN
Fractal Protocol: Vault
0 ETH0.0368826136.18546382
Withdraw189585682024-01-07 23:49:23776 days ago1704671363IN
Fractal Protocol: Vault
0 ETH0.0039613533.05319453
Deposit189585652024-01-07 23:48:47776 days ago1704671327IN
Fractal Protocol: Vault
0 ETH0.009069730.40128316
Withdraw189432342024-01-05 19:46:23778 days ago1704483983IN
Fractal Protocol: Vault
0 ETH0.0079275919.99243033
Withdraw189207432024-01-02 16:00:11781 days ago1704211211IN
Fractal Protocol: Vault
0 ETH0.0030731225.63672098
Set Investment P...189207252024-01-02 15:56:23781 days ago1704210983IN
Fractal Protocol: Vault
0 ETH0.0010229131.59988124
Compute189206802024-01-02 15:47:23781 days ago1704210443IN
Fractal Protocol: Vault
0 ETH0.070782429.35545661
Withdraw187331802023-12-07 8:19:11807 days ago1701937151IN
Fractal Protocol: Vault
0 ETH0.0103526433.92754011
Change Apr187234082023-12-05 23:25:23809 days ago1701818723IN
Fractal Protocol: Vault
0 ETH0.0528533150.59336183
Deposit186390402023-11-24 3:58:47821 days ago1700798327IN
Fractal Protocol: Vault
0 ETH0.0105363821.89947954
Lock Capital186151992023-11-20 19:51:59824 days ago1700509919IN
Fractal Protocol: Vault
0 ETH0.0117452633.57170891
Set Investment P...186151882023-11-20 19:49:47824 days ago1700509787IN
Fractal Protocol: Vault
0 ETH0.0009799630.27304277
Set Investment P...186150702023-11-20 19:25:59824 days ago1700508359IN
Fractal Protocol: Vault
0 ETH0.0010829733.4550153
Set Flat Withdra...186150612023-11-20 19:24:11824 days ago1700508251IN
Fractal Protocol: Vault
0 ETH0.0010803633.61332446
Set Flat Withdra...186150392023-11-20 19:19:47824 days ago1700507987IN
Fractal Protocol: Vault
0 ETH0.0010081431.38986476
Withdraw185902962023-11-17 8:05:35827 days ago1700208335IN
Fractal Protocol: Vault
0 ETH0.002533621.13803432
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vault

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2022-08-23
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;

/**
 * @title Represents an ownable resource.
 */
contract Ownable {
    address public owner;

    event OwnershipTransferred(address previousOwner, address newOwner);

    /**
     * Constructor
     * @param addr The owner of the smart contract
     */
    constructor (address addr) {
        require(addr != address(0), "non-zero address required");
        require(addr != address(1), "ecrecover address not allowed");
        owner = addr;
        emit OwnershipTransferred(address(0), addr);
    }

    /**
     * @notice This modifier indicates that the function can only be called by the owner.
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner == msg.sender, "Only owner requirement");
        _;
    }

    /**
     * @notice Transfers ownership to the address specified.
     * @param addr Specifies the address of the new owner.
     * @dev Throws if called by any account other than the owner.
     */
    function transferOwnership (address addr) public virtual onlyOwner {
        require(addr != address(0), "non-zero address required");
        emit OwnershipTransferred(owner, addr);
        owner = addr;
    }
}


/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
    /**
    * Transfer token for a specified address
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);

    /**
     * Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering.
     * One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0
     * and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @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);

    /**
     * Returns the total number of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    function decimals() external view returns (uint8);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);

    /**
    * Gets the balance of the address specified.
    * @param addr The address to query the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address addr) external view returns (uint256);

    /**
     * Function to check the amount of tokens that an owner allowed to a spender.
     * @param owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * This event is triggered when a given amount of tokens is sent to an address.
     * @param from The address of the sender
     * @param to The address of the receiver
     * @param value The amount transferred
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * This event is triggered when a given address is approved to spend a specific amount of tokens
     * on behalf of the sender.
     * @param owner The owner of the token
     * @param spender The spender
     * @param value The amount to transfer
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @title Represents an ERC-20
 */
contract ERC20 is IERC20 {
    // Basic ERC-20 data
    string private _name;
    string private _symbol;
    uint8 private _decimals;
    uint256 internal _totalSupply;

    // The balance of each owner
    mapping(address => uint256) internal _balances;

    // The allowance set by each owner
    mapping(address => mapping(address => uint256)) private _allowances;

    /**
     * @notice Constructor
     * @param tokenName The name of the token
     * @param tokenSymbol The symbol of the token
     * @param tokenDecimals The decimals of the token
     * @param initialSupply The initial supply
     */
    constructor (string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals, uint256 initialSupply) {
        _name = tokenName;
        _symbol = tokenSymbol;
        _decimals = tokenDecimals;
        _totalSupply = initialSupply;
    }

    /**
    * @notice Transfers a given amount tokens to the address specified.
    * @param from The address of the sender.
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    * @return Returns true in case of success.
    */
    function _executeErc20Transfer (address from, address to, uint256 value) private returns (bool) {
        // Checks
        require(to != address(0), "non-zero address required");
        require(from != address(0), "non-zero sender required");
        require(value > 0, "Amount cannot be zero");
        require(_balances[from] >= value, "Amount exceeds sender balance");

        // State changes
        _balances[from] = _balances[from] - value;
        _balances[to] = _balances[to] + value;

        // Emit the event per ERC-20
        emit Transfer(from, to, value);

        return true;
    }

    /**
     * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * @dev Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering.
     * One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0
     * and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param ownerAddr The address of the owner.
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @return Returns true in case of success.
     */
    function _approveSpender(address ownerAddr, address spender, uint256 value) private returns (bool) {
        require(spender != address(0), "non-zero spender required");
        require(ownerAddr != address(0), "non-zero owner required");

        // State changes
        _allowances[ownerAddr][spender] = value;

        // Emit the event
        emit Approval(ownerAddr, spender, value);

        return true;
    }

    /**
    * @notice Transfers a given amount tokens to the address specified.
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    * @return Returns true in case of success.
    */
    function transfer(address to, uint256 value) public override returns (bool) {
        require (_executeErc20Transfer(msg.sender, to, value), "Failed to execute ERC20 transfer");
        return true;
    }

    /**
     * @notice Transfer tokens from one address to another.
     * @dev Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     * @return Returns true in case of success.
     */
    function transferFrom(address from, address to, uint256 value) public override returns (bool) {
        uint256 currentAllowance = _allowances[from][msg.sender];
        require(currentAllowance >= value, "Amount exceeds allowance");

        require (_executeErc20Transfer(from, to, value), "Failed to execute transferFrom");

        require(_approveSpender(from, msg.sender, currentAllowance - value), "ERC20: Approval failed");

        return true;
    }

    /**
     * @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * @dev Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering.
     * One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0
     * and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     * @return Returns true in case of success.
     */
    function approve(address spender, uint256 value) public override returns (bool) {
        require(_approveSpender(msg.sender, spender, value), "ERC20: Approval failed");
        return true;
    }

    /**
     * Gets the total supply of tokens
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @notice Gets the name of the token.
     */
    function name() public view override returns (string memory) {
        return _name;
    }

    /**
     * @notice Gets the symbol of the token.
     */
    function symbol() public view override returns (string memory) {
        return _symbol;
    }

    /**
     * @notice Gets the decimals of the token.
     */
    function decimals() public view override returns (uint8) {
        return _decimals;
    }

    /**
    * Gets the balance of the address specified.
    * @param addr The address to query the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address addr) public view override returns (uint256) {
        return _balances[addr];
    }

    /**
     * Function to check the amount of tokens that an owner allowed to a spender.
     * @param owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }
}

/**
 * @notice Represents an ERC20 that can be minted and/or burnt by multiple parties.
 */
contract Mintable is ERC20, Ownable {
    /**
     * @notice The maximum circulating supply of tokens
     */
    uint256 public maxSupply;

    // Keeps track of the authorized minters
    mapping (address => bool) internal _authorizedMinters;

    // Keeps track of the authorized burners
    mapping (address => bool) internal _authorizedBurners;

    // ---------------------------------------
    // Events
    // ---------------------------------------
    /**
     * This event is triggered whenever an address is added as a valid minter.
     * @param addr The address that became a valid minter
     */
    event OnMinterGranted(address addr);

    /**
     * This event is triggered when a minter is revoked.
     * @param addr The address that was revoked
     */
    event OnMinterRevoked(address addr);

    /**
     * This event is triggered whenever an address is added as a valid burner.
     * @param addr The address that became a valid burner
     */
    event OnBurnerGranted(address addr);

    /**
     * This event is triggered when a burner is revoked.
     * @param addr The address that was revoked
     */
    event OnBurnerRevoked(address addr);

    /**
     * This event is triggered when the maximum limit for minting tokens is updated.
     * @param prevValue The previous limit
     * @param newValue The new limit
     */
    event OnMaxSupplyChanged(uint256 prevValue, uint256 newValue);

    // ---------------------------------------
    // Constructor
    // ---------------------------------------
    /**
     * @notice Constructor
     * @param newOwner The contract owner
     * @param tokenName The name of the token
     * @param tokenSymbol The symbol of the token
     * @param tokenDecimals The decimals of the token
     * @param initialSupply The initial supply
     */
    constructor (address newOwner, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals, uint256 initialSupply)
    ERC20(tokenName, tokenSymbol, tokenDecimals, initialSupply)
    Ownable(newOwner) { // solhint-disable-line no-empty-blocks
    }

    /**
     * @notice Throws if the sender is not a valid minter
     */
    modifier onlyMinter() {
        require(_authorizedMinters[msg.sender], "Unauthorized minter");
        _;
    }

    /**
     * @notice Throws if the sender is not a valid burner
     */
    modifier onlyBurner() {
        require(_authorizedBurners[msg.sender], "Unauthorized burner");
        _;
    }

    /**
     * @notice Grants the right to issue new tokens to the address specified.
     * @dev This function can be called by the owner only.
     * @param addr The destination address
     */
    function grantMinter (address addr) public onlyOwner {
        require(!_authorizedMinters[addr], "Address authorized already");
        _authorizedMinters[addr] = true;
        emit OnMinterGranted(addr);
    }

    /**
     * @notice Revokes the right to issue new tokens from the address specified.
     * @dev This function can be called by the owner only.
     * @param addr The destination address
     */
    function revokeMinter (address addr) public onlyOwner {
        require(_authorizedMinters[addr], "Address was never authorized");
        _authorizedMinters[addr] = false;
        emit OnMinterRevoked(addr);
    }

    /**
     * @notice Grants the right to burn tokens to the address specified.
     * @dev This function can be called by the owner only.
     * @param addr The destination address
     */
    function grantBurner (address addr) public onlyOwner {
        require(!_authorizedBurners[addr], "Address authorized already");
        _authorizedBurners[addr] = true;
        emit OnBurnerGranted(addr);
    }

    /**
     * @notice Revokes the right to burn tokens from the address specified.
     * @dev This function can be called by the owner only.
     * @param addr The destination address
     */
    function revokeBurner (address addr) public onlyOwner {
        require(_authorizedBurners[addr], "Address was never authorized");
        _authorizedBurners[addr] = false;
        emit OnBurnerRevoked(addr);
    }

    /**
     * @notice Updates the maximum limit for minting tokens.
     * @param newValue The new limit
     */
    function changeMaxSupply (uint256 newValue) public onlyOwner {
        require(newValue == 0 || newValue > _totalSupply, "Invalid max supply");
        emit OnMaxSupplyChanged(maxSupply, newValue);
        maxSupply = newValue;
    }

    /**
     * @notice Issues a given number of tokens to the address specified.
     * @dev This function throws if the sender is not a whitelisted minter.
     * @param addr The destination address
     * @param amount The number of tokens
     */
    function mint (address addr, uint256 amount) public onlyMinter {
        require(addr != address(0) && addr != address(this), "Invalid address");
        require(amount > 0, "Invalid amount");
        require(canMint(amount), "Max token supply exceeded");

        _totalSupply += amount;
        _balances[addr] += amount;
        emit Transfer(address(0), addr, amount);
    }

    /**
     * @notice Burns a given number of tokens from the address specified.
     * @dev This function throws if the sender is not a whitelisted minter. In this context, minters and burners have the same privileges.
     * @param addr The destination address
     * @param amount The number of tokens
     */
    function burn (address addr, uint256 amount) public onlyBurner {
        require(addr != address(0) && addr != address(this), "Invalid address");
        require(amount > 0, "Invalid amount");
        require(_totalSupply > 0, "No token supply");

        uint256 accountBalance = _balances[addr];
        require(accountBalance >= amount, "Burn amount exceeds balance");

        _balances[addr] = accountBalance - amount;
        _totalSupply -= amount;
        emit Transfer(addr, address(0), amount);
    }

    /**
     * @notice Indicates if we can issue/mint the number of tokens specified.
     * @param amount The number of tokens to issue/mint
     */
    function canMint (uint256 amount) public view returns (bool) {
        return (maxSupply == 0) || (_totalSupply + amount <= maxSupply);
    }
}


/**
 * @title Represents a controllable resource.
 */
contract Controllable is Ownable {
    address public controllerAddress;

    event OnControllerChanged (address prevAddress, address newAddress);

    /**
     * @notice Constructor
     * @param ownerAddr The owner of the smart contract
     * @param controllerAddr The address of the controller
     */
    constructor (address ownerAddr, address controllerAddr) Ownable (ownerAddr) {
        require(controllerAddr != address(0), "Controller address required");
        require(controllerAddr != ownerAddr, "Owner cannot be the Controller");
        controllerAddress = controllerAddr;
    }

    /**
     * @notice Throws if the sender is not the controller
     */
    modifier onlyController() {
        require(msg.sender == controllerAddress, "Unauthorized controller");
        _;
    }

    /**
     * @notice Makes sure the sender is either the owner of the contract or the controller
     */
    modifier onlyOwnerOrController() {
        require(msg.sender == controllerAddress || msg.sender == owner, "Only owner or controller");
        _;
    }

    /**
     * @notice Sets the controller
     * @dev This function can be called by the owner only
     * @param controllerAddr The address of the controller
     */
    function setController (address controllerAddr) public onlyOwner {
        // Checks
        require(controllerAddr != address(0), "Controller address required");
        require(controllerAddr != owner, "Owner cannot be the Controller");
        require(controllerAddr != controllerAddress, "Controller already set");

        emit OnControllerChanged(controllerAddress, controllerAddr);

        // State changes
        controllerAddress = controllerAddr;
    }

    /**
     * @notice Transfers ownership to the address specified.
     * @param addr Specifies the address of the new owner.
     * @dev Throws if called by any account other than the owner.
     */
    function transferOwnership (address addr) public override onlyOwner {
        require(addr != controllerAddress, "Cannot transfer to controller");
        super.transferOwnership(addr);
    }
}

/**
 * @title Represents a receipt token. The token is fully compliant with the ERC20 interface.
 * @dev The token can be minted or burnt by whitelisted addresses only. Only the owner is allowed to enable/disable addresses.
 */
contract ReceiptToken is Mintable {
    /**
     * @notice Constructor.
     * @param newOwner The owner of the smart contract.
     */
    constructor (address newOwner, uint256 initialMaxSupply) Mintable(newOwner, "Fractal Protocol Vault Token", "USDF", 6, 0) {
        maxSupply = initialMaxSupply;
    }
}

/**
 * @notice This library provides stateless, general purpose functions.
 */
library Utils {
    // The code hash of any EOA
    bytes32 constant internal EOA_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;

    /**
     * @notice Indicates if the address specified represents a smart contract.
     * @dev Notice that this method returns TRUE if the address is a contract under construction
     * @param addr The address to evaluate
     * @return Returns true if the address represents a smart contract
     */
    function isContract (address addr) internal view returns (bool) {
        bytes32 eoaHash = EOA_HASH;

        bytes32 codeHash;

        // solhint-disable-next-line no-inline-assembly
        assembly { codeHash := extcodehash(addr) }

        return (codeHash != eoaHash && codeHash != 0x0);
    }

    /**
     * @notice Gets the code hash of the address specified
     * @param addr The address to evaluate
     * @return Returns a hash
     */
    function getCodeHash (address addr) internal view returns (bytes32) {
        bytes32 codeHash;

        // solhint-disable-next-line no-inline-assembly
        assembly { codeHash := extcodehash(addr) }

        return codeHash;
    }
}

library DateUtils {
    // The number of seconds per day
    uint256 internal constant SECONDS_PER_DAY = 24 * 60 * 60;

    // The number of seconds per hour
    uint256 internal constant SECONDS_PER_HOUR = 60 * 60;

    // The number of seconds per minute
    uint256 internal constant SECONDS_PER_MINUTE = 60;

    // The offset from 01/01/1970
    int256 internal constant OFFSET19700101 = 2440588;

    /**
     * @notice Gets the year of the timestamp specified.
     * @param timestamp The timestamp
     * @return year The year
     */
    function getYear (uint256 timestamp) internal pure returns (uint256 year) {
        (year,,) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }

    /**
     * @notice Gets the timestamp of the date specified.
     * @param year The year
     * @param month The month
     * @param day The day
     * @param hour The hour
     * @param minute The minute
     * @param second The seconds
     * @return timestamp The timestamp
     */
    function timestampFromDateTime(uint256 year, uint256 month, uint256 day, uint256 hour, uint256 minute, uint256 second) internal pure returns (uint256 timestamp) {
        timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR + minute * SECONDS_PER_MINUTE + second;
    }

    /**
     * @notice Gets the number of days elapsed between the two timestamps specified.
     * @param fromTimestamp The source date
     * @param toTimestamp The target date
     * @return Returns the difference, in days
     */
    function diffDays (uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256) {
        require(fromTimestamp <= toTimestamp, "Invalid order for timestamps");
        return (toTimestamp - fromTimestamp) / SECONDS_PER_DAY;
    }

    /**
     * @notice Calculate year/month/day from the number of days since 1970/01/01 using the date conversion algorithm from http://aa.usno.navy.mil/faq/docs/JD_Formula.php and adding the offset 2440588 so that 1970/01/01 is day 0
     * @dev Taken from https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary/blob/master/contracts/BokkyPooBahsDateTimeLibrary.sol
     * @param _days The year
     * @return year The year
     * @return month The month
     * @return day The day
     */
    function _daysToDate (uint256 _days) internal pure returns (uint256 year, uint256 month, uint256 day) {
        int256 __days = int256(_days);

        int256 x = __days + 68569 + OFFSET19700101;
        int256 n = 4 * x / 146097;
        x = x - (146097 * n + 3) / 4;
        int256 _year = 4000 * (x + 1) / 1461001;
        x = x - 1461 * _year / 4 + 31;
        int256 _month = 80 * x / 2447;
        int256 _day = x - 2447 * _month / 80;
        x = _month / 11;
        _month = _month + 2 - 12 * x;
        _year = 100 * (n - 49) + _year + x;

        year = uint256(_year);
        month = uint256(_month);
        day = uint256(_day);
    }

    /**
     * @notice Calculates the number of days from 1970/01/01 to year/month/day using the date conversion algorithm from http://aa.usno.navy.mil/faq/docs/JD_Formula.php and subtracting the offset 2440588 so that 1970/01/01 is day 0
     * @dev Taken from https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary/blob/master/contracts/BokkyPooBahsDateTimeLibrary.sol
     * @param year The year
     * @param month The month
     * @param day The day
     * @return _days Returns the number of days
     */
    function _daysFromDate (uint256 year, uint256 month, uint256 day) internal pure returns (uint256 _days) {
        require(year >= 1970, "Error");
        int _year = int(year);
        int _month = int(month);
        int _day = int(day);

        int __days = _day
          - 32075
          + 1461 * (_year + 4800 + (_month - 14) / 12) / 4
          + 367 * (_month - 2 - (_month - 14) / 12 * 12) / 12
          - 3 * ((_year + 4900 + (_month - 14) / 12) / 100) / 4
          - OFFSET19700101;

        _days = uint256(__days);
    }

    function isLeapYear(uint timestamp) internal pure returns (bool leapYear) {
        (uint year,,) = _daysToDate(timestamp / SECONDS_PER_DAY);
        leapYear = _isLeapYear(year);
    }    

    function _isLeapYear (uint256 year) internal pure returns (bool leapYear) {
        leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
    }
}

interface IDeployable {
    function deployCapital (uint256 deploymentAmount, bytes32 foreignNetwork) external;
    function claim (uint256 dailyInterestAmount) external;
}

/**
 * @title Represents a vault.
 */
contract Vault is Controllable {
    // The decimal multiplier of the receipt token
    uint256 private constant USDF_DECIMAL_MULTIPLIER = uint256(10) ** uint256(6);

    // Represents a record
    struct Record {
        uint256 apr;
        uint256 tokenPrice;
        uint256 totalDeposited;
        uint256 dailyInterest;
    }

    /**
     * @notice The timestamp that defines the start of the current year, per contract deployment.
     * @dev This is the unix epoch of January 1st since the contract deployment.
     */
    uint256 public startOfYearTimestamp;

    /**
     * @notice The current period. It is the zero-based day of the year, ranging from [0..364]
     * @dev Day zero represents January 1st (first day of the year) whereas day 364 represents December 31st (last day of the day)
     */
    uint256 public currentPeriod;

    /**
     * @notice The minimum amount you can deposit in the vault.
     */
    uint256 public minDepositAmount;

    /**
     * @notice The flat fee to apply to vault withdrawals.
     */
    uint256 public flatFeePercent;

    // The decimals multiplier of the underlying ERC20
    uint256 immutable private _decimalsMultiplier;

    /**
     * @notice The percentage of capital that needs to be invested. It ranges from [1..99]
     * @dev The investment percent is set to 90% by default
     */
    uint8 public investmentPercent = 90;

    // The reentrancy guard for deposits
    uint8 private _reentrancyMutexForDeposits;

    // The reentrancy guard for withdrawals
    uint8 private _reentrancyMutexForWithdrawals;

    /**
     * @notice The address of the yield reserve
     */
    address public yieldReserveAddress;

    /**
     * @notice The address that collects the applicable fees
     */
    address public feesAddress;

    /**
     * @notice The interface of the underlying token
     */
    IERC20 public immutable underlyingTokenInterface;

    // The receipt token. This is immutable so it cannot be altered after deployment.
    ReceiptToken private immutable _receiptToken;

    // The snapshots history
    mapping (uint256 => Record) private _records;

    // ---------------------------------------
    // Events
    // ---------------------------------------
    /**
     * @notice This event is fired when the vault receives a deposit.
     * @param tokenAddress Specifies the token address
     * @param fromAddress Specifies the address of the sender
     * @param depositAmount Specifies the deposit amount in USDC or the ERC20 handled by this contract
     * @param receiptTokensAmount Specifies the amount of receipt tokens issued to the user
     */
    event OnVaultDeposit (address tokenAddress, address fromAddress, uint256 depositAmount, uint256 receiptTokensAmount);

    /**
     * @notice This event is fired when a user withdraws funds from the vault.
     * @param tokenAddress Specifies the token address
     * @param toAddress Specifies the address of the recipient
     * @param erc20Amount Specifies the amount in USDC or the ERC20 handled by this contract
     * @param receiptTokensAmount Specifies the amount of receipt tokens withdrawn by the user
     * @param fee Specifies the withdrawal fee
     */
    event OnVaultWithdrawal (address tokenAddress, address toAddress, uint256 erc20Amount, uint256 receiptTokensAmount, uint256 fee);

    event OnTokenPriceChanged (uint256 prevTokenPrice, uint256 newTokenPrice);
    event OnFlatWithdrawalFeeChanged (uint256 prevValue, uint256 newValue);
    event OnYieldReserveAddressChanged (address prevAddress, address newAddress);
    event OnFeesAddressChanged (address prevAddress, address newAddress);
    event OnInvestmentPercentChanged (uint8 prevValue, uint8 newValue);
    event OnCapitalLocked (uint256 amountLocked);
    event OnInterestClaimed (uint256 interestAmount);
    event OnAprChanged (uint256 prevApr, uint256 newApr);
    event OnEmergencyWithdraw (uint256 withdrawalAmount);

    // ---------------------------------------
    // Constructor
    // ---------------------------------------
    constructor (
        address ownerAddr, 
        address controllerAddr, 
        ReceiptToken receiptTokenInterface, 
        IERC20 eip20Interface, 
        uint256 initialApr, 
        uint256 initialTokenPrice, 
        uint256 initialMinDepositAmount,
        uint256 flatFeePerc,
        address feesAddr) 
    Controllable (ownerAddr, controllerAddr) {
        // Checks
        require(initialMinDepositAmount > 0, "Invalid min deposit amount");
        require(feesAddr != address(0), "Invalid address for fees");

        // State changes
        underlyingTokenInterface = eip20Interface;
        _receiptToken = receiptTokenInterface;
        minDepositAmount = initialMinDepositAmount;
        _decimalsMultiplier = uint256(10) ** uint256(eip20Interface.decimals());

        uint256 currentTimestamp = block.timestamp; // solhint-disable-line not-rely-on-time

        // Get the current year
        uint256 currentYear = DateUtils.getYear(currentTimestamp);

        // Set the timestamp of January 1st of the current year (the year starts at this unix epoch)
        startOfYearTimestamp = DateUtils.timestampFromDateTime(currentYear, 1, 1, 0, 0, 0);

        // Create the first record
        currentPeriod = DateUtils.diffDays(startOfYearTimestamp, currentTimestamp);
        
        // The APR must be expressed with 2 decimal places. Example: 5% = 500 whereas 5.75% = 575
        _records[currentPeriod] = Record(initialApr, initialTokenPrice, 0, 0);

        flatFeePercent = flatFeePerc;
        feesAddress = feesAddr;
    }

    // ---------------------------------------
    // Modifiers
    // ---------------------------------------
    /**
     * @notice Throws if there is a deposit in progress
     */
    modifier ifNotReentrantDeposit() {
        require(_reentrancyMutexForDeposits == 0, "Reentrant deposit rejected");
        _;
    }

    /**
     * @notice Throws if there is a withdrawal in progress
     */
    modifier ifNotReentrantWithdrawal() {
        require(_reentrancyMutexForWithdrawals == 0, "Reentrant withdrawal rejected");
        _;
    }

    // ---------------------------------------
    // Functions
    // ---------------------------------------
    /**
     * @notice Sets the address of the yield reserve
     * @dev This function can be called by the owner or the controller.
     * @param addr The address of the yield reserve
     */
    function setYieldReserveAddress (address addr) public onlyOwnerOrController {
        require(addr != address(0) && addr != address(this), "Invalid address");
        require(Utils.isContract(addr), "The address must be a contract");

        emit OnYieldReserveAddressChanged(yieldReserveAddress, addr);
        yieldReserveAddress = addr;
    }

    /**
     * @notice Sets the minimum amount for deposits.
     * @dev This function can be called by the owner or the controller.
     * @param minAmount The minimum deposit amount
     */
    function setMinDepositAmount (uint256 minAmount) public onlyOwnerOrController {
        // Checks
        require(minAmount > 0, "Invalid minimum deposit amount");

        // State changes
        minDepositAmount = minAmount;
    }

    /**
     * @notice Sets a new flat fee for withdrawals.
     * @dev The new fee is allowed to be zero (aka: no fees).
     * @param newFeeWithMultiplier The new fee, which is expressed per decimals precision of the underlying token (say USDC for example)
     */
    function setFlatWithdrawalFee (uint256 newFeeWithMultiplier) public onlyOwnerOrController {
        // Example for USDC (6 decimal places):
        // Say the fee is: 0.03%
        // Thus the fee amount is: 0.03 * _decimalsMultiplier = 30000 = 0.03 * (10 to the power of 6)
        emit OnFlatWithdrawalFeeChanged(flatFeePercent, newFeeWithMultiplier);

        flatFeePercent = newFeeWithMultiplier;
    }

    /**
     * @notice Sets the address for collecting fees.
     * @param addr The address
     */
    function setFeeAddress (address addr) public onlyOwnerOrController {
        require(addr != address(0) && addr != feesAddress, "Invalid address for fees");

        emit OnFeesAddressChanged(feesAddress, addr);
        feesAddress = addr;
    }

    /**
     * @notice Sets the total amount deposited in the Vault
     * @dev This function can be called during a migration only. It is guaranteed to fail otherwise.
     * @param newAmount The total amount deposited in the old Vault
     */
    function setTotalDepositedAmount (uint256 newAmount) public onlyOwner {
        require(newAmount > 0, "Non-zero amount required");

        uint256 currentBalance = underlyingTokenInterface.balanceOf(address(this));
        require(currentBalance == 0, "Deposits already available");

        // State changes
        _records[currentPeriod].totalDeposited = newAmount;
    }

    /**
     * @notice Deposits funds in the vault. The caller gets the respective amount of receipt tokens in exchange for their deposit.
     * @dev The number of receipt tokens is calculated based on the current token price.
     * @param depositAmount Specifies the deposit amount
     */
    function deposit (uint256 depositAmount) public ifNotReentrantDeposit {
        // Make sure the deposit amount falls within the expected range
        require(depositAmount >= minDepositAmount, "Minimum deposit amount not met");

        // Wake up the reentrancy guard
        _reentrancyMutexForDeposits = 1;

        // Refresh the current timelime, if needed
        compute();

        // Make sure the sender can cover the deposit (aka: has enough USDC/ERC20 on their wallet)
        require(underlyingTokenInterface.balanceOf(msg.sender) >= depositAmount, "Insufficient funds");

        // Make sure the user approved this contract to spend the amount specified
        require(underlyingTokenInterface.allowance(msg.sender, address(this)) >= depositAmount, "Insufficient allowance");

        // Determine how many tokens can be issued/minted to the destination address
        uint256 numberOfReceiptTokens = depositAmount * USDF_DECIMAL_MULTIPLIER / _records[currentPeriod].tokenPrice;

        // Make sure we can issue the number of tokens specified, per limits
        require(_receiptToken.canMint(numberOfReceiptTokens), "Token supply limit exceeded");

        _records[currentPeriod].totalDeposited += depositAmount;

        // Get the current balance of this contract in USDC (or whatever the ERC20 is, which defined at deployment time)
        uint256 balanceBeforeTransfer = underlyingTokenInterface.balanceOf(address(this));

        // Make sure the ERC20 transfer succeeded
        require(underlyingTokenInterface.transferFrom(msg.sender, address(this), depositAmount), "Token transfer failed");

        // The new balance of this contract, after the transfer
        uint256 newBalance = underlyingTokenInterface.balanceOf(address(this));

        // At the very least, the new balance should be the previous balance + the deposit.
        require(newBalance == balanceBeforeTransfer + depositAmount, "Balance verification failed");

        // Issue/mint the respective number of tokens. Users get a receipt token in exchange for their deposit in USDC/ERC20.
        _receiptToken.mint(msg.sender, numberOfReceiptTokens);

        // Emit a new "deposit" event
        emit OnVaultDeposit(address(underlyingTokenInterface), msg.sender, depositAmount, numberOfReceiptTokens);

        // Reset the reentrancy guard
        _reentrancyMutexForDeposits = 0;
    }

    /**
     * @notice Withdraws a specific amount of tokens from the Vault.
     * @param receiptTokenAmount The number of tokens to withdraw from the vault
     */
    function withdraw (uint256 receiptTokenAmount) public ifNotReentrantWithdrawal {
        // Checks
        require(receiptTokenAmount > 0, "Invalid withdrawal amount");

        // Wake up the reentrancy guard
        _reentrancyMutexForWithdrawals = 1;

        // Refresh the current timelime, if needed
        compute();

        // Make sure the sender has enough receipt tokens to burn
        require(_receiptToken.balanceOf(msg.sender) >= receiptTokenAmount, "Insufficient balance of tokens");

        // The amount of USDC you get in exchange, at the current token price
        uint256 withdrawalAmount = toErc20Amount(receiptTokenAmount);
        require(withdrawalAmount <= _records[currentPeriod].totalDeposited, "Invalid withdrawal amount");

        uint256 maxWithdrawalAmount = _records[currentPeriod].totalDeposited * (uint256(100) - uint256(investmentPercent)) / uint256(100);
        require(withdrawalAmount <= maxWithdrawalAmount, "Max withdrawal amount exceeded");

        uint256 currentBalance = underlyingTokenInterface.balanceOf(address(this));
        require(currentBalance >= withdrawalAmount, "Insufficient funds in the buffer");

        // Notice that the fee is applied in the underlying currency instead of receipt tokens.
        // The amount applicable to the fee
        uint256 feeAmount = (flatFeePercent > 0) ? withdrawalAmount * flatFeePercent / uint256(100) / _decimalsMultiplier : 0;
        require(feeAmount < withdrawalAmount, "Invalid fee");

        // The amount to send to the destination address (recipient), after applying the fee
        uint256 withdrawalAmountAfterFees = withdrawalAmount - feeAmount;

        // Update the record per amount withdrawn, with no applicable fees.
        // A common mistake would be update the metric below with fees included. DONT DO THAT.
        _records[currentPeriod].totalDeposited -= withdrawalAmount;

        // Burn the number of receipt tokens specified
        _receiptToken.burn(msg.sender, receiptTokenAmount);

        // Transfer the respective amount of underlying tokens to the sender (after applying the fee)
        require(underlyingTokenInterface.transfer(msg.sender, withdrawalAmountAfterFees), "Token transfer failed");

        if (feeAmount > 0) {
            // Transfer the applicable fee, if any
            require(underlyingTokenInterface.transfer(feesAddress, feeAmount), "Fee transfer failed");
        }

        // Emit a new "withdrawal" event
        emit OnVaultWithdrawal(address(underlyingTokenInterface), msg.sender, withdrawalAmount, receiptTokenAmount, feeAmount);

        // Reset the reentrancy guard
        _reentrancyMutexForWithdrawals = 0; // solhint-disable-line reentrancy
    }

    /**
     * @notice Runs an emergency withdrawal. Sends the whole balance to the address specified.
     * @dev This function can be called by the owner only.
     * @param destinationAddr The destination address
     */
    function emergencyWithdraw (address destinationAddr) public onlyOwner ifNotReentrantWithdrawal {
        require(destinationAddr != address(0) && destinationAddr != address(this), "Invalid address");

        // Wake up the reentrancy guard
        _reentrancyMutexForWithdrawals = 1;

        uint256 currentBalance = underlyingTokenInterface.balanceOf(address(this));
        require(currentBalance > 0, "The vault has no funds");

        // Transfer all funds to the address specified
        require(underlyingTokenInterface.transfer(destinationAddr, currentBalance), "Token transfer failed");

        emit OnEmergencyWithdraw(currentBalance);

        // Reset the reentrancy guard
        _reentrancyMutexForWithdrawals = 0; // solhint-disable-line reentrancy
    }

    /**
     * @notice Updates the APR
     * @dev The APR must be expressed with 2 decimal places. Example: 5% = 500 whereas 5.75% = 575
     * @param newApr The new APR, expressed with 2 decimal places.
     */
    function changeApr (uint256 newApr) public onlyOwner {
        require(newApr > 0, "Invalid APR");

        compute();

        emit OnAprChanged(_records[currentPeriod].apr, newApr);
        _records[currentPeriod].apr = newApr;
    }

    /**
     * @notice Sets the token price, arbitrarily.
     * @param newTokenPrice The new price of the receipt token
     */
    function setTokenPrice (uint256 newTokenPrice) public onlyOwner {
        require(newTokenPrice > 0, "Invalid token price");

        compute();

        emit OnTokenPriceChanged(_records[currentPeriod].tokenPrice, newTokenPrice);
        _records[currentPeriod].tokenPrice = newTokenPrice;
    }

    /**
     * @notice Sets the investment percent.
     * @param newPercent The new investment percent
     */
    function setInvestmentPercent (uint8 newPercent) public onlyOwnerOrController {
        require(newPercent > 0 && newPercent < 100, "Invalid investment percent");

        emit OnInvestmentPercentChanged(investmentPercent, newPercent);
        investmentPercent = newPercent;
    }

    /**
     * @notice Computes the metrics (token price, daily interest) for the current day of year
     */
    function compute () public {
        uint256 currentTimestamp = block.timestamp; // solhint-disable-line not-rely-on-time

        uint256 newPeriod = DateUtils.diffDays(startOfYearTimestamp, currentTimestamp);
        if (newPeriod <= currentPeriod) return;

        uint256 x = 0;

        for (uint256 i = currentPeriod + 1; i <= newPeriod; i++) {
            x++;
            _records[i].apr = _records[i - 1].apr;
            _records[i].totalDeposited = _records[i - 1].totalDeposited;

            uint256 diff = _records[i - 1].apr * USDF_DECIMAL_MULTIPLIER * uint256(100) / uint256(36500);
            _records[i].tokenPrice = _records[i - 1].tokenPrice + (diff / uint256(10000));
            _records[i].dailyInterest = _records[i - 1].totalDeposited * uint256(_records[i - 1].apr) / uint256(3650000);
            if (x >= 30) break;
        }

        currentPeriod += x;
    }

    /**
     * @notice Moves the deployable capital from the vault to the yield reserve.
     * @dev This function should fail if it would cause the vault to be left with <10% of deposited amount
     */
    function lockCapital () public onlyOwnerOrController ifNotReentrantWithdrawal {
        // Wake up the reentrancy guard
        _reentrancyMutexForWithdrawals = 1;

        compute();

        // Get the maximum amount of capital that can be deployed at this point in time
        uint256 maxDeployableAmount = getDeployableCapital();
        require(maxDeployableAmount > 0, "No capital to deploy");

        require(underlyingTokenInterface.transfer(yieldReserveAddress, maxDeployableAmount), "Transfer failed");
        emit OnCapitalLocked(maxDeployableAmount);

        // Reset the reentrancy guard
        _reentrancyMutexForWithdrawals = 0; // solhint-disable-line reentrancy
    }

    /**
     * @notice Claims the daily interest promised per APR.
     */
    function claimDailyInterest () public onlyOwnerOrController {
        compute();

        // Get the daily interest that need to be claimed at this point in time
        uint256 dailyInterestAmount = getDailyInterest();

        uint256 balanceBefore = underlyingTokenInterface.balanceOf(address(this));

        IDeployable(yieldReserveAddress).claim(dailyInterestAmount);

        uint256 balanceAfter = underlyingTokenInterface.balanceOf(address(this));

        require(balanceAfter >= balanceBefore + dailyInterestAmount, "Balance verification failed");

        emit OnInterestClaimed(dailyInterestAmount);
    }

    /**
     * @notice Gets the period of the current unix epoch.
     * @dev The period is the zero-based day of the current year. It is the number of days that elapsed since January 1st of the current year.
     * @return Returns a number between [0..364]
     */
    function getPeriodOfCurrentEpoch () public view returns (uint256) {
        return DateUtils.diffDays(startOfYearTimestamp, block.timestamp); // solhint-disable-line not-rely-on-time
    }

    function getSnapshot (uint256 i) public view returns (uint256 apr, uint256 tokenPrice, uint256 totalDeposited, uint256 dailyInterest) {
        apr = _records[i].apr;
        tokenPrice = _records[i].tokenPrice;
        totalDeposited = _records[i].totalDeposited;
        dailyInterest = _records[i].dailyInterest;
    }

    /**
     * @notice Gets the total amount deposited in the vault.
     * @dev This value increases when people deposits funds in the vault. Likewise, it decreases when people withdraw from the vault.
     * @return The total amount deposited in the vault.
     */
    function getTotalDeposited () public view returns (uint256) {
        return _records[currentPeriod].totalDeposited;
    }

    /**
     * @notice Gets the daily interest
     * @return The daily interest
     */
    function getDailyInterest () public view returns (uint256) {
        return _records[currentPeriod].dailyInterest;
    }

    /**
     * @notice Gets the current token price
     * @return The price of the token
     */
    function getTokenPrice () public view returns (uint256) {
        return _records[currentPeriod].tokenPrice;
    }

    /**
     * @notice Gets the maximum amount of USDC/ERC20 you can withdraw from the vault
     * @return The maximum withdrawal amount
     */
    function getMaxWithdrawalAmount () public view returns (uint256) {
        return _records[currentPeriod].totalDeposited * (uint256(100) - uint256(investmentPercent)) / uint256(100);
    }

    /**
     * @notice Gets the amount of capital that can be deployed.
     * @dev This is the amount of capital that will be moved from the Vault to the Yield Reserve.
     * @return The amount of deployable capital
     */
    function getDeployableCapital () public view returns (uint256) {
        // X% of the total deposits should remain in the vault. This is the target vault balance.
        //
        // For example:
        // ------------
        // If the total deposits are 800k USDC and the investment percent is set to 90%
        // then the vault should keep the remaining 10% as a buffer for withdrawals.
        // In this example the vault should keep 80k USDC, which is the 10% of 800k USDC.
        uint256 shouldRemainInVault = _records[currentPeriod].totalDeposited * (uint256(100) - uint256(investmentPercent)) / uint256(100);

        // The current balance at the Vault
        uint256 currentBalance = underlyingTokenInterface.balanceOf(address(this));

        // Return the amount of deployable capital
        return (currentBalance > shouldRemainInVault) ? currentBalance - shouldRemainInVault : 0;
    }

    /**
     * @notice Returns the amount of USDC you would get by burning the number of receipt tokens specified, at the current price.
     * @return The amount of USDC you get in exchange, at the current token price
     */
    function toErc20Amount (uint256 receiptTokenAmount) public view returns (uint256) {
        return receiptTokenAmount * _records[currentPeriod].tokenPrice / USDF_DECIMAL_MULTIPLIER;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"ownerAddr","type":"address"},{"internalType":"address","name":"controllerAddr","type":"address"},{"internalType":"contract ReceiptToken","name":"receiptTokenInterface","type":"address"},{"internalType":"contract IERC20","name":"eip20Interface","type":"address"},{"internalType":"uint256","name":"initialApr","type":"uint256"},{"internalType":"uint256","name":"initialTokenPrice","type":"uint256"},{"internalType":"uint256","name":"initialMinDepositAmount","type":"uint256"},{"internalType":"uint256","name":"flatFeePerc","type":"uint256"},{"internalType":"address","name":"feesAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevApr","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newApr","type":"uint256"}],"name":"OnAprChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountLocked","type":"uint256"}],"name":"OnCapitalLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"prevAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"OnControllerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawalAmount","type":"uint256"}],"name":"OnEmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"prevAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"OnFeesAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"OnFlatWithdrawalFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"interestAmount","type":"uint256"}],"name":"OnInterestClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"prevValue","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newValue","type":"uint8"}],"name":"OnInvestmentPercentChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevTokenPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTokenPrice","type":"uint256"}],"name":"OnTokenPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receiptTokensAmount","type":"uint256"}],"name":"OnVaultDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receiptTokensAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"OnVaultWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"prevAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"OnYieldReserveAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"newApr","type":"uint256"}],"name":"changeApr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimDailyInterest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controllerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destinationAddr","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flatFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDailyInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeployableCapital","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWithdrawalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPeriodOfCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getSnapshot","outputs":[{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"totalDeposited","type":"uint256"},{"internalType":"uint256","name":"dailyInterest","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investmentPercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockCapital","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controllerAddr","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeeWithMultiplier","type":"uint256"}],"name":"setFlatWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newPercent","type":"uint8"}],"name":"setInvestmentPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"setMinDepositAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setTotalDepositedAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setYieldReserveAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startOfYearTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"receiptTokenAmount","type":"uint256"}],"name":"toErc20Amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlyingTokenInterface","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"receiptTokenAmount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yieldReserveAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60e06040526006805460ff1916605a1790553480156200001e57600080fd5b5060405162003e9138038062003e918339810160408190526200004191620008ad565b8888816001600160a01b038116620000a05760405162461bcd60e51b815260206004820152601960248201527f6e6f6e2d7a65726f20616464726573732072657175697265640000000000000060448201526064015b60405180910390fd5b6001600160a01b03811660011415620000fc5760405162461bcd60e51b815260206004820152601d60248201527f65637265636f7665722061646472657373206e6f7420616c6c6f776564000000604482015260640162000097565b600080546001600160a01b0319166001600160a01b03831690811782556040805192835260208301919091527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1506001600160a01b038116620001ac5760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726f6c6c657220616464726573732072657175697265640000000000604482015260640162000097565b816001600160a01b0316816001600160a01b03161415620002105760405162461bcd60e51b815260206004820152601e60248201527f4f776e65722063616e6e6f742062652074686520436f6e74726f6c6c65720000604482015260640162000097565b600180546001600160a01b0319166001600160a01b03929092169190911790555082620002805760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206d696e206465706f73697420616d6f756e74000000000000604482015260640162000097565b6001600160a01b038116620002d85760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206164647265737320666f7220666565730000000000000000604482015260640162000097565b6001600160601b0319606087811b821660a05288901b1660c05260048381556040805163313ce56760e01b815290516001600160a01b0389169263313ce56792808201926020929091829003018186803b1580156200033657600080fd5b505afa1580156200034b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000371919062000954565b620003819060ff16600a62000a71565b6080524260006200039e8262000460602090811b620027aa17901c565b9050620003be8160018060008060006200048460201b620027ca1760201c565b600281905550620003dd60025483620004ee60201b620028261760201c565b600381815560408051608081018252998a526020808b01998a5260008b830181815260608d0182815295825260089092529190912099518a55975160018a015596516002890155519690950195909555600591909155600780546001600160a01b0319166001600160a01b039092169190911790555062000cae95505050505050565b60006200047b62000475620151808462000a0d565b62000565565b50909392505050565b60008162000494603c8562000be8565b620004a2610e108762000be8565b62015180620004b38b8b8b62000711565b620004bf919062000be8565b620004cb9190620009be565b620004d79190620009be565b620004e39190620009be565b979650505050505050565b600081831115620005425760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f7264657220666f722074696d657374616d707300000000604482015260640162000097565b6201518062000552848462000c4f565b6200055e919062000a0d565b9392505050565b60008080838162253d8c6200057e8362010bd962000977565b6200058a919062000977565b9050600062023ab16200059f83600462000b59565b620005ab9190620009d9565b90506004620005be8262023ab162000b59565b620005cb90600362000977565b620005d79190620009d9565b620005e3908362000c0a565b9150600062164b09620005f884600162000977565b6200060690610fa062000b59565b620006129190620009d9565b9050600462000624826105b562000b59565b620006309190620009d9565b6200063c908462000c0a565b6200064990601f62000977565b9250600061098f6200065d85605062000b59565b620006699190620009d9565b9050600060506200067d8361098f62000b59565b620006899190620009d9565b62000695908662000c0a565b9050620006a4600b83620009d9565b9450620006b385600c62000b59565b620006c083600262000977565b620006cc919062000c0a565b91508483620006dd60318762000c0a565b620006ea90606462000b59565b620006f6919062000977565b62000702919062000977565b9a919950975095505050505050565b60006107b28410156200074f5760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b604482015260640162000097565b838383600062253d8c60046064600c6200076b600e8862000c0a565b620007779190620009d9565b620007858861132462000977565b62000791919062000977565b6200079d9190620009d9565b620007aa90600362000b59565b620007b69190620009d9565b600c80620007c6600e8862000c0a565b620007d29190620009d9565b620007df90600c62000b59565b620007ec60028862000c0a565b620007f8919062000c0a565b620008069061016f62000b59565b620008129190620009d9565b6004600c62000823600e8962000c0a565b6200082f9190620009d9565b6200083d896112c062000977565b62000849919062000977565b62000857906105b562000b59565b620008639190620009d9565b62000871617d4b8762000c0a565b6200087d919062000977565b62000889919062000977565b62000895919062000c0a565b620008a1919062000c0a565b98975050505050505050565b60008060008060008060008060006101208a8c031215620008cc578485fd5b8951620008d98162000c95565b60208b0151909950620008ec8162000c95565b60408b0151909850620008ff8162000c95565b60608b0151909750620009128162000c95565b8096505060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a0151620009438162000c95565b809150509295985092959850929598565b60006020828403121562000966578081fd5b815160ff811681146200055e578182fd5b600080821280156001600160ff1b03849003851316156200099c576200099c62000c69565b600160ff1b8390038412811615620009b857620009b862000c69565b50500190565b60008219821115620009d457620009d462000c69565b500190565b600082620009eb57620009eb62000c7f565b600160ff1b82146000198414161562000a085762000a0862000c69565b500590565b60008262000a1f5762000a1f62000c7f565b500490565b80825b600180861162000a38575062000a68565b81870482111562000a4d5762000a4d62000c69565b8086161562000a5b57918102915b9490941c93800262000a27565b94509492505050565b60006200055e600019848460008262000a8d575060016200055e565b8162000a9c575060006200055e565b816001811462000ab5576002811462000ac05762000af4565b60019150506200055e565b60ff84111562000ad45762000ad462000c69565b6001841b91508482111562000aed5762000aed62000c69565b506200055e565b5060208310610133831016604e8410600b841016171562000b2c575081810a8381111562000b265762000b2662000c69565b6200055e565b62000b3b848484600162000a24565b80860482111562000b505762000b5062000c69565b02949350505050565b60006001600160ff1b038184138284138082168684048611161562000b825762000b8262000c69565b600160ff1b8487128281168783058912161562000ba35762000ba362000c69565b85871292508782058712848416161562000bc15762000bc162000c69565b8785058712818416161562000bda5762000bda62000c69565b505050929093029392505050565b600081600019048311821515161562000c055762000c0562000c69565b500290565b60008083128015600160ff1b85018412161562000c2b5762000c2b62000c69565b6001600160ff1b038401831381161562000c495762000c4962000c69565b50500390565b60008282101562000c645762000c6462000c69565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b038116811462000cab57600080fd5b50565b60805160a05160601c60c05160601c61312162000d7060003960008181610b2501528181610ecd01528181612037015261239d0152600081816102bd01528181610536015281816108f001528181610d0c01528181610f4b0152818161101c015281816110ea015281816114e5015281816115d001528181611c7c01528181611e3e01528181611f2001528181612146015281816121ed015281816122a50152818161240d01528181612509015261260001526000610df401526131216000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80636a61e5fc1161011a57806392eefe9b116100ad578063b68ef5591161007c578063b68ef55914610481578063b6b55f251461049b578063bced9117146104ae578063f2fde38b146104b6578063f36932b7146104c957610206565b806392eefe9b146104405780639c256eef146104535780639ce7f67014610466578063addf8f211461046e57610206565b80638da5cb5b116100e95780638da5cb5b146103f4578063919cfa211461040757806391dd75e71461041a578063922f21231461042d57610206565b80636a61e5fc146103655780636ff1c9bc1461037857806376f10ad01461038b5780638705fcd4146103e157610206565b806331cbd1481161019d5780634b24ea471161016c5780634b24ea47146103095780634b94f50e1461031c5780635798ef311461033657806357e0bf9414610349578063645006ca1461035c57610206565b806331cbd148146102b85780633a621d37146102df57806342c9b1d9146102e75780634378f0ec146102f057610206565b8063292bbd32116101d9578063292bbd32146102585780632a40eb721461028a5780632a80cda3146102925780632e1a7d4d146102a557610206565b80630301310b1461020b578063060406181461022f57806308b4a994146102465780631a43c3381461024e575b600080fd5b6006546102189060ff1681565b60405160ff90911681526020015b60405180910390f35b61023860035481565b604051908152602001610226565b6102386104d2565b6102566105d1565b005b60065461027290630100000090046001600160a01b031681565b6040516001600160a01b039091168152602001610226565b6102566107e2565b6102566102a0366004612cdf565b6109ec565b6102566102b3366004612cdf565b610a80565b6102727f000000000000000000000000000000000000000000000000000000000000000081565b610238611167565b61023860025481565b6003805460009081526008602052604090200154610238565b600154610272906001600160a01b031681565b600354600090815260086020526040902060010154610238565b610256610344366004612c98565b61117a565b610238610357366004612cdf565b6112e7565b61023860045481565b610256610373366004612cdf565b611324565b610256610386366004612c98565b611402565b6103c1610399366004612cdf565b6000908152600860205260409020805460018201546002830154600390930154919390929190565b604080519485526020850193909352918301526060820152608001610226565b6102566103ef366004612c98565b6116ab565b600054610272906001600160a01b031681565b610256610415366004612cdf565b6117c5565b600754610272906001600160a01b031681565b61025661043b366004612cdf565b611845565b61025661044e366004612c98565b611915565b610256610461366004612d0f565b611ab3565b610238611bab565b61025661047c366004612cdf565b611bea565b600354600090815260086020526040902060020154610238565b6102566104a9366004612cdf565b611d66565b610256612483565b6102566104c4366004612c98565b612716565b61023860055481565b60065460009081906064906104ea9060ff168261308d565b600354600090815260086020526040902060020154610509919061302f565b6105139190612e84565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561057857600080fd5b505afa15801561058c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612cf7565b90508181116105c05760006105ca565b6105ca828261308d565b9250505090565b600042905060006105e460025483612826565b905060035481116105f65750506107e0565b60008060035460016106089190612e3e565b90505b8281116107c4578161061c816130a4565b925060089050600061062f60018461308d565b815260208082019290925260409081016000908120548482526008938490529181209190915561066060018461308d565b81526020019081526020016000206002015460086000838152602001908152602001600020600201819055506000618e9460646006600a6106a19190612ede565b600860006106b060018861308d565b8152602001908152602001600020600001546106cc919061302f565b6106d6919061302f565b6106e09190612e84565b90506106ee61271082612e84565b600860006106fd60018661308d565b8152602001908152602001600020600101546107199190612e3e565b60086000848152602001908152602001600020600101819055506237b1d060086000600185610748919061308d565b8152602001908152602001600020600001546008600060018661076b919061308d565b815260200190815260200160002060020154610787919061302f565b6107919190612e84565b600083815260086020526040902060030155601e83106107b157506107c4565b50806107bc816130a4565b91505061060b565b5080600360008282546107d79190612e3e565b90915550505050505b565b6001546001600160a01b031633148061080557506000546001600160a01b031633145b61082a5760405162461bcd60e51b815260040161082190612dc6565b60405180910390fd5b60065462010000900460ff16156108535760405162461bcd60e51b815260040161082190612d30565b6006805462ff000019166201000017905561086c6105d1565b60006108766104d2565b9050600081116108bf5760405162461bcd60e51b81526020600482015260146024820152734e6f206361706974616c20746f206465706c6f7960601b6044820152606401610821565b60065460405163a9059cbb60e01b815263010000009091046001600160a01b039081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561093457600080fd5b505af1158015610948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096c9190612cbf565b6109aa5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610821565b6040518181527fa0c74edaedd64a934c208860c6fabae3e8a26c05dea32da0d43af5c0d6eff2559060200160405180910390a1506006805462ff000019169055565b6001546001600160a01b0316331480610a0f57506000546001600160a01b031633145b610a2b5760405162461bcd60e51b815260040161082190612dc6565b60008111610a7b5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206d696e696d756d206465706f73697420616d6f756e7400006044820152606401610821565b600455565b60065462010000900460ff1615610aa95760405162461bcd60e51b815260040161082190612d30565b60008111610af55760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b6044820152606401610821565b6006805462ff0000191662010000179055610b0e6105d1565b6040516370a0823160e01b815233600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610b6f57600080fd5b505afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190612cf7565b1015610bf55760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742062616c616e6365206f6620746f6b656e7300006044820152606401610821565b6000610c00826112e7565b600354600090815260086020526040902060020154909150811115610c635760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b6044820152606401610821565b600654600090606490610c799060ff168261308d565b600354600090815260086020526040902060020154610c98919061302f565b610ca29190612e84565b905080821115610cf45760405162461bcd60e51b815260206004820152601e60248201527f4d6178207769746864726177616c20616d6f756e7420657863656564656400006044820152606401610821565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610d5657600080fd5b505afa158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e9190612cf7565b905082811015610de05760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e742066756e647320696e20746865206275666665726044820152606401610821565b60008060055411610df2576000610e37565b7f0000000000000000000000000000000000000000000000000000000000000000606460055486610e23919061302f565b610e2d9190612e84565b610e379190612e84565b9050838110610e765760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b6044820152606401610821565b6000610e82828661308d565b9050846008600060035481526020019081526020016000206002016000828254610eac919061308d565b9091555050604051632770a7eb60e21b8152336004820152602481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610f1957600080fd5b505af1158015610f2d573d6000803e3d6000fd5b505060405163a9059cbb60e01b8152336004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316925063a9059cbb9150604401602060405180830381600087803b158015610f9957600080fd5b505af1158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd19190612cbf565b610fed5760405162461bcd60e51b815260040161082190612d67565b81156110dc5760075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b15801561106257600080fd5b505af1158015611076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a9190612cbf565b6110dc5760405162461bcd60e51b8152602060048201526013602482015272119959481d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610821565b604080516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815233602082015290810186905260608101879052608081018390527f297b983b359127be0bb37e151a4fec683bc9012dd4d0ac96db47cfc17019c1e49060a00160405180910390a150506006805462ff00001916905550505050565b600061117560025442612826565b905090565b6001546001600160a01b031633148061119d57506000546001600160a01b031633145b6111b95760405162461bcd60e51b815260040161082190612dc6565b6001600160a01b038116158015906111da57506001600160a01b0381163014155b6112185760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610821565b61122181612897565b61126d5760405162461bcd60e51b815260206004820152601e60248201527f5468652061646472657373206d757374206265206120636f6e747261637400006044820152606401610821565b600654604080516001600160a01b0363010000009093048316815291831660208301527f0aebc9026561f275e982d855dff9cf49033009d9f31ba8acc0b619ce6b5b2e4b910160405180910390a1600680546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60006112f56006600a612ede565b600354600090815260086020526040902060010154611314908461302f565b61131e9190612e84565b92915050565b6000546001600160a01b0316331461134e5760405162461bcd60e51b815260040161082190612d96565b600081116113945760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420746f6b656e20707269636560681b6044820152606401610821565b61139c6105d1565b6003546000908152600860209081526040918290206001015482519081529081018390527f1107a79eab721b565f7d6a0bd7847e7021dd0f721c65eadc1d6c35eb08dbc0ed910160405180910390a1600354600090815260086020526040902060010155565b6000546001600160a01b0316331461142c5760405162461bcd60e51b815260040161082190612d96565b60065462010000900460ff16156114555760405162461bcd60e51b815260040161082190612d30565b6001600160a01b0381161580159061147657506001600160a01b0381163014155b6114b45760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610821565b6006805462ff00001916620100001790556040516370a0823160e01b81523060048201526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190612cf7565b9050600081116115aa5760405162461bcd60e51b8152602060048201526016602482015275546865207661756c7420686173206e6f2066756e647360501b6044820152606401610821565b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561161457600080fd5b505af1158015611628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164c9190612cbf565b6116685760405162461bcd60e51b815260040161082190612d67565b6040518181527f55abaad61a326c0cc8618401ad343a21179b6f621dc9247617973a61b0d81d1e9060200160405180910390a150506006805462ff000019169055565b6001546001600160a01b03163314806116ce57506000546001600160a01b031633145b6116ea5760405162461bcd60e51b815260040161082190612dc6565b6001600160a01b0381161580159061171057506007546001600160a01b03828116911614155b61175c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206164647265737320666f72206665657300000000000000006044820152606401610821565b600754604080516001600160a01b03928316815291831660208301527f3b4be58da14251f504968b7257dff9b9c1ecb07ac50130d7a4bf5533acf20d23910160405180910390a1600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314806117e857506000546001600160a01b031633145b6118045760405162461bcd60e51b815260040161082190612dc6565b60055460408051918252602082018390527f120fd6c83629ae96124876a9b5b025e47fb83d42972ca449a5a3405dbccfb986910160405180910390a1600555565b6000546001600160a01b0316331461186f5760405162461bcd60e51b815260040161082190612d96565b600081116118ad5760405162461bcd60e51b815260206004820152600b60248201526a24b73b30b634b21020a82960a91b6044820152606401610821565b6118b56105d1565b6003546000908152600860209081526040918290205482519081529081018390527fc827555e5522aeda7e894c1d924063a0e0cb6e782418a59fcd72c6c23cbac06b910160405180910390a1600354600090815260086020526040902055565b6000546001600160a01b0316331461193f5760405162461bcd60e51b815260040161082190612d96565b6001600160a01b0381166119955760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726f6c6c6572206164647265737320726571756972656400000000006044820152606401610821565b6000546001600160a01b03828116911614156119f35760405162461bcd60e51b815260206004820152601e60248201527f4f776e65722063616e6e6f742062652074686520436f6e74726f6c6c657200006044820152606401610821565b6001546001600160a01b0382811691161415611a4a5760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c88185b1c9958591e481cd95d60521b6044820152606401610821565b600154604080516001600160a01b03928316815291831660208301527f3df96927933b869a51e4444ecd13bc819f0a1396ef6b6c3af44369afcb3e05b1910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331480611ad657506000546001600160a01b031633145b611af25760405162461bcd60e51b815260040161082190612dc6565b60008160ff16118015611b08575060648160ff16105b611b545760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e766573746d656e742070657263656e740000000000006044820152606401610821565b6006546040805160ff928316815291831660208301527ff6a34f02b83ccdde55c05d6d6e72262bae32f03d30abd8168b5a10f367967696910160405180910390a16006805460ff191660ff92909216919091179055565b600654600090606490611bc19060ff168261308d565b600354600090815260086020526040902060020154611be0919061302f565b6111759190612e84565b6000546001600160a01b03163314611c145760405162461bcd60e51b815260040161082190612d96565b60008111611c645760405162461bcd60e51b815260206004820152601860248201527f4e6f6e2d7a65726f20616d6f756e7420726571756972656400000000000000006044820152606401610821565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015611cc657600080fd5b505afa158015611cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfe9190612cf7565b90508015611d4e5760405162461bcd60e51b815260206004820152601a60248201527f4465706f7369747320616c726561647920617661696c61626c650000000000006044820152606401610821565b50600354600090815260086020526040902060020155565b600654610100900460ff1615611dbe5760405162461bcd60e51b815260206004820152601a60248201527f5265656e7472616e74206465706f7369742072656a65637465640000000000006044820152606401610821565b600454811015611e105760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f73697420616d6f756e74206e6f74206d657400006044820152606401610821565b6006805461ff001916610100179055611e276105d1565b6040516370a0823160e01b815233600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015611e8857600080fd5b505afa158015611e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec09190612cf7565b1015611f035760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610821565b604051636eb1769f60e11b815233600482015230602482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063dd62ed3e9060440160206040518083038186803b158015611f6a57600080fd5b505afa158015611f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa29190612cf7565b1015611fe95760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610821565b60035460009081526008602052604081206001015461200a6006600a612ede565b612014908461302f565b61201e9190612e84565b604051635dd871a360e01b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635dd871a39060240160206040518083038186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190612cbf565b6121055760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e20737570706c79206c696d697420657863656564656400000000006044820152606401610821565b60035460009081526008602052604081206002018054849290612129908490612e3e565b90915550506040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561219057600080fd5b505afa1580156121a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c89190612cf7565b6040516323b872dd60e01b8152336004820152306024820152604481018590529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561223957600080fd5b505af115801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122719190612cbf565b61228d5760405162461bcd60e51b815260040161082190612d67565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b1580156122ef57600080fd5b505afa158015612303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123279190612cf7565b90506123338483612e3e565b81146123815760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c656400000000006044820152606401610821565b6040516340c10f1960e01b8152336004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b1580156123e957600080fd5b505af11580156123fd573d6000803e3d6000fd5b5050604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152336020820152908101879052606081018690527f6c6941772efad791f0e8f0ff7e3e76b52034604c1427fc1bbda4dbd3d2570fc69250608001905060405180910390a150506006805461ff00191690555050565b6001546001600160a01b03163314806124a657506000546001600160a01b031633145b6124c25760405162461bcd60e51b815260040161082190612dc6565b6124ca6105d1565b60006124e6600380546000908152600860205260409020015490565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561254b57600080fd5b505afa15801561255f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125839190612cf7565b60065460405163379607f560e01b815260048101859052919250630100000090046001600160a01b03169063379607f590602401600060405180830381600087803b1580156125d157600080fd5b505af11580156125e5573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a082319060240160206040518083038186803b15801561264b57600080fd5b505afa15801561265f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126839190612cf7565b905061268f8383612e3e565b8110156126de5760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c656400000000006044820152606401610821565b6040518381527f652ad68d3e623a25d824203054acc050881d6da7ad6deb10e684f1aa1ca719aa9060200160405180910390a1505050565b6000546001600160a01b031633146127405760405162461bcd60e51b815260040161082190612d96565b6001546001600160a01b038281169116141561279e5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74207472616e7366657220746f20636f6e74726f6c6c65720000006044820152606401610821565b6127a7816128d3565b50565b60006127c16127bc6201518084612e84565b6129bc565b50909392505050565b6000816127d8603c8561302f565b6127e4610e108761302f565b620151806127f38b8b8b612b30565b6127fd919061302f565b6128079190612e3e565b6128119190612e3e565b61281b9190612e3e565b979650505050505050565b6000818311156128785760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f7264657220666f722074696d657374616d7073000000006044820152606401610821565b62015180612886848461308d565b6128909190612e84565b9392505050565b60007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470823f8082148015906128cb57508015155b949350505050565b6000546001600160a01b031633146128fd5760405162461bcd60e51b815260040161082190612d96565b6001600160a01b0381166129535760405162461bcd60e51b815260206004820152601960248201527f6e6f6e2d7a65726f2061646472657373207265717569726564000000000000006044820152606401610821565b600054604080516001600160a01b03928316815291831660208301527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008080838162253d8c6129d38362010bd9612dfd565b6129dd9190612dfd565b9050600062023ab16129f0836004612fac565b6129fa9190612e56565b90506004612a0b8262023ab1612fac565b612a16906003612dfd565b612a209190612e56565b612a2a908361304e565b9150600062164b09612a3d846001612dfd565b612a4990610fa0612fac565b612a539190612e56565b90506004612a63826105b5612fac565b612a6d9190612e56565b612a77908461304e565b612a8290601f612dfd565b9250600061098f612a94856050612fac565b612a9e9190612e56565b905060006050612ab08361098f612fac565b612aba9190612e56565b612ac4908661304e565b9050612ad1600b83612e56565b9450612ade85600c612fac565b612ae9836002612dfd565b612af3919061304e565b91508483612b0260318761304e565b612b0d906064612fac565b612b179190612dfd565b612b219190612dfd565b9a919950975095505050505050565b60006107b2841015612b6c5760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b6044820152606401610821565b838383600062253d8c60046064600c612b86600e8861304e565b612b909190612e56565b612b9c88611324612dfd565b612ba69190612dfd565b612bb09190612e56565b612bbb906003612fac565b612bc59190612e56565b600c80612bd3600e8861304e565b612bdd9190612e56565b612be890600c612fac565b612bf360028861304e565b612bfd919061304e565b612c099061016f612fac565b612c139190612e56565b6004600c612c22600e8961304e565b612c2c9190612e56565b612c38896112c0612dfd565b612c429190612dfd565b612c4e906105b5612fac565b612c589190612e56565b612c64617d4b8761304e565b612c6e9190612dfd565b612c789190612dfd565b612c82919061304e565b612c8c919061304e565b98975050505050505050565b600060208284031215612ca9578081fd5b81356001600160a01b0381168114612890578182fd5b600060208284031215612cd0578081fd5b81518015158114612890578182fd5b600060208284031215612cf0578081fd5b5035919050565b600060208284031215612d08578081fd5b5051919050565b600060208284031215612d20578081fd5b813560ff81168114612890578182fd5b6020808252601d908201527f5265656e7472616e74207769746864726177616c2072656a6563746564000000604082015260600190565b602080825260159082015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b60208082526016908201527513db9b1e481bdddb995c881c995c5d5a5c995b595b9d60521b604082015260600190565b60208082526018908201527f4f6e6c79206f776e6572206f7220636f6e74726f6c6c65720000000000000000604082015260600190565b600080821280156001600160ff1b0384900385131615612e1f57612e1f6130bf565b600160ff1b8390038412811615612e3857612e386130bf565b50500190565b60008219821115612e5157612e516130bf565b500190565b600082612e6557612e656130d5565b600160ff1b821460001984141615612e7f57612e7f6130bf565b500590565b600082612e9357612e936130d5565b500490565b80825b6001808611612eaa5750612ed5565b818704821115612ebc57612ebc6130bf565b80861615612ec957918102915b9490941c938002612e9b565b94509492505050565b60006128906000198484600082612ef757506001612890565b81612f0457506000612890565b8160018114612f1a5760028114612f2457612f51565b6001915050612890565b60ff841115612f3557612f356130bf565b6001841b915084821115612f4b57612f4b6130bf565b50612890565b5060208310610133831016604e8410600b8410161715612f84575081810a83811115612f7f57612f7f6130bf565b612890565b612f918484846001612e98565b808604821115612fa357612fa36130bf565b02949350505050565b60006001600160ff1b0381841382841380821686840486111615612fd257612fd26130bf565b600160ff1b84871282811687830589121615612ff057612ff06130bf565b85871292508782058712848416161561300b5761300b6130bf565b87850587128184161615613021576130216130bf565b505050929093029392505050565b6000816000190483118215151615613049576130496130bf565b500290565b60008083128015600160ff1b85018412161561306c5761306c6130bf565b6001600160ff1b0384018313811615613087576130876130bf565b50500390565b60008282101561309f5761309f6130bf565b500390565b60006000198214156130b8576130b86130bf565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fdfea264697066735822122057c1b6672852aab9f02860448a7ed09656af11e2888ff8ec3790d9f5cfdc394e64736f6c63430008030033000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed680000000000000000000000002d75aae9d4209b423db0cddba8649e1c9ff4487200000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000fc61f00000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000d8c48c19413727acb62e051ace11daf31a754c47

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c80636a61e5fc1161011a57806392eefe9b116100ad578063b68ef5591161007c578063b68ef55914610481578063b6b55f251461049b578063bced9117146104ae578063f2fde38b146104b6578063f36932b7146104c957610206565b806392eefe9b146104405780639c256eef146104535780639ce7f67014610466578063addf8f211461046e57610206565b80638da5cb5b116100e95780638da5cb5b146103f4578063919cfa211461040757806391dd75e71461041a578063922f21231461042d57610206565b80636a61e5fc146103655780636ff1c9bc1461037857806376f10ad01461038b5780638705fcd4146103e157610206565b806331cbd1481161019d5780634b24ea471161016c5780634b24ea47146103095780634b94f50e1461031c5780635798ef311461033657806357e0bf9414610349578063645006ca1461035c57610206565b806331cbd148146102b85780633a621d37146102df57806342c9b1d9146102e75780634378f0ec146102f057610206565b8063292bbd32116101d9578063292bbd32146102585780632a40eb721461028a5780632a80cda3146102925780632e1a7d4d146102a557610206565b80630301310b1461020b578063060406181461022f57806308b4a994146102465780631a43c3381461024e575b600080fd5b6006546102189060ff1681565b60405160ff90911681526020015b60405180910390f35b61023860035481565b604051908152602001610226565b6102386104d2565b6102566105d1565b005b60065461027290630100000090046001600160a01b031681565b6040516001600160a01b039091168152602001610226565b6102566107e2565b6102566102a0366004612cdf565b6109ec565b6102566102b3366004612cdf565b610a80565b6102727f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b610238611167565b61023860025481565b6003805460009081526008602052604090200154610238565b600154610272906001600160a01b031681565b600354600090815260086020526040902060010154610238565b610256610344366004612c98565b61117a565b610238610357366004612cdf565b6112e7565b61023860045481565b610256610373366004612cdf565b611324565b610256610386366004612c98565b611402565b6103c1610399366004612cdf565b6000908152600860205260409020805460018201546002830154600390930154919390929190565b604080519485526020850193909352918301526060820152608001610226565b6102566103ef366004612c98565b6116ab565b600054610272906001600160a01b031681565b610256610415366004612cdf565b6117c5565b600754610272906001600160a01b031681565b61025661043b366004612cdf565b611845565b61025661044e366004612c98565b611915565b610256610461366004612d0f565b611ab3565b610238611bab565b61025661047c366004612cdf565b611bea565b600354600090815260086020526040902060020154610238565b6102566104a9366004612cdf565b611d66565b610256612483565b6102566104c4366004612c98565b612716565b61023860055481565b60065460009081906064906104ea9060ff168261308d565b600354600090815260086020526040902060020154610509919061302f565b6105139190612e84565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816906370a082319060240160206040518083038186803b15801561057857600080fd5b505afa15801561058c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612cf7565b90508181116105c05760006105ca565b6105ca828261308d565b9250505090565b600042905060006105e460025483612826565b905060035481116105f65750506107e0565b60008060035460016106089190612e3e565b90505b8281116107c4578161061c816130a4565b925060089050600061062f60018461308d565b815260208082019290925260409081016000908120548482526008938490529181209190915561066060018461308d565b81526020019081526020016000206002015460086000838152602001908152602001600020600201819055506000618e9460646006600a6106a19190612ede565b600860006106b060018861308d565b8152602001908152602001600020600001546106cc919061302f565b6106d6919061302f565b6106e09190612e84565b90506106ee61271082612e84565b600860006106fd60018661308d565b8152602001908152602001600020600101546107199190612e3e565b60086000848152602001908152602001600020600101819055506237b1d060086000600185610748919061308d565b8152602001908152602001600020600001546008600060018661076b919061308d565b815260200190815260200160002060020154610787919061302f565b6107919190612e84565b600083815260086020526040902060030155601e83106107b157506107c4565b50806107bc816130a4565b91505061060b565b5080600360008282546107d79190612e3e565b90915550505050505b565b6001546001600160a01b031633148061080557506000546001600160a01b031633145b61082a5760405162461bcd60e51b815260040161082190612dc6565b60405180910390fd5b60065462010000900460ff16156108535760405162461bcd60e51b815260040161082190612d30565b6006805462ff000019166201000017905561086c6105d1565b60006108766104d2565b9050600081116108bf5760405162461bcd60e51b81526020600482015260146024820152734e6f206361706974616c20746f206465706c6f7960601b6044820152606401610821565b60065460405163a9059cbb60e01b815263010000009091046001600160a01b039081166004830152602482018390527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48169063a9059cbb90604401602060405180830381600087803b15801561093457600080fd5b505af1158015610948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096c9190612cbf565b6109aa5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610821565b6040518181527fa0c74edaedd64a934c208860c6fabae3e8a26c05dea32da0d43af5c0d6eff2559060200160405180910390a1506006805462ff000019169055565b6001546001600160a01b0316331480610a0f57506000546001600160a01b031633145b610a2b5760405162461bcd60e51b815260040161082190612dc6565b60008111610a7b5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206d696e696d756d206465706f73697420616d6f756e7400006044820152606401610821565b600455565b60065462010000900460ff1615610aa95760405162461bcd60e51b815260040161082190612d30565b60008111610af55760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b6044820152606401610821565b6006805462ff0000191662010000179055610b0e6105d1565b6040516370a0823160e01b815233600482015281907f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa6001600160a01b0316906370a082319060240160206040518083038186803b158015610b6f57600080fd5b505afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190612cf7565b1015610bf55760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742062616c616e6365206f6620746f6b656e7300006044820152606401610821565b6000610c00826112e7565b600354600090815260086020526040902060020154909150811115610c635760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b6044820152606401610821565b600654600090606490610c799060ff168261308d565b600354600090815260086020526040902060020154610c98919061302f565b610ca29190612e84565b905080821115610cf45760405162461bcd60e51b815260206004820152601e60248201527f4d6178207769746864726177616c20616d6f756e7420657863656564656400006044820152606401610821565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b158015610d5657600080fd5b505afa158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e9190612cf7565b905082811015610de05760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e742066756e647320696e20746865206275666665726044820152606401610821565b60008060055411610df2576000610e37565b7f00000000000000000000000000000000000000000000000000000000000f4240606460055486610e23919061302f565b610e2d9190612e84565b610e379190612e84565b9050838110610e765760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b6044820152606401610821565b6000610e82828661308d565b9050846008600060035481526020019081526020016000206002016000828254610eac919061308d565b9091555050604051632770a7eb60e21b8152336004820152602481018790527f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa6001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610f1957600080fd5b505af1158015610f2d573d6000803e3d6000fd5b505060405163a9059cbb60e01b8152336004820152602481018490527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316925063a9059cbb9150604401602060405180830381600087803b158015610f9957600080fd5b505af1158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd19190612cbf565b610fed5760405162461bcd60e51b815260040161082190612d67565b81156110dc5760075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489091169063a9059cbb90604401602060405180830381600087803b15801561106257600080fd5b505af1158015611076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a9190612cbf565b6110dc5760405162461bcd60e51b8152602060048201526013602482015272119959481d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610821565b604080516001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816815233602082015290810186905260608101879052608081018390527f297b983b359127be0bb37e151a4fec683bc9012dd4d0ac96db47cfc17019c1e49060a00160405180910390a150506006805462ff00001916905550505050565b600061117560025442612826565b905090565b6001546001600160a01b031633148061119d57506000546001600160a01b031633145b6111b95760405162461bcd60e51b815260040161082190612dc6565b6001600160a01b038116158015906111da57506001600160a01b0381163014155b6112185760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610821565b61122181612897565b61126d5760405162461bcd60e51b815260206004820152601e60248201527f5468652061646472657373206d757374206265206120636f6e747261637400006044820152606401610821565b600654604080516001600160a01b0363010000009093048316815291831660208301527f0aebc9026561f275e982d855dff9cf49033009d9f31ba8acc0b619ce6b5b2e4b910160405180910390a1600680546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60006112f56006600a612ede565b600354600090815260086020526040902060010154611314908461302f565b61131e9190612e84565b92915050565b6000546001600160a01b0316331461134e5760405162461bcd60e51b815260040161082190612d96565b600081116113945760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420746f6b656e20707269636560681b6044820152606401610821565b61139c6105d1565b6003546000908152600860209081526040918290206001015482519081529081018390527f1107a79eab721b565f7d6a0bd7847e7021dd0f721c65eadc1d6c35eb08dbc0ed910160405180910390a1600354600090815260086020526040902060010155565b6000546001600160a01b0316331461142c5760405162461bcd60e51b815260040161082190612d96565b60065462010000900460ff16156114555760405162461bcd60e51b815260040161082190612d30565b6001600160a01b0381161580159061147657506001600160a01b0381163014155b6114b45760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610821565b6006805462ff00001916620100001790556040516370a0823160e01b81523060048201526000906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816906370a082319060240160206040518083038186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190612cf7565b9050600081116115aa5760405162461bcd60e51b8152602060048201526016602482015275546865207661756c7420686173206e6f2066756e647360501b6044820152606401610821565b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48169063a9059cbb90604401602060405180830381600087803b15801561161457600080fd5b505af1158015611628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164c9190612cbf565b6116685760405162461bcd60e51b815260040161082190612d67565b6040518181527f55abaad61a326c0cc8618401ad343a21179b6f621dc9247617973a61b0d81d1e9060200160405180910390a150506006805462ff000019169055565b6001546001600160a01b03163314806116ce57506000546001600160a01b031633145b6116ea5760405162461bcd60e51b815260040161082190612dc6565b6001600160a01b0381161580159061171057506007546001600160a01b03828116911614155b61175c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206164647265737320666f72206665657300000000000000006044820152606401610821565b600754604080516001600160a01b03928316815291831660208301527f3b4be58da14251f504968b7257dff9b9c1ecb07ac50130d7a4bf5533acf20d23910160405180910390a1600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314806117e857506000546001600160a01b031633145b6118045760405162461bcd60e51b815260040161082190612dc6565b60055460408051918252602082018390527f120fd6c83629ae96124876a9b5b025e47fb83d42972ca449a5a3405dbccfb986910160405180910390a1600555565b6000546001600160a01b0316331461186f5760405162461bcd60e51b815260040161082190612d96565b600081116118ad5760405162461bcd60e51b815260206004820152600b60248201526a24b73b30b634b21020a82960a91b6044820152606401610821565b6118b56105d1565b6003546000908152600860209081526040918290205482519081529081018390527fc827555e5522aeda7e894c1d924063a0e0cb6e782418a59fcd72c6c23cbac06b910160405180910390a1600354600090815260086020526040902055565b6000546001600160a01b0316331461193f5760405162461bcd60e51b815260040161082190612d96565b6001600160a01b0381166119955760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726f6c6c6572206164647265737320726571756972656400000000006044820152606401610821565b6000546001600160a01b03828116911614156119f35760405162461bcd60e51b815260206004820152601e60248201527f4f776e65722063616e6e6f742062652074686520436f6e74726f6c6c657200006044820152606401610821565b6001546001600160a01b0382811691161415611a4a5760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c88185b1c9958591e481cd95d60521b6044820152606401610821565b600154604080516001600160a01b03928316815291831660208301527f3df96927933b869a51e4444ecd13bc819f0a1396ef6b6c3af44369afcb3e05b1910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331480611ad657506000546001600160a01b031633145b611af25760405162461bcd60e51b815260040161082190612dc6565b60008160ff16118015611b08575060648160ff16105b611b545760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e766573746d656e742070657263656e740000000000006044820152606401610821565b6006546040805160ff928316815291831660208301527ff6a34f02b83ccdde55c05d6d6e72262bae32f03d30abd8168b5a10f367967696910160405180910390a16006805460ff191660ff92909216919091179055565b600654600090606490611bc19060ff168261308d565b600354600090815260086020526040902060020154611be0919061302f565b6111759190612e84565b6000546001600160a01b03163314611c145760405162461bcd60e51b815260040161082190612d96565b60008111611c645760405162461bcd60e51b815260206004820152601860248201527f4e6f6e2d7a65726f20616d6f756e7420726571756972656400000000000000006044820152606401610821565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b158015611cc657600080fd5b505afa158015611cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfe9190612cf7565b90508015611d4e5760405162461bcd60e51b815260206004820152601a60248201527f4465706f7369747320616c726561647920617661696c61626c650000000000006044820152606401610821565b50600354600090815260086020526040902060020155565b600654610100900460ff1615611dbe5760405162461bcd60e51b815260206004820152601a60248201527f5265656e7472616e74206465706f7369742072656a65637465640000000000006044820152606401610821565b600454811015611e105760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f73697420616d6f756e74206e6f74206d657400006044820152606401610821565b6006805461ff001916610100179055611e276105d1565b6040516370a0823160e01b815233600482015281907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b158015611e8857600080fd5b505afa158015611e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec09190612cf7565b1015611f035760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610821565b604051636eb1769f60e11b815233600482015230602482015281907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b03169063dd62ed3e9060440160206040518083038186803b158015611f6a57600080fd5b505afa158015611f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa29190612cf7565b1015611fe95760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610821565b60035460009081526008602052604081206001015461200a6006600a612ede565b612014908461302f565b61201e9190612e84565b604051635dd871a360e01b8152600481018290529091507f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa6001600160a01b031690635dd871a39060240160206040518083038186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190612cbf565b6121055760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e20737570706c79206c696d697420657863656564656400000000006044820152606401610821565b60035460009081526008602052604081206002018054849290612129908490612e3e565b90915550506040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b15801561219057600080fd5b505afa1580156121a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c89190612cf7565b6040516323b872dd60e01b8152336004820152306024820152604481018590529091507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561223957600080fd5b505af115801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122719190612cbf565b61228d5760405162461bcd60e51b815260040161082190612d67565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b1580156122ef57600080fd5b505afa158015612303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123279190612cf7565b90506123338483612e3e565b81146123815760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c656400000000006044820152606401610821565b6040516340c10f1960e01b8152336004820152602481018490527f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa6001600160a01b0316906340c10f1990604401600060405180830381600087803b1580156123e957600080fd5b505af11580156123fd573d6000803e3d6000fd5b5050604080516001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48168152336020820152908101879052606081018690527f6c6941772efad791f0e8f0ff7e3e76b52034604c1427fc1bbda4dbd3d2570fc69250608001905060405180910390a150506006805461ff00191690555050565b6001546001600160a01b03163314806124a657506000546001600160a01b031633145b6124c25760405162461bcd60e51b815260040161082190612dc6565b6124ca6105d1565b60006124e6600380546000908152600860205260409020015490565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816906370a082319060240160206040518083038186803b15801561254b57600080fd5b505afa15801561255f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125839190612cf7565b60065460405163379607f560e01b815260048101859052919250630100000090046001600160a01b03169063379607f590602401600060405180830381600087803b1580156125d157600080fd5b505af11580156125e5573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b031691506370a082319060240160206040518083038186803b15801561264b57600080fd5b505afa15801561265f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126839190612cf7565b905061268f8383612e3e565b8110156126de5760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c656400000000006044820152606401610821565b6040518381527f652ad68d3e623a25d824203054acc050881d6da7ad6deb10e684f1aa1ca719aa9060200160405180910390a1505050565b6000546001600160a01b031633146127405760405162461bcd60e51b815260040161082190612d96565b6001546001600160a01b038281169116141561279e5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74207472616e7366657220746f20636f6e74726f6c6c65720000006044820152606401610821565b6127a7816128d3565b50565b60006127c16127bc6201518084612e84565b6129bc565b50909392505050565b6000816127d8603c8561302f565b6127e4610e108761302f565b620151806127f38b8b8b612b30565b6127fd919061302f565b6128079190612e3e565b6128119190612e3e565b61281b9190612e3e565b979650505050505050565b6000818311156128785760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f7264657220666f722074696d657374616d7073000000006044820152606401610821565b62015180612886848461308d565b6128909190612e84565b9392505050565b60007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470823f8082148015906128cb57508015155b949350505050565b6000546001600160a01b031633146128fd5760405162461bcd60e51b815260040161082190612d96565b6001600160a01b0381166129535760405162461bcd60e51b815260206004820152601960248201527f6e6f6e2d7a65726f2061646472657373207265717569726564000000000000006044820152606401610821565b600054604080516001600160a01b03928316815291831660208301527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008080838162253d8c6129d38362010bd9612dfd565b6129dd9190612dfd565b9050600062023ab16129f0836004612fac565b6129fa9190612e56565b90506004612a0b8262023ab1612fac565b612a16906003612dfd565b612a209190612e56565b612a2a908361304e565b9150600062164b09612a3d846001612dfd565b612a4990610fa0612fac565b612a539190612e56565b90506004612a63826105b5612fac565b612a6d9190612e56565b612a77908461304e565b612a8290601f612dfd565b9250600061098f612a94856050612fac565b612a9e9190612e56565b905060006050612ab08361098f612fac565b612aba9190612e56565b612ac4908661304e565b9050612ad1600b83612e56565b9450612ade85600c612fac565b612ae9836002612dfd565b612af3919061304e565b91508483612b0260318761304e565b612b0d906064612fac565b612b179190612dfd565b612b219190612dfd565b9a919950975095505050505050565b60006107b2841015612b6c5760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b6044820152606401610821565b838383600062253d8c60046064600c612b86600e8861304e565b612b909190612e56565b612b9c88611324612dfd565b612ba69190612dfd565b612bb09190612e56565b612bbb906003612fac565b612bc59190612e56565b600c80612bd3600e8861304e565b612bdd9190612e56565b612be890600c612fac565b612bf360028861304e565b612bfd919061304e565b612c099061016f612fac565b612c139190612e56565b6004600c612c22600e8961304e565b612c2c9190612e56565b612c38896112c0612dfd565b612c429190612dfd565b612c4e906105b5612fac565b612c589190612e56565b612c64617d4b8761304e565b612c6e9190612dfd565b612c789190612dfd565b612c82919061304e565b612c8c919061304e565b98975050505050505050565b600060208284031215612ca9578081fd5b81356001600160a01b0381168114612890578182fd5b600060208284031215612cd0578081fd5b81518015158114612890578182fd5b600060208284031215612cf0578081fd5b5035919050565b600060208284031215612d08578081fd5b5051919050565b600060208284031215612d20578081fd5b813560ff81168114612890578182fd5b6020808252601d908201527f5265656e7472616e74207769746864726177616c2072656a6563746564000000604082015260600190565b602080825260159082015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b60208082526016908201527513db9b1e481bdddb995c881c995c5d5a5c995b595b9d60521b604082015260600190565b60208082526018908201527f4f6e6c79206f776e6572206f7220636f6e74726f6c6c65720000000000000000604082015260600190565b600080821280156001600160ff1b0384900385131615612e1f57612e1f6130bf565b600160ff1b8390038412811615612e3857612e386130bf565b50500190565b60008219821115612e5157612e516130bf565b500190565b600082612e6557612e656130d5565b600160ff1b821460001984141615612e7f57612e7f6130bf565b500590565b600082612e9357612e936130d5565b500490565b80825b6001808611612eaa5750612ed5565b818704821115612ebc57612ebc6130bf565b80861615612ec957918102915b9490941c938002612e9b565b94509492505050565b60006128906000198484600082612ef757506001612890565b81612f0457506000612890565b8160018114612f1a5760028114612f2457612f51565b6001915050612890565b60ff841115612f3557612f356130bf565b6001841b915084821115612f4b57612f4b6130bf565b50612890565b5060208310610133831016604e8410600b8410161715612f84575081810a83811115612f7f57612f7f6130bf565b612890565b612f918484846001612e98565b808604821115612fa357612fa36130bf565b02949350505050565b60006001600160ff1b0381841382841380821686840486111615612fd257612fd26130bf565b600160ff1b84871282811687830589121615612ff057612ff06130bf565b85871292508782058712848416161561300b5761300b6130bf565b87850587128184161615613021576130216130bf565b505050929093029392505050565b6000816000190483118215151615613049576130496130bf565b500290565b60008083128015600160ff1b85018412161561306c5761306c6130bf565b6001600160ff1b0384018313811615613087576130876130bf565b50500390565b60008282101561309f5761309f6130bf565b500390565b60006000198214156130b8576130b86130bf565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fdfea264697066735822122057c1b6672852aab9f02860448a7ed09656af11e2888ff8ec3790d9f5cfdc394e64736f6c63430008030033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed680000000000000000000000002d75aae9d4209b423db0cddba8649e1c9ff4487200000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000fc61f00000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000d8c48c19413727acb62e051ace11daf31a754c47

-----Decoded View---------------
Arg [0] : ownerAddr (address): 0xc692d583567cdA0fDE14Cd3D6136c2623202Ed68
Arg [1] : controllerAddr (address): 0x2D75aae9d4209b423DB0Cddba8649e1c9Ff44872
Arg [2] : receiptTokenInterface (address): 0x51acB1ea45c1EC2512ae4202B9076C13016dc8aA
Arg [3] : eip20Interface (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [4] : initialApr (uint256): 800
Arg [5] : initialTokenPrice (uint256): 1033759
Arg [6] : initialMinDepositAmount (uint256): 100000
Arg [7] : flatFeePerc (uint256): 100000
Arg [8] : feesAddr (address): 0xd8c48C19413727aCB62e051acE11DAf31a754C47

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed68
Arg [1] : 0000000000000000000000002d75aae9d4209b423db0cddba8649e1c9ff44872
Arg [2] : 00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa
Arg [3] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [5] : 00000000000000000000000000000000000000000000000000000000000fc61f
Arg [6] : 00000000000000000000000000000000000000000000000000000000000186a0
Arg [7] : 00000000000000000000000000000000000000000000000000000000000186a0
Arg [8] : 000000000000000000000000d8c48c19413727acb62e051ace11daf31a754c47


Deployed Bytecode Sourcemap

26693:23439:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28088:35;;;;;;;;;;;;17027:4:1;17015:17;;;16997:36;;16985:2;16970:18;28088:35:0;;;;;;;;27531:28;;;;;;;;;16170:25:1;;;16158:2;16143:18;27531:28:0;16125:76:1;48778:923:0;;;:::i;43988:908::-;;;:::i;:::-;;28389:34;;;;;;;;-1:-1:-1;;;;;28389:34:0;;;;;;-1:-1:-1;;;;;1479:32:1;;;1461:51;;1449:2;1434:18;28389:34:0;1416:102:1;45112:704:0;;;:::i;33890:239::-;;;;;;:::i;:::-;;:::i;38745:2774::-;;;;;;:::i;:::-;;:::i;28619:48::-;;;;;46814:190;;;:::i;27241:35::-;;;;;;47843:122;47929:13;;;47893:7;47920:23;;;:8;:23;;;;;:37;;47843:122;;18065:32;;;;;-1:-1:-1;;;;;18065:32:0;;;48075:116;48158:13;;48122:7;48149:23;;;:8;:23;;;;;:34;;;48075:116;;33333:352;;;;;;:::i;:::-;;:::i;49940:189::-;;;;;;:::i;:::-;;:::i;27651:31::-;;;;;;43154:303;;;;;;:::i;:::-;;:::i;41756:789::-;;;;;;:::i;:::-;;:::i;47012:326::-;;;;;;:::i;:::-;47066:11;47163;;;:8;:11;;;;;:15;;47202:22;;;;47252:26;;;;47305:25;;;;;47163:15;;47202:22;;47252:26;47305:25;47012:326;;;;;16690:25:1;;;16746:2;16731:18;;16724:34;;;;16774:18;;;16767:34;16832:2;16817:18;;16810:34;16677:3;16662:19;47012:326:0;16644:206:1;34935:250:0;;;;;;:::i;:::-;;:::i;136:20::-;;;;;-1:-1:-1;;;;;136:20:0;;;34409:414;;;;;;:::i;:::-;;:::i;28512:26::-;;;;;-1:-1:-1;;;;;28512:26:0;;;42771:242;;;;;;:::i;:::-;;:::i;19297:474::-;;;;;;:::i;:::-;;:::i;43581:286::-;;;;;;:::i;:::-;;:::i;48349:190::-;;;:::i;35443:384::-;;;;;;:::i;:::-;;:::i;47618:124::-;47705:13;;47669:7;47696:23;;;:8;:23;;;;;:38;;;47618:124;;36133:2434;;;;;;:::i;:::-;;:::i;45902:633::-;;;:::i;19986:194::-;;;;;;:::i;:::-;;:::i;27769:29::-;;;;;;48778:923;49374:17;;48832:7;;;;49404:3;;49351:41;;49374:17;;49404:3;49351:41;:::i;:::-;49318:13;;49309:23;;;;:8;:23;;;;;:38;;;:84;;;;:::i;:::-;:99;;;;:::i;:::-;49491:49;;-1:-1:-1;;;49491:49:0;;49534:4;49491:49;;;1461:51:1;49279:129:0;;-1:-1:-1;49466:22:0;;-1:-1:-1;;;;;49491:24:0;:34;;;;1434:18:1;;49491:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49466:74;;49630:19;49613:14;:36;49612:81;;49692:1;49612:81;;;49653:36;49670:19;49653:14;:36;:::i;:::-;49605:88;;;;48778:923;:::o;43988:908::-;44026:24;44053:15;44026:42;;44122:17;44142:58;44161:20;;44183:16;44142:18;:58::i;:::-;44122:78;;44228:13;;44215:9;:26;44211:39;;44243:7;;;;44211:39;44262:9;44293;44305:13;;44321:1;44305:17;;;;:::i;:::-;44293:29;;44288:570;44329:9;44324:1;:14;44288:570;;44360:3;;;;:::i;:::-;;-1:-1:-1;44396:8:0;;-1:-1:-1;44396:15:0;44405:5;44409:1;44405;:5;:::i;:::-;44396:15;;;;;;;;;;;;;;-1:-1:-1;44396:15:0;;;:19;44378:11;;;:8;:11;;;;;;;:37;;;;44468:5;44472:1;44387;44468:5;:::i;:::-;44459:15;;;;;;;;;;;:30;;;44430:8;:11;44439:1;44430:11;;;;;;;;;;;:26;;:59;;;;44506:12;44592:5;44577:3;26857:1;26842:2;26834:25;;;;:::i;:::-;44521:8;:15;44530:5;44534:1;44530;:5;:::i;:::-;44521:15;;;;;;;;;;;:19;;;:45;;;;:::i;:::-;:60;;;;:::i;:::-;:77;;;;:::i;:::-;44506:92;-1:-1:-1;44668:21:0;44683:5;44506:92;44668:21;:::i;:::-;44638:8;:15;44647:5;44651:1;44647;:5;:::i;:::-;44638:15;;;;;;;;;;;:26;;;:52;;;;:::i;:::-;44613:8;:11;44622:1;44613:11;;;;;;;;;;;:22;;:77;;;;44805:7;44774:8;:15;44787:1;44783;:5;;;;:::i;:::-;44774:15;;;;;;;;;;;:19;;;44733:8;:15;44746:1;44742;:5;;;;:::i;:::-;44733:15;;;;;;;;;;;:30;;;:61;;;;:::i;:::-;:80;;;;:::i;:::-;44705:11;;;;:8;:11;;;;;:25;;:108;44837:2;44832:7;;44828:18;;44841:5;;;44828:18;-1:-1:-1;44340:3:0;;;;:::i;:::-;;;;44288:570;;;;44887:1;44870:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;43988:908:0;:::o;45112:704::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;;;;;;;;;32924:30:::1;::::0;;;::::1;;;:35:::0;32916:77:::1;;;;-1:-1:-1::0;;;32916:77:0::1;;;;;;;:::i;:::-;45242:30:::2;:34:::0;;-1:-1:-1;;45242:34:0::2;::::0;::::2;::::0;;45289:9:::2;:7;:9::i;:::-;45400:27;45430:22;:20;:22::i;:::-;45400:52;;45493:1;45471:19;:23;45463:56;;;::::0;-1:-1:-1;;;45463:56:0;;12018:2:1;45463:56:0::2;::::0;::::2;12000:21:1::0;12057:2;12037:18;;;12030:30;-1:-1:-1;;;12076:18:1;;;12069:50;12136:18;;45463:56:0::2;11990:170:1::0;45463:56:0::2;45574:19;::::0;45540:75:::2;::::0;-1:-1:-1;;;45540:75:0;;45574:19;;;::::2;-1:-1:-1::0;;;;;45574:19:0;;::::2;45540:75;::::0;::::2;3362:51:1::0;3429:18;;;3422:34;;;45540:24:0::2;:33;::::0;::::2;::::0;3335:18:1;;45540:75:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45532:103;;;::::0;-1:-1:-1;;;45532:103:0;;4942:2:1;45532:103:0::2;::::0;::::2;4924:21:1::0;4981:2;4961:18;;;4954:30;-1:-1:-1;;;5000:18:1;;;4993:45;5055:18;;45532:103:0::2;4914:165:1::0;45532:103:0::2;45651:36;::::0;16170:25:1;;;45651:36:0::2;::::0;16158:2:1;16143:18;45651:36:0::2;;;;;;;-1:-1:-1::0;45739:30:0::2;:34:::0;;-1:-1:-1;;45739:34:0::2;::::0;;45112:704::o;33890:239::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;34018:1:::1;34006:9;:13;33998:56;;;::::0;-1:-1:-1;;;33998:56:0;;8114:2:1;33998:56:0::1;::::0;::::1;8096:21:1::0;8153:2;8133:18;;;8126:30;8192:32;8172:18;;;8165:60;8242:18;;33998:56:0::1;8086:180:1::0;33998:56:0::1;34093:16;:28:::0;33890:239::o;38745:2774::-;32924:30;;;;;;;:35;32916:77;;;;-1:-1:-1;;;32916:77:0;;;;;;;:::i;:::-;38883:1:::1;38862:18;:22;38854:60;;;::::0;-1:-1:-1;;;38854:60:0;;3891:2:1;38854:60:0::1;::::0;::::1;3873:21:1::0;3930:2;3910:18;;;3903:30;-1:-1:-1;;;3949:18:1;;;3942:55;4014:18;;38854:60:0::1;3863:175:1::0;38854:60:0::1;38968:30;:34:::0;;-1:-1:-1;;38968:34:0::1;::::0;::::1;::::0;;39067:9:::1;:7;:9::i;:::-;39164:35;::::0;-1:-1:-1;;;39164:35:0;;39188:10:::1;39164:35;::::0;::::1;1461:51:1::0;39203:18:0;;39164:13:::1;-1:-1:-1::0;;;;;39164:23:0::1;::::0;::::1;::::0;1434:18:1;;39164:35:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;39156:100;;;::::0;-1:-1:-1;;;39156:100:0;;9181:2:1;39156:100:0::1;::::0;::::1;9163:21:1::0;9220:2;9200:18;;;9193:30;9259:32;9239:18;;;9232:60;9309:18;;39156:100:0::1;9153:180:1::0;39156:100:0::1;39348:24;39375:33;39389:18;39375:13;:33::i;:::-;39456:13;::::0;39447:23:::1;::::0;;;:8:::1;:23;::::0;;;;:38:::1;;::::0;39348:60;;-1:-1:-1;39427:58:0;::::1;;39419:96;;;::::0;-1:-1:-1;;;39419:96:0;;3891:2:1;39419:96:0::1;::::0;::::1;3873:21:1::0;3930:2;3910:18;;;3903:30;-1:-1:-1;;;3949:18:1;;;3942:55;4014:18;;39419:96:0::1;3863:175:1::0;39419:96:0::1;39623:17;::::0;39528:27:::1;::::0;39653:3:::1;::::0;39600:41:::1;::::0;39623:17:::1;;39653:3:::0;39600:41:::1;:::i;:::-;39567:13;::::0;39558:23:::1;::::0;;;:8:::1;:23;::::0;;;;:38:::1;;::::0;:84:::1;::::0;;::::1;:::i;:::-;:99;;;;:::i;:::-;39528:129;;39696:19;39676:16;:39;;39668:82;;;::::0;-1:-1:-1;;;39668:82:0;;14134:2:1;39668:82:0::1;::::0;::::1;14116:21:1::0;14173:2;14153:18;;;14146:30;14212:32;14192:18;;;14185:60;14262:18;;39668:82:0::1;14106:180:1::0;39668:82:0::1;39788:49;::::0;-1:-1:-1;;;39788:49:0;;39831:4:::1;39788:49;::::0;::::1;1461:51:1::0;39763:22:0::1;::::0;39788:24:::1;-1:-1:-1::0;;;;;39788:34:0::1;::::0;::::1;::::0;1434:18:1;;39788:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39763:74;;39874:16;39856:14;:34;;39848:79;;;::::0;-1:-1:-1;;;39848:79:0;;8820:2:1;39848:79:0::1;::::0;::::1;8802:21:1::0;;;8839:18;;;8832:30;8898:34;8878:18;;;8871:62;8950:18;;39848:79:0::1;8792:182:1::0;39848:79:0::1;40082:17;40120:1:::0;40103:14:::1;;:18;40102:97;;40198:1;40102:97;;;40176:19;40169:3;40144:14;;40125:16;:33;;;;:::i;:::-;:48;;;;:::i;:::-;:70;;;;:::i;:::-;40082:117;;40230:16;40218:9;:28;40210:52;;;::::0;-1:-1:-1;;;40210:52:0;;10962:2:1;40210:52:0::1;::::0;::::1;10944:21:1::0;11001:2;10981:18;;;10974:30;-1:-1:-1;;;11020:18:1;;;11013:41;11071:18;;40210:52:0::1;10934:161:1::0;40210:52:0::1;40369:33;40405:28;40424:9:::0;40405:16;:28:::1;:::i;:::-;40369:64;;40661:16;40619:8;:23;40628:13;;40619:23;;;;;;;;;;;:38;;;:58;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40746:50:0::1;::::0;-1:-1:-1;;;40746:50:0;;40765:10:::1;40746:50;::::0;::::1;3362:51:1::0;3429:18;;;3422:34;;;40746:13:0::1;-1:-1:-1::0;;;;;40746:18:0::1;::::0;::::1;::::0;3335::1;;40746:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40920:72:0::1;::::0;-1:-1:-1;;;40920:72:0;;40954:10:::1;40920:72;::::0;::::1;3362:51:1::0;3429:18;;;3422:34;;;40920:24:0::1;-1:-1:-1::0;;;;;40920:33:0::1;::::0;-1:-1:-1;40920:33:0::1;::::0;-1:-1:-1;3335:18:1;;40920:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40912:106;;;;-1:-1:-1::0;;;40912:106:0::1;;;;;;;:::i;:::-;41035:13:::0;;41031:187:::1;;41159:11;::::0;41125:57:::1;::::0;-1:-1:-1;;;41125:57:0;;-1:-1:-1;;;;;41159:11:0;;::::1;41125:57;::::0;::::1;3362:51:1::0;3429:18;;;3422:34;;;41125:24:0::1;:33:::0;;::::1;::::0;::::1;::::0;3335:18:1;;41125:57:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41117:89;;;::::0;-1:-1:-1;;;41117:89:0;;6705:2:1;41117:89:0::1;::::0;::::1;6687:21:1::0;6744:2;6724:18;;;6717:30;-1:-1:-1;;;6763:18:1;;;6756:49;6822:18;;41117:89:0::1;6677:169:1::0;41117:89:0::1;41277:113;::::0;;-1:-1:-1;;;;;41303:24:0::1;2979:15:1::0;2961:34;;41330:10:0::1;3026:2:1::0;3011:18;;3004:43;3063:18;;;3056:34;;;3121:2;3106:18;;3099:34;;;3164:3;3149:19;;3142:35;;;41277:113:0::1;::::0;2910:3:1;2895:19;41277:113:0::1;;;;;;;-1:-1:-1::0;;41442:30:0::1;:34:::0;;-1:-1:-1;;41442:34:0::1;::::0;;-1:-1:-1;;;;38745:2774:0:o;46814:190::-;46871:7;46898:57;46917:20;;46939:15;46898:18;:57::i;:::-;46891:64;;46814:190;:::o;33333:352::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33428:18:0;::::1;::::0;;::::1;::::0;:43:::1;;-1:-1:-1::0;;;;;;33450:21:0;::::1;33466:4;33450:21;;33428:43;33420:71;;;::::0;-1:-1:-1;;;33420:71:0;;4598:2:1;33420:71:0::1;::::0;::::1;4580:21:1::0;4637:2;4617:18;;;4610:30;-1:-1:-1;;;4656:18:1;;;4649:45;4711:18;;33420:71:0::1;4570:165:1::0;33420:71:0::1;33510:22;33527:4;33510:16;:22::i;:::-;33502:65;;;::::0;-1:-1:-1;;;33502:65:0;;11302:2:1;33502:65:0::1;::::0;::::1;11284:21:1::0;11341:2;11321:18;;;11314:30;11380:32;11360:18;;;11353:60;11430:18;;33502:65:0::1;11274:180:1::0;33502:65:0::1;33614:19;::::0;33585:55:::1;::::0;;-1:-1:-1;;;;;33614:19:0;;;::::1;::::0;::::1;1735:34:1::0;;1805:15;;;1800:2;1785:18;;1778:43;33585:55:0::1;::::0;1670:18:1;33585:55:0::1;;;;;;;33651:19;:26:::0;;-1:-1:-1;;;;;33651:26:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;33651:26:0;;::::1;::::0;;;::::1;::::0;;33333:352::o;49940:189::-;50013:7;26834:25;26857:1;26842:2;26834:25;:::i;:::-;50070:13;;50061:23;;;;:8;:23;;;;;:34;;;50040:55;;:18;:55;:::i;:::-;:81;;;;:::i;:::-;50033:88;49940:189;-1:-1:-1;;49940:189:0:o;43154:303::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;43253:1:::1;43237:13;:17;43229:49;;;::::0;-1:-1:-1;;;43229:49:0;;14493:2:1;43229:49:0::1;::::0;::::1;14475:21:1::0;14532:2;14512:18;;;14505:30;-1:-1:-1;;;14551:18:1;;;14544:49;14610:18;;43229:49:0::1;14465:169:1::0;43229:49:0::1;43291:9;:7;:9::i;:::-;43347:13;::::0;43338:23:::1;::::0;;;:8:::1;:23;::::0;;;;;;;;:34:::1;;::::0;43318:70;;16380:25:1;;;16421:18;;;16414:34;;;43318:70:0::1;::::0;16353:18:1;43318:70:0::1;;;;;;;43408:13;::::0;43399:23:::1;::::0;;;:8:::1;:23;::::0;;;;:34:::1;;:50:::0;43154:303::o;41756:789::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;32924:30:::1;::::0;;;::::1;;;:35:::0;32916:77:::1;;;;-1:-1:-1::0;;;32916:77:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41870:29:0;::::2;::::0;;::::2;::::0;:65:::2;;-1:-1:-1::0;;;;;;41903:32:0;::::2;41930:4;41903:32;;41870:65;41862:93;;;::::0;-1:-1:-1;;;41862:93:0;;4598:2:1;41862:93:0::2;::::0;::::2;4580:21:1::0;4637:2;4617:18;;;4610:30;-1:-1:-1;;;4656:18:1;;;4649:45;4711:18;;41862:93:0::2;4570:165:1::0;41862:93:0::2;42009:30;:34:::0;;-1:-1:-1;;42009:34:0::2;::::0;::::2;::::0;;42081:49:::2;::::0;-1:-1:-1;;;42081:49:0;;42124:4:::2;42081:49;::::0;::::2;1461:51:1::0;-1:-1:-1;;;;;;;42081:24:0::2;:34;::::0;::::2;::::0;1434:18:1;;42081:49:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42056:74;;42166:1;42149:14;:18;42141:53;;;::::0;-1:-1:-1;;;42141:53:0;;7763:2:1;42141:53:0::2;::::0;::::2;7745:21:1::0;7802:2;7782:18;;;7775:30;-1:-1:-1;;;7821:18:1;;;7814:52;7883:18;;42141:53:0::2;7735:172:1::0;42141:53:0::2;42271:66;::::0;-1:-1:-1;;;42271:66:0;;-1:-1:-1;;;;;3380:32:1;;;42271:66:0::2;::::0;::::2;3362:51:1::0;3429:18;;;3422:34;;;42271:24:0::2;:33;::::0;::::2;::::0;3335:18:1;;42271:66:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42263:100;;;;-1:-1:-1::0;;;42263:100:0::2;;;;;;;:::i;:::-;42381:35;::::0;16170:25:1;;;42381:35:0::2;::::0;16158:2:1;16143:18;42381:35:0::2;;;;;;;-1:-1:-1::0;;42468:30:0::2;:34:::0;;-1:-1:-1;;42468:34:0::2;::::0;;41756:789::o;34935:250::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35021:18:0;::::1;::::0;;::::1;::::0;:41:::1;;-1:-1:-1::0;35051:11:0::1;::::0;-1:-1:-1;;;;;35043:19:0;;::::1;35051:11:::0;::::1;35043:19;;35021:41;35013:78;;;::::0;-1:-1:-1;;;35013:78:0;;5637:2:1;35013:78:0::1;::::0;::::1;5619:21:1::0;5676:2;5656:18;;;5649:30;5715:26;5695:18;;;5688:54;5759:18;;35013:78:0::1;5609:174:1::0;35013:78:0::1;35130:11;::::0;35109:39:::1;::::0;;-1:-1:-1;;;;;35130:11:0;;::::1;1735:34:1::0;;1805:15;;;1800:2;1785:18;;1778:43;35109:39:0::1;::::0;1670:18:1;35109:39:0::1;;;;;;;35159:11;:18:::0;;-1:-1:-1;;;;;;35159:18:0::1;-1:-1:-1::0;;;;;35159:18:0;;;::::1;::::0;;;::::1;::::0;;34935:250::o;34409:414::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;34728:14:::1;::::0;34701:64:::1;::::0;;16380:25:1;;;16436:2;16421:18;;16414:34;;;34701:64:0::1;::::0;16353:18:1;34701:64:0::1;;;;;;;34778:14;:37:::0;34409:414::o;42771:242::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;42852:1:::1;42843:6;:10;42835:34;;;::::0;-1:-1:-1;;;42835:34:0;;15886:2:1;42835:34:0::1;::::0;::::1;15868:21:1::0;15925:2;15905:18;;;15898:30;-1:-1:-1;;;15944:18:1;;;15937:41;15995:18;;42835:34:0::1;15858:161:1::0;42835:34:0::1;42882:9;:7;:9::i;:::-;42931:13;::::0;42922:23:::1;::::0;;;:8:::1;:23;::::0;;;;;;;;:27;42909:49;;16380:25:1;;;16421:18;;;16414:34;;;42909:49:0::1;::::0;16353:18:1;42909:49:0::1;;;;;;;42978:13;::::0;42969:23:::1;::::0;;;:8:::1;:23;::::0;;;;:36;42771:242::o;19297:474::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19400:28:0;::::1;19392:68;;;::::0;-1:-1:-1;;;19392:68:0;;5990:2:1;19392:68:0::1;::::0;::::1;5972:21:1::0;6029:2;6009:18;;;6002:30;6068:29;6048:18;;;6041:57;6115:18;;19392:68:0::1;5962:177:1::0;19392:68:0::1;19497:5;::::0;-1:-1:-1;;;;;19479:23:0;;::::1;19497:5:::0;::::1;19479:23;;19471:66;;;::::0;-1:-1:-1;;;19471:66:0;;15174:2:1;19471:66:0::1;::::0;::::1;15156:21:1::0;15213:2;15193:18;;;15186:30;15252:32;15232:18;;;15225:60;15302:18;;19471:66:0::1;15146:180:1::0;19471:66:0::1;19574:17;::::0;-1:-1:-1;;;;;19556:35:0;;::::1;19574:17:::0;::::1;19556:35;;19548:70;;;::::0;-1:-1:-1;;;19548:70:0;;12718:2:1;19548:70:0::1;::::0;::::1;12700:21:1::0;12757:2;12737:18;;;12730:30;-1:-1:-1;;;12776:18:1;;;12769:52;12838:18;;19548:70:0::1;12690:172:1::0;19548:70:0::1;19656:17;::::0;19636:54:::1;::::0;;-1:-1:-1;;;;;19656:17:0;;::::1;1735:34:1::0;;1805:15;;;1800:2;1785:18;;1778:43;19636:54:0::1;::::0;1670:18:1;19636:54:0::1;;;;;;;19729:17;:34:::0;;-1:-1:-1;;;;;;19729:34:0::1;-1:-1:-1::0;;;;;19729:34:0;;;::::1;::::0;;;::::1;::::0;;19297:474::o;43581:286::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;43691:1:::1;43678:10;:14;;;:34;;;;;43709:3;43696:10;:16;;;43678:34;43670:73;;;::::0;-1:-1:-1;;;43670:73:0;;13423:2:1;43670:73:0::1;::::0;::::1;13405:21:1::0;13462:2;13442:18;;;13435:30;13501:28;13481:18;;;13474:56;13547:18;;43670:73:0::1;13395:176:1::0;43670:73:0::1;43788:17;::::0;43761:57:::1;::::0;;43788:17:::1;::::0;;::::1;17210:36:1::0;;17282:17;;;17277:2;17262:18;;17255:45;43761:57:0::1;::::0;17183:18:1;43761:57:0::1;;;;;;;43829:17;:30:::0;;-1:-1:-1;;43829:30:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;43581:286::o;48349:190::-;48497:17;;48405:7;;48527:3;;48474:41;;48497:17;;48527:3;48474:41;:::i;:::-;48441:13;;48432:23;;;;:8;:23;;;;;:38;;;:84;;;;:::i;:::-;:99;;;;:::i;35443:384::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;35544:1:::1;35532:9;:13;35524:50;;;::::0;-1:-1:-1;;;35524:50:0;;4245:2:1;35524:50:0::1;::::0;::::1;4227:21:1::0;4284:2;4264:18;;;4257:30;4323:26;4303:18;;;4296:54;4367:18;;35524:50:0::1;4217:174:1::0;35524:50:0::1;35612:49;::::0;-1:-1:-1;;;35612:49:0;;35655:4:::1;35612:49;::::0;::::1;1461:51:1::0;35587:22:0::1;::::0;35612:24:::1;-1:-1:-1::0;;;;;35612:34:0::1;::::0;::::1;::::0;1434:18:1;;35612:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35587:74:::0;-1:-1:-1;35680:19:0;;35672:58:::1;;;::::0;-1:-1:-1;;;35672:58:0;;7053:2:1;35672:58:0::1;::::0;::::1;7035:21:1::0;7092:2;7072:18;;;7065:30;7131:28;7111:18;;;7104:56;7177:18;;35672:58:0::1;7025:176:1::0;35672:58:0::1;-1:-1:-1::0;35778:13:0::1;::::0;35769:23:::1;::::0;;;:8:::1;:23;::::0;;;;:38:::1;;:50:::0;35443:384::o;36133:2434::-;32700:27;;;;;;;:32;32692:71;;;;-1:-1:-1;;;32692:71:0;;7408:2:1;32692:71:0;;;7390:21:1;7447:2;7427:18;;;7420:30;7486:28;7466:18;;;7459:56;7532:18;;32692:71:0;7380:176:1;32692:71:0;36312:16:::1;;36295:13;:33;;36287:76;;;::::0;-1:-1:-1;;;36287:76:0;;6346:2:1;36287:76:0::1;::::0;::::1;6328:21:1::0;6385:2;6365:18;;;6358:30;6424:32;6404:18;;;6397:60;6474:18;;36287:76:0::1;6318:180:1::0;36287:76:0::1;36417:27;:31:::0;;-1:-1:-1;;36417:31:0::1;;;::::0;;36513:9:::1;:7;:9::i;:::-;36643:46;::::0;-1:-1:-1;;;36643:46:0;;36678:10:::1;36643:46;::::0;::::1;1461:51:1::0;36693:13:0;;36643:24:::1;-1:-1:-1::0;;;;;36643:34:0::1;::::0;::::1;::::0;1434:18:1;;36643:46:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;36635:94;;;::::0;-1:-1:-1;;;36635:94:0;;8473:2:1;36635:94:0::1;::::0;::::1;8455:21:1::0;8512:2;8492:18;;;8485:30;-1:-1:-1;;;8531:18:1;;;8524:48;8589:18;;36635:94:0::1;8445:168:1::0;36635:94:0::1;36834:61;::::0;-1:-1:-1;;;36834:61:0;;36869:10:::1;36834:61;::::0;::::1;1735:34:1::0;36889:4:0::1;1785:18:1::0;;;1778:43;36899:13:0;;36834:24:::1;-1:-1:-1::0;;;;;36834:34:0::1;::::0;::::1;::::0;1670:18:1;;36834:61:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:78;;36826:113;;;::::0;-1:-1:-1;;;36826:113:0;;5286:2:1;36826:113:0::1;::::0;::::1;5268:21:1::0;5325:2;5305:18;;;5298:30;-1:-1:-1;;;5344:18:1;;;5337:52;5406:18;;36826:113:0::1;5258:172:1::0;36826:113:0::1;37121:13;::::0;37038:29:::1;37112:23:::0;;;:8:::1;:23;::::0;;;;:34:::1;;::::0;26834:25:::1;26857:1;26842:2;26834:25;:::i;:::-;37070:39;::::0;:13;:39:::1;:::i;:::-;:76;;;;:::i;:::-;37245:44;::::0;-1:-1:-1;;;37245:44:0;;::::1;::::0;::::1;16170:25:1::0;;;37038:108:0;;-1:-1:-1;37245:13:0::1;-1:-1:-1::0;;;;;37245:21:0::1;::::0;::::1;::::0;16143:18:1;;37245:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37237:84;;;::::0;-1:-1:-1;;;37237:84:0;;13778:2:1;37237:84:0::1;::::0;::::1;13760:21:1::0;13817:2;13797:18;;;13790:30;13856:29;13836:18;;;13829:57;13903:18;;37237:84:0::1;13750:177:1::0;37237:84:0::1;37343:13;::::0;37334:23:::1;::::0;;;:8:::1;:23;::::0;;;;:38:::1;;:55:::0;;37376:13;;37334:23;:55:::1;::::0;37376:13;;37334:55:::1;:::i;:::-;::::0;;;-1:-1:-1;;37556:49:0::1;::::0;-1:-1:-1;;;37556:49:0;;37599:4:::1;37556:49;::::0;::::1;1461:51:1::0;37524:29:0::1;::::0;37556:24:::1;-1:-1:-1::0;;;;;37556:34:0::1;::::0;::::1;::::0;1434:18:1;;37556:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37677:79;::::0;-1:-1:-1;;;37677:79:0;;37715:10:::1;37677:79;::::0;::::1;2072:34:1::0;37735:4:0::1;2122:18:1::0;;;2115:43;2174:18;;;2167:34;;;37524:81:0;;-1:-1:-1;37677:24:0::1;-1:-1:-1::0;;;;;37677:37:0::1;::::0;::::1;::::0;2007:18:1;;37677:79:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37669:113;;;;-1:-1:-1::0;;;37669:113:0::1;;;;;;;:::i;:::-;37881:49;::::0;-1:-1:-1;;;37881:49:0;;37924:4:::1;37881:49;::::0;::::1;1461:51:1::0;37860:18:0::1;::::0;37881:24:::1;-1:-1:-1::0;;;;;37881:34:0::1;::::0;::::1;::::0;1434:18:1;;37881:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37860:70:::0;-1:-1:-1;38058:37:0::1;38082:13:::0;38058:21;:37:::1;:::i;:::-;38044:10;:51;38036:91;;;::::0;-1:-1:-1;;;38036:91:0;;10606:2:1;38036:91:0::1;::::0;::::1;10588:21:1::0;10645:2;10625:18;;;10618:30;10684:29;10664:18;;;10657:57;10731:18;;38036:91:0::1;10578:177:1::0;38036:91:0::1;38267:53;::::0;-1:-1:-1;;;38267:53:0;;38286:10:::1;38267:53;::::0;::::1;3362:51:1::0;3429:18;;;3422:34;;;38267:13:0::1;-1:-1:-1::0;;;;;38267:18:0::1;::::0;::::1;::::0;3335::1;;38267:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;38377:99:0::1;::::0;;-1:-1:-1;;;;;38400:24:0::1;2499:15:1::0;2481:34;;38427:10:0::1;2546:2:1::0;2531:18;;2524:43;2583:18;;;2576:34;;;2641:2;2626:18;;2619:34;;;38377:99:0::1;::::0;-1:-1:-1;2430:3:1;2415:19;;-1:-1:-1;38377:99:0::1;;;;;;;-1:-1:-1::0;;38528:27:0::1;:31:::0;;-1:-1:-1;;38528:31:0::1;::::0;;-1:-1:-1;;36133:2434:0:o;45902:633::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;45973:9:::1;:7;:9::i;:::-;46076:27;46106:18;47929:13:::0;;;47893:7;47920:23;;;:8;:23;;;;;:37;;47843:122;;46106:18:::1;46161:49;::::0;-1:-1:-1;;;46161:49:0;;46204:4:::1;46161:49;::::0;::::1;1461:51:1::0;46076:48:0;;-1:-1:-1;46137:21:0::1;::::0;-1:-1:-1;;;;;46161:24:0::1;:34;::::0;::::1;::::0;1434:18:1;;46161:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46235:19;::::0;46223:59:::1;::::0;-1:-1:-1;;;46223:59:0;;::::1;::::0;::::1;16170:25:1::0;;;46137:73:0;;-1:-1:-1;46235:19:0;;::::1;-1:-1:-1::0;;;;;46235:19:0::1;::::0;46223:38:::1;::::0;16143:18:1;;46223:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;46318:49:0::1;::::0;-1:-1:-1;;;46318:49:0;;46361:4:::1;46318:49;::::0;::::1;1461:51:1::0;46295:20:0::1;::::0;-1:-1:-1;46318:24:0::1;-1:-1:-1::0;;;;;46318:34:0::1;::::0;-1:-1:-1;46318:34:0::1;::::0;1434:18:1;;46318:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46295:72:::0;-1:-1:-1;46404:35:0::1;46420:19:::0;46404:13;:35:::1;:::i;:::-;46388:12;:51;;46380:91;;;::::0;-1:-1:-1;;;46380:91:0;;10606:2:1;46380:91:0::1;::::0;::::1;10588:21:1::0;10645:2;10625:18;;;10618:30;10684:29;10664:18;;;10657:57;10731:18;;46380:91:0::1;10578:177:1::0;46380:91:0::1;46489:38;::::0;16170:25:1;;;46489:38:0::1;::::0;16158:2:1;16143:18;46489:38:0::1;;;;;;;19107:1;;;45902:633::o:0;19986:194::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;20081:17:::1;::::0;-1:-1:-1;;;;;20073:25:0;;::::1;20081:17:::0;::::1;20073:25;;20065:67;;;::::0;-1:-1:-1;;;20065:67:0;;9898:2:1;20065:67:0::1;::::0;::::1;9880:21:1::0;9937:2;9917:18;;;9910:30;9976:31;9956:18;;;9949:59;10025:18;;20065:67:0::1;9870:179:1::0;20065:67:0::1;20143:29;20167:4;20143:23;:29::i;:::-;19986:194:::0;:::o;22584:144::-;22644:12;22680:40;22692:27;22126:12;22692:9;:27;:::i;:::-;22680:11;:40::i;:::-;-1:-1:-1;22669:51:0;;22584:144;-1:-1:-1;;;22584:144:0:o;23035:306::-;23177:17;23327:6;23297:27;22335:2;23297:6;:27;:::i;:::-;23271:23;22231:7;23271:4;:23;:::i;:::-;22126:12;23219:31;23233:4;23239:5;23246:3;23219:13;:31::i;:::-;:49;;;;:::i;:::-;:75;;;;:::i;:::-;:105;;;;:::i;:::-;:114;;;;:::i;:::-;23207:126;23035:306;-1:-1:-1;;;;;;;23035:306:0:o;23589:248::-;23675:7;23720:11;23703:13;:28;;23695:69;;;;-1:-1:-1;;;23695:69:0;;11661:2:1;23695:69:0;;;11643:21:1;11700:2;11680:18;;;11673:30;11739;11719:18;;;11712:58;11787:18;;23695:69:0;11633:178:1;23695:69:0;22126:12;23783:27;23797:13;23783:11;:27;:::i;:::-;23782:47;;;;:::i;:::-;23775:54;23589:248;-1:-1:-1;;;23589:248:0:o;21300:309::-;21358:4;20913:66;21523:17;;21562:19;;;;;;:38;;-1:-1:-1;21585:15:0;;;21562:38;21554:47;21300:309;-1:-1:-1;;;;21300:309:0:o;1086:214::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1172:18:0;::::1;1164:56;;;::::0;-1:-1:-1;;;1164:56:0;;13069:2:1;1164:56:0::1;::::0;::::1;13051:21:1::0;13108:2;13088:18;;;13081:30;13147:27;13127:18;;;13120:55;13192:18;;1164:56:0::1;13041:175:1::0;1164:56:0::1;1257:5;::::0;1236:33:::1;::::0;;-1:-1:-1;;;;;1257:5:0;;::::1;1735:34:1::0;;1805:15;;;1800:2;1785:18;;1778:43;1236:33:0::1;::::0;1670:18:1;1236:33:0::1;;;;;;;1280:5;:12:::0;;-1:-1:-1;;;;;;1280:12:0::1;-1:-1:-1::0;;;;;1280:12:0;;;::::1;::::0;;;::::1;::::0;;1086:214::o;24349:665::-;24409:12;;;24485:5;24409:12;22423:7;24515:14;24485:5;24524;24515:14;:::i;:::-;:31;;;;:::i;:::-;24504:42;-1:-1:-1;24557:8:0;24576:6;24568:5;24504:42;24568:1;:5;:::i;:::-;:14;;;;:::i;:::-;24557:25;-1:-1:-1;24620:1:0;24602:10;24557:25;24602:6;:10;:::i;:::-;:14;;24615:1;24602:14;:::i;:::-;24601:20;;;;:::i;:::-;24597:24;;:1;:24;:::i;:::-;24593:28;-1:-1:-1;24632:12:0;24664:7;24655:5;24593:28;24659:1;24655:5;:::i;:::-;24647:14;;:4;:14;:::i;:::-;:24;;;;:::i;:::-;24632:39;-1:-1:-1;24705:1:0;24690:12;24632:39;24690:4;:12;:::i;:::-;:16;;;;:::i;:::-;24686:20;;:1;:20;:::i;:::-;:25;;24709:2;24686:25;:::i;:::-;24682:29;-1:-1:-1;24722:13:0;24747:4;24738:6;24682:29;24738:2;:6;:::i;:::-;:13;;;;:::i;:::-;24722:29;-1:-1:-1;24762:11:0;24796:2;24780:13;24722:29;24780:4;:13;:::i;:::-;:18;;;;:::i;:::-;24776:22;;:1;:22;:::i;:::-;24762:36;-1:-1:-1;24813:11:0;24822:2;24813:6;:11;:::i;:::-;24809:15;-1:-1:-1;24857:6:0;24809:15;24857:2;:6;:::i;:::-;24844:10;:6;24853:1;24844:10;:::i;:::-;:19;;;;:::i;:::-;24835:28;-1:-1:-1;24907:1:0;24899:5;24889:6;24893:2;24889:1;:6;:::i;:::-;24882:14;;:3;:14;:::i;:::-;:22;;;;:::i;:::-;:26;;;;:::i;:::-;24874:34;24969:6;;-1:-1:-1;25001:4:0;-1:-1:-1;24349:665:0;-1:-1:-1;;;;;;24349:665:0:o;25545:550::-;25634:13;25676:4;25668;:12;;25660:30;;;;-1:-1:-1;;;25660:30:0;;14841:2:1;25660:30:0;;;14823:21:1;14880:1;14860:18;;;14853:29;-1:-1:-1;;;14898:18:1;;;14891:35;14943:18;;25660:30:0;14813:154:1;25660:30:0;25717:4;25750:5;25782:3;25701:9;22423:7;26022:1;26015:3;26009:2;25994:11;26003:2;25750:5;25994:11;:::i;:::-;25993:18;;;;:::i;:::-;25978:12;:5;25986:4;25978:12;:::i;:::-;:33;;;;:::i;:::-;25977:41;;;;:::i;:::-;25972:47;;:1;:47;:::i;:::-;:51;;;;:::i;:::-;25956:2;;25930:11;25939:2;25930:6;:11;:::i;:::-;25929:18;;;;:::i;:::-;:23;;25950:2;25929:23;:::i;:::-;25916:10;25925:1;25916:6;:10;:::i;:::-;:36;;;;:::i;:::-;25909:44;;:3;:44;:::i;:::-;:49;;;;:::i;:::-;25894:1;25888:2;25873:11;25882:2;25873:6;:11;:::i;:::-;25872:18;;;;:::i;:::-;25857:12;:5;25865:4;25857:12;:::i;:::-;:33;;;;:::i;:::-;25849:42;;:4;:42;:::i;:::-;:46;;;;:::i;:::-;25812:23;25830:5;25812:4;:23;:::i;:::-;:83;;;;:::i;:::-;:146;;;;:::i;:::-;:211;;;;:::i;:::-;:239;;;;:::i;:::-;25799:252;25545:550;-1:-1:-1;;;;;;;;25545:550:0:o;14:306:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;178:23;;-1:-1:-1;;;;;230:31:1;;220:42;;210:2;;281:6;273;266:22;325:297;;445:2;433:9;424:7;420:23;416:32;413:2;;;466:6;458;451:22;413:2;503:9;497:16;556:5;549:13;542:21;535:5;532:32;522:2;;583:6;575;568:22;627:190;;739:2;727:9;718:7;714:23;710:32;707:2;;;760:6;752;745:22;707:2;-1:-1:-1;788:23:1;;697:120;-1:-1:-1;697:120:1:o;822:194::-;;945:2;933:9;924:7;920:23;916:32;913:2;;;966:6;958;951:22;913:2;-1:-1:-1;994:16:1;;903:113;-1:-1:-1;903:113:1:o;1021:289::-;;1131:2;1119:9;1110:7;1106:23;1102:32;1099:2;;;1152:6;1144;1137:22;1099:2;1196:9;1183:23;1246:4;1239:5;1235:16;1228:5;1225:27;1215:2;;1271:6;1263;1256:22;9338:353;9540:2;9522:21;;;9579:2;9559:18;;;9552:30;9618:31;9613:2;9598:18;;9591:59;9682:2;9667:18;;9512:179::o;10054:345::-;10256:2;10238:21;;;10295:2;10275:18;;;10268:30;-1:-1:-1;;;10329:2:1;10314:18;;10307:51;10390:2;10375:18;;10228:171::o;12165:346::-;12367:2;12349:21;;;12406:2;12386:18;;;12379:30;-1:-1:-1;;;12440:2:1;12425:18;;12418:52;12502:2;12487:18;;12339:172::o;15331:348::-;15533:2;15515:21;;;15572:2;15552:18;;;15545:30;15611:26;15606:2;15591:18;;15584:54;15670:2;15655:18;;15505:174::o;17311:267::-;;17378:11;;;17405:10;;-1:-1:-1;;;;;17424:27:1;;;17417:35;;17401:52;17398:2;;;17456:18;;:::i;:::-;-1:-1:-1;;;17503:19:1;;;17496:27;;17488:36;;17485:2;;;17527:18;;:::i;:::-;-1:-1:-1;;17563:9:1;;17358:220::o;17583:128::-;;17654:1;17650:6;17647:1;17644:13;17641:2;;;17660:18;;:::i;:::-;-1:-1:-1;17696:9:1;;17631:80::o;17716:193::-;;17781:1;17771:2;;17786:18;;:::i;:::-;-1:-1:-1;;;17822:18:1;;-1:-1:-1;;17842:13:1;;17818:38;17815:2;;;17859:18;;:::i;:::-;-1:-1:-1;17893:10:1;;17761:148::o;17914:120::-;;17980:1;17970:2;;17985:18;;:::i;:::-;-1:-1:-1;18019:9:1;;17960:74::o;18039:453::-;18135:6;18158:5;18172:314;18221:1;18258:2;18248:8;18245:16;18235:2;;18265:5;;;18235:2;18306:4;18301:3;18297:14;18291:4;18288:24;18285:2;;;18315:18;;:::i;:::-;18365:2;18355:8;18351:17;18348:2;;;18380:16;;;;18348:2;18459:17;;;;;18419:15;;18172:314;;;18116:376;;;;;;;:::o;18497:139::-;;18586:44;-1:-1:-1;;18613:8:1;18607:4;18641:922;18725:8;18715:2;;-1:-1:-1;18766:1:1;18780:5;;18715:2;18814:4;18804:2;;-1:-1:-1;18851:1:1;18865:5;;18804:2;18896:4;18914:1;18909:59;;;;18982:1;18977:183;;;;18889:271;;18909:59;18939:1;18930:10;;18953:5;;;18977:183;19014:3;19004:8;19001:17;18998:2;;;19021:18;;:::i;:::-;19077:1;19067:8;19063:16;19054:25;;19105:3;19098:5;19095:14;19092:2;;;19112:18;;:::i;:::-;19145:5;;;18889:271;;19244:2;19234:8;19231:16;19225:3;19219:4;19216:13;19212:36;19206:2;19196:8;19193:16;19188:2;19182:4;19179:12;19175:35;19172:77;19169:2;;;-1:-1:-1;19281:19:1;;;19316:14;;;19313:2;;;19333:18;;:::i;:::-;19366:5;;19169:2;19413:42;19451:3;19441:8;19435:4;19432:1;19413:42;:::i;:::-;19488:6;19483:3;19479:16;19470:7;19467:29;19464:2;;;19499:18;;:::i;:::-;19537:20;;18705:858;-1:-1:-1;;;;18705:858:1:o;19568:577::-;;-1:-1:-1;;;;;19677:15:1;;;19711;;;19742:11;;;19761:10;;;19755:17;;19738:35;19735:2;;;19776:18;;:::i;:::-;-1:-1:-1;;;19845:15:1;;;19876:11;;;19896;;;19889:19;;19872:37;19869:2;;;19912:18;;:::i;:::-;19958:7;19955:1;19951:15;19941:25;;20011:1;20007:2;20002:11;19999:1;19995:19;19990:2;19986;19982:11;19978:37;19975:2;;;20018:18;;:::i;:::-;20083:1;20079:2;20074:11;20071:1;20067:19;20062:2;20058;20054:11;20050:37;20047:2;;;20090:18;;:::i;:::-;-1:-1:-1;;;20130:9:1;;;;;19619:526;-1:-1:-1;;;19619:526:1:o;20150:168::-;;20256:1;20252;20248:6;20244:14;20241:1;20238:21;20233:1;20226:9;20219:17;20215:45;20212:2;;;20263:18;;:::i;:::-;-1:-1:-1;20303:9:1;;20202:116::o;20323:270::-;;20391:12;;;20419:10;;-1:-1:-1;;;20438:19:1;;20431:27;;20415:44;20412:2;;;20462:18;;:::i;:::-;-1:-1:-1;;;;;20509:27:1;;20502:35;;20494:44;;20491:2;;;20541:18;;:::i;:::-;-1:-1:-1;;20578:9:1;;20371:222::o;20598:125::-;;20666:1;20663;20660:8;20657:2;;;20671:18;;:::i;:::-;-1:-1:-1;20708:9:1;;20647:76::o;20728:135::-;;-1:-1:-1;;20788:17:1;;20785:2;;;20808:18;;:::i;:::-;-1:-1:-1;20855:1:1;20844:13;;20775:88::o;20868:127::-;20929:10;20924:3;20920:20;20917:1;20910:31;20960:4;20957:1;20950:15;20984:4;20981:1;20974:15;21000:127;21061:10;21056:3;21052:20;21049:1;21042:31;21092:4;21089:1;21082:15;21116:4;21113:1;21106:15

Swarm Source

ipfs://57c1b6672852aab9f02860448a7ed09656af11e2888ff8ec3790d9f5cfdc394e

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.