Contract 0xe499CeE42868A0B4F8Ac2152a77B012530b361E4

 

Contract Overview

Balance:
0 Ether

EtherValue:
$0.00

Token:
 
Txn Hash
Method
Block
From
To
Value
0xcc32bb0cc40bd71ce01db739f0c65d2c8d6819ef6cba58e1850a29910532ea0cCreate Auction158744602022-11-01 10:02:5928 days 21 hrs ago0x65424bf27bf5fed70a5377f31929ff83f0ccc361 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.0026757412.1
0x4cdaaeec79b32668543e5f5fd4c0b3e3d7ea4fdb9b2cdc9e97117fc5c9ab9b3aCancel Auction158473322022-10-28 15:03:1132 days 16 hrs ago0xd2e6ec7894444fa03527b3f59ca85ae8dc25e387 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00133764 19.50858117
0x2cc5a062a1e251e4640d299b0ea8e102fad76910315a4f02be73f9038fc65594Cancel Auction158473292022-10-28 15:02:3532 days 16 hrs ago0xd2e6ec7894444fa03527b3f59ca85ae8dc25e387 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00152221 18.50790256
0x8be7bb99a492478b0ff8ac030c234a7deb9c96a9c2faa13f5940db8cf81f52a9Create Auction157548592022-10-15 16:57:4745 days 14 hrs ago0x0f62ee409ffcb4ca6a5a60fafc7d4f158b059899 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00401814 18.17147396
0x36a1ec240e110a4d714fc30702b017d86638c3d024c138689f770ad093297fceCreate Auction157228772022-10-11 5:48:1150 days 2 hrs ago0xd2e6ec7894444fa03527b3f59ca85ae8dc25e387 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00508101 23.48800532
0x7c2e521864360d0dfafe032a122ec08707cc166ea41c535fa2ec4b2bc84e3175Cancel Auction157228662022-10-11 5:45:5950 days 2 hrs ago0xd2e6ec7894444fa03527b3f59ca85ae8dc25e387 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00172905 21.02271241
0x346f256e10c876695a89ab537e91774997af61c056cd1089c810fa556df96906Create Auction157228602022-10-11 5:44:4750 days 2 hrs ago0xd2e6ec7894444fa03527b3f59ca85ae8dc25e387 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00556459 25.72342036
0xd29e68b05b8d2c64c65c96ddeddc62050d44b180d651f40fbecc392ccd28f624Create Auction156822862022-10-05 13:45:5955 days 18 hrs ago0xd2e6ec7894444fa03527b3f59ca85ae8dc25e387 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.0029192 13.20168032
0xf23dccf68e7c736dc3834c9ea6c8b2cfcdb2b1f88b5a9593f2fc409e002c22aaCancel Auction156754482022-10-04 14:45:2356 days 17 hrs ago0x6048fc91583e3373acb88d2196db8aedf9730fe1 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00144922 21.13901906
0x3f4893cb97b2dc1aff7f674f84f7be9385ce1c56db2a3378309cbaedae661ea6Create Auction156753822022-10-04 14:31:5956 days 17 hrs ago0x6048fc91583e3373acb88d2196db8aedf9730fe1 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.0043349 19.60504126
0x0da81436d9a2d073d67a565204fb2e6367e0057628a732fa961b361f3f80a5fbCancel Auction156753722022-10-04 14:29:5956 days 17 hrs ago0x6048fc91583e3373acb88d2196db8aedf9730fe1 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00124667 18.18443173
0xb9ae9106325ba95fb4988c2465e85a1e02ecab46a1e0143b1a2a03859935d8a9Create Auction156753332022-10-04 14:22:1156 days 17 hrs ago0x6048fc91583e3373acb88d2196db8aedf9730fe1 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00432056 19.53806334
0x4f5cb6e08a648b9da564ceadb23744c53a337ddafae3e8efdd8d4b4fdf876681Bid156746982022-10-04 12:13:3556 days 19 hrs ago0x685027fac031dbaa230d441d656948b9acfe5b69 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40.0833 Ether0.001534979
0xe52635cf177a06f24b74669b4872956501c10769dde6115ac45e8c7974730706Create Auction156741542022-10-04 10:23:4756 days 21 hrs ago0xea84a82dee247aa328dd31306e083e75ac0df812 IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.0018257 8.25602066
0x91c9b0b8ebc07da145e6d087c161f4870dddd83f0d6db81353efd2a9e1746f32Bid156658082022-10-03 6:22:3558 days 1 hr ago0xcc043727305fce85758286743484f60072a220eb IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40.0000001 Ether0.00137767 10.28273408
0x6e1d327b538c14a5f140dc9b80394d960bbe166dbf14e10e6e7929415cd19406Create Auction156658052022-10-03 6:21:5958 days 1 hr agoENS Name collarquest.eth IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00220953 9.99499123
0x5f43aed8e80c5a3f1ff753ae9d0640d5e9d8120addf1b1b71c466b51f11d6d10Bid156657732022-10-03 6:15:3558 days 1 hr ago0xcc043727305fce85758286743484f60072a220eb IN  0xe499cee42868a0b4f8ac2152a77b012530b361e41 wei0.0017109 10.75792016
0xa61cf49df64c1f979db870d706f2999e28befae5211118a41d1850b09907024fCreate Auction156657282022-10-03 6:06:3558 days 1 hr agoENS Name collarquest.eth IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00204825 9.26845635
0x0331d9f3caad9d5628edabb0003fc4c19b8a48b78e7e1cb1dca82c8bc256b7b6Create Auction156656442022-10-03 5:49:3558 days 2 hrs agoENS Name collarquest.eth IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00253171 10.63335681
0x5d95d805cdc6fa498fecb03230923fae5e6a2750879491b793cfc809109b3479Set Signer156227162022-09-27 5:50:1164 days 2 hrs agoENS Name collarquest.eth IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00023335 8.03539554
0xa89aa692ce311abf6703a96a262f563c95bc22e52f3a2e8479f6610dac791b1bSet Breeder Cont...154896342022-09-07 9:53:4683 days 21 hrs agoENS Name collarquest.eth IN  0xe499cee42868a0b4f8ac2152a77b012530b361e40 Ether0.00068997 14.94672985
0x916b667738de125b3616c3cae7ab796b55f072d5070563fabcbb6b0303426bf60x60806040154892342022-09-07 8:21:5183 days 23 hrs agoENS Name collarquest.eth IN  Create: SPARCEClockAuction0 Ether0.01941929 9.57452265
[ Download CSV Export 
Latest 5 internal transactions
Parent Txn Hash Block From To Value
0x4f5cb6e08a648b9da564ceadb23744c53a337ddafae3e8efdd8d4b4fdf876681156746982022-10-04 12:13:3556 days 19 hrs ago 0xe499cee42868a0b4f8ac2152a77b012530b361e40xea84a82dee247aa328dd31306e083e75ac0df8120.07497 Ether
0x4f5cb6e08a648b9da564ceadb23744c53a337ddafae3e8efdd8d4b4fdf876681156746982022-10-04 12:13:3556 days 19 hrs ago 0xe499cee42868a0b4f8ac2152a77b012530b361e4ENS Name collarquest.eth0.00833 Ether
0x91c9b0b8ebc07da145e6d087c161f4870dddd83f0d6db81353efd2a9e1746f32156658082022-10-03 6:22:3558 days 1 hr ago 0xe499cee42868a0b4f8ac2152a77b012530b361e4ENS Name collarquest.eth0.00000009 Ether
0x91c9b0b8ebc07da145e6d087c161f4870dddd83f0d6db81353efd2a9e1746f32156658082022-10-03 6:22:3558 days 1 hr ago 0xe499cee42868a0b4f8ac2152a77b012530b361e4ENS Name collarquest.eth0.00000001 Ether
0x5f43aed8e80c5a3f1ff753ae9d0640d5e9d8120addf1b1b71c466b51f11d6d10156657732022-10-03 6:15:3558 days 1 hr ago 0xe499cee42868a0b4f8ac2152a77b012530b361e4ENS Name collarquest.eth1 wei
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SPARCEClockAuction

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-07
*/

//SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.4;

interface IERC721 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

abstract contract SignatureVerifier {
    using ECDSA for bytes32;
    
    bytes32 public constant SIGNATURE_PERMIT_TYPEHASH = keccak256("validateSig(address _nft, uint _amount, uint _nonce, bytes memory signature)");
    uint public chainId;
    
    struct ValidatorInfo {
        uint nonce;
        mapping(bytes => bool) signature;
    }
    
    mapping(address => ValidatorInfo) validateInfo;
    
    constructor() {
        uint _chainId;
        assembly {
            _chainId := chainid()
        }
        
        chainId = _chainId;
    }
    
    function validateSig(address _owner, address _nft, uint _amount, uint _nonce, bytes memory signature) public view returns (address){
      // This recreates the message hash that was signed on the client.
      bytes32 hash = keccak256(abi.encodePacked(SIGNATURE_PERMIT_TYPEHASH, _owner, _nft, _amount, _nonce, chainId));
      bytes32 messageHash = hash.toSignedMessageHash();
    
      // Verify that the message's signer is the owner of the order
      return messageHash.recover(signature);
    }
}

library ECDSA {

  /**
   * @dev Recover signer address from a message by using their signature
   * @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address.
   * @param signature bytes signature, the signature is generated using web3.eth.sign()
   */
  function recover(bytes32 hash, bytes memory signature)
    internal
    pure
    returns (address)
  {
    bytes32 r;
    bytes32 s;
    uint8 v;

    // Check the signature length
    if (signature.length != 65) {
      return (address(0));
    }

    // Divide the signature in r, s and v variables with inline assembly.
    assembly {
      r := mload(add(signature, 0x20))
      s := mload(add(signature, 0x40))
      v := byte(0, mload(add(signature, 0x60)))
    }

    // Version of signature should be 27 or 28, but 0 and 1 are also possible versions
    if (v < 27) {
      v += 27;
    }

    // If the version is correct return the signer address
    if (v != 27 && v != 28) {
      return (address(0));
    } else {
      // solium-disable-next-line arg-overflow
      return ecrecover(hash, v, r, s);
    }
  }

  /**
    * toEthSignedMessageHash
    * @dev prefix a bytes32 value with "\x19Ethereum Signed Message:"
    * and hash the result
    */
  function toSignedMessageHash(bytes32 hash)
    internal
    pure
    returns (bytes32)
  {
    return keccak256(
      abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
    );
  }
}

interface ICollarQuest is IERC721 {
  function getSparce(
    uint256 _sparceId
  )
    external
    view
    returns (uint256 /* _genes */, uint256 /* _bornAt */, address /* _operator */, bool /* _newlyBorn */);

  function UpdateNewBornSparce( uint _sparceId) external;
}

contract SPARCEClockAuction is Pausable, Ownable, SignatureVerifier {
  enum Operations {Market,Breeder}
  
  ICollarQuest public collarQuest;

  struct Auction {
    address seller;
    address operator;
    uint startingPrice;
    uint endingPrice;
    uint duration;
    uint startedAt;
    bool newBorn;
  }

  struct Fees {
    uint256 daoFee;
    uint256 royalityFee;
  }

  uint256 constant DIVISOR = 10000;
  address public treasury;
  address public breedingContract;
  address public signer;
  
  // Map from token ID to their corresponding auction.
  mapping (address => mapping (uint256 => Auction)) public auctions;
  mapping(bool => mapping(uint8 => Fees)) public feeStruct;

  // stores verified signatures
  mapping(bytes => bool) public isVerified;

  // returns current nonce of address
  mapping(address => uint256) public nonce;

  event AuctionCreated(
    address indexed _nftAddress,
    uint256 indexed _tokenId,
    uint256 _startingPrice,
    uint256 _endingPrice,
    uint256 _duration,
    address _seller
  );

  event AuctionSuccessful(
    address indexed _nftAddress,
    uint256 indexed _tokenId,
    uint256 _totalPrice,
    address _winner
  );

  event AuctionCancelled(
    address indexed _nftAddress,
    uint256 indexed _tokenId
  );

  constructor(ICollarQuest _collarQuest, address _treasury, address _signer) {
    treasury = _treasury;
    signer = _signer;
    collarQuest = _collarQuest;
    feeStruct[true][uint8(Operations.Market)] = Fees(1000, 0);
    feeStruct[true][uint8(Operations.Breeder)] = Fees(500, 0);
    feeStruct[false][uint8(Operations.Breeder)] = feeStruct[false][uint8(Operations.Market)] = Fees(500, 500);
  }

  fallback () external {}

  /// @dev Returns auction info for an NFT on auction.
  /// @param _nftAddress - Address of the NFT.
  /// @param _tokenId - ID of NFT on auction.
  function getAuction(
    address _nftAddress,
    uint256 _tokenId
  )
    external
    view
    returns (
      address seller,
      uint256 startingPrice,
      uint256 endingPrice,
      uint256 duration,
      uint256 startedAt,
      address operator,
      bool newBorn
    )
  {
    Auction storage _auction = auctions[_nftAddress][_tokenId];
    require(_isOnAuction(_auction));
    return (
      _auction.seller,
      _auction.startingPrice,
      _auction.endingPrice,
      _auction.duration,
      _auction.startedAt,
      _auction.operator,
      _auction.newBorn
    );
  }

  /// @dev Returns the current price of an auction.
  /// @param _nftAddress - Address of the NFT.
  /// @param _tokenId - ID of the token price we are checking.
  function getCurrentPrice(
    address _nftAddress,
    uint256 _tokenId
  )
    external
    view
    returns (uint256)
  {
    Auction storage _auction = auctions[_nftAddress][_tokenId];
    require(_isOnAuction(_auction));
    return _getCurrentPrice(_auction);
  }

  /// @dev Creates and begins a new auction.
  /// @param _nftAddress - address of a deployed contract implementing
  ///  the Nonfungible Interface.
  /// @param _tokenId - ID of token to auction, sender must be owner.
  /// @param _startingPrice - Price of item (in wei) at beginning of auction.
  /// @param _endingPrice - Price of item (in wei) at end of auction.
  /// @param _duration - Length of time to move between starting
  ///  price and ending price (in seconds).
  function createAuction(
    address _nftAddress,
    uint256 _tokenId,
    uint256 _startingPrice,
    uint256 _endingPrice,
    uint256 _duration
  )
    external
    whenNotPaused
  {
    address _seller = msg.sender;
    require(_owns(_nftAddress, _seller, _tokenId));
    
    (, , address _operator, bool _newlyBorn ) =  collarQuest.getSparce(_tokenId);
    _escrow(_nftAddress, _seller, _tokenId);    

    Auction memory _auction = Auction({
      seller : _seller,
      operator : _operator,
      startingPrice : _startingPrice,
      endingPrice : _endingPrice,
      duration : _duration,
      startedAt : block.timestamp,
      newBorn : _newlyBorn
    });

    _addAuction(
      _nftAddress,
      _tokenId,
      _auction,
      _seller
    );
  }

  /// @dev Bids on an open auction, completing the auction and transferring
  ///  ownership of the NFT if enough Ether is supplied.
  /// @param _nftAddress - address of a deployed contract implementing
  ///  the Nonfungible Interface.
  /// @param _tokenId - ID of token to bid on.
  function bid(
    address _nftAddress,
    address royalityAddress,
    uint256 _tokenId,
    bytes calldata signature
  )
    external
    payable
    whenNotPaused
  {
    require(!isVerified[signature], "signature already verified");
    require(validateSig( msg.sender, _nftAddress, msg.value, nonce[msg.sender],signature) == signer,"Signature invalid");

    nonce[msg.sender]++;
    isVerified[signature] = true;
    bool _newBorn = auctions[_nftAddress][_tokenId].newBorn;

    // _bid will throw if the bid or funds transfer fails
    _bid(_nftAddress, royalityAddress, _tokenId, msg.value);
    
    if(_nftAddress == address(collarQuest)) {
      if(_newBorn) {
        collarQuest.UpdateNewBornSparce(_tokenId);
      }
    }

    _transfer(_nftAddress, msg.sender, _tokenId);
  }

  /// @dev Cancels an auction that hasn't been won yet.
  ///  Returns the NFT to original owner.
  /// @notice This is a state-modifying function that can
  ///  be called while the contract is paused.
  /// @param _nftAddress - Address of the NFT.
  /// @param _tokenId - ID of token on auction
  function cancelAuction(address _nftAddress, uint256 _tokenId) external {
    Auction storage _auction = auctions[_nftAddress][_tokenId];
    require(_isOnAuction(_auction));
    require(msg.sender == _auction.seller);
    _cancelAuction(_nftAddress, _tokenId, _auction.seller);
  }

  /// @dev Cancels an auction when the contract is paused.
  ///  Only the owner may do this, and NFTs are returned to
  ///  the seller. This should only be used in emergencies.
  /// @param _nftAddress - Address of the NFT.
  /// @param _tokenId - ID of the NFT on auction to cancel.
  function cancelAuctionWhenPaused(
    address _nftAddress,
    uint256 _tokenId
  )
    external
    whenPaused
    onlyOwner
  {
    Auction storage _auction = auctions[_nftAddress][_tokenId];
    require(_isOnAuction(_auction));
    _cancelAuction(_nftAddress, _tokenId, _auction.seller);
  }

  function setBreederContract( address _breedingContract) external onlyOwner {
    breedingContract = _breedingContract;
  }

  function setSigner( address _signer) external onlyOwner {
    signer = _signer;
  }

  function setTreasury( address _treasury) external onlyOwner {
    treasury = _treasury;
  }

  function setCollarQuest( ICollarQuest _collarQuest) external onlyOwner {
        collarQuest = _collarQuest;
    }

  function setPrimaryDAOFee( uint8 _type, uint _daoFee) external onlyOwner {
    require(_type <= uint8(Operations.Breeder));
    require(_daoFee <= DIVISOR);
    feeStruct[true][uint8(_type)].daoFee = _daoFee;
  }

  function setPrimaryRoyalityFee(uint8 _type, uint _royalityFee) external onlyOwner {
    require(_type <= uint8(Operations.Breeder));
    require(_royalityFee <= DIVISOR);
    feeStruct[true][uint8(_type)].royalityFee = _royalityFee;
  }

  function setSecondaryDAOFee(uint8 _type, uint _daoFee) external onlyOwner {
    require(_type <= uint8(Operations.Breeder));
    require(_daoFee <= DIVISOR);
    feeStruct[false][uint8(_type)].daoFee = _daoFee;
  }

  function setSecondaryRoyalityFee(uint8 _type, uint _royalityFee) external onlyOwner {
    require(_type <= uint8(Operations.Breeder));
    require(_royalityFee <= DIVISOR);
    feeStruct[false][uint8(_type)].royalityFee = _royalityFee;
  }

  /// @dev Returns true if the NFT is on auction.
  /// @param _auction - Auction to check.
  function _isOnAuction(Auction storage _auction) internal view returns (bool) {
    return (_auction.startedAt > 0);
  }

  /// @dev Gets the NFT object from an address, validating that implementsERC721 is true.
  /// @param _nftAddress - Address of the NFT.
  function _getNftContract(address _nftAddress) internal pure returns (IERC721) {
    IERC721 candidateContract = IERC721(_nftAddress);
    // require(candidateContract.implementsERC721());
    return candidateContract;
  }

  /// @dev Returns current price of an NFT on auction. Broken into two
  ///  functions (this one, that computes the duration from the auction
  ///  structure, and the other that does the price computation) so we
  ///  can easily test that the price computation works correctly.
  function _getCurrentPrice(
    Auction storage _auction
  )
    internal
    view
    returns (uint256)
  {
    uint256 _secondsPassed = 0;

    if (block.timestamp > _auction.startedAt) {
      _secondsPassed = block.timestamp - _auction.startedAt;
    }

    return _computeCurrentPrice(
      _auction.startingPrice,
      _auction.endingPrice,
      _auction.duration,
      _secondsPassed
    );
  }

  /// @dev Computes the current price of an auction. Factored out
  ///  from _currentPrice so we can run extensive unit tests.
  ///  When testing, make this function external and turn on
  ///  `Current price computation` test suite.
  function _computeCurrentPrice(
    uint256 _startingPrice,
    uint256 _endingPrice,
    uint256 _duration,
    uint256 _secondsPassed
  )
    internal
    pure
    returns (uint256)
  {
    if (_secondsPassed >= _duration) {
      return _endingPrice;
    } else {
      int256 _totalPriceChange = int256(_endingPrice) - int256(_startingPrice);
      int256 _currentPriceChange = _totalPriceChange * int256(_secondsPassed) / int256(_duration);
      int256 _currentPrice = int256(_startingPrice) + _currentPriceChange;

      return uint256(_currentPrice);
    }
  }

  /// @dev Returns true if the claimant owns the token.
  /// @param _nftAddress - The address of the NFT.
  /// @param _claimant - Address claiming to own the token.
  /// @param _tokenId - ID of token whose ownership to verify.
  function _owns(address _nftAddress, address _claimant, uint256 _tokenId) internal view returns (bool) {
    IERC721 _nftContract = _getNftContract(_nftAddress);
    return (_nftContract.ownerOf(_tokenId) == _claimant);
  }

  /// @dev Adds an auction to the list of open auctions. Also fires the
  ///  AuctionCreated event.
  /// @param _tokenId The ID of the token to be put on auction.
  /// @param _auction Auction to add.
  function _addAuction(
    address _nftAddress,
    uint256 _tokenId,
    Auction memory _auction,
    address _seller
  )
    internal
  {
    // Require that all auctions have a duration of
    // at least one minute. (Keeps our math from getting hairy!)
    require(_auction.duration >= 1 minutes);
    auctions[_nftAddress][_tokenId] = _auction;

    emit AuctionCreated(
      _nftAddress,
      _tokenId,
      uint256(_auction.startingPrice),
      uint256(_auction.endingPrice),
      uint256(_auction.duration),
      _seller
    );
  }

  /// @dev Removes an auction from the list of open auctions.
  /// @param _tokenId - ID of NFT on auction.
  function _removeAuction(address _nftAddress, uint256 _tokenId) internal {
    delete auctions[_nftAddress][_tokenId];
  }

  /// @dev Cancels an auction unconditionally.
  function _cancelAuction(address _nftAddress, uint256 _tokenId, address _seller) internal {
    _removeAuction(_nftAddress, _tokenId);
    _transfer(_nftAddress, _seller, _tokenId);
    emit AuctionCancelled(_nftAddress, _tokenId);
  }

  /// @dev Escrows the NFT, assigning ownership to this contract.
  /// Throws if the escrow fails.
  /// @param _nftAddress - The address of the NFT.
  /// @param _owner - Current owner address of token to escrow.
  /// @param _tokenId - ID of token whose approval to verify.
  function _escrow(address _nftAddress, address _owner, uint256 _tokenId) internal {
    IERC721 _nftContract = _getNftContract(_nftAddress);
    
    _nftContract.transferFrom(_owner, address(this), _tokenId);
  }

  /// @dev Transfers an NFT owned by this contract to another address.
  /// Returns true if the transfer succeeds.
  /// @param _nftAddress - The address of the NFT.
  /// @param _receiver - Address to transfer NFT to.
  /// @param _tokenId - ID of token to transfer.
  function _transfer(address _nftAddress, address _receiver, uint256 _tokenId) internal {
    IERC721 _nftContract = _getNftContract(_nftAddress);
    _nftContract.transferFrom(address(this), _receiver, _tokenId);
  }

  /// @dev Computes the price and transfers winnings.
  /// Does NOT transfer ownership of token.
  function _bid(
    address _nftAddress,
    address _royalityAddress,
    uint256 _tokenId,
    uint256 _bidAmount
  )
    internal
    returns (uint256)
  {
    Auction storage _auction = auctions[_nftAddress][_tokenId];

    require(_isOnAuction(_auction));
    uint256 _price = _getCurrentPrice(_auction);
    require(_bidAmount >= _price);
    address _seller = _auction.seller;
     (address _operator, bool _newlyBorn) = (_auction.operator,_auction.newBorn);
    _removeAuction(_nftAddress, _tokenId);

    if (_price > 0) {
      (uint _royalityFee, uint _daoFee, uint _sellerProceeds) = _calculateSaleRoyality(_nftAddress,_operator, _newlyBorn, _price);

      if(_daoFee > 0)
        payable(treasury).transfer(_daoFee);

      if(_sellerProceeds > 0)
        payable(_seller).transfer(_sellerProceeds);
      
      if(_royalityFee > 0)
        payable(_royalityAddress).transfer(_royalityFee);
    }

    if (_bidAmount > _price) {
      uint256 _bidExcess = _bidAmount - _price;
      payable(msg.sender).transfer(_bidExcess);
    }

    emit AuctionSuccessful(
      _nftAddress,
      _tokenId,
      _price,
      msg.sender
    );

    return _price;
  }

  function _calculateSaleRoyality(
    address _nftAddress, 
    address _operator, 
    bool _newlyBorn, 
    uint price
  ) 
    private
    view 
    returns (uint _royalityFee, uint _daoFee, uint _price) 
  {
    if(_nftAddress != address(collarQuest)) {
      return (_royalityFee,_daoFee,_price);
    }

    uint8 _sale = isBreederContract(_operator);
    _royalityFee = (price * feeStruct[_newlyBorn][_sale].royalityFee) / DIVISOR;
    _daoFee = (price * feeStruct[_newlyBorn][_sale].daoFee) / DIVISOR;
    _price = price - (_royalityFee + _daoFee);
  }

  function isBreederContract(address operator) private view returns (uint8 _type) {
    _type = (operator == breedingContract) ? uint8(Operations.Breeder) : uint8(Operations.Market);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract ICollarQuest","name":"_collarQuest","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_signer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_nftAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"AuctionCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_nftAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_startingPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_endingPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_duration","type":"uint256"},{"indexed":false,"internalType":"address","name":"_seller","type":"address"}],"name":"AuctionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_nftAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalPrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"_winner","type":"address"}],"name":"AuctionSuccessful","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"SIGNATURE_PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctions","outputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"startingPrice","type":"uint256"},{"internalType":"uint256","name":"endingPrice","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"bool","name":"newBorn","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"address","name":"royalityAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"breedingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"cancelAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"cancelAuctionWhenPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collarQuest","outputs":[{"internalType":"contract ICollarQuest","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_startingPrice","type":"uint256"},{"internalType":"uint256","name":"_endingPrice","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"createAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"feeStruct","outputs":[{"internalType":"uint256","name":"daoFee","type":"uint256"},{"internalType":"uint256","name":"royalityFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getAuction","outputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"startingPrice","type":"uint256"},{"internalType":"uint256","name":"endingPrice","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"newBorn","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"isVerified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_breedingContract","type":"address"}],"name":"setBreederContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ICollarQuest","name":"_collarQuest","type":"address"}],"name":"setCollarQuest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_type","type":"uint8"},{"internalType":"uint256","name":"_daoFee","type":"uint256"}],"name":"setPrimaryDAOFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_type","type":"uint8"},{"internalType":"uint256","name":"_royalityFee","type":"uint256"}],"name":"setPrimaryRoyalityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_type","type":"uint8"},{"internalType":"uint256","name":"_daoFee","type":"uint256"}],"name":"setSecondaryDAOFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_type","type":"uint8"},{"internalType":"uint256","name":"_royalityFee","type":"uint256"}],"name":"setSecondaryRoyalityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validateSig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162002215380380620022158339810160408190526200003491620002a1565b6000805460ff19169055620000493362000248565b466001908155600480546001600160a01b03199081166001600160a01b0395861617909155600680548216938516939093179092556003805490921693909216929092179091556040805180820182526103e88152600060208083018281528280527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f80835293517f8f715efb45b3f43fabf5a352a1ea9cb6a7048b73a9b21d92cf2b6cf34d9fd22d55517f8f715efb45b3f43fabf5a352a1ea9cb6a7048b73a9b21d92cf2b6cf34d9fd22e55835180850185526101f480825281830184815287855294835290517f201cfe56e3078299f26d8ce4ac47862ef90d0160f4a50f7c80a39a29152f50855592517f201cfe56e3078299f26d8ce4ac47862ef90d0160f4a50f7c80a39a29152f50865583518085019094528284528381019283528180527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7905291517f3b543ac468519aa6396aba1a2611925510398aac61d1cc7b45f433e69042eb5781905590517f3b543ac468519aa6396aba1a2611925510398aac61d1cc7b45f433e69042eb58819055929091527f1b4dc45c9661b5e2a9811ed27e0e8a4fabbe5923764fe958074e81903e799e3a557f1b4dc45c9661b5e2a9811ed27e0e8a4fabbe5923764fe958074e81903e799e3b556200030d565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b600080600060608486031215620002b6578283fd5b8351620002c381620002f4565b6020850151909350620002d681620002f4565b6040850151909250620002e981620002f4565b809150509250925092565b6001600160a01b03811681146200030a57600080fd5b50565b611ef8806200031d6000396000f3fe6080604052600436106101c25760003560e01c8063836e3375116100f7578063c994180611610095578063d96d3f5211610064578063d96d3f5214610658578063de8e2a701461066b578063f0f442601461068b578063f2fde38b146106ab576101c2565b8063c9941806146105a9578063ccfa0391146105e4578063d4009ad514610604578063d50a64aa14610638576101c2565b806390075115116100d15780639007511514610533578063961c9ae4146105535780639a8a059214610573578063aac668d414610589576101c2565b8063836e3375146104d0578063859b97fe146104f05780638da5cb5b14610510576101c2565b806361d027b3116101645780636c54df521161013e5780636c54df52146103fc57806370ae92d21461042a578063715018a614610457578063762a66a21461046c576101c2565b806361d027b314610368578063683a0e4a146103885780636c19e783146103dc576101c2565b80633cadbb69116101a05780633cadbb691461025057806344f91c1e1461027057806355eafbad146103245780635c975abb14610344576101c2565b80630826a2de146101d15780631ae6b6ee146101f3578063238ac93314610213575b3480156101ce57600080fd5b50005b3480156101dd57600080fd5b506101f16101ec3660046119c5565b6106cb565b005b3480156101ff57600080fd5b506101f161020e366004611b0b565b610726565b34801561021f57600080fd5b50600654610233906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025c57600080fd5b506101f161026b366004611c2a565b6107ed565b34801561027c57600080fd5b506102e261028b366004611b0b565b600760209081526000928352604080842090915290825290208054600182015460028301546003840154600485015460058601546006909601546001600160a01b0395861696959094169492939192909160ff1687565b604080516001600160a01b039889168152979096166020880152948601939093526060850191909152608084015260a0830152151560c082015260e001610247565b34801561033057600080fd5b506101f161033f366004611c2a565b610872565b34801561035057600080fd5b5060005460ff165b6040519015158152602001610247565b34801561037457600080fd5b50600454610233906001600160a01b031681565b34801561039457600080fd5b506103c76103a3366004611b79565b60086020908152600092835260408084209091529082529020805460019091015482565b60408051928352602083019190915201610247565b3480156103e857600080fd5b506101f16103f73660046119c5565b6108f7565b34801561040857600080fd5b5061041c610417366004611b0b565b610949565b604051908152602001610247565b34801561043657600080fd5b5061041c6104453660046119c5565b600a6020526000908152604090205481565b34801561046357600080fd5b506101f161098d565b34801561047857600080fd5b5061048c610487366004611b0b565b6109c9565b604080516001600160a01b03988916815260208101979097528601949094526060850192909252608084015290921660a082015290151560c082015260e001610247565b3480156104dc57600080fd5b50600554610233906001600160a01b031681565b3480156104fc57600080fd5b506101f161050b366004611b0b565b610a53565b34801561051c57600080fd5b5060005461010090046001600160a01b0316610233565b34801561053f57600080fd5b5061023361054e366004611a97565b610a9a565b34801561055f57600080fd5b506101f161056e366004611b36565b610b81565b34801561057f57600080fd5b5061041c60015481565b34801561059557600080fd5b506101f16105a43660046119c5565b610cc5565b3480156105b557600080fd5b506103586105c4366004611bad565b805160208183018101805160098252928201919093012091525460ff1681565b3480156105f057600080fd5b506101f16105ff366004611c2a565b610d17565b34801561061057600080fd5b5061041c7f3c6e028a0bce3ec0727c125529a642c051c71c268d6077293c60f86492dc8b6c81565b34801561064457600080fd5b50600354610233906001600160a01b031681565b6101f16106663660046119fd565b610d9f565b34801561067757600080fd5b506101f1610686366004611c2a565b611018565b34801561069757600080fd5b506101f16106a63660046119c5565b6110a0565b3480156106b757600080fd5b506101f16106c63660046119c5565b6110f2565b6000546001600160a01b036101009091041633146107045760405162461bcd60e51b81526004016106fb90611c55565b60405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b60005460ff1661076f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106fb565b6000546001600160a01b0361010090910416331461079f5760405162461bcd60e51b81526004016106fb90611c55565b6001600160a01b0382166000908152600760209081526040808320848452909152902060058101546107d057600080fd5b80546107e890849084906001600160a01b0316611193565b505050565b6000546001600160a01b0361010090910416331461081d5760405162461bcd60e51b81526004016106fb90611c55565b600160ff8316111561082e57600080fd5b61271081111561083d57600080fd5b60ff90911660009081527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f6020526040902055565b6000546001600160a01b036101009091041633146108a25760405162461bcd60e51b81526004016106fb90611c55565b600160ff831611156108b357600080fd5b6127108111156108c257600080fd5b60ff90911660009081527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c76020526040902055565b6000546001600160a01b036101009091041633146109275760405162461bcd60e51b81526004016106fb90611c55565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03821660009081526007602090815260408083208484529091528120600581015461097a57600080fd5b610983816111e3565b9150505b92915050565b6000546001600160a01b036101009091041633146109bd5760405162461bcd60e51b81526004016106fb90611c55565b6109c76000611225565b565b6001600160a01b038216600090815260076020908152604080832084845290915281206005810154829182918291829182918291610a0657600080fd5b8054600282015460038301546004840154600585015460018601546006909601546001600160a01b039586169d50939b50919950975095509116925060ff16905092959891949750929550565b6001600160a01b038216600090815260076020908152604080832084845290915290206005810154610a8457600080fd5b80546001600160a01b031633146107d057600080fd5b600154604080517f3c6e028a0bce3ec0727c125529a642c051c71c268d6077293c60f86492dc8b6c6020808301919091526bffffffffffffffffffffffff1960608a811b82168486015289901b166054830152606882018790526088820186905260a8808301949094528251808303909401845260c8820183528351938101939093207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060e883015261010480830182905283518084039091018152610124909201909252805192019190912060009190610b75818561127e565b98975050505050505050565b60005460ff1615610bc75760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106fb565b33610bd3868287611355565b610bdc57600080fd5b60035460405163ea1f714160e01b81526004810187905260009182916001600160a01b039091169063ea1f71419060240160806040518083038186803b158015610c2557600080fd5b505afa158015610c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5d9190611be0565b935093505050610c6e8884896113ea565b6040805160e0810182526001600160a01b0380861682528416602082015290810187905260608101869052608081018590524260a082015281151560c0820152610cba8989838761145c565b505050505050505050565b6000546001600160a01b03610100909104163314610cf55760405162461bcd60e51b81526004016106fb90611c55565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03610100909104163314610d475760405162461bcd60e51b81526004016106fb90611c55565b600160ff83161115610d5857600080fd5b612710811115610d6757600080fd5b60ff90911660009081527fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f6020526040902060010155565b60005460ff1615610de55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106fb565b60098282604051610df7929190611c45565b9081526040519081900360200190205460ff1615610e575760405162461bcd60e51b815260206004820152601a60248201527f7369676e617475726520616c726561647920766572696669656400000000000060448201526064016106fb565b600654336000818152600a6020908152604091829020548251601f87018390048302810183019093528583526001600160a01b0390941693610eba93928a92349291908990899081908401838280828437600092019190915250610a9a92505050565b6001600160a01b031614610f045760405162461bcd60e51b815260206004820152601160248201527014da59db985d1d5c99481a5b9d985b1a59607a1b60448201526064016106fb565b336000908152600a60205260408120805491610f1f83611e42565b9190505550600160098383604051610f38929190611c45565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b038716600090815260078252828120868252909152206006015460ff16610f8986868634611552565b506003546001600160a01b03878116911614156110055780156110055760035460405163af1d9eb160e01b8152600481018690526001600160a01b039091169063af1d9eb190602401600060405180830381600087803b158015610fec57600080fd5b505af1158015611000573d6000803e3d6000fd5b505050505b611010863386611742565b505050505050565b6000546001600160a01b036101009091041633146110485760405162461bcd60e51b81526004016106fb90611c55565b600160ff8316111561105957600080fd5b61271081111561106857600080fd5b60ff90911660009081527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c76020526040902060010155565b6000546001600160a01b036101009091041633146110d05760405162461bcd60e51b81526004016106fb90611c55565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b036101009091041633146111225760405162461bcd60e51b81526004016106fb90611c55565b6001600160a01b0381166111875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fb565b61119081611225565b50565b61119d8383611780565b6111a8838284611742565b60405182906001600160a01b038516907f018b64b6242d32aa550e95d78985b938d71af5b3f10827b0683f55da1639304890600090a3505050565b600581015460009081904211156112065760058301546112039042611e2b565b90505b61121e836002015484600301548560040154846117ea565b9392505050565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60008060008084516041146112995760009350505050610987565b50505060208201516040830151606084015160001a601b8110156112c5576112c2601b82611ce3565b90505b8060ff16601b141580156112dd57508060ff16601c14155b156112ee5760009350505050610987565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa158015611341573d6000803e3d6000fd5b505050602060405103519350505050610987565b6040516331a9108f60e11b81526004810182905260009084906001600160a01b038086169190831690636352211e9060240160206040518083038186803b15801561139f57600080fd5b505afa1580156113b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d791906119e1565b6001600160a01b03161495945050505050565b6040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528491908216906323b872dd906064015b600060405180830381600087803b15801561143e57600080fd5b505af1158015611452573d6000803e3d6000fd5b5050505050505050565b603c8260800151101561146e57600080fd5b6001600160a01b038481166000818152600760209081526040808320888452825291829020865181549086166001600160a01b031991821617825587830151600183018054918816919092161790558683015160028201819055606080890151600384018190556080808b01516004860181905560a08c0151600587015560c08c01516006909601805496151560ff19909716969096179095558651938452948301528185019290925294861690850152905186937febc6e332a2c695c53d77b2922a18bcf3ab024549f5f2bfa67e0875ec29d59d4692908290030190a350505050565b6001600160a01b03841660009081526007602090815260408083208584529091528120600581015461158357600080fd5b600061158e826111e3565b90508084101561159d57600080fd5b8154600183015460068401546001600160a01b03928316929091169060ff166115c68a89611780565b83156116a65760008060006115dd8d86868a611838565b919450925090508115611626576004546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015611624573d6000803e3d6000fd5b505b8015611664576040516001600160a01b0387169082156108fc029083906000818181858888f19350505050158015611662573d6000803e3d6000fd5b505b82156116a2576040516001600160a01b038d169084156108fc029085906000818181858888f193505050501580156116a0573d6000803e3d6000fd5b505b5050505b838711156116ed5760006116ba8589611e2b565b604051909150339082156108fc029083906000818181858888f193505050501580156116ea573d6000803e3d6000fd5b50505b6040805185815233602082015289916001600160a01b038d16917f6c00bb44a64da29b6a73920d50ff280237d277bda3e1f3cdf4e24392e6839efe910160405180910390a3509193505050505b949350505050565b6040516323b872dd60e01b81523060048201526001600160a01b038381166024830152604482018390528491908216906323b872dd90606401611424565b6001600160a01b03909116600090815260076020908152604080832093835292905290812080546001600160a01b0319908116825560018201805490911690556002810182905560038101829055600481018290556005810191909155600601805460ff19169055565b60008282106117fa57508261173a565b60006118068686611dec565b90506000846118158584611d4a565b61181f9190611d08565b9050600061182d8289611c8a565b935061173a92505050565b600354600090819081906001600160a01b03888116911614611859576118f7565b600061186487611901565b861515600090815260086020908152604080832060ff85168452909152902060010154909150612710906118989087611dcd565b6118a29190611d36565b861515600090815260086020908152604080832060ff86168452909152902054909450612710906118d39087611dcd565b6118dd9190611d36565b92506118e98385611ccb565b6118f39086611e2b565b9150505b9450945094915050565b6005546000906001600160a01b03838116911614611920576000610987565b600192915050565b600082601f830112611938578081fd5b813567ffffffffffffffff8082111561195357611953611e89565b604051601f8301601f19908116603f0116810190828211818310171561197b5761197b611e89565b81604052838152866020858801011115611993578485fd5b8360208701602083013792830160200193909352509392505050565b803560ff811681146119c057600080fd5b919050565b6000602082840312156119d6578081fd5b813561121e81611e9f565b6000602082840312156119f2578081fd5b815161121e81611e9f565b600080600080600060808688031215611a14578081fd5b8535611a1f81611e9f565b94506020860135611a2f81611e9f565b935060408601359250606086013567ffffffffffffffff80821115611a52578283fd5b818801915088601f830112611a65578283fd5b813581811115611a73578384fd5b896020828501011115611a84578384fd5b9699959850939650602001949392505050565b600080600080600060a08688031215611aae578081fd5b8535611ab981611e9f565b94506020860135611ac981611e9f565b93506040860135925060608601359150608086013567ffffffffffffffff811115611af2578182fd5b611afe88828901611928565b9150509295509295909350565b60008060408385031215611b1d578182fd5b8235611b2881611e9f565b946020939093013593505050565b600080600080600060a08688031215611b4d578081fd5b8535611b5881611e9f565b97602087013597506040870135966060810135965060800135945092505050565b60008060408385031215611b8b578182fd5b8235611b9681611eb4565b9150611ba4602084016119af565b90509250929050565b600060208284031215611bbe578081fd5b813567ffffffffffffffff811115611bd4578182fd5b61098384828501611928565b60008060008060808587031215611bf5578384fd5b84519350602085015192506040850151611c0e81611e9f565b6060860151909250611c1f81611eb4565b939692955090935050565b60008060408385031215611c3c578182fd5b611b28836119af565b8183823760009101908152919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600080821280156001600160ff1b0384900385131615611cac57611cac611e5d565b600160ff1b8390038412811615611cc557611cc5611e5d565b50500190565b60008219821115611cde57611cde611e5d565b500190565b600060ff821660ff84168060ff03821115611d0057611d00611e5d565b019392505050565b600082611d1757611d17611e73565b600160ff1b821460001984141615611d3157611d31611e5d565b500590565b600082611d4557611d45611e73565b500490565b60006001600160ff1b0381841382841380821686840486111615611d7057611d70611e5d565b600160ff1b84871282811687830589121615611d8e57611d8e611e5d565b858712925087820587128484161615611da957611da9611e5d565b87850587128184161615611dbf57611dbf611e5d565b505050929093029392505050565b6000816000190483118215151615611de757611de7611e5d565b500290565b60008083128015600160ff1b850184121615611e0a57611e0a611e5d565b6001600160ff1b0384018313811615611e2557611e25611e5d565b50500390565b600082821015611e3d57611e3d611e5d565b500390565b6000600019821415611e5657611e56611e5d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461119057600080fd5b801515811461119057600080fdfea26469706673582212201e09caea2adf39f5e6db9958e80479ea072e800c16c71c204880ad86a779c92564736f6c63430008040033000000000000000000000000674900b8fd8ee1b487d162d04c59300222d904660000000000000000000000003a91ece2a4dabd5f9f8086c2161d7d3edd3c8eb7000000000000000000000000abea313ce39ebf4ff8371b21d69264a609a4ca4b

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

000000000000000000000000674900b8fd8ee1b487d162d04c59300222d904660000000000000000000000003a91ece2a4dabd5f9f8086c2161d7d3edd3c8eb7000000000000000000000000abea313ce39ebf4ff8371b21d69264a609a4ca4b

-----Decoded View---------------
Arg [0] : _collarQuest (address): 0x674900B8fD8EE1B487d162d04C59300222D90466
Arg [1] : _treasury (address): 0x3a91Ece2a4Dabd5f9f8086c2161D7D3EDD3C8eb7
Arg [2] : _signer (address): 0xAbeA313Ce39ebF4ff8371b21D69264a609a4cA4b

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000674900b8fd8ee1b487d162d04c59300222d90466
Arg [1] : 0000000000000000000000003a91ece2a4dabd5f9f8086c2161d7d3edd3c8eb7
Arg [2] : 000000000000000000000000abea313ce39ebf4ff8371b21d69264a609a4ca4b


Deployed ByteCode Sourcemap

11240:14981:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18154:116;;;;;;;;;;-1:-1:-1;18154:116:0;;;;;:::i;:::-;;:::i;:::-;;17523:305;;;;;;;;;;-1:-1:-1;17523:305:0;;;;;:::i;:::-;;:::i;11742:21::-;;;;;;;;;;-1:-1:-1;11742:21:0;;;;-1:-1:-1;;;;;11742:21:0;;;;;;-1:-1:-1;;;;;7225:32:1;;;7207:51;;7195:2;7180:18;11742:21:0;;;;;;;;18276:216;;;;;;;;;;-1:-1:-1;18276:216:0;;;;;:::i;:::-;;:::i;11828:65::-;;;;;;;;;;-1:-1:-1;11828:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11828:65:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8014:15:1;;;7996:34;;8066:15;;;;8061:2;8046:18;;8039:43;8098:18;;;8091:34;;;;8156:2;8141:18;;8134:34;;;;8199:3;8184:19;;8177:35;7976:3;8228:19;;8221:35;8300:14;8293:22;8287:3;8272:19;;8265:51;7945:3;7930:19;11828:65:0;7912:410:1;18744:218:0;;;;;;;;;;-1:-1:-1;18744:218:0;;;;;:::i;:::-;;:::i;5471:86::-;;;;;;;;;;-1:-1:-1;5518:4:0;5542:7;;;5471:86;;;9170:14:1;;9163:22;9145:41;;9133:2;9118:18;5471:86:0;9100:92:1;11678:23:0;;;;;;;;;;-1:-1:-1;11678:23:0;;;;-1:-1:-1;;;;;11678:23:0;;;11898:56;;;;;;;;;;-1:-1:-1;11898:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12808:25:1;;;12864:2;12849:18;;12842:34;;;;12781:18;11898:56:0;12763:119:1;17964:85:0;;;;;;;;;;-1:-1:-1;17964:85:0;;;;;:::i;:::-;;:::i;13952:278::-;;;;;;;;;;-1:-1:-1;13952:278:0;;;;;:::i;:::-;;:::i;:::-;;;9343:25:1;;;9331:2;9316:18;13952:278:0;9298:76:1;12080:40:0;;;;;;;;;;-1:-1:-1;12080:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;7711:94;;;;;;;;;;;;;:::i;13163:618::-;;;;;;;;;;-1:-1:-1;13163:618:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8692:15:1;;;8674:34;;8739:2;8724:18;;8717:34;;;;8767:18;;8760:34;;;;8825:2;8810:18;;8803:34;;;;8868:3;8853:19;;8846:35;8918:15;;;8654:3;8897:19;;8890:44;8978:14;;8971:22;8965:3;8950:19;;8943:51;8623:3;8608:19;13163:618:0;8590:410:1;11706:31:0;;;;;;;;;;-1:-1:-1;11706:31:0;;;;-1:-1:-1;;;;;11706:31:0;;;16940:286;;;;;;;;;;-1:-1:-1;16940:286:0;;;;;:::i;:::-;;:::i;7060:87::-;;;;;;;;;;-1:-1:-1;7106:7:0;7133:6;;;;-1:-1:-1;;;;;7133:6:0;7060:87;;8926:508;;;;;;;;;;-1:-1:-1;8926:508:0;;;;;:::i;:::-;;:::i;14721:796::-;;;;;;;;;;-1:-1:-1;14721:796:0;;;;;:::i;:::-;;:::i;8567:19::-;;;;;;;;;;;;;;;;17834:124;;;;;;;;;;-1:-1:-1;17834:124:0;;;;;:::i;:::-;;:::i;11994:40::-;;;;;;;;;;-1:-1:-1;11994:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18498:240;;;;;;;;;;-1:-1:-1;18498:240:0;;;;;:::i;:::-;;:::i;8419:141::-;;;;;;;;;;;;8471:89;8419:141;;11353:31;;;;;;;;;;-1:-1:-1;11353:31:0;;;;-1:-1:-1;;;;;11353:31:0;;;15813:818;;;;;;:::i;:::-;;:::i;18968:243::-;;;;;;;;;;-1:-1:-1;18968:243:0;;;;;:::i;:::-;;:::i;18055:93::-;;;;;;;;;;-1:-1:-1;18055:93:0;;;;;:::i;:::-;;:::i;7960:192::-;;;;;;;;;;-1:-1:-1;7960:192:0;;;;;:::i;:::-;;:::i;18154:116::-;7106:7;7133:6;-1:-1:-1;;;;;7133:6:0;;;;;4803:10;7280:23;7272:68;;;;-1:-1:-1;;;7272:68:0;;;;;;;:::i;:::-;;;;;;;;;18236:11:::1;:26:::0;;-1:-1:-1;;;;;;18236:26:0::1;-1:-1:-1::0;;;;;18236:26:0;;;::::1;::::0;;;::::1;::::0;;18154:116::o;17523:305::-;5518:4;5542:7;;;6066:41;;;;-1:-1:-1;;;6066:41:0;;10567:2:1;6066:41:0;;;10549:21:1;10606:2;10586:18;;;10579:30;-1:-1:-1;;;10625:18:1;;;10618:50;10685:18;;6066:41:0;10539:170:1;6066:41:0;7106:7;7133:6;-1:-1:-1;;;;;7133:6:0;;;;;4803:10;7280:23:::1;7272:68;;;;-1:-1:-1::0;;;7272:68:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17692:21:0;::::2;17665:24;17692:21:::0;;;:8:::2;:21;::::0;;;;;;;:31;;;;;;;;19403:18;;;;17730:31:::2;;;::::0;::::2;;17806:15:::0;;17768:54:::2;::::0;17783:11;;17796:8;;-1:-1:-1;;;;;17806:15:0::2;17768:14;:54::i;:::-;7351:1;17523:305:::0;;:::o;18276:216::-;7106:7;7133:6;-1:-1:-1;;;;;7133:6:0;;;;;4803:10;7280:23;7272:68;;;;-1:-1:-1;;;7272:68:0;;;;;;;:::i;:::-;18379:18:::1;18364:34;::::0;::::1;;;18356:43;;;::::0;::::1;;11668:5;18414:7;:18;;18406:27;;;::::0;::::1;;18440:29;::::0;;::::1;:15;:29:::0;;;:15;::::1;:29:::0;:15;:29;;:46;18276:216::o;18744:218::-;7106:7;7133:6;-1:-1:-1;;;;;7133:6:0;;;;;4803:10;7280:23;7272:68;;;;-1:-1:-1;;;7272:68:0;;;;;;;:::i;:::-;18848:18:::1;18833:34;::::0;::::1;;;18825:43;;;::::0;::::1;;11668:5;18883:7;:18;;18875:27;;;::::0;::::1;;18909:30;::::0;;::::1;:16;:30:::0;;;:16;::::1;:30:::0;:16;:30;;:47;18744:218::o;17964:85::-;7106:7;7133:6;-1:-1:-1;;;;;7133:6:0;;;;;4803:10;7280:23;7272:68;;;;-1:-1:-1;;;7272:68:0;;;;;;;:::i;:::-;18027:6:::1;:16:::0;;-1:-1:-1;;;;;;18027:16:0::1;-1:-1:-1::0;;;;;18027:16:0;;;::::1;::::0;;;::::1;::::0;;17964:85::o;13952:278::-;-1:-1:-1;;;;;14115:21:0;;14069:7;14115:21;;;:8;:21;;;;;;;;:31;;;;;;;;19403:18;;;;14153:31;;;;;;14198:26;14215:8;14198:16;:26::i;:::-;14191:33;;;13952:278;;;;;:::o;7711:94::-;7106:7;7133:6;-1:-1:-1;;;;;7133:6:0;;;;;4803:10;7280:23;7272:68;;;;-1:-1:-1;;;7272:68:0;;;;;;;:::i;:::-;7776:21:::1;7794:1;7776:9;:21::i;:::-;7711:94::o:0;13163:618::-;-1:-1:-1;;;;;13497:21:0;;13283:14;13497:21;;;:8;:21;;;;;;;;:31;;;;;;;;19403:18;;;;13283:14;;;;;;;;;;;;13535:31;;;;;;13589:15;;13613:22;;;;13644:20;;;;13673:17;;;;13699:18;;;;13589:15;13726:17;;;13752:16;;;;;-1:-1:-1;;;;;13589:15:0;;;;-1:-1:-1;13613:22:0;;-1:-1:-1;13644:20:0;;-1:-1:-1;13673:17:0;-1:-1:-1;13699:18:0;-1:-1:-1;13726:17:0;;;-1:-1:-1;13752:16:0;;;-1:-1:-1;13163:618:0;;;;;;;;;;:::o;16940:286::-;-1:-1:-1;;;;;17045:21:0;;17018:24;17045:21;;;:8;:21;;;;;;;;:31;;;;;;;;19403:18;;;;17083:31;;;;;;17143:15;;-1:-1:-1;;;;;17143:15:0;17129:10;:29;17121:38;;;;;8926:508;9239:7;;9164:83;;;8471:89;9164:83;;;;6066:19:1;;;;-1:-1:-1;;6173:2:1;6169:15;;;6165:24;;6151:12;;;6144:46;6224:15;;;6220:24;6206:12;;;6199:46;6261:12;;;6254:28;;;6298:13;;;6291:29;;;6336:13;;;;6329:29;;;;9164:83:0;;;;;;;;;;6374:13:1;;;9164:83:0;;9154:94;;;;;;;;;6918:66:1;10876:58:0;;;6906:79:1;7001:12;;;;6994:28;;;10876:58:0;;;;;;;;;;7038:12:1;;;;10876:58:0;;;10858:83;;;;;;;;-1:-1:-1;;9154:94:0;9396:30;9257:48;9416:9;9396:19;:30::i;:::-;9389:37;8926:508;-1:-1:-1;;;;;;;;8926:508:0:o;14721:796::-;5518:4;5542:7;;;5796:9;5788:38;;;;-1:-1:-1;;;5788:38:0;;11323:2:1;5788:38:0;;;11305:21:1;11362:2;11342:18;;;11335:30;-1:-1:-1;;;11381:18:1;;;11374:46;11437:18;;5788:38:0;11295:166:1;5788:38:0;14939:10:::1;14964:37;14970:11:::0;14939:10;14992:8;14964:5:::1;:37::i;:::-;14956:46;;;::::0;::::1;;15060:11;::::0;:31:::1;::::0;-1:-1:-1;;;15060:31:0;;::::1;::::0;::::1;9343:25:1::0;;;15020:17:0::1;::::0;;;-1:-1:-1;;;;;15060:11:0;;::::1;::::0;:21:::1;::::0;9316:18:1;;15060:31:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15015:76;;;;;;15098:39;15106:11;15119:7;15128:8;15098:7;:39::i;:::-;15176:238;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;15176:238:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;15362:15:::1;15176:238:::0;;;;;::::1;;::::0;;;;15423:88:::1;15443:11:::0;15463:8;15176:238;15202:7;15423:11:::1;:88::i;:::-;5837:1;;;;14721:796:::0;;;;;:::o;17834:124::-;7106:7;7133:6;-1:-1:-1;;;;;7133:6:0;;;;;4803:10;7280:23;7272:68;;;;-1:-1:-1;;;7272:68:0;;;;;;;:::i;:::-;17916:16:::1;:36:::0;;-1:-1:-1;;;;;;17916:36:0::1;-1:-1:-1::0;;;;;17916:36:0;;;::::1;::::0;;;::::1;::::0;;17834:124::o;18498:240::-;7106:7;7133:6;-1:-1:-1;;;;;7133:6:0;;;;;4803:10;7280:23;7272:68;;;;-1:-1:-1;;;7272:68:0;;;;;;;:::i;:::-;18610:18:::1;18595:34;::::0;::::1;;;18587:43;;;::::0;::::1;;11668:5;18645:12;:23;;18637:32;;;::::0;::::1;;18676:29;::::0;;::::1;:15;:29:::0;;;:15;::::1;:29:::0;:15;:29;;18686:4:::1;18676:41;:56:::0;18498:240::o;15813:818::-;5518:4;5542:7;;;5796:9;5788:38;;;;-1:-1:-1;;;5788:38:0;;11323:2:1;5788:38:0;;;11305:21:1;11362:2;11342:18;;;11335:30;-1:-1:-1;;;11381:18:1;;;11374:46;11437:18;;5788:38:0;11295:166:1;5788:38:0;16006:10:::1;16017:9;;16006:21;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;16005:22;15997:61;;;::::0;-1:-1:-1;;;15997:61:0;;10212:2:1;15997:61:0::1;::::0;::::1;10194:21:1::0;10251:2;10231:18;;;10224:30;10290:28;10270:18;;;10263:56;10336:18;;15997:61:0::1;10184:176:1::0;15997:61:0::1;16154:6;::::0;16086:10:::1;16154:6;16122:17:::0;;;:5:::1;:17;::::0;;;;;;;;;16073:77;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;-1:-1:-1;;;;;16154:6:0;;::::1;::::0;16073:77:::1;::::0;16086:10;16098:11;;16111:9:::1;::::0;16122:17;16073:77;16140:9;;;;;;16073:77;::::1;16140:9:::0;;;;16073:77;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;16073:11:0::1;::::0;-1:-1:-1;;;16073:77:0:i:1;:::-;-1:-1:-1::0;;;;;16073:87:0::1;;16065:116;;;::::0;-1:-1:-1;;;16065:116:0;;11668:2:1;16065:116:0::1;::::0;::::1;11650:21:1::0;11707:2;11687:18;;;11680:30;-1:-1:-1;;;11726:18:1;;;11719:47;11783:18;;16065:116:0::1;11640:167:1::0;16065:116:0::1;16196:10;16190:17;::::0;;;:5:::1;:17;::::0;;;;:19;;;::::1;::::0;::::1;:::i;:::-;;;;;;16240:4;16216:10;16227:9;;16216:21;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:28;;-1:-1:-1;;16216:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;;;;;16267:21:0;::::1;-1:-1:-1::0;16267:21:0;;;:8:::1;:21:::0;;;;;:31;;;;;;;:39:::1;;::::0;16216:28:::1;16267:39;16374:55;16267:21:::0;16392:15;16267:31;16419:9:::1;16374:4;:55::i;:::-;-1:-1:-1::0;16468:11:0::1;::::0;-1:-1:-1;;;;;16445:35:0;;::::1;16468:11:::0;::::1;16445:35;16442:131;;;16494:8;16491:75;;;16515:11;::::0;:41:::1;::::0;-1:-1:-1;;;16515:41:0;;::::1;::::0;::::1;9343:25:1::0;;;-1:-1:-1;;;;;16515:11:0;;::::1;::::0;:31:::1;::::0;9316:18:1;;16515:41:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16491:75;16581:44;16591:11;16604:10;16616:8;16581:9;:44::i;:::-;5837:1;15813:818:::0;;;;;:::o;18968:243::-;7106:7;7133:6;-1:-1:-1;;;;;7133:6:0;;;;;4803:10;7280:23;7272:68;;;;-1:-1:-1;;;7272:68:0;;;;;;;:::i;:::-;19082:18:::1;19067:34;::::0;::::1;;;19059:43;;;::::0;::::1;;11668:5;19117:12;:23;;19109:32;;;::::0;::::1;;19148:30;::::0;;::::1;:16;:30:::0;;;:16;::::1;:30:::0;:16;:30;;:16;:42:::1;:57:::0;18968:243::o;18055:93::-;7106:7;7133:6;-1:-1:-1;;;;;7133:6:0;;;;;4803:10;7280:23;7272:68;;;;-1:-1:-1;;;7272:68:0;;;;;;;:::i;:::-;18122:8:::1;:20:::0;;-1:-1:-1;;;;;;18122:20:0::1;-1:-1:-1::0;;;;;18122:20:0;;;::::1;::::0;;;::::1;::::0;;18055:93::o;7960:192::-;7106:7;7133:6;-1:-1:-1;;;;;7133:6:0;;;;;4803:10;7280:23;7272:68;;;;-1:-1:-1;;;7272:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8049:22:0;::::1;8041:73;;;::::0;-1:-1:-1;;;8041:73:0;;10916:2:1;8041:73:0::1;::::0;::::1;10898:21:1::0;10955:2;10935:18;;;10928:30;10994:34;10974:18;;;10967:62;-1:-1:-1;;;11045:18:1;;;11038:36;11091:19;;8041:73:0::1;10888:228:1::0;8041:73:0::1;8125:19;8135:8;8125:9;:19::i;:::-;7960:192:::0;:::o;22884:238::-;22980:37;22995:11;23008:8;22980:14;:37::i;:::-;23024:41;23034:11;23047:7;23056:8;23024:9;:41::i;:::-;23077:39;;23107:8;;-1:-1:-1;;;;;23077:39:0;;;;;;;;22884:238;;;:::o;20093:423::-;20269:18;;;;20193:7;;;;20251:15;:36;20247:112;;;20333:18;;;;20315:36;;:15;:36;:::i;:::-;20298:53;;20247:112;20374:136;20403:8;:22;;;20434:8;:20;;;20463:8;:17;;;20489:14;20374:20;:136::i;:::-;20367:143;20093:423;-1:-1:-1;;;20093:423:0:o;8160:173::-;8216:16;8235:6;;-1:-1:-1;;;;;8252:17:0;;;8235:6;8252:17;;;-1:-1:-1;;;;;;8252:17:0;;;;;8285:40;;8235:6;;;;;;;8252:17;;8235:6;;8285:40;;;8160:173;;:::o;9747:855::-;9840:7;9859:9;9875;9891:7;9946:9;:16;9966:2;9946:22;9942:64;;9995:1;9979:19;;;;;;;9942:64;-1:-1:-1;;;10133:4:0;10118:20;;10112:27;10173:4;10158:20;;10152:27;10221:4;10206:20;;10200:27;10197:1;10192:36;10339:2;10335:6;;10331:36;;;10352:7;10357:2;10352:7;;:::i;:::-;;;10331:36;10439:1;:7;;10444:2;10439:7;;:18;;;;;10450:1;:7;;10455:2;10450:7;;10439:18;10435:162;;;10484:1;10468:19;;;;;;;10435:162;10565:24;;;;;;;;;;;;9606:25:1;;;9679:4;9667:17;;9647:18;;;9640:45;;;;9701:18;;;9694:34;;;9744:18;;;9737:34;;;10565:24:0;;9578:19:1;;10565:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10558:31;;;;;;;21588:225;21763:30;;-1:-1:-1;;;21763:30:0;;;;;9343:25:1;;;21684:4:0;;21736:11;;-1:-1:-1;;;;;21763:43:0;;;;:20;;;;;;9316:18:1;;21763:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21763:43:0;;;21588:225;-1:-1:-1;;;;;21588:225:0:o;23410:216::-;23562:58;;-1:-1:-1;;;23562:58:0;;-1:-1:-1;;;;;7527:15:1;;;23562:58:0;;;7509:34:1;23604:4:0;7559:18:1;;;7552:43;7611:18;;;7604:34;;;23537:11:0;;23562:25;;;;;;7444:18:1;;23562:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23410:216;;;;:::o;22026:565::-;22325:9;22304:8;:17;;;:30;;22296:39;;;;;;-1:-1:-1;;;;;22342:21:0;;;;;;;:8;:21;;;;;;;;:31;;;;;;;;;:42;;;;;;;-1:-1:-1;;;;;;22342:42:0;;;;;;;;;;-1:-1:-1;22342:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22342:42:0;;;;;;;;;;22398:187;;13118:25:1;;;13159:18;;;13152:34;13202:18;;;13195:34;;;;13265:32;;;13245:18;;;13238:60;22398:187:0;;22342:31;;22398:187;;;;;;;;;22026:565;;;;:::o;24230:1214::-;-1:-1:-1;;;;;24428:21:0;;24382:7;24428:21;;;:8;:21;;;;;;;;:31;;;;;;;;19403:18;;;;24468:31;;;;;;24506:14;24523:26;24540:8;24523:16;:26::i;:::-;24506:43;;24578:6;24564:10;:20;;24556:29;;;;;;24610:15;;;24673:17;;;24691:16;;;;-1:-1:-1;;;;;24610:15:0;;;;24673:17;;;;24691:16;;24715:37;24730:11;24743:8;24715:14;:37::i;:::-;24765:10;;24761:408;;24787:17;24806:12;24820:20;24844:65;24867:11;24879:9;24890:10;24902:6;24844:22;:65::i;:::-;24786:123;;-1:-1:-1;24786:123:0;-1:-1:-1;24786:123:0;-1:-1:-1;24923:11:0;;24920:60;;24953:8;;24945:35;;-1:-1:-1;;;;;24953:8:0;;;;24945:35;;;;;24972:7;;24953:8;24945:35;24953:8;24945:35;24972:7;24953:8;24945:35;;;;;;;;;;;;;;;;;;;;;24920:60;24994:19;;24991:75;;25024:42;;-1:-1:-1;;;;;25024:25:0;;;:42;;;;;25050:15;;25024:42;;;;25050:15;25024:25;:42;;;;;;;;;;;;;;;;;;;;;24991:75;25086:16;;25083:78;;25113:48;;-1:-1:-1;;;;;25113:34:0;;;:48;;;;;25148:12;;25113:48;;;;25148:12;25113:34;:48;;;;;;;;;;;;;;;;;;;;;25083:78;24761:408;;;;25194:6;25181:10;:19;25177:131;;;25211:18;25232:19;25245:6;25232:10;:19;:::i;:::-;25260:40;;25211;;-1:-1:-1;25268:10:0;;25260:40;;;;;25211;;25260;;;;25211;25268:10;25260:40;;;;;;;;;;;;;;;;;;;;;25177:131;;25321:95;;;12529:25:1;;;25399:10:0;12585:2:1;12570:18;;12563:60;25367:8:0;;-1:-1:-1;;;;;25321:95:0;;;;;12502:18:1;25321:95:0;;;;;;;-1:-1:-1;25432:6:0;;-1:-1:-1;;;;24230:1214:0;;;;;;;:::o;23906:218::-;24057:61;;-1:-1:-1;;;24057:61:0;;24091:4;24057:61;;;7509:34:1;-1:-1:-1;;;;;7579:15:1;;;7559:18;;;7552:43;7611:18;;;7604:34;;;24038:11:0;;24057:25;;;;;;7444:18:1;;24057:61:0;7426:218:1;22707:123:0;-1:-1:-1;;;;;22793:21:0;;;;;;;:8;:21;;;;;;;;:31;;;;;;;;;22786:38;;-1:-1:-1;;;;;;22786:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22786:38:0;;;22707:123::o;20762:586::-;20944:7;20985:9;20967:14;:27;20963:380;;-1:-1:-1;21012:12:0;21005:19;;20963:380;21047:24;21074:45;21104:14;21081:12;21074:45;:::i;:::-;21047:72;-1:-1:-1;21128:26:0;21209:9;21157:42;21184:14;21047:72;21157:42;:::i;:::-;:62;;;;:::i;:::-;21128:91;-1:-1:-1;21228:20:0;21251:44;21128:91;21258:14;21251:44;:::i;:::-;21228:67;-1:-1:-1;21306:29:0;;-1:-1:-1;;;21306:29:0;25450:576;25701:11;;25618:17;;;;;;-1:-1:-1;;;;;25678:35:0;;;25701:11;;25678:35;25675:93;;25724:36;;25675:93;25776:11;25790:28;25808:9;25790:17;:28::i;:::-;25849:21;;;;;;;:9;:21;;;;;;;;:28;;;;;;;;;;:40;;;25776:42;;-1:-1:-1;11668:5:0;;25841:48;;:5;:48;:::i;:::-;25840:60;;;;:::i;:::-;25926:21;;;;;;;:9;:21;;;;;;;;:28;;;;;;;;;;:35;25825:75;;-1:-1:-1;11668:5:0;;25918:43;;:5;:43;:::i;:::-;25917:55;;;;:::i;:::-;25907:65;-1:-1:-1;25997:22:0;25907:65;25997:12;:22;:::i;:::-;25988:32;;:5;:32;:::i;:::-;25979:41;;25450:576;;;;;;;;;;:::o;26032:186::-;26140:16;;26099:11;;-1:-1:-1;;;;;26128:28:0;;;26140:16;;26128:28;26127:85;;26194:17;26127:85;;;26166:18;26119:93;26032:186;-1:-1:-1;;26032:186:0:o;14:738:1:-;56:5;109:3;102:4;94:6;90:17;86:27;76:2;;131:5;124;117:20;76:2;171:6;158:20;197:18;234:2;230;227:10;224:2;;;240:18;;:::i;:::-;315:2;309:9;283:2;369:13;;-1:-1:-1;;365:22:1;;;389:2;361:31;357:40;345:53;;;413:18;;;433:22;;;410:46;407:2;;;459:18;;:::i;:::-;499:10;495:2;488:22;534:2;526:6;519:18;580:3;573:4;568:2;560:6;556:15;552:26;549:35;546:2;;;601:5;594;587:20;546:2;669;662:4;654:6;650:17;643:4;635:6;631:17;618:54;692:15;;;709:4;688:26;681:41;;;;-1:-1:-1;696:6:1;66:686;-1:-1:-1;;;66:686:1:o;757:156::-;823:20;;883:4;872:16;;862:27;;852:2;;903:1;900;893:12;852:2;804:109;;;:::o;918:257::-;977:6;1030:2;1018:9;1009:7;1005:23;1001:32;998:2;;;1051:6;1043;1036:22;998:2;1095:9;1082:23;1114:31;1139:5;1114:31;:::i;1180:261::-;1250:6;1303:2;1291:9;1282:7;1278:23;1274:32;1271:2;;;1324:6;1316;1309:22;1271:2;1361:9;1355:16;1380:31;1405:5;1380:31;:::i;1446:986::-;1543:6;1551;1559;1567;1575;1628:3;1616:9;1607:7;1603:23;1599:33;1596:2;;;1650:6;1642;1635:22;1596:2;1694:9;1681:23;1713:31;1738:5;1713:31;:::i;:::-;1763:5;-1:-1:-1;1820:2:1;1805:18;;1792:32;1833:33;1792:32;1833:33;:::i;:::-;1885:7;-1:-1:-1;1939:2:1;1924:18;;1911:32;;-1:-1:-1;1994:2:1;1979:18;;1966:32;2017:18;2047:14;;;2044:2;;;2079:6;2071;2064:22;2044:2;2122:6;2111:9;2107:22;2097:32;;2167:7;2160:4;2156:2;2152:13;2148:27;2138:2;;2194:6;2186;2179:22;2138:2;2239;2226:16;2265:2;2257:6;2254:14;2251:2;;;2286:6;2278;2271:22;2251:2;2336:7;2331:2;2322:6;2318:2;2314:15;2310:24;2307:37;2304:2;;;2362:6;2354;2347:22;2304:2;1586:846;;;;-1:-1:-1;1586:846:1;;-1:-1:-1;2398:2:1;2390:11;;2420:6;1586:846;-1:-1:-1;;;1586:846:1:o;2437:754::-;2541:6;2549;2557;2565;2573;2626:3;2614:9;2605:7;2601:23;2597:33;2594:2;;;2648:6;2640;2633:22;2594:2;2692:9;2679:23;2711:31;2736:5;2711:31;:::i;:::-;2761:5;-1:-1:-1;2818:2:1;2803:18;;2790:32;2831:33;2790:32;2831:33;:::i;:::-;2883:7;-1:-1:-1;2937:2:1;2922:18;;2909:32;;-1:-1:-1;2988:2:1;2973:18;;2960:32;;-1:-1:-1;3043:3:1;3028:19;;3015:33;3071:18;3060:30;;3057:2;;;3108:6;3100;3093:22;3057:2;3136:49;3177:7;3168:6;3157:9;3153:22;3136:49;:::i;:::-;3126:59;;;2584:607;;;;;;;;:::o;3196:325::-;3264:6;3272;3325:2;3313:9;3304:7;3300:23;3296:32;3293:2;;;3346:6;3338;3331:22;3293:2;3390:9;3377:23;3409:31;3434:5;3409:31;:::i;:::-;3459:5;3511:2;3496:18;;;;3483:32;;-1:-1:-1;;;3283:238:1:o;3526:531::-;3621:6;3629;3637;3645;3653;3706:3;3694:9;3685:7;3681:23;3677:33;3674:2;;;3728:6;3720;3713:22;3674:2;3772:9;3759:23;3791:31;3816:5;3791:31;:::i;:::-;3841:5;3893:2;3878:18;;3865:32;;-1:-1:-1;3944:2:1;3929:18;;3916:32;;3995:2;3980:18;;3967:32;;-1:-1:-1;4046:3:1;4031:19;4018:33;;-1:-1:-1;3664:393:1;-1:-1:-1;;;3664:393:1:o;4062:321::-;4125:6;4133;4186:2;4174:9;4165:7;4161:23;4157:32;4154:2;;;4207:6;4199;4192:22;4154:2;4251:9;4238:23;4270:28;4292:5;4270:28;:::i;:::-;4317:5;-1:-1:-1;4341:36:1;4373:2;4358:18;;4341:36;:::i;:::-;4331:46;;4144:239;;;;;:::o;4388:340::-;4456:6;4509:2;4497:9;4488:7;4484:23;4480:32;4477:2;;;4530:6;4522;4515:22;4477:2;4575:9;4562:23;4608:18;4600:6;4597:30;4594:2;;;4645:6;4637;4630:22;4594:2;4673:49;4714:7;4705:6;4694:9;4690:22;4673:49;:::i;5015:512::-;5109:6;5117;5125;5133;5186:3;5174:9;5165:7;5161:23;5157:33;5154:2;;;5208:6;5200;5193:22;5154:2;5242:9;5236:16;5226:26;;5292:2;5281:9;5277:18;5271:25;5261:35;;5339:2;5328:9;5324:18;5318:25;5352:31;5377:5;5352:31;:::i;:::-;5452:2;5437:18;;5431:25;5402:5;;-1:-1:-1;5465:30:1;5431:25;5465:30;:::i;:::-;5144:383;;;;-1:-1:-1;5144:383:1;;-1:-1:-1;;5144:383:1:o;5532:260::-;5598:6;5606;5659:2;5647:9;5638:7;5634:23;5630:32;5627:2;;;5680:6;5672;5665:22;5627:2;5708:27;5725:9;5708:27;:::i;6398:273::-;6581:6;6573;6568:3;6555:33;6537:3;6607:16;;6632:15;;;6607:16;6545:126;-1:-1:-1;6545:126:1:o;11812:356::-;12014:2;11996:21;;;12033:18;;;12026:30;12092:34;12087:2;12072:18;;12065:62;12159:2;12144:18;;11986:182::o;13309:267::-;13348:3;13376:11;;;13403:10;;-1:-1:-1;;;;;13422:27:1;;;13415:35;;13399:52;13396:2;;;13454:18;;:::i;:::-;-1:-1:-1;;;13501:19:1;;;13494:27;;13486:36;;13483:2;;;13525:18;;:::i;:::-;-1:-1:-1;;13561:9:1;;13356:220::o;13581:128::-;13621:3;13652:1;13648:6;13645:1;13642:13;13639:2;;;13658:18;;:::i;:::-;-1:-1:-1;13694:9:1;;13629:80::o;13714:204::-;13752:3;13788:4;13785:1;13781:12;13820:4;13817:1;13813:12;13855:3;13849:4;13845:14;13840:3;13837:23;13834:2;;;13863:18;;:::i;:::-;13899:13;;13760:158;-1:-1:-1;;;13760:158:1:o;13923:193::-;13962:1;13988;13978:2;;13993:18;;:::i;:::-;-1:-1:-1;;;14029:18:1;;-1:-1:-1;;14049:13:1;;14025:38;14022:2;;;14066:18;;:::i;:::-;-1:-1:-1;14100:10:1;;13968:148::o;14121:120::-;14161:1;14187;14177:2;;14192:18;;:::i;:::-;-1:-1:-1;14226:9:1;;14167:74::o;14246:577::-;14285:7;-1:-1:-1;;;;;14355:15:1;;;14389;;;14420:11;;;14439:10;;;14433:17;;14416:35;14413:2;;;14454:18;;:::i;:::-;-1:-1:-1;;;14523:15:1;;;14554:11;;;14574;;;14567:19;;14550:37;14547:2;;;14590:18;;:::i;:::-;14636:7;14633:1;14629:15;14619:25;;14689:1;14685:2;14680:11;14677:1;14673:19;14668:2;14664;14660:11;14656:37;14653:2;;;14696:18;;:::i;:::-;14761:1;14757:2;14752:11;14749:1;14745:19;14740:2;14736;14732:11;14728:37;14725:2;;;14768:18;;:::i;:::-;-1:-1:-1;;;14808:9:1;;;;;14297:526;-1:-1:-1;;;14297:526:1:o;14828:168::-;14868:7;14934:1;14930;14926:6;14922:14;14919:1;14916:21;14911:1;14904:9;14897:17;14893:45;14890:2;;;14941:18;;:::i;:::-;-1:-1:-1;14981:9:1;;14880:116::o;15001:270::-;15040:4;15069:12;;;15097:10;;-1:-1:-1;;;15116:19:1;;15109:27;;15093:44;15090:2;;;15140:18;;:::i;:::-;-1:-1:-1;;;;;15187:27:1;;15180:35;;15172:44;;15169:2;;;15219:18;;:::i;:::-;-1:-1:-1;;15256:9:1;;15049:222::o;15276:125::-;15316:4;15344:1;15341;15338:8;15335:2;;;15349:18;;:::i;:::-;-1:-1:-1;15386:9:1;;15325:76::o;15406:135::-;15445:3;-1:-1:-1;;15466:17:1;;15463:2;;;15486:18;;:::i;:::-;-1:-1:-1;15533:1:1;15522:13;;15453:88::o;15546:127::-;15607:10;15602:3;15598:20;15595:1;15588:31;15638:4;15635:1;15628:15;15662:4;15659:1;15652:15;15678:127;15739:10;15734:3;15730:20;15727:1;15720:31;15770:4;15767:1;15760:15;15794:4;15791:1;15784:15;15810:127;15871:10;15866:3;15862:20;15859:1;15852:31;15902:4;15899:1;15892:15;15926:4;15923:1;15916:15;15942:131;-1:-1:-1;;;;;16017:31:1;;16007:42;;15997:2;;16063:1;16060;16053:12;16078:118;16164:5;16157:13;16150:21;16143:5;16140:32;16130:2;;16186:1;16183;16176:12

Swarm Source

ipfs://1e09caea2adf39f5e6db9958e80479ea072e800c16c71c204880ad86a779c925
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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