ETH Price: $2,879.97 (+0.38%)
Gas: 4.61 Gwei
 

Overview

Max Total Supply

3,347.255138164335255398 ERC20 ***

Holders

27

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
poap.eth
Balance
0 ERC20 ***

Value
$0.00
0xf6b6f07862a02c85628b3a9688beae07fea9c863
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DaiBackstopSyndicateV3

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-03-18
*/

pragma solidity 0.5.16; // optimization runs: 200


interface IDaiBackstopSyndicate {
  event AuctionEntered(uint256 auctionId, uint256 mkrAsk, uint256 daiBid);
  event AuctionFinalized(uint256 auctionId);

  enum Status {
    ACCEPTING_DEPOSITS,
    ACTIVATED,
    DEACTIVATED
  }

  // Anyone can deposit Dai up until the auctions have started at 1:1
  function enlist(uint256 daiAmount) external returns (uint256 backstopTokensMinted);

  // Anyone can withdraw at any point as long as Dai is not locked in auctions
  function defect(uint256 backstopTokenAmount) external returns (uint256 daiRedeemed, uint256 mkrRedeemed);

  // Anyone can enter an auction for the syndicate, bidding Dai in return for MKR
  function enterAuction(uint256 auctionId) external;

  // Anyone can finalize an auction, returning the Dai or MKR to the syndicate
  function finalizeAuction(uint256 auctionId) external;

  // An owner can halt all new deposits and auctions (but not withdrawals or ongoing auctions)
  function ceaseFire() external;
  
  /// Return total amount of DAI that is currently held by Syndicate
  function getDaiBalance() external view returns (uint256 combinedDaiInVat);

  /// Return total amount of DAI that is currently being used in auctions
  function getDaiBalanceForAuctions() external view returns (uint256 daiInVatForAuctions);

  /// Return total amount of DAI that is *not* currently being used in auctions
  function getAvailableDaiBalance() external view returns (uint256 daiInVat);

  /// Return total amount of MKR that is currently held by Syndicate
  function getMKRBalance() external view returns (uint256 mkr);

  /// Do a "dry-run" of a withdrawal of some amount of tokens
  function getDefectAmount(
    uint256 backstopTokenAmount
  ) external view returns (
    uint256 daiRedeemed, uint256 mkrRedeemed, bool redeemable
  );

  // Determine if the contract is accepting deposits (0), active (1), or deactivated (2).
  function getStatus() external view returns (Status status);

  // Return all auctions that the syndicate is currently participating in.
  function getActiveAuctions() external view returns (uint256[] memory activeAuctions);
}


interface IJoin {
    function join(address, uint256) external;
    function exit(address, uint256) external;
}


interface IVat {
    function dai(address) external view returns (uint256);
    function hope(address) external;
    function move(address, address, uint256) external;
}


interface IFlopper {
    // --- Auth ---
    // caller authorization (1 = authorized, 0 = not authorized)
    function wards(address) external view returns (uint256);
    // authorize caller
    function rely(address usr) external;
    // deauthorize caller
    function deny(address usr) external;

    // Bid objects
    function bids(uint256) external view returns (
        uint256 bid,
        uint256 lot,
        address guy,
        uint48 tic,
        uint48 end
    );

    // DAI contract address
    function vat() external view returns (address);
    // MKR contract address
    function gem() external view returns (address);

    // num decimals (constant)
    function ONE() external pure returns (uint256);

    // minimum bid increase (config - 5% initial)
    function beg() external view returns (uint256);
    // initial lot increase (config - 50% initial)
    function pad() external view returns (uint256);
    // bid lifetime (config - 3 hours initial)
    function ttl() external view returns (uint48);
    // total auction length (config - 2 days initial)
    function tau() external view returns (uint48);

    // number of auctions
    function kicks() external view returns (uint256);
    // status of the auction (1 = active, 0 = disabled)
    function live() external view returns (uint256);
    // user who shut down flopper mechanism and paid off last bid
    function vow() external view returns (address);

    // --- Events ---
    event Kick(uint256 id, uint256 lot, uint256 bid, address indexed gal);

    // --- Admin ---
    function file(bytes32 what, uint256 data) external;

    // --- Auction ---

    // create an auction 
    // access control: authed
    // state machine: after auction expired
    // gal - recipient of the dai
    // lot - amount of mkr to mint
    // bid - amount of dai to pay
    // id - id of the auction
    function kick(address gal, uint256 lot, uint256 bid) external returns (uint256 id);

    // extend the auction and increase minimum maker amount minted
    // access control: not-authed
    // state machine: after auction expiry, before first bid
    // id - id of the auction
    function tick(uint256 id) external;

    // bid up auction and refund locked up dai to previous bidder
    // access control: not-authed
    // state machine: before auction expired
    // id - id of the auction
    // lot - amount of mkr to mint
    // bid - amount of dai to pay
    function dent(uint256 id, uint256 lot, uint256 bid) external;

    // finalize auction
    // access control: not-authed
    // state machine: after auction expired
    // id - id of the auction
    function deal(uint256 id) external;

    // --- Shutdown ---

    // shutdown flopper mechanism
    // access control: authed
    // state machine: anytime
    function cage() external;

    // get cancelled bid back
    // access control: authed
    // state machine: after shutdown
    function yank(uint256 id) external;
}


/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}


/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through `transferFrom`. This is
     * zero by default.
     *
     * This value changes when `approve` or `transferFrom` are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * > 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
     *
     * Emits an `Approval` event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to `approve`. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


/**
 * @dev Implementation of the `IERC20` interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using `_mint`.
 * For a generic mechanism see `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an `Approval` event is emitted on calls to `transferFrom`.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See `IERC20.approve`.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    /**
     * @dev See `IERC20.totalSupply`.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See `IERC20.balanceOf`.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See `IERC20.transfer`.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See `IERC20.allowance`.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev See `IERC20.transferFrom`.
     *
     * Emits an `Approval` event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of `ERC20`;
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to `transfer`, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a `Transfer` event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a `Transfer` event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

     /**
     * @dev Destoys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a `Transfer` event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an `Approval` event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }
}


contract SimpleFlopper {

  // A "flopper" is a contract for auctioning off MKR in exchange for Dai.
  IFlopper internal constant _auction = IFlopper(
    0x4D95A049d5B0b7d32058cd3F2163015747522e99
  );

  // Getters //

  /// @notice Get the status of the flopper contract
  /// @return bool status true if auction contract is enabled
  function isEnabled() public view returns (bool status) {
    return (_auction.live() == 1) ? true : false;
  }

  /// @notice Get the id of the latest auction
  /// @return auctionID uint256 id
  function getTotalNumberOfAuctions() public view returns (uint256 auctionID) {
    return _auction.kicks();
  }

  /// @notice Get the address of the auction contract (Flopper)
  /// @return Auction address
  function getFlopperAddress() public pure returns (address flopper) {
    return address(_auction);
  }

  /// @notice Get the flopper contract config
  /// @return bidIncrement uint256 minimum bid increment as percentage (initial = 1.05E18)
  /// @return repriceIncrement uint256 reprice increment as percentage (initial = 1.50E18)
  /// @return bidDuration uint256 duration of a bid in seconds (initial = 3 hours)
  /// @return auctionDuration uint256 initial duration of an auction in seconds (initial = 2 days)
  function getAuctionInformation() public view returns (
    uint256 bidIncrement,
    uint256 repriceIncrement,
    uint256 bidDuration,
    uint256 auctionDuration
  ) {
    return (_auction.beg(), _auction.pad(), _auction.ttl(), _auction.tau());
  }

  /// @notice Get the winning bid for an auction
  /// @return amountDAI uint256 amount of DAI to be burned
  /// @return amountMKR uint256 amount of MKR to be minted
  /// @return bidder address account who placed bid
  /// @return bidDeadline uint48 deadline of bid
  /// @return auctionDeadline uint48 deadline of auction
  function getCurrentBid(uint256 auctionID) public view returns (
    uint256 amountDAI,
    uint256 amountMKR,
    address bidder,
    uint48 bidDeadline,
    uint48 auctionDeadline
  ) {
    return _auction.bids(auctionID);
  }

  // Setters //

  /// @notice Extend and reprice expired auction with no bid
  /// @dev state machine: after auction expiry, before first bid
  /// @param auctionID uint256 id of the auction
  function _reprice(uint256 auctionID) internal {
    _auction.tick(auctionID);
  }

  /// @notice Add bid to a live auction, if first bid this transfers DAI to vat
  /// @dev state machine: before auction expired
  /// @param auctionID uint256 id of the auction
  function _bid(uint256 auctionID, uint256 amountMKR, uint256 amountDAI) internal {
    _auction.dent(auctionID, amountMKR, amountDAI);
  }

  /// @notice Finalize an auction with a winning bid and release maker
  /// @dev state machine: after auction expired
  /// @param auctionID uint256 id of the auction
  function _finalize(uint256 auctionID) internal {
    _auction.deal(auctionID);
  }
}


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be aplied to your functions to restrict their use to
 * the owner.
 *
 * In order to transfer ownership, a recipient must be specified, at which point
 * the specified recipient can call `acceptOwnership` and take ownership.
 */
contract TwoStepOwnable {
  address private _owner;

  address private _newPotentialOwner;

  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev Initialize contract by setting transaction submitter as initial owner.
   */
  constructor() internal {
    _owner = tx.origin;
    emit OwnershipTransferred(address(0), _owner);
  }

  /**
   * @dev Returns the address of the current owner.
   */
  function owner() public view returns (address) {
    return _owner;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(isOwner(), "TwoStepOwnable: caller is not the owner.");
    _;
  }

  /**
   * @dev Returns true if the caller is the current owner.
   */
  function isOwner() public view returns (bool) {
    return msg.sender == _owner;
  }

  /**
   * @dev Allows a new account (`newOwner`) to accept ownership.
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(
      newOwner != address(0),
      "TwoStepOwnable: new potential owner is the zero address."
    );

    _newPotentialOwner = newOwner;
  }

  /**
   * @dev Cancel a transfer of ownership to a new account.
   * Can only be called by the current owner.
   */
  function cancelOwnershipTransfer() public onlyOwner {
    delete _newPotentialOwner;
  }

  /**
   * @dev Transfers ownership of the contract to the caller.
   * Can only be called by a new potential owner set by the current owner.
   */
  function acceptOwnership() public {
    require(
      msg.sender == _newPotentialOwner,
      "TwoStepOwnable: current owner must set caller as new potential owner."
    );

    delete _newPotentialOwner;

    emit OwnershipTransferred(_owner, msg.sender);

    _owner = msg.sender;
  }
}


/**
 * Adapted from OpenZeppelin's address version of the same, written by Alberto Cuesta Cañada:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/5dfe7215a9156465d550030eadc08770503b2b2f/
 *   contracts/utils/EnumerableSet.sol
 */
library EnumerableSet {

  struct AuctionIDSet {
    // Position of the value in the `values` array, plus 1 because index 0
    // means a value is not in the set.
    mapping (uint256 => uint256) index;
    uint256[] values;
  }

  /**
   * @dev Add a value to a set. O(1).
   * Returns false if the value was already in the set.
   */
  function add(AuctionIDSet storage set, uint256 value)
    internal
    returns (bool)
  {
    if (!contains(set, value)) {
      set.values.push(value);
      // The element is stored at length-1, but we add 1 to all indexes
      // and use 0 as a sentinel value
      set.index[value] = set.values.length;
      return true;
    } else {
      return false;
    }
  }

  /**
   * @dev Removes a value from a set. O(1).
   * Returns false if the value was not present in the set.
   */
  function remove(AuctionIDSet storage set, uint256 value)
    internal
    returns (bool)
  {
    if (contains(set, value)){
      uint256 toDeleteIndex = set.index[value] - 1;
      uint256 lastIndex = set.values.length - 1;

      // If the element we're deleting is the last one, we can just remove it without doing a swap
      if (lastIndex != toDeleteIndex) {
        uint256 lastValue = set.values[lastIndex];

        // Move the last value to the index where the deleted value is
        set.values[toDeleteIndex] = lastValue;
        // Update the index for the moved value
        set.index[lastValue] = toDeleteIndex + 1; // All indexes are 1-based
      }

      // Delete the index entry for the deleted value
      delete set.index[value];

      // Delete the old entry for the moved value
      set.values.pop();

      return true;
    } else {
      return false;
    }
  }

  /**
   * @dev Returns true if the value is in the set. O(1).
   */
  function contains(AuctionIDSet storage set, uint256 value)
    internal
    view
    returns (bool)
  {
    return set.index[value] != 0;
  }

  /**
   * @dev Returns an array with all values in the set. O(N).
   * Note that there are no guarantees on the ordering of values inside the
   * array, and it may change when more values are added or removed.
   * WARNING: This function may run out of gas on large sets: use {length} and
   * {get} instead in these cases.
   */
  function enumerate(AuctionIDSet storage set)
    internal
    view
    returns (uint256[] memory)
  {
    uint256[] memory output = new uint256[](set.values.length);
    for (uint256 i; i < set.values.length; i++){
      output[i] = set.values[i];
    }
    return output;
  }

  /**
   * @dev Returns the number of elements on the set. O(1).
   */
  function length(AuctionIDSet storage set)
    internal
    view
    returns (uint256)
  {
    return set.values.length;
  }

   /** @dev Returns the element stored at position `index` in the set. O(1).
  * Note that there are no guarantees on the ordering of values inside the
  * array, and it may change when more values are added or removed.
  *
  * Requirements:
  *
  * - `index` must be strictly less than {length}.
  */
  function get(AuctionIDSet storage set, uint256 index)
    internal
    view
    returns (uint256)
  {
    return set.values[index];
  }
}


/// @notice See https://github.com/backstop-syndicate/dai-backstop-syndicate
contract DaiBackstopSyndicateV3 is
  IDaiBackstopSyndicate,
  SimpleFlopper,
  TwoStepOwnable,
  ERC20
{
  using SafeMath for uint256;
  using EnumerableSet for EnumerableSet.AuctionIDSet;

  // Track the status of the Syndicate.
  Status internal _status;

  // Track each active auction as an enumerable set.
  EnumerableSet.AuctionIDSet internal _activeAuctions;

  IERC20 internal constant _DAI = IERC20(
    0x6B175474E89094C44Da98b954EedeAC495271d0F
  );

  IERC20 internal constant _MKR = IERC20(
    0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2
  );

  IJoin internal constant _DAI_JOIN = IJoin(
    0x9759A6Ac90977b93B58547b4A71c78317f391A28
  );

  IVat internal constant _VAT = IVat(
    0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B
  );

  constructor() public {
    // Begin in the "accepting deposits" state.
    _status = Status.ACCEPTING_DEPOSITS;
 
    // Enable "dai-join" to take vatDai in order mint ERC20 Dai.
    _VAT.hope(address(_DAI_JOIN));

    // Enable creation of "vat dai" by approving dai-join.
    _DAI.approve(address(_DAI_JOIN), uint256(-1));

    // Enable entry into auctions by approving the "flopper".
    _VAT.hope(SimpleFlopper.getFlopperAddress());
  }

  /// @notice User deposits DAI in the BackStop Syndicate and receives Syndicate shares
  /// @param daiAmount Amount of DAI to deposit
  /// @return Amount of Backstop Syndicate shares participant receives
  function enlist(
    uint256 daiAmount
  ) external notWhenDeactivated returns (uint256 backstopTokensMinted) {
    require(daiAmount > 0, "DaiBackstopSyndicate/enlist: No Dai amount supplied.");  
      
    require(
      _status == Status.ACCEPTING_DEPOSITS,
      "DaiBackstopSyndicate/enlist: Cannot deposit once the first auction bid has been made."
    );

    require(
      _DAI.transferFrom(msg.sender, address(this), daiAmount),
      "DaiBackstopSyndicate/enlist: Could not transfer Dai amount from caller."
    );

    // Place the supplied Dai into the central Maker ledger for use in auctions.
    _DAI_JOIN.join(address(this), daiAmount);

    // Mint tokens 1:1 to the caller in exchange for the supplied Dai.
    backstopTokensMinted = daiAmount;
    _mint(msg.sender, backstopTokensMinted);
  }

  /// @notice User withdraws DAI and MKR from BackStop Syndicate based on Syndicate shares owned
  /// @param backstopTokenAmount Amount of shares to burn
  /// @return daiRedeemed: Amount of DAI withdrawn
  /// @return mkrRedeemed: Amount of MKR withdrawn
  function defect(
    uint256 backstopTokenAmount
  ) external returns (uint256 daiRedeemed, uint256 mkrRedeemed) {
    require(
      backstopTokenAmount > 0, "DaiBackstopSyndicate/defect: No token amount supplied."
    );
      
    // Determine the % ownership. (scaled up by 1e18)
    uint256 shareFloat = (backstopTokenAmount.mul(1e18)).div(totalSupply());

    // Burn the tokens.
    _burn(msg.sender, backstopTokenAmount);

    // Determine the Dai currently being used to bid in auctions.
    uint256 vatDaiLockedInAuctions = _getActiveAuctionVatDaiTotal();

    // Determine the Dai currently locked up on behalf of this contract.
    uint256 vatDaiBalance = _VAT.dai(address(this));

    // Combine Dai locked in auctions with the balance on the contract.
    uint256 combinedVatDai = vatDaiLockedInAuctions.add(vatDaiBalance);

    // Determine the Maker currently held by the contract.
    uint256 makerBalance = _MKR.balanceOf(address(this));

    // Determine the amount of Dai and MKR to redeem based on the share.
    uint256 vatDaiRedeemed = combinedVatDai.mul(shareFloat) / 1e18;
    mkrRedeemed = makerBalance.mul(shareFloat) / 1e18;

    // daiRedeemed is the e18 version of vatDaiRedeemed (e45).
    // Needed for dai ERC20 token, otherwise keep decimals of vatDai.
    daiRedeemed = vatDaiRedeemed / 1e27;

    // Ensure that something is returned in exchange for burned tokens.
    require(
      mkrRedeemed != 0 || daiRedeemed != 0,
      "DaiBackstopSyndicate/defect: Nothing returned after burning tokens."
    );

    // Ensure that sufficient Dai liquidity is currently available to withdraw.
    require(
      vatDaiRedeemed <= vatDaiBalance,
      "DaiBackstopSyndicate/defect: Insufficient Dai (in use in auctions)"
    );

    // Redeem the Dai and MKR, giving user vatDai if global settlement, otherwise, tokens
    if (vatDaiRedeemed > 0) {
      if (SimpleFlopper.isEnabled()) {
        _DAI_JOIN.exit(msg.sender, daiRedeemed);
      } else {
        _VAT.move(address(this), msg.sender, vatDaiRedeemed);
      }
    }

    if (mkrRedeemed > 0) {
      require(
        _MKR.transfer(msg.sender, mkrRedeemed),
        "DaiBackstopSyndicate/defect: MKR redemption failed."
      );      
    }
  }

  /// @notice Triggers syndicate participation in an auction, bidding 50k DAI for 500 MKR
  /// @param auctionId ID of the auction to participate in
  function enterAuction(uint256 auctionId) external notWhenDeactivated {
    require(
      !_activeAuctions.contains(auctionId),
      "DaiBackstopSyndicate/enterAuction: Auction already active."
    );

    // dai has 45 decimal places
    (uint256 amountDai, , , , ) = SimpleFlopper.getCurrentBid(auctionId);

    // lot needs to have 18 decimal places, and we're expecting 1 mkr == 100 dai
    uint256 expectedLot = (amountDai / 1e27) / 100;

    // Place the bid, reverting on failure.
    SimpleFlopper._bid(auctionId, expectedLot, amountDai);

    // Prevent further deposits.
    if (_status != Status.ACTIVATED) {
      _status = Status.ACTIVATED;
    }

    // Register auction if successful participation.
    _activeAuctions.add(auctionId);

    // Emit an event to signal that the auction was entered.
    emit AuctionEntered(auctionId, expectedLot, amountDai);
  }

  // Anyone can finalize an auction if it's ready
  function finalizeAuction(uint256 auctionId) external {
    require(
      _activeAuctions.contains(auctionId),
      "DaiBackstopSyndicate/finalizeAuction: Auction already finalized"
    );

    // If auction was finalized, end should be 0x0.
    (,, address bidder,, uint48 end) = SimpleFlopper.getCurrentBid(auctionId);

    // If auction isn't closed, we try to close it ourselves
    if (end != 0) {
      // If we are the winning bidder, we finalize the auction
      // Otherwise we got outbid and we withdraw DAI
      if (bidder == address(this)) {
        SimpleFlopper._finalize(auctionId);
      }
    }

    // Remove the auction from the set of active auctions.
    _activeAuctions.remove(auctionId);

    // Emit an event to signal that the auction was finalized.
    emit AuctionFinalized(auctionId);
  }

  /// @notice The owner can pause new deposits and auctions. Existing auctions
  /// and withdrawals will be unaffected.
  function ceaseFire() external onlyOwner {
    _status = Status.DEACTIVATED;
  }

  function getStatus() external view returns (Status status) {
    status = _status;
  }

  function getActiveAuctions() external view returns (
    uint256[] memory activeAuctions
  ) {
    activeAuctions = _activeAuctions.enumerate();
  }

  /**
   * @dev Returns the name of the token.
   */
  function name() external view returns (string memory) {
    return "Dai Backstop Syndicate v3-100";
  }

  /**
   * @dev Returns the symbol of the token, usually a shorter version of the
   * name.
   */
  function symbol() external view returns (string memory) {
    return "DBSv3-100";
  }

  /**
   * @dev Returns the number of decimals used to get its user representation.
   * For example, if `decimals` equals `2`, a balance of `505` tokens should
   * be displayed to a user as `5,05` (`505 / 10 ** 2`).
   *
   * Tokens usually opt for a value of 18, imitating the relationship between
   * Ether and Wei.
   *
   * > Note that this information is only used for _display_ purposes: it in
   * no way affects any of the arithmetic of the contract, including
   * `IERC20.balanceOf` and `IERC20.transfer`.
   */
  function decimals() external view returns (uint8) {
    return 18;
  }

  /// @notice Return total amount of DAI that is currently held by Syndicate
  function getDaiBalance() external view returns (uint256 combinedDaiInVat) {
    // Determine the Dai currently being used to bid in auctions.
    uint256 vatDaiLockedInAuctions = _getActiveAuctionVatDaiTotal();

    // Determine the Dai currently locked up on behalf of this contract.
    uint256 vatDaiBalance = _VAT.dai(address(this));

    // Combine Dai locked in auctions with the balance on the contract.
    combinedDaiInVat = vatDaiLockedInAuctions.add(vatDaiBalance) / 1e27;
  }

  /// @notice Return total amount of DAI that is currently being used in auctions
  function getDaiBalanceForAuctions() external view returns (uint256 daiInVatForAuctions) {
    // Determine the Dai currently locked up in auctions.
    daiInVatForAuctions = _getActiveAuctionVatDaiTotal() / 1e27;
  }

  /// @notice Return total amount of DAI that is currently withdrawable
  function getAvailableDaiBalance() external view returns (uint256 daiInVat) {
    // Determine the Dai currently locked up on behalf of this contract.
    daiInVat = _VAT.dai(address(this)) / 1e27;
  }

  /// @notice Return total amount of MKR that is currently in this contract.
  function getMKRBalance() external view returns (uint256 mkr) {
    // Determine the MKR currently in this contract.
    mkr = _MKR.balanceOf(address(this));
  }

  /// @notice Dry-run of DAI and MKR withdrawal based on Syndicate shares owned
  /// @param backstopTokenAmount Amount of shares to burn
  /// @return daiRedeemed: Amount of DAI withdrawn
  /// @return mkrRedeemed: Amount of MKR withdrawn
  /// @return redeemable: Whether there's enough Dai not in auctions to withdraw
  function getDefectAmount(
    uint256 backstopTokenAmount
  ) external view returns (
    uint256 daiRedeemed, uint256 mkrRedeemed, bool redeemable
  ) {
    if (backstopTokenAmount == 0) {
      return (0, 0, false);
    }

    if (backstopTokenAmount > totalSupply()) {
      revert("Supplied token amount is greater than total supply.");
    }

    // Determine the % ownership. (scaled up by 1e18)
    uint256 shareFloat = (backstopTokenAmount.mul(1e18)).div(totalSupply());

    // Determine the Dai currently being used to bid in auctions.
    uint256 vatDaiLockedInAuctions = _getActiveAuctionVatDaiTotal();

    // Determine the Dai currently locked up on behalf of this contract.
    uint256 vatDaiBalance = _VAT.dai(address(this));

    // Combine Dai locked in auctions with the balance on the contract.
    uint256 combinedVatDai = vatDaiLockedInAuctions.add(vatDaiBalance);

    // Determine the Maker currently held by the contract.
    uint256 makerBalance = _MKR.balanceOf(address(this));

    // Determine the amount of Dai and MKR to redeem based on the share.
    uint256 vatDaiRedeemed = combinedVatDai.mul(shareFloat) / 1e18;
    mkrRedeemed = makerBalance.mul(shareFloat) / 1e18;

    // daiRedeemed is the e18 version of vatDaiRedeemed (e45).
    // Needed for dai ERC20 token, otherwise keep decimals of vatDai.
    daiRedeemed = vatDaiRedeemed / 1e27;

    // Check that sufficient Dai liquidity is currently available to withdraw.
    redeemable = (vatDaiRedeemed <= vatDaiBalance);
  }

  function _getActiveAuctionVatDaiTotal() internal view returns (uint256 vatDai) {
    vatDai = 0;
    uint256[] memory activeAuctions = _activeAuctions.enumerate();

    uint256 auctionVatDai;
    address bidder;
    for (uint256 i = 0; i < activeAuctions.length; i++) {
      // Dai bid size is returned from getCurrentBid with 45 decimals
      (auctionVatDai,, bidder,,) = SimpleFlopper.getCurrentBid(activeAuctions[i]);
      if (bidder == address(this)) {
        // we are keeping the 45 decimals in case we need to return vatDai
        vatDai = vatDai.add(auctionVatDai);
      }
    }
  }

  modifier notWhenDeactivated() {
    require(
      _status != Status.DEACTIVATED,
      "DaiBackstopSyndicate/notWhenDeactivated: Syndicate is deactivated, please withdraw."
    );
    _;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mkrAsk","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daiBid","type":"uint256"}],"name":"AuctionEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"AuctionFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"ceaseFire","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"backstopTokenAmount","type":"uint256"}],"name":"defect","outputs":[{"internalType":"uint256","name":"daiRedeemed","type":"uint256"},{"internalType":"uint256","name":"mkrRedeemed","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"daiAmount","type":"uint256"}],"name":"enlist","outputs":[{"internalType":"uint256","name":"backstopTokensMinted","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"enterAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"finalizeAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getActiveAuctions","outputs":[{"internalType":"uint256[]","name":"activeAuctions","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAuctionInformation","outputs":[{"internalType":"uint256","name":"bidIncrement","type":"uint256"},{"internalType":"uint256","name":"repriceIncrement","type":"uint256"},{"internalType":"uint256","name":"bidDuration","type":"uint256"},{"internalType":"uint256","name":"auctionDuration","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAvailableDaiBalance","outputs":[{"internalType":"uint256","name":"daiInVat","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"auctionID","type":"uint256"}],"name":"getCurrentBid","outputs":[{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"amountMKR","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint48","name":"bidDeadline","type":"uint48"},{"internalType":"uint48","name":"auctionDeadline","type":"uint48"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDaiBalance","outputs":[{"internalType":"uint256","name":"combinedDaiInVat","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDaiBalanceForAuctions","outputs":[{"internalType":"uint256","name":"daiInVatForAuctions","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"backstopTokenAmount","type":"uint256"}],"name":"getDefectAmount","outputs":[{"internalType":"uint256","name":"daiRedeemed","type":"uint256"},{"internalType":"uint256","name":"mkrRedeemed","type":"uint256"},{"internalType":"bool","name":"redeemable","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFlopperAddress","outputs":[{"internalType":"address","name":"flopper","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getMKRBalance","outputs":[{"internalType":"uint256","name":"mkr","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStatus","outputs":[{"internalType":"enum IDaiBackstopSyndicate.Status","name":"status","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalNumberOfAuctions","outputs":[{"internalType":"uint256","name":"auctionID","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isEnabled","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50600080546001600160a01b03191632178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36005805460ff19169055604080516328ec8bf160e21b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163a3b22fc491602480830192600092919082900301818387803b158015620000cc57600080fd5b505af1158015620000e1573d6000803e3d6000fd5b50506040805163095ea7b360e01b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015260001960248201529051736b175474e89094c44da98b954eedeac495271d0f935063095ea7b3925060448083019260209291908290030181600087803b1580156200015557600080fd5b505af11580156200016a573d6000803e3d6000fd5b505050506040513d60208110156200018157600080fd5b507335d1b3f3d7966a1dfe207aa4514c12a259a0492b905063a3b22fc4620001b46200021c602090811b6200167217901c565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b158015620001fd57600080fd5b505af115801562000212573d6000803e3d6000fd5b5050505062000234565b734d95a049d5b0b7d32058cd3f2163015747522e9990565b6127aa80620002446000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638a5399721161011a578063bafebc6f116100ad578063dd62ed3e1161007c578063dd62ed3e146105f0578063e80838631461061e578063e918ad911461063b578063f2fde38b14610658578063feab50cb1461067e576101fb565b8063bafebc6f1461052d578063c49c2eb614610535578063cf44b5d51461053d578063da4e364f14610595576101fb565b80639d64087f116100e95780639d64087f14610490578063a457c2d7146104cd578063a9059cbb146104f9578063b2a8c6fe14610525576101fb565b80638a539972146104265780638da5cb5b1461045c5780638f32d59b1461048057806395d89b4114610488576101fb565b80633d8b7894116101925780636aa633b6116101615780636aa633b6146103e857806370a08231146103f0578063746fed731461041657806379ba50971461041e576101fb565b80633d8b7894146103695780633f1fc678146103865780634e69d560146103b45780635ddc916a146103e0576101fb565b806323452b9c116101ce57806323452b9c146102df57806323b872dd146102e9578063313ce5671461031f578063395093511461033d576101fb565b8063045f9f8a1461020057806306fdde031461021a578063095ea7b31461029757806318160ddd146102d7575b600080fd5b610208610686565b60408051918252519081900360200190f35b610222610721565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102c3600480360360408110156102ad57600080fd5b506001600160a01b038135169060200135610758565b604080519115158252519081900360200190f35b61020861076f565b6102e7610775565b005b6102c3600480360360608110156102ff57600080fd5b506001600160a01b038135811691602081013590911690604001356107ca565b610327610821565b6040805160ff9092168252519081900360200190f35b6102c36004803603604081101561035357600080fd5b506001600160a01b038135169060200135610826565b6102086004803603602081101561037f57600080fd5b5035610862565b61038e610a8c565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6103bc610c8a565b604051808260028111156103cc57fe5b60ff16815260200191505060405180910390f35b610208610c93565b6102c3610d4f565b6102086004803603602081101561040657600080fd5b50356001600160a01b0316610de0565b610208610dfb565b6102e7610e81565b6104436004803603602081101561043c57600080fd5b5035610f26565b6040805192835260208301919091528051918290030190f35b61046461137e565b604080516001600160a01b039092168252519081900360200190f35b6102c361138d565b61022261139e565b6104ad600480360360208110156104a657600080fd5b50356113c1565b604080519384526020840192909252151582820152519081900360600190f35b6102c3600480360360408110156104e357600080fd5b506001600160a01b0381351690602001356115d7565b6102c36004803603604081101561050f57600080fd5b506001600160a01b038135169060200135611613565b6102e7611620565b610464611672565b61020861168a565b6105456116d9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610581578181015183820152602001610569565b505050509050019250505060405180910390f35b6105b2600480360360208110156105ab57600080fd5b50356116e5565b6040805195865260208601949094526001600160a01b039092168484015265ffffffffffff9081166060850152166080830152519081900360a00190f35b6102086004803603604081101561060657600080fd5b506001600160a01b0381358116916020013516611798565b6102e76004803603602081101561063457600080fd5b50356117c3565b6102e76004803603602081101561065157600080fd5b5035611896565b6102e76004803603602081101561066e57600080fd5b50356001600160a01b03166119f0565b610208611a9a565b60408051633612d9a360e11b815230600482015290516000916b033b2e3c9fd0803ce8000000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b1580156106e857600080fd5b505afa1580156106fc573d6000803e3d6000fd5b505050506040513d602081101561071257600080fd5b50518161071b57fe5b04905090565b60408051808201909152601d81527f446169204261636b73746f702053796e6469636174652076332d313030000000602082015290565b6000610765338484611ab8565b5060015b92915050565b60045490565b61077d61138d565b6107b85760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b600180546001600160a01b0319169055565b60006107d7848484611ba4565b6001600160a01b038416600090815260036020908152604080832033808552925290912054610817918691610812908663ffffffff611ce816565b611ab8565b5060019392505050565b601290565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610765918590610812908663ffffffff611d4516565b6000600260055460ff16600281111561087757fe5b14156108b45760405162461bcd60e51b81526004018080602001828103825260538152602001806123fe6053913960600191505060405180910390fd5b600082116108f35760405162461bcd60e51b815260040180806020018281038252603481526020018061265e6034913960400191505060405180910390fd5b600060055460ff16600281111561090657fe5b146109425760405162461bcd60e51b81526004018080602001828103825260558152602001806124986055913960600191505060405180910390fd5b604080516323b872dd60e01b8152336004820152306024820152604481018490529051736b175474e89094c44da98b954eedeac495271d0f916323b872dd9160648083019260209291908290030181600087803b1580156109a257600080fd5b505af11580156109b6573d6000803e3d6000fd5b505050506040513d60208110156109cc57600080fd5b5051610a095760405162461bcd60e51b81526004018080602001828103825260478152602001806124516047913960600191505060405180910390fd5b60408051633b4da69f60e01b8152306004820152602481018490529051739759a6ac90977b93b58547b4a71c78317f391a2891633b4da69f91604480830192600092919082900301818387803b158015610a6257600080fd5b505af1158015610a76573d6000803e3d6000fd5b50505050819050610a873382611da6565b919050565b600080600080734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316637d780d826040518163ffffffff1660e01b815260040160206040518083038186803b158015610adf57600080fd5b505afa158015610af3573d6000803e3d6000fd5b505050506040513d6020811015610b0957600080fd5b5051604080516324d8499b60e21b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991639361266c916004808301926020929190829003018186803b158015610b5657600080fd5b505afa158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b505160408051634e8b1dd560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991634e8b1dd5916004808301926020929190829003018186803b158015610bcd57600080fd5b505afa158015610be1573d6000803e3d6000fd5b505050506040513d6020811015610bf757600080fd5b50516040805163cfc4af5560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e999163cfc4af55916004808301926020929190829003018186803b158015610c4457600080fd5b505afa158015610c58573d6000803e3d6000fd5b505050506040513d6020811015610c6e57600080fd5b5051929791965065ffffffffffff908116955090911692509050565b60055460ff1690565b600080610c9e611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b158015610cf557600080fd5b505afa158015610d09573d6000803e3d6000fd5b505050506040513d6020811015610d1f57600080fd5b505190506b033b2e3c9fd0803ce8000000610d40838363ffffffff611d4516565b81610d4757fe5b049250505090565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663957aa58c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9e57600080fd5b505afa158015610db2573d6000803e3d6000fd5b505050506040513d6020811015610dc857600080fd5b5051600114610dd8576000610ddb565b60015b905090565b6001600160a01b031660009081526002602052604090205490565b604080516370a0823160e01b81523060048201529051600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a0823191602480820192602092909190829003018186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d6020811015610e7a57600080fd5b5051919050565b6001546001600160a01b03163314610eca5760405162461bcd60e51b81526004018080602001828103825260458152602001806124ed6045913960600191505060405180910390fd5b600180546001600160a01b03191690556000805460405133926001600160a01b03909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03191633179055565b60008060008311610f685760405162461bcd60e51b81526004018080602001828103825260368152602001806126926036913960400191505060405180910390fd5b6000610f99610f7561076f565b610f8d86670de0b6b3a764000063ffffffff611f0d16565b9063ffffffff611f6616565b9050610fa53385611fd0565b6000610faf611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b15801561100657600080fd5b505afa15801561101a573d6000803e3d6000fd5b505050506040513d602081101561103057600080fd5b505190506000611046838363ffffffff611d4516565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b15801561109d57600080fd5b505afa1580156110b1573d6000803e3d6000fd5b505050506040513d60208110156110c757600080fd5b505190506000670de0b6b3a76400006110e6848863ffffffff611f0d16565b816110ed57fe5b049050670de0b6b3a7640000611109838863ffffffff611f0d16565b8161111057fe5b0496506b033b2e3c9fd0803ce8000000810497508615158061113157508715155b61116c5760405162461bcd60e51b81526004018080602001828103825260438152602001806126c86043913960600191505060405180910390fd5b838111156111ab5760405162461bcd60e51b81526004018080602001828103825260428152602001806123676042913960600191505060405180910390fd5b80156112ac576111b9610d4f565b15611234576040805163ef693bed60e01b8152336004820152602481018a90529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b505050506112ac565b6040805163bb35783b60e01b81523060048201523360248201526044810183905290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163bb35783b91606480830192600092919082900301818387803b15801561129357600080fd5b505af11580156112a7573d6000803e3d6000fd5b505050505b8615611373576040805163a9059cbb60e01b8152336004820152602481018990529051739f8f72aa9304c8b593d555f12ef6589cc3a579a29163a9059cbb9160448083019260209291908290030181600087803b15801561130c57600080fd5b505af1158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b50516113735760405162461bcd60e51b81526004018080602001828103825260338152602001806123cb6033913960400191505060405180910390fd5b505050505050915091565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b604080518082019091526009815268044425376332d3130360bc1b602082015290565b60008080836113d8575060009150819050806115d0565b6113e061076f565b84111561141e5760405162461bcd60e51b815260040180806020018281038252603381526020018061270b6033913960400191505060405180910390fd5b600061144361142b61076f565b610f8d87670de0b6b3a764000063ffffffff611f0d16565b9050600061144f611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b1580156114a657600080fd5b505afa1580156114ba573d6000803e3d6000fd5b505050506040513d60208110156114d057600080fd5b5051905060006114e6838363ffffffff611d4516565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b15801561153d57600080fd5b505afa158015611551573d6000803e3d6000fd5b505050506040513d602081101561156757600080fd5b505190506000670de0b6b3a7640000611586848863ffffffff611f0d16565b8161158d57fe5b049050670de0b6b3a76400006115a9838863ffffffff611f0d16565b816115b057fe5b0497506b033b2e3c9fd0803ce80000008104985092909211159450505050505b9193909250565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610765918590610812908663ffffffff611ce816565b6000610765338484611ba4565b61162861138d565b6116635760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b6005805460ff19166002179055565b734d95a049d5b0b7d32058cd3f2163015747522e9990565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663cfdd33026040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5057600080fd5b6060610ddb60066120ab565b6000806000806000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316634423c5f1876040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561174557600080fd5b505afa158015611759573d6000803e3d6000fd5b505050506040513d60a081101561176f57600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6117d460068263ffffffff61213116565b61180f5760405162461bcd60e51b815260040180806020018281038252603f81526020018061257b603f913960400191505060405180910390fd5b60008061181b836116e5565b945050935050508065ffffffffffff1660001461184c576001600160a01b03821630141561184c5761184c83612146565b61185d60068463ffffffff6121bb16565b506040805184815290517f2d7633a748a750b559b97738629efd586b561319b152bb42ba14d590706d31da9181900360200190a1505050565b600260055460ff1660028111156118a957fe5b14156118e65760405162461bcd60e51b81526004018080602001828103825260538152602001806123fe6053913960600191505060405180910390fd5b6118f760068263ffffffff61213116565b156119335760405162461bcd60e51b815260040180806020018281038252603a8152602001806125ba603a913960400191505060405180910390fd5b600061193e826116e5565b505050509050600060646b033b2e3c9fd0803ce8000000838161195d57fe5b048161196557fe5b049050611973838284612284565b600160055460ff16600281111561198657fe5b14611999576005805460ff191660011790555b6119aa60068463ffffffff61230216565b50604080518481526020810183905280820184905290517f35f50010a71a711fbfb0ada2814c5caf05bf153ccea88acca671ab6a5615d7c79181900360600190a1505050565b6119f861138d565b611a335760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b6001600160a01b038116611a785760405162461bcd60e51b815260040180806020018281038252603881526020018061273e6038913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006b033b2e3c9fd0803ce8000000611ab1611e98565b8161071b57fe5b6001600160a01b038316611afd5760405162461bcd60e51b815260040180806020018281038252602481526020018061263a6024913960400191505060405180910390fd5b6001600160a01b038216611b425760405162461bcd60e51b81526004018080602001828103825260228152602001806123a96022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611be95760405162461bcd60e51b81526004018080602001828103825260258152602001806126156025913960400191505060405180910390fd5b6001600160a01b038216611c2e5760405162461bcd60e51b81526004018080602001828103825260238152602001806123446023913960400191505060405180910390fd5b6001600160a01b038316600090815260026020526040902054611c57908263ffffffff611ce816565b6001600160a01b038085166000908152600260205260408082209390935590841681522054611c8c908263ffffffff611d4516565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082821115611d3f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611d9f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216611e01576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600454611e14908263ffffffff611d4516565b6004556001600160a01b038216600090815260026020526040902054611e40908263ffffffff611d4516565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006060611ea660066120ab565b9050600080805b8351811015611f0657611ed2848281518110611ec557fe5b60200260200101516116e5565b50929550935050506001600160a01b038216301415611efe57611efb858463ffffffff611d4516565b94505b600101611ead565b5050505090565b600082611f1c57506000610769565b82820282848281611f2957fe5b0414611d9f5760405162461bcd60e51b815260040180806020018281038252602181526020018061255a6021913960400191505060405180910390fd5b6000808211611fbc576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481611fc757fe5b04949350505050565b6001600160a01b0382166120155760405162461bcd60e51b81526004018080602001828103825260218152602001806125f46021913960400191505060405180910390fd5b600454612028908263ffffffff611ce816565b6004556001600160a01b038216600090815260026020526040902054612054908263ffffffff611ce816565b6001600160a01b0383166000818152600260209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b60608082600101805490506040519080825280602002602001820160405280156120df578160200160208202803883390190505b50905060005b600184015481101561212a5783600101818154811061210057fe5b906000526020600020015482828151811061211757fe5b60209081029190910101526001016120e5565b5092915050565b60009081526020919091526040902054151590565b734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663c959c42b826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156121a057600080fd5b505af11580156121b4573d6000803e3d6000fd5b5050505050565b60006121c78383612131565b1561227c576000828152602084905260409020546001840154600019918201910180821461223f57600085600101828154811061220057fe5b906000526020600020015490508086600101848154811061221d57fe5b6000918252602080832090910192909255918252869052604090206001830190555b6000848152602086905260408120556001850180548061225b57fe5b60019003818190600052602060002001600090559055600192505050610769565b506000610769565b60408051632ff9d1c160e11b81526004810185905260248101849052604481018390529051734d95a049d5b0b7d32058cd3f2163015747522e9991635ff3a38291606480830192600092919082900301818387803b1580156122e557600080fd5b505af11580156122f9573d6000803e3d6000fd5b50505050505050565b600061230e8383612131565b61227c57506001808301805480830182556000828152602080822090920185905591548483529085905260409091205561076956fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a20496e73756666696369656e74204461692028696e2075736520696e2061756374696f6e732945524332303a20617070726f766520746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a204d4b5220726564656d7074696f6e206661696c65642e4461694261636b73746f7053796e6469636174652f6e6f745768656e44656163746976617465643a2053796e6469636174652069732064656163746976617465642c20706c656173652077697468647261772e4461694261636b73746f7053796e6469636174652f656e6c6973743a20436f756c64206e6f74207472616e736665722044616920616d6f756e742066726f6d2063616c6c65722e4461694261636b73746f7053796e6469636174652f656e6c6973743a2043616e6e6f74206465706f736974206f6e6365207468652066697273742061756374696f6e2062696420686173206265656e206d6164652e54776f537465704f776e61626c653a2063757272656e74206f776e6572206d757374207365742063616c6c6572206173206e657720706f74656e7469616c206f776e65722e54776f537465704f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65722e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774461694261636b73746f7053796e6469636174652f66696e616c697a6541756374696f6e3a2041756374696f6e20616c72656164792066696e616c697a65644461694261636b73746f7053796e6469636174652f656e74657241756374696f6e3a2041756374696f6e20616c7265616479206163746976652e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f656e6c6973743a204e6f2044616920616d6f756e7420737570706c6965642e4461694261636b73746f7053796e6469636174652f6465666563743a204e6f20746f6b656e20616d6f756e7420737570706c6965642e4461694261636b73746f7053796e6469636174652f6465666563743a204e6f7468696e672072657475726e6564206166746572206275726e696e6720746f6b656e732e537570706c69656420746f6b656e20616d6f756e742069732067726561746572207468616e20746f74616c20737570706c792e54776f537465704f776e61626c653a206e657720706f74656e7469616c206f776e657220697320746865207a65726f20616464726573732ea265627a7a723158203b3d1ab0970420054eea88565f5c47c41e3cecbfdd2677b72dc1de24decde3f564736f6c63430005100032

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638a5399721161011a578063bafebc6f116100ad578063dd62ed3e1161007c578063dd62ed3e146105f0578063e80838631461061e578063e918ad911461063b578063f2fde38b14610658578063feab50cb1461067e576101fb565b8063bafebc6f1461052d578063c49c2eb614610535578063cf44b5d51461053d578063da4e364f14610595576101fb565b80639d64087f116100e95780639d64087f14610490578063a457c2d7146104cd578063a9059cbb146104f9578063b2a8c6fe14610525576101fb565b80638a539972146104265780638da5cb5b1461045c5780638f32d59b1461048057806395d89b4114610488576101fb565b80633d8b7894116101925780636aa633b6116101615780636aa633b6146103e857806370a08231146103f0578063746fed731461041657806379ba50971461041e576101fb565b80633d8b7894146103695780633f1fc678146103865780634e69d560146103b45780635ddc916a146103e0576101fb565b806323452b9c116101ce57806323452b9c146102df57806323b872dd146102e9578063313ce5671461031f578063395093511461033d576101fb565b8063045f9f8a1461020057806306fdde031461021a578063095ea7b31461029757806318160ddd146102d7575b600080fd5b610208610686565b60408051918252519081900360200190f35b610222610721565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102c3600480360360408110156102ad57600080fd5b506001600160a01b038135169060200135610758565b604080519115158252519081900360200190f35b61020861076f565b6102e7610775565b005b6102c3600480360360608110156102ff57600080fd5b506001600160a01b038135811691602081013590911690604001356107ca565b610327610821565b6040805160ff9092168252519081900360200190f35b6102c36004803603604081101561035357600080fd5b506001600160a01b038135169060200135610826565b6102086004803603602081101561037f57600080fd5b5035610862565b61038e610a8c565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6103bc610c8a565b604051808260028111156103cc57fe5b60ff16815260200191505060405180910390f35b610208610c93565b6102c3610d4f565b6102086004803603602081101561040657600080fd5b50356001600160a01b0316610de0565b610208610dfb565b6102e7610e81565b6104436004803603602081101561043c57600080fd5b5035610f26565b6040805192835260208301919091528051918290030190f35b61046461137e565b604080516001600160a01b039092168252519081900360200190f35b6102c361138d565b61022261139e565b6104ad600480360360208110156104a657600080fd5b50356113c1565b604080519384526020840192909252151582820152519081900360600190f35b6102c3600480360360408110156104e357600080fd5b506001600160a01b0381351690602001356115d7565b6102c36004803603604081101561050f57600080fd5b506001600160a01b038135169060200135611613565b6102e7611620565b610464611672565b61020861168a565b6105456116d9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610581578181015183820152602001610569565b505050509050019250505060405180910390f35b6105b2600480360360208110156105ab57600080fd5b50356116e5565b6040805195865260208601949094526001600160a01b039092168484015265ffffffffffff9081166060850152166080830152519081900360a00190f35b6102086004803603604081101561060657600080fd5b506001600160a01b0381358116916020013516611798565b6102e76004803603602081101561063457600080fd5b50356117c3565b6102e76004803603602081101561065157600080fd5b5035611896565b6102e76004803603602081101561066e57600080fd5b50356001600160a01b03166119f0565b610208611a9a565b60408051633612d9a360e11b815230600482015290516000916b033b2e3c9fd0803ce8000000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b1580156106e857600080fd5b505afa1580156106fc573d6000803e3d6000fd5b505050506040513d602081101561071257600080fd5b50518161071b57fe5b04905090565b60408051808201909152601d81527f446169204261636b73746f702053796e6469636174652076332d313030000000602082015290565b6000610765338484611ab8565b5060015b92915050565b60045490565b61077d61138d565b6107b85760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b600180546001600160a01b0319169055565b60006107d7848484611ba4565b6001600160a01b038416600090815260036020908152604080832033808552925290912054610817918691610812908663ffffffff611ce816565b611ab8565b5060019392505050565b601290565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610765918590610812908663ffffffff611d4516565b6000600260055460ff16600281111561087757fe5b14156108b45760405162461bcd60e51b81526004018080602001828103825260538152602001806123fe6053913960600191505060405180910390fd5b600082116108f35760405162461bcd60e51b815260040180806020018281038252603481526020018061265e6034913960400191505060405180910390fd5b600060055460ff16600281111561090657fe5b146109425760405162461bcd60e51b81526004018080602001828103825260558152602001806124986055913960600191505060405180910390fd5b604080516323b872dd60e01b8152336004820152306024820152604481018490529051736b175474e89094c44da98b954eedeac495271d0f916323b872dd9160648083019260209291908290030181600087803b1580156109a257600080fd5b505af11580156109b6573d6000803e3d6000fd5b505050506040513d60208110156109cc57600080fd5b5051610a095760405162461bcd60e51b81526004018080602001828103825260478152602001806124516047913960600191505060405180910390fd5b60408051633b4da69f60e01b8152306004820152602481018490529051739759a6ac90977b93b58547b4a71c78317f391a2891633b4da69f91604480830192600092919082900301818387803b158015610a6257600080fd5b505af1158015610a76573d6000803e3d6000fd5b50505050819050610a873382611da6565b919050565b600080600080734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316637d780d826040518163ffffffff1660e01b815260040160206040518083038186803b158015610adf57600080fd5b505afa158015610af3573d6000803e3d6000fd5b505050506040513d6020811015610b0957600080fd5b5051604080516324d8499b60e21b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991639361266c916004808301926020929190829003018186803b158015610b5657600080fd5b505afa158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b505160408051634e8b1dd560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991634e8b1dd5916004808301926020929190829003018186803b158015610bcd57600080fd5b505afa158015610be1573d6000803e3d6000fd5b505050506040513d6020811015610bf757600080fd5b50516040805163cfc4af5560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e999163cfc4af55916004808301926020929190829003018186803b158015610c4457600080fd5b505afa158015610c58573d6000803e3d6000fd5b505050506040513d6020811015610c6e57600080fd5b5051929791965065ffffffffffff908116955090911692509050565b60055460ff1690565b600080610c9e611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b158015610cf557600080fd5b505afa158015610d09573d6000803e3d6000fd5b505050506040513d6020811015610d1f57600080fd5b505190506b033b2e3c9fd0803ce8000000610d40838363ffffffff611d4516565b81610d4757fe5b049250505090565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663957aa58c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9e57600080fd5b505afa158015610db2573d6000803e3d6000fd5b505050506040513d6020811015610dc857600080fd5b5051600114610dd8576000610ddb565b60015b905090565b6001600160a01b031660009081526002602052604090205490565b604080516370a0823160e01b81523060048201529051600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a0823191602480820192602092909190829003018186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d6020811015610e7a57600080fd5b5051919050565b6001546001600160a01b03163314610eca5760405162461bcd60e51b81526004018080602001828103825260458152602001806124ed6045913960600191505060405180910390fd5b600180546001600160a01b03191690556000805460405133926001600160a01b03909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03191633179055565b60008060008311610f685760405162461bcd60e51b81526004018080602001828103825260368152602001806126926036913960400191505060405180910390fd5b6000610f99610f7561076f565b610f8d86670de0b6b3a764000063ffffffff611f0d16565b9063ffffffff611f6616565b9050610fa53385611fd0565b6000610faf611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b15801561100657600080fd5b505afa15801561101a573d6000803e3d6000fd5b505050506040513d602081101561103057600080fd5b505190506000611046838363ffffffff611d4516565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b15801561109d57600080fd5b505afa1580156110b1573d6000803e3d6000fd5b505050506040513d60208110156110c757600080fd5b505190506000670de0b6b3a76400006110e6848863ffffffff611f0d16565b816110ed57fe5b049050670de0b6b3a7640000611109838863ffffffff611f0d16565b8161111057fe5b0496506b033b2e3c9fd0803ce8000000810497508615158061113157508715155b61116c5760405162461bcd60e51b81526004018080602001828103825260438152602001806126c86043913960600191505060405180910390fd5b838111156111ab5760405162461bcd60e51b81526004018080602001828103825260428152602001806123676042913960600191505060405180910390fd5b80156112ac576111b9610d4f565b15611234576040805163ef693bed60e01b8152336004820152602481018a90529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b505050506112ac565b6040805163bb35783b60e01b81523060048201523360248201526044810183905290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163bb35783b91606480830192600092919082900301818387803b15801561129357600080fd5b505af11580156112a7573d6000803e3d6000fd5b505050505b8615611373576040805163a9059cbb60e01b8152336004820152602481018990529051739f8f72aa9304c8b593d555f12ef6589cc3a579a29163a9059cbb9160448083019260209291908290030181600087803b15801561130c57600080fd5b505af1158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b50516113735760405162461bcd60e51b81526004018080602001828103825260338152602001806123cb6033913960400191505060405180910390fd5b505050505050915091565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b604080518082019091526009815268044425376332d3130360bc1b602082015290565b60008080836113d8575060009150819050806115d0565b6113e061076f565b84111561141e5760405162461bcd60e51b815260040180806020018281038252603381526020018061270b6033913960400191505060405180910390fd5b600061144361142b61076f565b610f8d87670de0b6b3a764000063ffffffff611f0d16565b9050600061144f611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b1580156114a657600080fd5b505afa1580156114ba573d6000803e3d6000fd5b505050506040513d60208110156114d057600080fd5b5051905060006114e6838363ffffffff611d4516565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b15801561153d57600080fd5b505afa158015611551573d6000803e3d6000fd5b505050506040513d602081101561156757600080fd5b505190506000670de0b6b3a7640000611586848863ffffffff611f0d16565b8161158d57fe5b049050670de0b6b3a76400006115a9838863ffffffff611f0d16565b816115b057fe5b0497506b033b2e3c9fd0803ce80000008104985092909211159450505050505b9193909250565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610765918590610812908663ffffffff611ce816565b6000610765338484611ba4565b61162861138d565b6116635760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b6005805460ff19166002179055565b734d95a049d5b0b7d32058cd3f2163015747522e9990565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663cfdd33026040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5057600080fd5b6060610ddb60066120ab565b6000806000806000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316634423c5f1876040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561174557600080fd5b505afa158015611759573d6000803e3d6000fd5b505050506040513d60a081101561176f57600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6117d460068263ffffffff61213116565b61180f5760405162461bcd60e51b815260040180806020018281038252603f81526020018061257b603f913960400191505060405180910390fd5b60008061181b836116e5565b945050935050508065ffffffffffff1660001461184c576001600160a01b03821630141561184c5761184c83612146565b61185d60068463ffffffff6121bb16565b506040805184815290517f2d7633a748a750b559b97738629efd586b561319b152bb42ba14d590706d31da9181900360200190a1505050565b600260055460ff1660028111156118a957fe5b14156118e65760405162461bcd60e51b81526004018080602001828103825260538152602001806123fe6053913960600191505060405180910390fd5b6118f760068263ffffffff61213116565b156119335760405162461bcd60e51b815260040180806020018281038252603a8152602001806125ba603a913960400191505060405180910390fd5b600061193e826116e5565b505050509050600060646b033b2e3c9fd0803ce8000000838161195d57fe5b048161196557fe5b049050611973838284612284565b600160055460ff16600281111561198657fe5b14611999576005805460ff191660011790555b6119aa60068463ffffffff61230216565b50604080518481526020810183905280820184905290517f35f50010a71a711fbfb0ada2814c5caf05bf153ccea88acca671ab6a5615d7c79181900360600190a1505050565b6119f861138d565b611a335760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b6001600160a01b038116611a785760405162461bcd60e51b815260040180806020018281038252603881526020018061273e6038913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006b033b2e3c9fd0803ce8000000611ab1611e98565b8161071b57fe5b6001600160a01b038316611afd5760405162461bcd60e51b815260040180806020018281038252602481526020018061263a6024913960400191505060405180910390fd5b6001600160a01b038216611b425760405162461bcd60e51b81526004018080602001828103825260228152602001806123a96022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611be95760405162461bcd60e51b81526004018080602001828103825260258152602001806126156025913960400191505060405180910390fd5b6001600160a01b038216611c2e5760405162461bcd60e51b81526004018080602001828103825260238152602001806123446023913960400191505060405180910390fd5b6001600160a01b038316600090815260026020526040902054611c57908263ffffffff611ce816565b6001600160a01b038085166000908152600260205260408082209390935590841681522054611c8c908263ffffffff611d4516565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082821115611d3f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611d9f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216611e01576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600454611e14908263ffffffff611d4516565b6004556001600160a01b038216600090815260026020526040902054611e40908263ffffffff611d4516565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006060611ea660066120ab565b9050600080805b8351811015611f0657611ed2848281518110611ec557fe5b60200260200101516116e5565b50929550935050506001600160a01b038216301415611efe57611efb858463ffffffff611d4516565b94505b600101611ead565b5050505090565b600082611f1c57506000610769565b82820282848281611f2957fe5b0414611d9f5760405162461bcd60e51b815260040180806020018281038252602181526020018061255a6021913960400191505060405180910390fd5b6000808211611fbc576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481611fc757fe5b04949350505050565b6001600160a01b0382166120155760405162461bcd60e51b81526004018080602001828103825260218152602001806125f46021913960400191505060405180910390fd5b600454612028908263ffffffff611ce816565b6004556001600160a01b038216600090815260026020526040902054612054908263ffffffff611ce816565b6001600160a01b0383166000818152600260209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b60608082600101805490506040519080825280602002602001820160405280156120df578160200160208202803883390190505b50905060005b600184015481101561212a5783600101818154811061210057fe5b906000526020600020015482828151811061211757fe5b60209081029190910101526001016120e5565b5092915050565b60009081526020919091526040902054151590565b734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663c959c42b826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156121a057600080fd5b505af11580156121b4573d6000803e3d6000fd5b5050505050565b60006121c78383612131565b1561227c576000828152602084905260409020546001840154600019918201910180821461223f57600085600101828154811061220057fe5b906000526020600020015490508086600101848154811061221d57fe5b6000918252602080832090910192909255918252869052604090206001830190555b6000848152602086905260408120556001850180548061225b57fe5b60019003818190600052602060002001600090559055600192505050610769565b506000610769565b60408051632ff9d1c160e11b81526004810185905260248101849052604481018390529051734d95a049d5b0b7d32058cd3f2163015747522e9991635ff3a38291606480830192600092919082900301818387803b1580156122e557600080fd5b505af11580156122f9573d6000803e3d6000fd5b50505050505050565b600061230e8383612131565b61227c57506001808301805480830182556000828152602080822090920185905591548483529085905260409091205561076956fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a20496e73756666696369656e74204461692028696e2075736520696e2061756374696f6e732945524332303a20617070726f766520746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a204d4b5220726564656d7074696f6e206661696c65642e4461694261636b73746f7053796e6469636174652f6e6f745768656e44656163746976617465643a2053796e6469636174652069732064656163746976617465642c20706c656173652077697468647261772e4461694261636b73746f7053796e6469636174652f656e6c6973743a20436f756c64206e6f74207472616e736665722044616920616d6f756e742066726f6d2063616c6c65722e4461694261636b73746f7053796e6469636174652f656e6c6973743a2043616e6e6f74206465706f736974206f6e6365207468652066697273742061756374696f6e2062696420686173206265656e206d6164652e54776f537465704f776e61626c653a2063757272656e74206f776e6572206d757374207365742063616c6c6572206173206e657720706f74656e7469616c206f776e65722e54776f537465704f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65722e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774461694261636b73746f7053796e6469636174652f66696e616c697a6541756374696f6e3a2041756374696f6e20616c72656164792066696e616c697a65644461694261636b73746f7053796e6469636174652f656e74657241756374696f6e3a2041756374696f6e20616c7265616479206163746976652e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f656e6c6973743a204e6f2044616920616d6f756e7420737570706c6965642e4461694261636b73746f7053796e6469636174652f6465666563743a204e6f20746f6b656e20616d6f756e7420737570706c6965642e4461694261636b73746f7053796e6469636174652f6465666563743a204e6f7468696e672072657475726e6564206166746572206275726e696e6720746f6b656e732e537570706c69656420746f6b656e20616d6f756e742069732067726561746572207468616e20746f74616c20737570706c792e54776f537465704f776e61626c653a206e657720706f74656e7469616c206f776e657220697320746865207a65726f20616464726573732ea265627a7a723158203b3d1ab0970420054eea88565f5c47c41e3cecbfdd2677b72dc1de24decde3f564736f6c63430005100032

Deployed Bytecode Sourcemap

29067:12360:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29067:12360:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38273:203;;;:::i;:::-;;;;;;;;;;;;;;;;36390:105;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36390:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14437:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14437:148:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13460:91;;;:::i;24872:90::-;;;:::i;:::-;;15056:256;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15056:256:0;;;;;;;;;;;;;;;;;:::i;37234:72::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15721:206;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15721:206:0;;;;;;;;:::i;30515:834::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30515:834:0;;:::i;21239:257::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36082:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37390:496;;;:::i;20298:112::-;;;:::i;13614:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13614:110:0;-1:-1:-1;;;;;13614:110:0;;:::i;38560:163::-;;;:::i;25120:298::-;;;:::i;31616:2293::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31616:2293:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23959:73;;;:::i;:::-;;;;-1:-1:-1;;;;;23959:73:0;;;;;;;;;;;;;;24301:86;;;:::i;36604:87::-;;;:::i;39055:1550::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39055:1550:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16430:216;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16430:216:0;;;;;;;;:::i;13937:156::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13937:156:0;;;;;;;;:::i;35995:81::-;;;:::i;20714:104::-;;;:::i;20500:112::-;;;:::i;36176:152::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36176:152:0;;;;;;;;;;;;;;;;;21833:235;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21833:235:0;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;21833:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14156:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14156:134:0;;;;;;;;;;:::i;35024:842::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35024:842:0;;:::i;34066:901::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34066:901:0;;:::i;24520:225::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24520:225:0;-1:-1:-1;;;;;24520:225:0;;:::i;37975:219::-;;;:::i;38273:203::-;38440:23;;;-1:-1:-1;;;38440:23:0;;38457:4;38440:23;;;;;;38330:16;;38466:4;;29792:42;;38440:8;;:23;;;;;;;;;;;;;;29792:42;38440:23;;;5:2:-1;;;;30:1;27;20:12;5:2;38440:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38440:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38440:23:0;:30;;;;;;38429:41;;38273:203;:::o;36390:105::-;36451:38;;;;;;;;;;;;;;;;;36390:105;:::o;14437:148::-;14502:4;14519:36;14528:10;14540:7;14549:5;14519:8;:36::i;:::-;-1:-1:-1;14573:4:0;14437:148;;;;;:::o;13460:91::-;13531:12;;13460:91;:::o;24872:90::-;24153:9;:7;:9::i;:::-;24145:62;;;;-1:-1:-1;;;24145:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24938:18;24931:25;;-1:-1:-1;;;;;;24931:25:0;;;24872:90::o;15056:256::-;15145:4;15162:36;15172:6;15180:9;15191:6;15162:9;:36::i;:::-;-1:-1:-1;;;;;15238:19:0;;;;;;:11;:19;;;;;;;;15226:10;15238:31;;;;;;;;;15209:73;;15218:6;;15238:43;;15274:6;15238:43;:35;:43;:::i;:::-;15209:8;:73::i;:::-;-1:-1:-1;15300:4:0;15056:256;;;;;:::o;37234:72::-;37298:2;37234:72;:::o;15721:206::-;15827:10;15801:4;15848:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;15848:32:0;;;;;;;;;;15801:4;;15818:79;;15839:7;;15848:48;;15885:10;15848:48;:36;:48;:::i;30515:834::-;30597:28;41291:18;41280:7;;;;:29;;;;;;;;;;41264:146;;;;-1:-1:-1;;;41264:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30654:1;30642:9;:13;30634:78;;;;-1:-1:-1;;;30634:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30756:25;30745:7;;;;:36;;;;;;;;;30729:155;;;;-1:-1:-1;;;30729:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30909:55;;;-1:-1:-1;;;30909:55:0;;30927:10;30909:55;;;;30947:4;30909:55;;;;;;;;;;;;29496:42;;30909:17;;:55;;;;;;;;;;;;;;-1:-1:-1;29496:42:0;30909:55;;;5:2:-1;;;;30:1;27;20:12;5:2;30909:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30909:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30909:55:0;30893:160;;;;-1:-1:-1;;;30893:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31144:40;;;-1:-1:-1;;;31144:40:0;;31167:4;31144:40;;;;;;;;;;;;29697:42;;31144:14;;:40;;;;;-1:-1:-1;;31144:40:0;;;;;;;-1:-1:-1;29697:42:0;31144:40;;;5:2:-1;;;;30:1;27;20:12;5:2;31144:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31144:40:0;;;;31288:9;31265:32;;31304:39;31310:10;31322:20;31304:5;:39::i;:::-;30515:834;;;:::o;21239:257::-;21299:20;21326:24;21357:19;21383:23;20108:42;-1:-1:-1;;;;;21427:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21427:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21427:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21427:14:0;21443;;;-1:-1:-1;;;21443:14:0;;;;20108:42;;21443:12;;:14;;;;;21427;;21443;;;;;;;20108:42;21443:14;;;5:2:-1;;;;30:1;27;20:12;5:2;21443:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21443:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21443:14:0;21459;;;-1:-1:-1;;;21459:14:0;;;;20108:42;;21459:12;;:14;;;;;21443;;21459;;;;;;;20108:42;21459:14;;;5:2:-1;;;;30:1;27;20:12;5:2;21459:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21459:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21459:14:0;21475;;;-1:-1:-1;;;21475:14:0;;;;20108:42;;21475:12;;:14;;;;;21459;;21475;;;;;;;20108:42;21475:14;;;5:2:-1;;;;30:1;27;20:12;5:2;21475:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21475:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21475:14:0;21419:71;;;;-1:-1:-1;21419:71:0;;;;;-1:-1:-1;21419:71:0;;;;-1:-1:-1;21239:257:0;-1:-1:-1;21239:257:0:o;36082:88::-;36157:7;;;;;36082:88::o;37390:496::-;37438:24;37538:30;37571;:28;:30::i;:::-;37708:23;;;-1:-1:-1;;;37708:23:0;;37725:4;37708:23;;;;;;37538:63;;-1:-1:-1;37684:21:0;;29792:42;;37708:8;;:23;;;;;;;;;;;;;;29792:42;37708:23;;;5:2:-1;;;;30:1;27;20:12;5:2;37708:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37708:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37708:23:0;;-1:-1:-1;37876:4:0;37832:41;:22;37708:23;37832:41;:26;:41;:::i;:::-;:48;;;;;;37813:67;;37390:496;;;:::o;20298:112::-;20340:11;20108:42;-1:-1:-1;;;;;20368:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20368:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20368:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20368:15:0;20387:1;20368:20;20367:37;;20399:5;20367:37;;;20392:4;20367:37;20360:44;;20298:112;:::o;13614:110::-;-1:-1:-1;;;;;13698:18:0;13671:7;13698:18;;;:9;:18;;;;;;;13614:110::o;38560:163::-;38688:29;;;-1:-1:-1;;;38688:29:0;;38711:4;38688:29;;;;;;38608:11;;29595:42;;38688:14;;:29;;;;;;;;;;;;;;;29595:42;38688:29;;;5:2:-1;;;;30:1;27;20:12;5:2;38688:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38688:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38688:29:0;;38560:163;-1:-1:-1;38560:163:0:o;25120:298::-;25191:18;;-1:-1:-1;;;;;25191:18:0;25177:10;:32;25161:135;;;;-1:-1:-1;;;25161:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25312:18;25305:25;;-1:-1:-1;;;;;;25305:25:0;;;-1:-1:-1;25365:6:0;;25344:40;;25373:10;;-1:-1:-1;;;;;25365:6:0;;;;25344:40;;;25393:6;:19;;-1:-1:-1;;;;;;25393:19:0;25402:10;25393:19;;;25120:298::o;31616:2293::-;31689:19;31710;31776:1;31754:19;:23;31738:104;;;;-1:-1:-1;;;31738:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31912:18;31933:50;31969:13;:11;:13::i;:::-;31934:29;:19;31958:4;31934:29;:23;:29;:::i;:::-;31933:35;:50;:35;:50;:::i;:::-;31912:71;;32017:38;32023:10;32035:19;32017:5;:38::i;:::-;32131:30;32164;:28;:30::i;:::-;32301:23;;;-1:-1:-1;;;32301:23:0;;32318:4;32301:23;;;;;;32131:63;;-1:-1:-1;32277:21:0;;29792:42;;32301:8;;:23;;;;;;;;;;;;;;29792:42;32301:23;;;5:2:-1;;;;30:1;27;20:12;5:2;32301:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32301:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32301:23:0;;-1:-1:-1;32406:22:0;32431:41;:22;32301:23;32431:41;:26;:41;:::i;:::-;32564:29;;;-1:-1:-1;;;32564:29:0;;32587:4;32564:29;;;;;;32406:66;;-1:-1:-1;32541:20:0;;29595:42;;32564:14;;:29;;;;;;;;;;;;;;29595:42;32564:29;;;5:2:-1;;;;30:1;27;20:12;5:2;32564:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32564:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32564:29:0;;-1:-1:-1;32676:22:0;32734:4;32701:30;:14;32720:10;32701:30;:18;:30;:::i;:::-;:37;;;;;;;-1:-1:-1;32790:4:0;32759:28;:12;32776:10;32759:28;:16;:28;:::i;:::-;:35;;;;;;;-1:-1:-1;32969:4:0;32952:14;:21;;-1:-1:-1;33071:16:0;;;;:36;;-1:-1:-1;33091:16:0;;;33071:36;33055:137;;;;-1:-1:-1;;;33055:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33316:13;33298:14;:31;;33282:131;;;;-1:-1:-1;;;33282:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33517:18;;33513:210;;33550:25;:23;:25::i;:::-;33546:170;;;33588:39;;;-1:-1:-1;;;33588:39:0;;33603:10;33588:39;;;;;;;;;;;;29697:42;;33588:14;;:39;;;;;-1:-1:-1;;33588:39:0;;;;;;;-1:-1:-1;29697:42:0;33588:39;;;5:2:-1;;;;30:1;27;20:12;5:2;33588:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33588:39:0;;;;33546:170;;;33654:52;;;-1:-1:-1;;;33654:52:0;;33672:4;33654:52;;;;33679:10;33654:52;;;;;;;;;;;;29792:42;;33654:9;;:52;;;;;-1:-1:-1;;33654:52:0;;;;;;;-1:-1:-1;29792:42:0;33654:52;;;5:2:-1;;;;30:1;27;20:12;5:2;33654:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33654:52:0;;;;33546:170;33735:15;;33731:173;;33779:38;;;-1:-1:-1;;;33779:38:0;;33793:10;33779:38;;;;;;;;;;;;29595:42;;33779:13;;:38;;;;;;;;;;;;;;-1:-1:-1;29595:42:0;33779:38;;;5:2:-1;;;;30:1;27;20:12;5:2;33779:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33779:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33779:38:0;33761:129;;;;-1:-1:-1;;;33761:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31616:2293;;;;;;;;;:::o;23959:73::-;23997:7;24020:6;-1:-1:-1;;;;;24020:6:0;23959:73;:::o;24301:86::-;24341:4;24375:6;-1:-1:-1;;;;;24375:6:0;24361:10;:20;;24301:86::o;36604:87::-;36667:18;;;;;;;;;;;;-1:-1:-1;;;36667:18:0;;;;36604:87;:::o;39055:1550::-;39148:19;;;39222:24;39218:67;;-1:-1:-1;39265:1:0;;-1:-1:-1;39265:1:0;;-1:-1:-1;39265:1:0;39257:20;;39218:67;39319:13;:11;:13::i;:::-;39297:19;:35;39293:119;;;39343:61;;-1:-1:-1;;;39343:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39293:119;39475:18;39496:50;39532:13;:11;:13::i;:::-;39497:29;:19;39521:4;39497:29;:23;:29;:::i;39496:50::-;39475:71;;39622:30;39655;:28;:30::i;:::-;39792:23;;;-1:-1:-1;;;39792:23:0;;39809:4;39792:23;;;;;;39622:63;;-1:-1:-1;39768:21:0;;29792:42;;39792:8;;:23;;;;;;;;;;;;;;29792:42;39792:23;;;5:2:-1;;;;30:1;27;20:12;5:2;39792:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39792:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39792:23:0;;-1:-1:-1;39897:22:0;39922:41;:22;39792:23;39922:41;:26;:41;:::i;:::-;40055:29;;;-1:-1:-1;;;40055:29:0;;40078:4;40055:29;;;;;;39897:66;;-1:-1:-1;40032:20:0;;29595:42;;40055:14;;:29;;;;;;;;;;;;;;29595:42;40055:29;;;5:2:-1;;;;30:1;27;20:12;5:2;40055:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40055:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40055:29:0;;-1:-1:-1;40167:22:0;40225:4;40192:30;:14;40211:10;40192:30;:18;:30;:::i;:::-;:37;;;;;;;-1:-1:-1;40281:4:0;40250:28;:12;40267:10;40250:28;:16;:28;:::i;:::-;:35;;;;;;;-1:-1:-1;40460:4:0;40443:14;:21;;-1:-1:-1;40567:31:0;;;;;;-1:-1:-1;;;;;39055:1550:0;;;;;;:::o;16430:216::-;16541:10;16515:4;16562:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;16562:32:0;;;;;;;;;;16515:4;;16532:84;;16553:7;;16562:53;;16599:15;16562:53;:36;:53;:::i;13937:156::-;14006:4;14023:40;14033:10;14045:9;14056:6;14023:9;:40::i;35995:81::-;24153:9;:7;:9::i;:::-;24145:62;;;;-1:-1:-1;;;24145:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36042:7;:28;;-1:-1:-1;;36042:28:0;36052:18;36042:28;;;35995:81::o;20714:104::-;20108:42;20714:104;:::o;20500:112::-;20557:17;20108:42;-1:-1:-1;;;;;20590:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;36176:152:0;36234:31;36295:27;:15;:25;:27::i;21833:235::-;21902:17;21926;21950:14;21971:18;21996:22;20108:42;-1:-1:-1;;;;;22038:13:0;;22052:9;22038:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22038:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22038:24:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;22038:24:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22038:24:0;-1:-1:-1;22038:24:0;;-1:-1:-1;22038:24:0;-1:-1:-1;21833:235:0;-1:-1:-1;;21833:235:0:o;14156:134::-;-1:-1:-1;;;;;14255:18:0;;;14228:7;14255:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14156:134::o;35024:842::-;35100:35;:15;35125:9;35100:35;:24;:35;:::i;:::-;35084:132;;;;-1:-1:-1;;;35084:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35282:14;35299:10;35313:38;35341:9;35313:27;:38::i;:::-;35278:73;;;;;;;35426:3;:8;;35433:1;35426:8;35422:232;;-1:-1:-1;;;;;35567:23:0;;35585:4;35567:23;35563:84;;;35603:34;35627:9;35603:23;:34::i;:::-;35722:33;:15;35745:9;35722:33;:22;:33;:::i;:::-;-1:-1:-1;35833:27:0;;;;;;;;;;;;;;;;;35024:842;;;:::o;34066:901::-;41291:18;41280:7;;;;:29;;;;;;;;;;41264:146;;;;-1:-1:-1;;;41264:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34159:35;:15;34184:9;34159:35;:24;:35;:::i;:::-;34158:36;34142:128;;;;-1:-1:-1;;;34142:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34314:17;34343:38;34371:9;34343:27;:38::i;:::-;34313:68;;;;;;34472:19;34515:3;34507:4;34495:9;:16;;;;;;34494:24;;;;;;34472:46;;34572:53;34591:9;34602:11;34615:9;34572:18;:53::i;:::-;34683:16;34672:7;;;;:27;;;;;;;;;34668:76;;34710:7;:26;;-1:-1:-1;;34710:26:0;34720:16;34710:26;;;34668:76;34806:30;:15;34826:9;34806:30;:19;:30;:::i;:::-;-1:-1:-1;34912:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41417:1;;34066:901;:::o;24520:225::-;24153:9;:7;:9::i;:::-;24145:62;;;;-1:-1:-1;;;24145:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24605:22:0;;24589:112;;;;-1:-1:-1;;;24589:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24710:18;:29;;-1:-1:-1;;;;;;24710:29:0;-1:-1:-1;;;;;24710:29:0;;;;;;;;;;24520:225::o;37975:219::-;38034:27;38184:4;38151:30;:28;:30::i;:::-;:37;;;;19232:335;-1:-1:-1;;;;;19325:19:0;;19317:68;;;;-1:-1:-1;;;19317:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19404:21:0;;19396:68;;;;-1:-1:-1;;;19396:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19477:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;19528:31;;;;;;;;;;;;;;;;;19232:335;;;:::o;17136:429::-;-1:-1:-1;;;;;17234:20:0;;17226:70;;;;-1:-1:-1;;;17226:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17315:23:0;;17307:71;;;;-1:-1:-1;;;17307:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17411:17:0;;;;;;:9;:17;;;;;;:29;;17433:6;17411:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;17391:17:0;;;;;;;:9;:17;;;;;;:49;;;;17474:20;;;;;;;:32;;17499:6;17474:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;17451:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;17522:35;;;;;;;17451:20;;17522:35;;;;;;;;;;;;;17136:429;;;:::o;6882:184::-;6940:7;6973:1;6968;:6;;6960:49;;;;;-1:-1:-1;;;6960:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7032:5:0;;;6882:184::o;6426:181::-;6484:7;6516:5;;;6540:6;;;;6532:46;;;;;-1:-1:-1;;;6532:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6598:1;6426:181;-1:-1:-1;;;6426:181:0:o;17846:308::-;-1:-1:-1;;;;;17922:21:0;;17914:65;;;;;-1:-1:-1;;;17914:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18007:12;;:24;;18024:6;18007:24;:16;:24;:::i;:::-;17992:12;:39;-1:-1:-1;;;;;18063:18:0;;;;;;:9;:18;;;;;;:30;;18086:6;18063:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;18042:18:0;;;;;;:9;:18;;;;;;;;:51;;;;18109:37;;;;;;;18042:18;;;;18109:37;;;;;;;;;;17846:308;;:::o;40611:610::-;40674:14;40714:31;40748:27;:15;:25;:27::i;:::-;40714:61;-1:-1:-1;40784:21:0;;;40833:383;40857:14;:21;40853:1;:25;40833:383;;;40994:46;41022:14;41037:1;41022:17;;;;;;;;;;;;;;40994:27;:46::i;:::-;-1:-1:-1;40965:75:0;;-1:-1:-1;40965:75:0;-1:-1:-1;;;;;;;;41053:23:0;;41071:4;41053:23;41049:160;;;41174:25;:6;41185:13;41174:25;:10;:25;:::i;:::-;41165:34;;41049:160;40880:3;;40833:383;;;;40611:610;;;;:::o;7317:471::-;7375:7;7620:6;7616:47;;-1:-1:-1;7650:1:0;7643:8;;7616:47;7687:5;;;7691:1;7687;:5;:1;7711:5;;;;;:10;7703:56;;;;-1:-1:-1;;;7703:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8256:333;8314:7;8413:1;8409;:5;8401:44;;;;;-1:-1:-1;;;8401:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8456:9;8472:1;8468;:5;;;;;;;8256:333;-1:-1:-1;;;;8256:333:0:o;18486:306::-;-1:-1:-1;;;;;18561:21:0;;18553:67;;;;-1:-1:-1;;;18553:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18648:12;;:23;;18665:5;18648:23;:16;:23;:::i;:::-;18633:12;:38;-1:-1:-1;;;;;18703:18:0;;;;;;:9;:18;;;;;;:29;;18726:5;18703:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;18682:18:0;;;;;;:9;:18;;;;;;;;:50;;;;18748:36;;;;;;;18682:18;;18748:36;;;;;;;;;;;18486:306;;:::o;28028:286::-;28111:16;28139:23;28179:3;:10;;:17;;;;28165:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;28165:32:0;;28139:58;;28209:9;28204:85;28224:10;;;:17;28220:21;;28204:85;;;28268:3;:10;;28279:1;28268:13;;;;;;;;;;;;;;;;28256:6;28263:1;28256:9;;;;;;;;;;;;;;;;;:25;28243:3;;28204:85;;;-1:-1:-1;28302:6:0;28028:286;-1:-1:-1;;28028:286:0:o;27536:147::-;27633:4;27656:16;;;;;;;;;;;;:21;;;27536:147::o;22857:84::-;20108:42;-1:-1:-1;;;;;22911:13:0;;22925:9;22911:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22911:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22911:24:0;;;;22857:84;:::o;26539:919::-;26624:4;26644:20;26653:3;26658:5;26644:8;:20::i;:::-;26640:813;;;26674:21;26698:16;;;;;;;;;;;26717:1;26747:10;;:17;-1:-1:-1;;26698:20:0;;;;26747:21;26883:26;;;26879:343;;26922:17;26942:3;:10;;26953:9;26942:21;;;;;;;;;;;;;;;;26922:41;;27076:9;27048:3;:10;;27059:13;27048:25;;;;;;;;;;;;;;;;;;;:37;;;;27145:20;;;;;;;;;27184:1;27168:17;;27145:40;;26879:343;27294:9;:16;;;;;;;;;;27287:23;27372:10;;;:16;;;;;;;;;;;;;;;;;;;;;;;;27406:4;27399:11;;;;;;26640:813;-1:-1:-1;27440:5:0;27433:12;;22541:139;22628:46;;;-1:-1:-1;;;22628:46:0;;;;;;;;;;;;;;;;;;;;;;20108:42;;22628:13;;:46;;;;;-1:-1:-1;;22628:46:0;;;;;;;-1:-1:-1;20108:42:0;22628:46;;;5:2:-1;;;;30:1;27;20:12;5:2;22628:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22628:46:0;;;;22541:139;;;:::o;26031:382::-;26113:4;26134:20;26143:3;26148:5;26134:8;:20::i;:::-;26129:279;;-1:-1:-1;26165:10:0;;;;27::-1;;23:18;;;45:23;;-1:-1;26165:22:0;;;;;;;;;;;;;26328:17;;26309:16;;;;;;;;;;;:36;26354:11;

Swarm Source

bzzr://3b3d1ab0970420054eea88565f5c47c41e3cecbfdd2677b72dc1de24decde3f5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.