ETH Price: $2,701.64 (-0.16%)

Contract

0xaD7Ce050E176fDF23520330f0E7F342276b3c891
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Make Order_175711182023-06-27 13:55:47598 days ago1687874147IN
0xaD7Ce050...276b3c891
0 ETH0.0012828415.66165466
Make Order_172831872023-05-18 1:30:47639 days ago1684373447IN
0xaD7Ce050...276b3c891
0 ETH0.0042551251.94119893
Make Order_172814682023-05-17 19:40:59639 days ago1684352459IN
0xaD7Ce050...276b3c891
0 ETH0.0042217251.5409612
Make Order_172795482023-05-17 13:08:23639 days ago1684328903IN
0xaD7Ce050...276b3c891
0 ETH0.0042391251.74584984
Make Order_172795432023-05-17 13:07:23639 days ago1684328843IN
0xaD7Ce050...276b3c891
0 ETH0.0047370257.82354538
Make Order_172795342023-05-17 13:05:35639 days ago1684328735IN
0xaD7Ce050...276b3c891
0 ETH0.0041711550.91613323
Make Order_172795272023-05-17 13:04:11639 days ago1684328651IN
0xaD7Ce050...276b3c891
0 ETH0.0044883354.79588745
Make Order_170872152023-04-20 10:48:35666 days ago1681987715IN
0xaD7Ce050...276b3c891
0 ETH0.0037082745.25264276
Make Order_169657212023-04-03 3:03:35684 days ago1680491015IN
0xaD7Ce050...276b3c891
0 ETH0.0014785718.05122294
Make Order_168871082023-03-23 1:52:59695 days ago1679536379IN
0xaD7Ce050...276b3c891
0 ETH0.0010594312.93219855
Make Order_168746212023-03-21 7:46:11697 days ago1679384771IN
0xaD7Ce050...276b3c891
0 ETH0.0012044214.7
Make Order_168229032023-03-14 1:23:35704 days ago1678757015IN
0xaD7Ce050...276b3c891
0 ETH0.0014567417.78207983
Make Order_166684282023-02-20 7:59:11726 days ago1676879951IN
0xaD7Ce050...276b3c891
0 ETH0.0016739920.43702314
Make Order_166655642023-02-19 22:20:47726 days ago1676845247IN
0xaD7Ce050...276b3c891
0 ETH0.0017869221.80937468
Make Order_166655462023-02-19 22:16:59726 days ago1676845019IN
0xaD7Ce050...276b3c891
0 ETH0.0017226321.02774656
Make Order_165882992023-02-09 2:44:59737 days ago1675910699IN
0xaD7Ce050...276b3c891
0 ETH0.0025290230.87116376
Make Order_165047112023-01-28 10:26:35748 days ago1674901595IN
0xaD7Ce050...276b3c891
0 ETH0.0011674114.25031249
Make Order_164703642023-01-23 15:20:59753 days ago1674487259IN
0xaD7Ce050...276b3c891
0 ETH0.0016386820
Make Order_164701972023-01-23 14:47:23753 days ago1674485243IN
0xaD7Ce050...276b3c891
0 ETH0.0012080114.75019236
Make Order_164701792023-01-23 14:43:47753 days ago1674485027IN
0xaD7Ce050...276b3c891
0 ETH0.0013703816.73031905
Make Order_163430812023-01-05 20:50:23771 days ago1672951823IN
0xaD7Ce050...276b3c891
0 ETH0.0016912720.64801234
Cancel Order_163152412023-01-01 23:35:47775 days ago1672616147IN
0xaD7Ce050...276b3c891
0 ETH0.0010132314.5023038
Make Order_163152212023-01-01 23:31:47775 days ago1672615907IN
0xaD7Ce050...276b3c891
0 ETH0.0012612115.39536725
Make Order_163006302022-12-30 22:41:23777 days ago1672440083IN
0xaD7Ce050...276b3c891
0 ETH0.0025463631.08277663
Make Order_162882292022-12-29 5:08:11779 days ago1672290491IN
0xaD7Ce050...276b3c891
0 ETH0.0012379914.85317828
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
160909392022-12-01 15:46:23806 days ago1669909583
0xaD7Ce050...276b3c891
0.012 ETH
160909372022-12-01 15:45:59806 days ago1669909559
0xaD7Ce050...276b3c891
0.04 ETH
160909362022-12-01 15:45:47806 days ago1669909547
0xaD7Ce050...276b3c891
0.041 ETH
160909312022-12-01 15:44:47806 days ago1669909487
0xaD7Ce050...276b3c891
0.01 ETH
160909302022-12-01 15:44:35806 days ago1669909475
0xaD7Ce050...276b3c891
0.035 ETH
160909282022-12-01 15:44:11806 days ago1669909451
0xaD7Ce050...276b3c891
0.04 ETH
160909282022-12-01 15:44:11806 days ago1669909451
0xaD7Ce050...276b3c891
0.04 ETH
160909282022-12-01 15:44:11806 days ago1669909451
0xaD7Ce050...276b3c891
0.013 ETH
160909252022-12-01 15:43:35806 days ago1669909415
0xaD7Ce050...276b3c891
0.04 ETH
160909252022-12-01 15:43:35806 days ago1669909415
0xaD7Ce050...276b3c891
0.02 ETH
160909242022-12-01 15:43:23806 days ago1669909403
0xaD7Ce050...276b3c891
0.013 ETH
160794802022-11-30 1:19:47808 days ago1669771187
0xaD7Ce050...276b3c891
0.00001 ETH
160794432022-11-30 1:12:23808 days ago1669770743
0xaD7Ce050...276b3c891
0.00001 ETH
160768552022-11-29 16:31:35808 days ago1669739495
0xaD7Ce050...276b3c891
0.13 ETH
160768482022-11-29 16:30:11808 days ago1669739411
0xaD7Ce050...276b3c891
0.108 ETH
160768062022-11-29 16:21:47808 days ago1669738907
0xaD7Ce050...276b3c891
0.09 ETH
160766522022-11-29 15:50:35808 days ago1669737035
0xaD7Ce050...276b3c891
0.041 ETH
160766502022-11-29 15:50:11808 days ago1669737011
0xaD7Ce050...276b3c891
0.023 ETH
160766482022-11-29 15:49:47808 days ago1669736987
0xaD7Ce050...276b3c891
0.02 ETH
160766472022-11-29 15:49:35808 days ago1669736975
0xaD7Ce050...276b3c891
0.013 ETH
160766452022-11-29 15:49:11808 days ago1669736951
0xaD7Ce050...276b3c891
0.04 ETH
160766432022-11-29 15:48:47808 days ago1669736927
0xaD7Ce050...276b3c891
0.035 ETH
160766432022-11-29 15:48:47808 days ago1669736927
0xaD7Ce050...276b3c891
0.04 ETH
160766412022-11-29 15:48:23808 days ago1669736903
0xaD7Ce050...276b3c891
0.013 ETH
160766382022-11-29 15:47:47808 days ago1669736867
0xaD7Ce050...276b3c891
0.012 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NiftyConnectExchange

Compiler Version
v0.4.26+commit.4563c3fc

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-24
*/

// File: contracts/ArrayUtils.sol

pragma solidity 0.4.26;

library ArrayUtils {

    /**
     * Replace bytes in an array with bytes in another array, guarded by a bitmask
     * Efficiency of this function is a bit unpredictable because of the EVM's word-specific model (arrays under 32 bytes will be slower)
     *
     * @dev Mask must be the size of the byte array. A nonzero byte means the byte array can be changed.
     * @param array The original array
     * @param desired The target array
     * @param mask The mask specifying which bits can be changed
     * @return The updated byte array (the parameter will be modified inplace)
     */
    function guardedArrayReplace(bytes memory array, bytes memory desired, bytes memory mask)
    internal
    pure
    {
        require(array.length == desired.length);
        require(array.length == mask.length);

        uint words = array.length / 0x20;
        uint index = words * 0x20;
        assert(index / 0x20 == words);
        uint i;

        for (i = 0; i < words; i++) {
            /* Conceptually: array[i] = (!mask[i] && array[i]) || (mask[i] && desired[i]), bitwise in word chunks. */
            assembly {
                let commonIndex := mul(0x20, add(1, i))
                let maskValue := mload(add(mask, commonIndex))
                mstore(add(array, commonIndex), or(and(not(maskValue), mload(add(array, commonIndex))), and(maskValue, mload(add(desired, commonIndex)))))
            }
        }

        /* Deal with the last section of the byte array. */
        if (words > 0) {
            /* This overlaps with bytes already set but is still more efficient than iterating through each of the remaining bytes individually. */
            i = words;
            assembly {
                let commonIndex := mul(0x20, add(1, i))
                let maskValue := mload(add(mask, commonIndex))
                mstore(add(array, commonIndex), or(and(not(maskValue), mload(add(array, commonIndex))), and(maskValue, mload(add(desired, commonIndex)))))
            }
        } else {
            /* If the byte array is shorter than a word, we must unfortunately do the whole thing bytewise.
               (bounds checks could still probably be optimized away in assembly, but this is a rare case) */
            for (i = index; i < array.length; i++) {
                array[i] = ((mask[i] ^ 0xff) & array[i]) | (mask[i] & desired[i]);
            }
        }
    }

    /**
     * Test if two arrays are equal
     * @param a First array
     * @param b Second array
     * @return Whether or not all bytes in the arrays are equal
     */
    function arrayEq(bytes memory a, bytes memory b)
    internal
    pure
    returns (bool)
    {
        return keccak256(a) == keccak256(b);
    }

    /**
     * Unsafe write byte array into a memory location
     *
     * @param index Memory location
     * @param source Byte array to write
     * @return End memory index
     */
    function unsafeWriteBytes(uint index, bytes source)
    internal
    pure
    returns (uint)
    {
        if (source.length > 0) {
            assembly {
                let length := mload(source)
                let end := add(source, add(0x20, length))
                let arrIndex := add(source, 0x20)
                let tempIndex := index
                for { } eq(lt(arrIndex, end), 1) {
                    arrIndex := add(arrIndex, 0x20)
                    tempIndex := add(tempIndex, 0x20)
                } {
                    mstore(tempIndex, mload(arrIndex))
                }
                index := add(index, length)
            }
        }
        return index;
    }

    /**
     * Unsafe write address into a memory location
     *
     * @param index Memory location
     * @param source Address to write
     * @return End memory index
     */
    function unsafeWriteAddress(uint index, address source)
    internal
    pure
    returns (uint)
    {
        uint conv = uint(source) << 0x60;
        assembly {
            mstore(index, conv)
            index := add(index, 0x14)
        }
        return index;
    }

    /**
     * Unsafe write address into a memory location using entire word
     *
     * @param index Memory location
     * @param source uint to write
     * @return End memory index
     */
    function unsafeWriteAddressWord(uint index, address source)
    internal
    pure
    returns (uint)
    {
        assembly {
            mstore(index, source)
            index := add(index, 0x20)
        }
        return index;
    }

    /**
     * Unsafe write uint into a memory location
     *
     * @param index Memory location
     * @param source uint to write
     * @return End memory index
     */
    function unsafeWriteUint(uint index, uint source)
    internal
    pure
    returns (uint)
    {
        assembly {
            mstore(index, source)
            index := add(index, 0x20)
        }
        return index;
    }

    /**
     * Unsafe write uint8 into a memory location
     *
     * @param index Memory location
     * @param source uint8 to write
     * @return End memory index
     */
    function unsafeWriteUint8(uint index, uint8 source)
    internal
    pure
    returns (uint)
    {
        assembly {
            mstore8(index, source)
            index := add(index, 0x1)
        }
        return index;
    }

    /**
     * Unsafe write uint8 into a memory location using entire word
     *
     * @param index Memory location
     * @param source uint to write
     * @return End memory index
     */
    function unsafeWriteUint8Word(uint index, uint8 source)
    internal
    pure
    returns (uint)
    {
        assembly {
            mstore(index, source)
            index := add(index, 0x20)
        }
        return index;
    }

    /**
     * Unsafe write bytes32 into a memory location using entire word
     *
     * @param index Memory location
     * @param source uint to write
     * @return End memory index
     */
    function unsafeWriteBytes32(uint index, bytes32 source)
    internal
    pure
    returns (uint)
    {
        assembly {
            mstore(index, source)
            index := add(index, 0x20)
        }
        return index;
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.4.24;

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
  function totalSupply() external view returns (uint256);

  function balanceOf(address who) external view returns (uint256);

  function allowance(address owner, address spender)
    external view returns (uint256);

  function transfer(address to, uint256 value) external returns (bool);

  function approve(address spender, uint256 value)
    external returns (bool);

  function transferFrom(address from, address to, uint256 value)
    external returns (bool);

  event Transfer(
    address indexed from,
    address indexed to,
    uint256 value
  );

  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.4.24;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, reverts on 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-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b > 0); // Solidity only automatically asserts when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a);
    uint256 c = a - b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}

// File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol

pragma solidity ^0.4.24;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {

  using SafeMath for uint256;

  function safeTransfer(
    IERC20 token,
    address to,
    uint256 value
  )
    internal
  {
    require(token.transfer(to, value));
  }

  function safeTransferFrom(
    IERC20 token,
    address from,
    address to,
    uint256 value
  )
    internal
  {
    require(token.transferFrom(from, to, value));
  }

  function safeApprove(
    IERC20 token,
    address spender,
    uint256 value
  )
    internal
  {
    // safeApprove should only be called when setting an initial allowance, 
    // or when resetting it to zero. To increase and decrease it, use 
    // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
    require((value == 0) || (token.allowance(address(this), spender) == 0));
    require(token.approve(spender, value));
  }

  function safeIncreaseAllowance(
    IERC20 token,
    address spender,
    uint256 value
  )
    internal
  {
    uint256 newAllowance = token.allowance(address(this), spender).add(value);
    require(token.approve(spender, newAllowance));
  }

  function safeDecreaseAllowance(
    IERC20 token,
    address spender,
    uint256 value
  )
    internal
  {
    uint256 newAllowance = token.allowance(address(this), spender).sub(value);
    require(token.approve(spender, newAllowance));
  }
}

// File: contracts/TokenTransferProxy.sol

pragma solidity 0.4.26;



contract TokenTransferProxy {
    using SafeERC20 for IERC20;

    /* Whether initialized. */
    bool public initialized = false;

    address public exchangeAddress;

    function initialize (address _exchangeAddress)
    public
    {
        require(!initialized);
        initialized = true;
        exchangeAddress = _exchangeAddress;
    }
    /**
     * Call ERC20 `transferFrom`
     *
     * @dev Authenticated contract only
     * @param token IERC20 token address
     * @param from From address
     * @param to To address
     * @param amount Transfer amount
     */
    function transferFrom(address token, address from, address to, uint amount)
    public
    returns (bool)
    {
        require(msg.sender==exchangeAddress, "not authorized");
        IERC20(token).safeTransferFrom(from, to, amount);
        return true;
    }

}

// File: contracts/IERC2981.sol

pragma solidity 0.4.26;

///
/// @dev Interface for the NFT Royalty Standard
///

interface IERC2981 {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount);
}

// File: contracts/IRoyaltyRegisterHub.sol

pragma solidity 0.4.26;

///
/// @dev Interface for the NFT Royalty Standard
///

interface IRoyaltyRegisterHub {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _nftAddress - the NFT contract address
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(address _nftAddress, uint256 _salePrice)  external view returns (address receiver, uint256 royaltyAmount);
}

// File: contracts/ReentrancyGuarded.sol

pragma solidity 0.4.26;

contract ReentrancyGuarded {

    bool reentrancyLock = false;

    /* Prevent a contract function from being reentrant-called. */
    modifier reentrancyGuard {
        if (reentrancyLock) {
            revert();
        }
        reentrancyLock = true;
        _;
        reentrancyLock = false;
    }

}

// File: contracts/Ownable.sol

pragma solidity 0.4.26;

contract Ownable {
    address public owner;

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


    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor() public {
        owner = msg.sender;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0));
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(owner);
        owner = address(0);
    }
}

// File: contracts/Governable.sol

pragma solidity 0.4.26;

contract Governable {
    address public governor;
    address public pendingGovernor;

    event GovernanceTransferred(
        address indexed previousGovernor,
        address indexed newGovernor
    );
    event NewPendingGovernor(address indexed newPendingGovernor);


    /**
     * @dev The Governable constructor sets the original `governor` of the contract to the sender
     * account.
     */
    constructor() public {
        governor = msg.sender;
    }

    /**
     * @dev Throws if called by any account other than the governor.
     */
    modifier onlyGovernor() {
        require(msg.sender == governor);
        _;
    }

    function acceptGovernance() external {
        require(msg.sender == pendingGovernor, "acceptGovernance: Call must come from pendingGovernor.");
        address previousGovernor = governor;
        governor = msg.sender;
        pendingGovernor = address(0);

        emit GovernanceTransferred(previousGovernor, governor);
    }

    function setPendingGovernor(address pendingGovernor_) external {
        require(msg.sender == governor, "setPendingGovernor: Call must come from governor.");
        pendingGovernor = pendingGovernor_;

        emit NewPendingGovernor(pendingGovernor);
    }
}

// File: contracts/SaleKindInterface.sol

pragma solidity 0.4.26;


library SaleKindInterface {

    /**
     * Side: buy or sell.
     */
    enum Side { Buy, Sell }

    /**
     * Currently supported kinds of sale: fixed price, Dutch auction.
     * English auctions cannot be supported without stronger escrow guarantees.
     * Future interesting options: Vickrey auction, nonlinear Dutch auctions.
     */
    enum SaleKind { FixedPrice, DutchAuction }

    /**
     * @dev Check whether the parameters of a sale are valid
     * @param saleKind Kind of sale
     * @param expirationTime Order expiration time
     * @return Whether the parameters were valid
     */
    function validateParameters(SaleKind saleKind, uint expirationTime)
    pure
    internal
    returns (bool)
    {
        /* Auctions must have a set expiration date. */
        return (saleKind == SaleKind.FixedPrice || expirationTime > 0);
    }

    /**
     * @dev Return whether or not an order can be settled
     * @dev Precondition: parameters have passed validateParameters
     * @param listingTime Order listing time
     * @param expirationTime Order expiration time
     */
    function canSettleOrder(uint listingTime, uint expirationTime)
    view
    internal
    returns (bool)
    {
        return (listingTime < now) && (expirationTime == 0 || now < expirationTime);
    }

    /**
     * @dev Calculate the settlement price of an order
     * @dev Precondition: parameters have passed validateParameters.
     * @param side Order side
     * @param saleKind Method of sale
     * @param basePrice Order base price
     * @param extra Order extra price data
     * @param listingTime Order listing time
     * @param expirationTime Order expiration time
     */
    function calculateFinalPrice(Side side, SaleKind saleKind, uint basePrice, uint extra, uint listingTime, uint expirationTime)
    view
    internal
    returns (uint finalPrice)
    {
        if (saleKind == SaleKind.FixedPrice) {
            return basePrice;
        } else if (saleKind == SaleKind.DutchAuction) {
            uint diff = SafeMath.div(SafeMath.mul(extra, SafeMath.sub(now, listingTime)), SafeMath.sub(expirationTime, listingTime));
            if (side == Side.Sell) {
                /* Sell-side - start price: basePrice. End price: basePrice - extra. */
                return SafeMath.sub(basePrice, diff);
            } else {
                /* Buy-side - start price: basePrice. End price: basePrice + extra. */
                return SafeMath.add(basePrice, diff);
            }
        }
    }

}

// File: contracts/ExchangeCore.sol

pragma solidity 0.4.26;









contract ExchangeCore is ReentrancyGuarded, Ownable, Governable {
    string public constant name = "NiftyConnect Exchange Contract";
    string public constant version = "1.0";

    // NOTE: these hashes are derived and verified in the constructor.
    bytes32 private constant _EIP_712_DOMAIN_TYPEHASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;
    bytes32 private constant _NAME_HASH = 0x97b3fae253daa304aa40063e4f71c3efec8d260848d7379fc623e35f84c73f47;
    bytes32 private constant _VERSION_HASH = 0xe6bbd6277e1bf288eed5e8d1780f9a50b239e86b153736bceebccf4ea79d90b3;
    bytes32 private constant _ORDER_TYPEHASH = 0xf446866267029076a71bb126e250b9480cd4ac2699baa745a582b10b361ec951;

    bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; // bytes4(keccak256("royaltyInfo(uint256,uint256)"));
    bytes4 private constant _EIP_165_SUPPORT_INTERFACE = 0x01ffc9a7; // bytes4(keccak256("supportsInterface(bytes4)"));

    //    // NOTE: chainId opcode is not supported in solidiy 0.4.x; here we hardcode as 56.
    // In order to protect against orders that are replayable across forked chains,
    // either the solidity version needs to be bumped up or it needs to be retrieved
    // from another contract.
    uint256 private constant _CHAIN_ID = 1;

    // Note: the domain separator is derived and verified in the constructor. */
    bytes32 public constant DOMAIN_SEPARATOR = 0x048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a21;

    uint256 public constant MAXIMUM_EXCHANGE_RATE = 500; //5%

    /* Token transfer proxy. */
    TokenTransferProxy public tokenTransferProxy;

    /* Cancelled / finalized orders, by hash. */
    mapping(bytes32 => bool) public cancelledOrFinalized;

    /* Orders verified by on-chain approval (alternative to ECDSA signatures so that smart contracts can place orders directly). */
    /* Note that the maker's nonce at the time of approval **plus one** is stored in the mapping. */
    mapping(bytes32 => uint256) private _approvedOrdersByNonce;

    /* Track per-maker nonces that can be incremented by the maker to cancel orders in bulk. */
    // The current nonce for the maker represents the only valid nonce that can be signed by the maker
    // If a signature was signed with a nonce that's different from the one stored in nonces, it
    // will fail validation.
    mapping(address => uint256) public nonces;

    /* Required protocol taker fee, in basis points. Paid to takerRelayerFeeRecipient, makerRelayerFeeRecipient and protocol owner */
    /* Initial rate 2% */
    uint public exchangeFeeRate = 0;

    /* Share of exchangeFee which will be paid to takerRelayerFeeRecipient, in basis points. */
    /* Initial share 15% */
    uint public takerRelayerFeeShare = 1500;

    /* Share of exchangeFee which will be paid to makerRelayerFeeRecipient, in basis points. */
    /* Initial share 80% */
    uint public makerRelayerFeeShare = 8000;

    /* Share of exchangeFee which will be paid to protocolFeeRecipient, in basis points. */
    /* Initial share 5% */
    uint public protocolFeeShare = 500;

    /* Recipient of protocol fees. */
    address public protocolFeeRecipient;

    /* Inverse basis point. */
    uint public constant INVERSE_BASIS_POINT = 10000;

    /*  */
    address public merkleValidatorContract;

    /*  */
    address public royaltyRegisterHub;

    /* An order on the exchange. */
    struct Order {
        /* Exchange address, intended as a versioning mechanism. */
        address exchange;
        /* Order maker address. */
        address maker;
        /* Order taker address, if specified. */
        address taker;
        /*  Order fee recipient or zero address for taker order. */
        address makerRelayerFeeRecipient;
        /*  Taker order fee recipient */
        address takerRelayerFeeRecipient;
        /* Side (buy/sell). */
        SaleKindInterface.Side side;
        /* Kind of sale. */
        SaleKindInterface.SaleKind saleKind;
        /* nftAddress. */
        address nftAddress;
        /* nft tokenId. */
        uint tokenId;
        /* Calldata. */
        bytes calldata;
        /* Calldata replacement pattern, or an empty byte array for no replacement. */
        bytes replacementPattern;
        /* Static call target, zero-address for no static call. */
        address staticTarget;
        /* Static call extra data. */
        bytes staticExtradata;
        /* Token used to pay for the order, or the zero-address as a sentinel value for Ether. */
        address paymentToken;
        /* Base price of the order (in paymentTokens). */
        uint basePrice;
        /* Auction extra parameter - minimum bid increment for English auctions, starting/ending price difference. */
        uint extra;
        /* Listing timestamp. */
        uint listingTime;
        /* Expiration timestamp - 0 for no expiry. */
        uint expirationTime;
        /* Order salt, used to prevent duplicate hashes. */
        uint salt;
        /* NOTE: uint nonce is an additional component of the order but is read from storage */
    }

    event OrderApprovedPartOne    (bytes32 indexed hash, address exchange, address indexed maker, address taker, address indexed makerRelayerFeeRecipient, SaleKindInterface.Side side, SaleKindInterface.SaleKind saleKind, address nftAddress, uint256 tokenId, bytes32 ipfsHash);
    event OrderApprovedPartTwo    (bytes32 indexed hash, bytes calldata, bytes replacementPattern, address staticTarget, bytes staticExtradata, address paymentToken, uint basePrice, uint extra, uint listingTime, uint expirationTime, uint salt);
    event OrderCancelled          (bytes32 indexed hash);
    event OrdersMatched           (bytes32 buyHash, bytes32 sellHash, address indexed maker, address indexed taker, address makerRelayerFeeRecipient, address takerRelayerFeeRecipient, uint price, bytes32 indexed metadata);
    event NonceIncremented        (address indexed maker, uint newNonce);

    constructor () public {
        require(keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") == _EIP_712_DOMAIN_TYPEHASH);
        require(keccak256(bytes(name)) == _NAME_HASH);
        require(keccak256(bytes(version)) == _VERSION_HASH);
        require(keccak256("Order(address exchange,address maker,address taker,address makerRelayerFeeRecipient,address takerRelayerFeeRecipient,uint8 side,uint8 saleKind,address nftAddress,uint tokenId,bytes32 merkleRoot,bytes calldata,bytes replacementPattern,address staticTarget,bytes staticExtradata,address paymentToken,uint256 basePrice,uint256 extra,uint256 listingTime,uint256 expirationTime,uint256 salt,uint256 nonce)") == _ORDER_TYPEHASH);
        require(DOMAIN_SEPARATOR == _deriveDomainSeparator());
    }

    /**
     * @dev Derive the domain separator for EIP-712 signatures.
     * @return The domain separator.
     */
    function _deriveDomainSeparator() private view returns (bytes32) {
        return keccak256(
            abi.encode(
            _EIP_712_DOMAIN_TYPEHASH, // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")
            _NAME_HASH, // keccak256("NiftyConnect Exchange Contract")
            _VERSION_HASH, // keccak256(bytes("1.0"))
            _CHAIN_ID,
            address(this)
        )); // NOTE: this is fixed, need to use solidity 0.5+ or make external call to support!
    }

    function checkRoyalties(address _contract) internal returns (bool) {
        bool success;
        bytes memory data = abi.encodeWithSelector(_EIP_165_SUPPORT_INTERFACE, _INTERFACE_ID_ERC2981);
        bytes memory result = new bytes(32);
        assembly {
            success := call(
                gas,            // gas remaining
                _contract,      // destination address
                0,              // no ether
                add(data, 32),  // input buffer (starts after the first 32 bytes in the `data` array)
                mload(data),    // input length (loaded from the first 32 bytes in the `data` array)
                result,         // output buffer
                32              // output length
            )
        }
        if (!success) {
            return false;
        }
        bool supportERC2981;
        assembly {
            supportERC2981 := mload(result)
        }
        return supportERC2981;
    }

    /**
     * Increment a particular maker's nonce, thereby invalidating all orders that were not signed
     * with the original nonce.
     */
    function incrementNonce() external {
        uint newNonce = ++nonces[msg.sender];
        emit NonceIncremented(msg.sender, newNonce);
    }

    /**
     * @dev Change the exchange fee rate
     * @param newExchangeFeeRate New fee to set in basis points
     */
    function changeExchangeFeeRate(uint newExchangeFeeRate)
    public
    onlyGovernor
    {
        require(newExchangeFeeRate<=MAXIMUM_EXCHANGE_RATE, "invalid exchange fee rate");
        exchangeFeeRate = newExchangeFeeRate;
    }

    /**
     * @dev Change the taker fee paid to the taker relayer (owner only)
     * @param newTakerRelayerFeeShare New fee to set in basis points
     * @param newMakerRelayerFeeShare New fee to set in basis points
     * @param newProtocolFeeShare New fee to set in basis points
     */
    function changeTakerRelayerFeeShare(uint newTakerRelayerFeeShare, uint newMakerRelayerFeeShare, uint newProtocolFeeShare)
    public
    onlyGovernor
    {
        require(SafeMath.add(SafeMath.add(newTakerRelayerFeeShare, newMakerRelayerFeeShare), newProtocolFeeShare) == INVERSE_BASIS_POINT, "invalid new fee share");
        takerRelayerFeeShare = newTakerRelayerFeeShare;
        makerRelayerFeeShare = newMakerRelayerFeeShare;
        protocolFeeShare = newProtocolFeeShare;
    }

    /**
     * @dev Change the protocol fee recipient (owner only)
     * @param newProtocolFeeRecipient New protocol fee recipient address
     */
    function changeProtocolFeeRecipient(address newProtocolFeeRecipient)
    public
    onlyOwner
    {
        protocolFeeRecipient = newProtocolFeeRecipient;
    }

    /**
     * @dev Transfer tokens
     * @param token Token to transfer
     * @param from Address to charge fees
     * @param to Address to receive fees
     * @param amount Amount of protocol tokens to charge
     */
    function transferTokens(address token, address from, address to, uint amount)
    internal
    {
        if (amount > 0) {
            require(tokenTransferProxy.transferFrom(token, from, to, amount));
        }
    }

    /**
     * @dev Execute a STATICCALL (introduced with Ethereum Metropolis, non-state-modifying external call)
     * @param target Contract to call
     * @param calldata Calldata (appended to extradata)
     * @param extradata Base data for STATICCALL (probably function selector and argument encoding)
     * @return The result of the call (success or failure)
     */
    function staticCall(address target, bytes memory calldata, bytes memory extradata)
    public
    view
    returns (bool result)
    {
        bytes memory combined = new bytes(calldata.length + extradata.length);
        uint index;
        assembly {
            index := add(combined, 0x20)
        }
        index = ArrayUtils.unsafeWriteBytes(index, extradata);
        ArrayUtils.unsafeWriteBytes(index, calldata);
        assembly {
            result := staticcall(gas, target, add(combined, 0x20), mload(combined), mload(0x40), 0)
        }
        return result;
    }

    /**
     * @dev Hash an order, returning the canonical EIP-712 order hash without the domain separator
     * @param order Order to hash
     * @param nonce maker nonce to hash
     * @return Hash of order
     */
    function hashOrder(Order memory order, uint nonce)
    internal
    pure
    returns (bytes32 hash)
    {
        /* Unfortunately abi.encodePacked doesn't work here, stack size constraints. */
        uint size = 672;
        bytes memory array = new bytes(size);
        uint index;
        assembly {
            index := add(array, 0x20)
        }
        index = ArrayUtils.unsafeWriteBytes32(index, _ORDER_TYPEHASH);
        index = ArrayUtils.unsafeWriteAddressWord(index, order.exchange);
        index = ArrayUtils.unsafeWriteAddressWord(index, order.maker);
        index = ArrayUtils.unsafeWriteAddressWord(index, order.taker);
        index = ArrayUtils.unsafeWriteAddressWord(index, order.makerRelayerFeeRecipient);
        index = ArrayUtils.unsafeWriteAddressWord(index, order.takerRelayerFeeRecipient);
        index = ArrayUtils.unsafeWriteUint8Word(index, uint8(order.side));
        index = ArrayUtils.unsafeWriteUint8Word(index, uint8(order.saleKind));
        index = ArrayUtils.unsafeWriteAddressWord(index, order.nftAddress);
        index = ArrayUtils.unsafeWriteUint(index, order.tokenId);
        index = ArrayUtils.unsafeWriteBytes32(index, keccak256(order.calldata));
        index = ArrayUtils.unsafeWriteBytes32(index, keccak256(order.replacementPattern));
        index = ArrayUtils.unsafeWriteAddressWord(index, order.staticTarget);
        index = ArrayUtils.unsafeWriteBytes32(index, keccak256(order.staticExtradata));
        index = ArrayUtils.unsafeWriteAddressWord(index, order.paymentToken);
        index = ArrayUtils.unsafeWriteUint(index, order.basePrice);
        index = ArrayUtils.unsafeWriteUint(index, order.extra);
        index = ArrayUtils.unsafeWriteUint(index, order.listingTime);
        index = ArrayUtils.unsafeWriteUint(index, order.expirationTime);
        index = ArrayUtils.unsafeWriteUint(index, order.salt);
        index = ArrayUtils.unsafeWriteUint(index, nonce);
        assembly {
            hash := keccak256(add(array, 0x20), size)
        }
        return hash;
    }

    /**
     * @dev Hash an order, returning the hash that a client must sign via EIP-712 including the message prefix
     * @param order Order to hash
     * @param nonce Nonce to hash
     * @return Hash of message prefix and order hash per Ethereum format
     */
    function hashToSign(Order memory order, uint nonce)
    internal
    pure
    returns (bytes32)
    {
        return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, hashOrder(order, nonce)));
    }

    /**
     * @dev Assert an order is valid and return its hash
     * @param order Order to validate
     * @param nonce Nonce to validate
     */
    function requireValidOrder(Order memory order, uint nonce)
    internal
    view
    returns (bytes32)
    {
        bytes32 hash = hashToSign(order, nonce);
        require(validateOrder(hash, order), "invalid order");
        return hash;
    }

    /**
     * @dev Validate order parameters
     * @param order Order to validate
     */
    function validateOrderParameters(Order memory order)
    internal
    view
    returns (bool)
    {
        /* Order must be targeted at this protocol version (this Exchange contract). */
        if (order.exchange != address(this)) {
            return false;
        }

        /* Order must have a maker. */
        if (order.maker == address(0)) {
            return false;
        }

        /* Order must possess valid sale kind parameter combination. */
        if (!SaleKindInterface.validateParameters(order.saleKind, order.expirationTime)) {
            return false;
        }

        return true;
    }

    /**
     * @dev Validate a provided previously approved / signed order, hash
     * @param hash Order hash (already calculated, passed to avoid recalculation)
     * @param order Order to validate
     */
    function validateOrder(bytes32 hash, Order memory order)
    internal
    view
    returns (bool)
    {
        /* Not done in an if-conditional to prevent unnecessary ecrecover evaluation, which seems to happen even though it should short-circuit. */

        /* Order must have valid parameters. */
        if (!validateOrderParameters(order)) {
            return false;
        }

        /* Order must have not been canceled or already filled. */
        if (cancelledOrFinalized[hash]) {
            return false;
        }

        /* Return true if order has been previously approved with the current nonce */
        uint approvedOrderNoncePlusOne = _approvedOrdersByNonce[hash];
        if (approvedOrderNoncePlusOne == 0) {
            return false;
        }
        return approvedOrderNoncePlusOne == nonces[order.maker] + 1;
    }

    /**
     * @dev Determine if an order has been approved. Note that the order may not still
     * be valid in cases where the maker's nonce has been incremented.
     * @param hash Hash of the order
     * @return whether or not the order was approved.
     */
    function approvedOrders(bytes32 hash) public view returns (bool approved) {
        return _approvedOrdersByNonce[hash] != 0;
    }

    /**
     * @dev Approve an order and optionally mark it for orderbook inclusion. Must be called by the maker of the order
     * @param order Order to approve
     * @param ipfsHash Order metadata on IPFS
     */
    function makeOrder(Order memory order, bytes32 ipfsHash)
    internal
    {
        /* CHECKS */

        /* Assert sender is authorized to approve order. */
        require(msg.sender == order.maker);

        /* Calculate order hash. */
        bytes32 hash = hashToSign(order, nonces[order.maker]);

        /* Assert order has not already been approved. */
        require(_approvedOrdersByNonce[hash] == 0, "duplicated order hash");

        /* EFFECTS */

        /* Mark order as approved. */
        _approvedOrdersByNonce[hash] = nonces[order.maker] + 1;

        /* Log approval event. Must be split in two due to Solidity stack size limitations. */
        {
            emit OrderApprovedPartOne(hash, order.exchange, order.maker, order.taker, order.makerRelayerFeeRecipient, order.side, order.saleKind, order.nftAddress, order.tokenId, ipfsHash);
        }
        {
            emit OrderApprovedPartTwo(hash, order.calldata, order.replacementPattern, order.staticTarget, order.staticExtradata, order.paymentToken, order.basePrice, order.extra, order.listingTime, order.expirationTime, order.salt);
        }
    }

    /**
     * @dev Cancel an order, preventing it from being matched. Must be called by the maker of the order
     * @param order Order to cancel
     * @param nonce Nonce to cancel
     */
    function cancelOrder(Order memory order, uint nonce)
    internal
    {
        /* CHECKS */

        /* Calculate order hash. */
        bytes32 hash = requireValidOrder(order, nonce);

        /* Assert sender is authorized to cancel order. */
        require(msg.sender == order.maker);

        /* EFFECTS */

        /* Mark order as cancelled, preventing it from being matched. */
        cancelledOrFinalized[hash] = true;

        /* Log cancel event. */
        emit OrderCancelled(hash);
    }

    /**
     * @dev Calculate the current price of an order (convenience function)
     * @param order Order to calculate the price of
     * @return The current price of the order
     */
    function calculateCurrentPrice (Order memory order)
    internal
    view
    returns (uint)
    {
        return SaleKindInterface.calculateFinalPrice(order.side, order.saleKind, order.basePrice, order.extra, order.listingTime, order.expirationTime);
    }

    /**
     * @dev Calculate the price two orders would match at, if in fact they would match (otherwise fail)
     * @param buy Buy-side order
     * @param sell Sell-side order
     * @return Match price
     */
    function calculateMatchPrice(Order memory buy, Order memory sell)
    view
    internal
    returns (uint)
    {
        /* Calculate sell price. */
        uint sellPrice = SaleKindInterface.calculateFinalPrice(sell.side, sell.saleKind, sell.basePrice, sell.extra, sell.listingTime, sell.expirationTime);

        /* Calculate buy price. */
        uint buyPrice = SaleKindInterface.calculateFinalPrice(buy.side, buy.saleKind, buy.basePrice, buy.extra, buy.listingTime, buy.expirationTime);

        /* Require price cross. */
        require(buyPrice >= sellPrice);

        /* Maker/taker priority. */
        return sell.makerRelayerFeeRecipient != address(0) ? sellPrice : buyPrice;
    }

    /**
     * @dev Execute all IERC20 token / Ether transfers associated with an order match (fees and buyer => seller transfer)
     * @param buy Buy-side order
     * @param sell Sell-side order
     */
    function executeFundsTransfer(Order memory buy, Order memory sell)
    internal
    returns (uint)
    {
        /* Only payable in the special case of unwrapped Ether. */
        if (sell.paymentToken != address(0)) {
            require(msg.value == 0);
        }

        /* Calculate match price. */
        uint price = calculateMatchPrice(buy, sell);

        /* If paying using a token (not Ether), transfer tokens. This is done prior to fee payments to that a seller will have tokens before being charged fees. */
        if (price > 0 && sell.paymentToken != address(0)) {
            transferTokens(sell.paymentToken, buy.maker, sell.maker, price);
        }

        /* Amount that will be received by seller (for Ether). */
        uint receiveAmount = price;

        /* Amount that must be sent by buyer (for Ether). */
        uint requiredAmount = price;

        uint exchangeFee = SafeMath.div(SafeMath.mul(exchangeFeeRate, price), INVERSE_BASIS_POINT);

        address royaltyReceiver = address(0x00);
        uint256 royaltyAmount;
        if (checkRoyalties(sell.nftAddress)) {
            (royaltyReceiver, royaltyAmount) = IERC2981(sell.nftAddress).royaltyInfo(buy.tokenId, price);
        } else {
            (royaltyReceiver, royaltyAmount) = IRoyaltyRegisterHub(royaltyRegisterHub).royaltyInfo(sell.nftAddress, price);
        }

        if (royaltyReceiver != address(0x00) && royaltyAmount != 0) {
            if (sell.paymentToken == address(0)) {
                receiveAmount = SafeMath.sub(receiveAmount, royaltyAmount);
                royaltyReceiver.transfer(royaltyAmount);
            } else {
                transferTokens(sell.paymentToken, sell.maker, royaltyReceiver, royaltyAmount);
            }
        }

        /* Determine maker/taker and charge fees accordingly. */
        if (sell.makerRelayerFeeRecipient != address(0) && exchangeFee != 0) {
            /* Sell-side order is maker. */

            /* Maker fees are deducted from the token amount that the maker receives. Taker fees are extra tokens that must be paid by the taker. */

            uint makerRelayerFee = SafeMath.div(SafeMath.mul(makerRelayerFeeShare, exchangeFee), INVERSE_BASIS_POINT);
            if (sell.paymentToken == address(0)) {
                receiveAmount = SafeMath.sub(receiveAmount, makerRelayerFee);
                sell.makerRelayerFeeRecipient.transfer(makerRelayerFee);
            } else {
                transferTokens(sell.paymentToken, sell.maker, sell.makerRelayerFeeRecipient, makerRelayerFee);
            }

            if (buy.takerRelayerFeeRecipient != address(0)) {
                uint takerRelayerFee = SafeMath.div(SafeMath.mul(takerRelayerFeeShare, exchangeFee), INVERSE_BASIS_POINT);
                if (sell.paymentToken == address(0)) {
                    receiveAmount = SafeMath.sub(receiveAmount, takerRelayerFee);
                    buy.takerRelayerFeeRecipient.transfer(takerRelayerFee);
                } else {
                    transferTokens(sell.paymentToken, sell.maker, buy.takerRelayerFeeRecipient, takerRelayerFee);
                }
            }

            uint protocolFee = SafeMath.div(SafeMath.mul(protocolFeeShare, exchangeFee), INVERSE_BASIS_POINT);
            if (sell.paymentToken == address(0)) {
                receiveAmount = SafeMath.sub(receiveAmount, protocolFee);
                protocolFeeRecipient.transfer(protocolFee);
            } else {
                transferTokens(sell.paymentToken, sell.maker, protocolFeeRecipient, protocolFee);
            }
        } else if (sell.makerRelayerFeeRecipient == address(0)){
            /* Buy-side order is maker. */

            /* The Exchange does not escrow Ether, so direct Ether can only be used to with sell-side maker / buy-side taker orders. */
            require(sell.paymentToken != address(0));

            if (exchangeFee != 0) {
                makerRelayerFee = SafeMath.div(SafeMath.mul(makerRelayerFeeShare, exchangeFee), INVERSE_BASIS_POINT);
                transferTokens(sell.paymentToken, sell.maker, buy.makerRelayerFeeRecipient, makerRelayerFee);

                if (sell.takerRelayerFeeRecipient != address(0)) {
                    takerRelayerFee = SafeMath.div(SafeMath.mul(takerRelayerFeeShare, exchangeFee), INVERSE_BASIS_POINT);
                    transferTokens(sell.paymentToken, sell.maker, sell.takerRelayerFeeRecipient, takerRelayerFee);
                }

                protocolFee = SafeMath.div(SafeMath.mul(protocolFeeShare, exchangeFee), INVERSE_BASIS_POINT);
                transferTokens(sell.paymentToken, sell.maker, protocolFeeRecipient, protocolFee);
            }
        }

        if (sell.paymentToken == address(0)) {
            /* Special-case Ether, order must be matched by buyer. */
            require(msg.value >= requiredAmount);
            sell.maker.transfer(receiveAmount);
            /* Allow overshoot for variable-price auctions, refund difference. */
            uint diff = SafeMath.sub(msg.value, requiredAmount);
            if (diff > 0) {
                buy.maker.transfer(diff);
            }
        }

        /* This contract should never hold Ether, however, we cannot assert this, since it is impossible to prevent anyone from sending Ether e.g. with selfdestruct. */

        return price;
    }

    /**
     * @dev Return whether or not two orders can be matched with each other by basic parameters (does not check order signatures / calldata or perform static calls)
     * @param buy Buy-side order
     * @param sell Sell-side order
     * @return Whether or not the two orders can be matched
     */
    function ordersCanMatch(Order memory buy, Order memory sell)
    internal
    view
    returns (bool)
    {
        return (
        /* Must be opposite-side. */
        (buy.side == SaleKindInterface.Side.Buy && sell.side == SaleKindInterface.Side.Sell) &&
        /* Must use same payment token. */
        (buy.paymentToken == sell.paymentToken) &&
        /* Must match maker/taker addresses. */
        (sell.taker == address(0) || sell.taker == buy.maker) &&
        (buy.taker == address(0) || buy.taker == sell.maker) &&
        /* One must be maker and the other must be taker (no bool XOR in Solidity). */
        ((sell.makerRelayerFeeRecipient == address(0) && buy.makerRelayerFeeRecipient != address(0)) || (sell.makerRelayerFeeRecipient != address(0) && buy.makerRelayerFeeRecipient == address(0))) &&
        /* Must match nftAddress. */
        (buy.nftAddress == sell.nftAddress) &&
        /* Buy-side order must be settleable. */
        SaleKindInterface.canSettleOrder(buy.listingTime, buy.expirationTime) &&
        /* Sell-side order must be settleable. */
        SaleKindInterface.canSettleOrder(sell.listingTime, sell.expirationTime)
        );
    }

    /**
     * @dev Atomically match two orders, ensuring validity of the match, and execute all associated state transitions. Protected against reentrancy by a contract-global lock.
     * @param buy Buy-side order
     * @param sell Sell-side order
     */
    function takeOrder(Order memory buy, Order memory sell, bytes32 metadata)
    internal
    reentrancyGuard
    {
        /* CHECKS */

        /* Ensure buy order validity and calculate hash if necessary. */
        bytes32 buyHash;
        if (buy.maker == msg.sender) {
            require(validateOrderParameters(buy), "invalid buy params");
        } else {
            buyHash = _requireValidOrderWithNonce(buy);
        }

        /* Ensure sell order validity and calculate hash if necessary. */
        bytes32 sellHash;
        if (sell.maker == msg.sender) {
            require(validateOrderParameters(sell), "invalid sell params");
        } else {
            sellHash = _requireValidOrderWithNonce(sell);
        }

        /* Must be matchable. */
        require(ordersCanMatch(buy, sell), "order can't match");

        /* Must match calldata after replacement, if specified. */
        if (buy.replacementPattern.length > 0) {
            ArrayUtils.guardedArrayReplace(buy.calldata, sell.calldata, buy.replacementPattern);
        }
        if (sell.replacementPattern.length > 0) {
            ArrayUtils.guardedArrayReplace(sell.calldata, buy.calldata, sell.replacementPattern);
        }
        require(ArrayUtils.arrayEq(buy.calldata, sell.calldata), "calldata doesn't equal");

        /* EFFECTS */

        /* Mark previously signed or approved orders as finalized. */
        if (msg.sender != buy.maker) {
            cancelledOrFinalized[buyHash] = true;
        }
        if (msg.sender != sell.maker) {
            cancelledOrFinalized[sellHash] = true;
        }

        /* INTERACTIONS */

        /* Execute funds transfer and pay fees. */
        uint price = executeFundsTransfer(buy, sell);

        require(merkleValidatorContract.delegatecall(sell.calldata), "order calldata failure");

        /* Static calls are intentionally done after the effectful call so they can check resulting state. */

        /* Handle buy-side static call if specified. */
        if (buy.staticTarget != address(0)) {
            require(staticCall(buy.staticTarget, sell.calldata, buy.staticExtradata));
        }

        /* Handle sell-side static call if specified. */
        if (sell.staticTarget != address(0)) {
            require(staticCall(sell.staticTarget, sell.calldata, sell.staticExtradata));
        }

        /* Log match event. */
        emit OrdersMatched(
            buyHash, sellHash,
            sell.makerRelayerFeeRecipient != address(0) ? sell.maker : buy.maker,
            sell.makerRelayerFeeRecipient != address(0) ? buy.maker : sell.maker,
            sell.makerRelayerFeeRecipient != address(0) ? sell.makerRelayerFeeRecipient : buy.makerRelayerFeeRecipient,
            sell.makerRelayerFeeRecipient != address(0) ? buy.takerRelayerFeeRecipient : sell.takerRelayerFeeRecipient,
            price, metadata);
    }

    function _requireValidOrderWithNonce(Order memory order) internal view returns (bytes32) {
        return requireValidOrder(order, nonces[order.maker]);
    }
}

// File: contracts/NiftyConnectExchange.sol

pragma solidity 0.4.26;




contract NiftyConnectExchange is ExchangeCore {

    enum MerkleValidatorSelector {
        MatchERC721UsingCriteria,
        MatchERC721WithSafeTransferUsingCriteria,
        MatchERC1155UsingCriteria
    }

    constructor (
        TokenTransferProxy tokenTransferProxyAddress,
        address protocolFeeAddress,
        address merkleValidatorAddress,
        address royaltyRegisterHubAddress)
    public {
        tokenTransferProxy = tokenTransferProxyAddress;
        protocolFeeRecipient = protocolFeeAddress;
        merkleValidatorContract = merkleValidatorAddress;
        royaltyRegisterHub = royaltyRegisterHubAddress;
    }

    function buildCallData(
        uint selector,
        address from,
        address to,
        address nftAddress,
        uint256 tokenId,
        uint256 amount,
        bytes32 merkleRoot,
        bytes32[] memory merkleProof)
    public view returns(bytes) {
        MerkleValidatorSelector merkleValidatorSelector = MerkleValidatorSelector(selector);
        if (merkleValidatorSelector == MerkleValidatorSelector.MatchERC721UsingCriteria) {
            return abi.encodeWithSignature("matchERC721UsingCriteria(address,address,address,uint256,bytes32,bytes32[])", from, to, nftAddress, tokenId, merkleRoot, merkleProof);
        } else if (merkleValidatorSelector == MerkleValidatorSelector.MatchERC721WithSafeTransferUsingCriteria) {
            return abi.encodeWithSignature("matchERC721WithSafeTransferUsingCriteria(address,address,address,uint256,bytes32,bytes32[])", from, to, nftAddress, tokenId, merkleRoot, merkleProof);
        } else if (merkleValidatorSelector == MerkleValidatorSelector.MatchERC1155UsingCriteria) {
            return abi.encodeWithSignature("matchERC1155UsingCriteria(address,address,address,uint256,uint256,bytes32,bytes32[])", from, to, nftAddress, tokenId, amount, merkleRoot, merkleProof);
        } else {
            return new bytes(0);
        }
    }

    function buildCallDataInternal(
        address from,
        address to,
        address nftAddress,
        uint[9] uints,
        bytes32 merkleRoot)
    internal view returns(bytes) {
        bytes32[] memory merkleProof;
        if (uints[8]==0) {
            require(merkleRoot==bytes32(0x00), "invalid merkleRoot");
            return buildCallData(uints[5],from,to,nftAddress,uints[6],uints[7],merkleRoot,merkleProof);
        }
        require(uints[8]>=2&&merkleRoot!=bytes32(0x00), "invalid merkle data");
        uint256 merkleProofLength;
        uint256 divResult = uints[8];
        bool hasMod = false;
        for(;divResult!=0;) {
            uint256 tempDivResult = divResult/2;
            if (SafeMath.mul(tempDivResult, 2)<divResult) {
                hasMod = true;
            }
            divResult=tempDivResult;
            merkleProofLength++;
        }
        if (!hasMod) {
            merkleProofLength--;
        }
        merkleProof = new bytes32[](merkleProofLength);
        return buildCallData(uints[5],from,to,nftAddress,uints[6],uints[7],merkleRoot,merkleProof);
    }

    function guardedArrayReplace(bytes array, bytes desired, bytes mask)
    public
    pure
    returns (bytes)
    {
        ArrayUtils.guardedArrayReplace(array, desired, mask);
        return array;
    }

    function calculateFinalPrice(SaleKindInterface.Side side, SaleKindInterface.SaleKind saleKind, uint basePrice, uint extra, uint listingTime, uint expirationTime)
    public
    view
    returns (uint)
    {
        return SaleKindInterface.calculateFinalPrice(side, saleKind, basePrice, extra, listingTime, expirationTime);
    }

    function hashToSign_(
        address[9] addrs,
        uint[9] uints,
        SaleKindInterface.Side side,
        SaleKindInterface.SaleKind saleKind,
        bytes replacementPattern,
        bytes staticExtradata,
        bytes32 merkleRoot)
    public
    view
    returns (bytes32)
    {
        bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleRoot);
        return hashToSign(
            Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4]),
            nonces[addrs[1]]
        );
    }

    function validateOrderParameters_ (
        address[9] addrs,
        uint[9] uints,
        SaleKindInterface.Side side,
        SaleKindInterface.SaleKind saleKind,
        bytes replacementPattern,
        bytes staticExtradata,
        bytes32 merkleRoot)
    view
    public
    returns (bool) {
        bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleRoot);
        Order memory order = Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4]);
        return validateOrderParameters(
            order
        );
    }

    function validateOrder_ (
        address[9] addrs,
        uint[9] uints,
        SaleKindInterface.Side side,
        SaleKindInterface.SaleKind saleKind,
        bytes replacementPattern,
        bytes staticExtradata,
        bytes32 merkleRoot)
    view
    public
    returns (bool)
    {
        bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleRoot);
        Order memory order = Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4]);
        return validateOrder(
            hashToSign(order, nonces[order.maker]),
            order
        );
    }

    function makeOrder_ (
        address[9] addrs,
        uint[9] uints,
        SaleKindInterface.Side side,
        SaleKindInterface.SaleKind saleKind,
        bytes replacementPattern,
        bytes staticExtradata,
        bytes32[2] merkleData)
    public
    {
        bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleData[0]);
        require(addrs[3]!=address(0x00), "makerRelayerFeeRecipient must not be zero");
        require(orderCallData.length==replacementPattern.length, "replacement pattern length mismatch");
        Order memory order = Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4]);
        return makeOrder(order, merkleData[1]);
    }

    function cancelOrder_(
        address[9] addrs,
        uint[9] uints,
        SaleKindInterface.Side side,
        SaleKindInterface.SaleKind saleKind,
        bytes replacementPattern,
        bytes staticExtradata,
        bytes32 merkleRoot)
    public
    {
        bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleRoot);
        Order memory order = Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4]);
        return cancelOrder(
            order,
            nonces[order.maker]
        );
    }

    function calculateCurrentPrice_(
        address[9] addrs,
        uint[9] uints,
        SaleKindInterface.Side side,
        SaleKindInterface.SaleKind saleKind,
        bytes replacementPattern,
        bytes staticExtradata,
        bytes32 merkleRoot)
    public
    view
    returns (uint)
    {
        bytes memory orderCallData = buildCallDataInternal(addrs[7],addrs[8],addrs[4],uints,merkleRoot);
        return calculateCurrentPrice(
            Order(addrs[0], addrs[1], addrs[2], addrs[3], address(0x00), side, saleKind, addrs[4], uints[6], orderCallData, replacementPattern, addrs[5], staticExtradata, IERC20(addrs[6]), uints[0], uints[1], uints[2], uints[3], uints[4])
        );
    }

    function ordersCanMatch_(
        address[16] addrs,
        uint[12] uints,
        uint8[4] sidesKinds,
        bytes calldataBuy,
        bytes calldataSell,
        bytes replacementPatternBuy,
        bytes replacementPatternSell,
        bytes staticExtradataBuy,
        bytes staticExtradataSell)
    public
    view
    returns (bool)
    {
        Order memory buy = Order(addrs[0], addrs[1], addrs[2], addrs[3], addrs[4], SaleKindInterface.Side(sidesKinds[0]), SaleKindInterface.SaleKind(sidesKinds[1]), addrs[5], uints[5], calldataBuy, replacementPatternBuy, addrs[6], staticExtradataBuy, IERC20(addrs[7]), uints[0], uints[1], uints[2], uints[3], uints[4]);
        Order memory sell = Order(addrs[8], addrs[9], addrs[10], addrs[11], addrs[12], SaleKindInterface.Side(sidesKinds[2]), SaleKindInterface.SaleKind(sidesKinds[3]), addrs[13], uints[11], calldataSell, replacementPatternSell, addrs[14], staticExtradataSell, IERC20(addrs[15]), uints[6], uints[7], uints[8], uints[9], uints[10]);
        return ordersCanMatch(
            buy,
            sell
        );
    }

    function orderCalldataCanMatch(bytes buyCalldata, bytes buyReplacementPattern, bytes sellCalldata, bytes sellReplacementPattern)
    public
    pure
    returns (bool)
    {
        if (buyReplacementPattern.length > 0) {
            ArrayUtils.guardedArrayReplace(buyCalldata, sellCalldata, buyReplacementPattern);
        }
        if (sellReplacementPattern.length > 0) {
            ArrayUtils.guardedArrayReplace(sellCalldata, buyCalldata, sellReplacementPattern);
        }
        return ArrayUtils.arrayEq(buyCalldata, sellCalldata);
    }

    function calculateMatchPrice_(
        address[16] addrs,
        uint[12] uints,
        uint8[4] sidesKinds,
        bytes calldataBuy,
        bytes calldataSell,
        bytes replacementPatternBuy,
        bytes replacementPatternSell,
        bytes staticExtradataBuy,
        bytes staticExtradataSell)
    public
    view
    returns (uint)
    {
        Order memory buy = Order(addrs[0], addrs[1], addrs[2], addrs[3], addrs[4], SaleKindInterface.Side(sidesKinds[0]), SaleKindInterface.SaleKind(sidesKinds[1]), addrs[5], uints[5], calldataBuy, replacementPatternBuy, addrs[6], staticExtradataBuy, IERC20(addrs[7]), uints[0], uints[1], uints[2], uints[3], uints[4]);
        Order memory sell = Order(addrs[8], addrs[9], addrs[10], addrs[11], addrs[12], SaleKindInterface.Side(sidesKinds[2]), SaleKindInterface.SaleKind(sidesKinds[3]), addrs[13], uints[11], calldataSell, replacementPatternSell, addrs[14], staticExtradataSell, IERC20(addrs[15]), uints[6], uints[7], uints[8], uints[9], uints[10]);
        return calculateMatchPrice(
            buy,
            sell
        );
    }

    function takeOrder_(
        address[16] addrs,
        uint[12] uints,
        uint8[4] sidesKinds,
        bytes calldataBuy,
        bytes calldataSell,
        bytes replacementPatternBuy,
        bytes replacementPatternSell,
        bytes staticExtradataBuy,
        bytes staticExtradataSell,
        bytes32 rssMetadata)
    public
    payable
    {

        return takeOrder(
            Order(addrs[0], addrs[1], addrs[2], addrs[3], addrs[4], SaleKindInterface.Side(sidesKinds[0]), SaleKindInterface.SaleKind(sidesKinds[1]), addrs[5], uints[5], calldataBuy, replacementPatternBuy, addrs[6], staticExtradataBuy, IERC20(addrs[7]), uints[0], uints[1], uints[2], uints[3], uints[4]),
            Order(addrs[8], addrs[9], addrs[10], addrs[11], addrs[12], SaleKindInterface.Side(sidesKinds[2]), SaleKindInterface.SaleKind(sidesKinds[3]), addrs[13], uints[11], calldataSell, replacementPatternSell, addrs[14], staticExtradataSell, IERC20(addrs[15]), uints[6], uints[7], uints[8], uints[9], uints[10]),
            rssMetadata
        );
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"addrs","type":"address[16]"},{"name":"uints","type":"uint256[12]"},{"name":"sidesKinds","type":"uint8[4]"},{"name":"calldataBuy","type":"bytes"},{"name":"calldataSell","type":"bytes"},{"name":"replacementPatternBuy","type":"bytes"},{"name":"replacementPatternSell","type":"bytes"},{"name":"staticExtradataBuy","type":"bytes"},{"name":"staticExtradataSell","type":"bytes"}],"name":"calculateMatchPrice_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"governor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenTransferProxy","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"exchangeFeeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"target","type":"address"},{"name":"calldata","type":"bytes"},{"name":"extradata","type":"bytes"}],"name":"staticCall","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addrs","type":"address[16]"},{"name":"uints","type":"uint256[12]"},{"name":"sidesKinds","type":"uint8[4]"},{"name":"calldataBuy","type":"bytes"},{"name":"calldataSell","type":"bytes"},{"name":"replacementPatternBuy","type":"bytes"},{"name":"replacementPatternSell","type":"bytes"},{"name":"staticExtradataBuy","type":"bytes"},{"name":"staticExtradataSell","type":"bytes"}],"name":"ordersCanMatch_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleRoot","type":"bytes32"}],"name":"calculateCurrentPrice_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptGovernance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"array","type":"bytes"},{"name":"desired","type":"bytes"},{"name":"mask","type":"bytes"}],"name":"guardedArrayReplace","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"selector","type":"uint256"},{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"nftAddress","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"merkleRoot","type":"bytes32"},{"name":"merkleProof","type":"bytes32[]"}],"name":"buildCallData","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newTakerRelayerFeeShare","type":"uint256"},{"name":"newMakerRelayerFeeShare","type":"uint256"},{"name":"newProtocolFeeShare","type":"uint256"}],"name":"changeTakerRelayerFeeShare","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleRoot","type":"bytes32"}],"name":"validateOrder_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"royaltyRegisterHub","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"takerRelayerFeeShare","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newProtocolFeeRecipient","type":"address"}],"name":"changeProtocolFeeRecipient","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"buyCalldata","type":"bytes"},{"name":"buyReplacementPattern","type":"bytes"},{"name":"sellCalldata","type":"bytes"},{"name":"sellReplacementPattern","type":"bytes"}],"name":"orderCalldataCanMatch","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"incrementNonce","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"basePrice","type":"uint256"},{"name":"extra","type":"uint256"},{"name":"listingTime","type":"uint256"},{"name":"expirationTime","type":"uint256"}],"name":"calculateFinalPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"protocolFeeRecipient","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addrs","type":"address[16]"},{"name":"uints","type":"uint256[12]"},{"name":"sidesKinds","type":"uint8[4]"},{"name":"calldataBuy","type":"bytes"},{"name":"calldataSell","type":"bytes"},{"name":"replacementPatternBuy","type":"bytes"},{"name":"replacementPatternSell","type":"bytes"},{"name":"staticExtradataBuy","type":"bytes"},{"name":"staticExtradataSell","type":"bytes"},{"name":"rssMetadata","type":"bytes32"}],"name":"takeOrder_","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"nonces","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"cancelledOrFinalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleRoot","type":"bytes32"}],"name":"hashToSign_","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleRoot","type":"bytes32"}],"name":"cancelOrder_","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"protocolFeeShare","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleData","type":"bytes32[2]"}],"name":"makeOrder_","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newExchangeFeeRate","type":"uint256"}],"name":"changeExchangeFeeRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INVERSE_BASIS_POINT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingGovernor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAXIMUM_EXCHANGE_RATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"}],"name":"approvedOrders","outputs":[{"name":"approved","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addrs","type":"address[9]"},{"name":"uints","type":"uint256[9]"},{"name":"side","type":"uint8"},{"name":"saleKind","type":"uint8"},{"name":"replacementPattern","type":"bytes"},{"name":"staticExtradata","type":"bytes"},{"name":"merkleRoot","type":"bytes32"}],"name":"validateOrderParameters_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"makerRelayerFeeShare","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"merkleValidatorContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"pendingGovernor_","type":"address"}],"name":"setPendingGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"tokenTransferProxyAddress","type":"address"},{"name":"protocolFeeAddress","type":"address"},{"name":"merkleValidatorAddress","type":"address"},{"name":"royaltyRegisterHubAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"},{"indexed":false,"name":"exchange","type":"address"},{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"taker","type":"address"},{"indexed":true,"name":"makerRelayerFeeRecipient","type":"address"},{"indexed":false,"name":"side","type":"uint8"},{"indexed":false,"name":"saleKind","type":"uint8"},{"indexed":false,"name":"nftAddress","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"ipfsHash","type":"bytes32"}],"name":"OrderApprovedPartOne","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"},{"indexed":false,"name":"calldata","type":"bytes"},{"indexed":false,"name":"replacementPattern","type":"bytes"},{"indexed":false,"name":"staticTarget","type":"address"},{"indexed":false,"name":"staticExtradata","type":"bytes"},{"indexed":false,"name":"paymentToken","type":"address"},{"indexed":false,"name":"basePrice","type":"uint256"},{"indexed":false,"name":"extra","type":"uint256"},{"indexed":false,"name":"listingTime","type":"uint256"},{"indexed":false,"name":"expirationTime","type":"uint256"},{"indexed":false,"name":"salt","type":"uint256"}],"name":"OrderApprovedPartTwo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"}],"name":"OrderCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"buyHash","type":"bytes32"},{"indexed":false,"name":"sellHash","type":"bytes32"},{"indexed":true,"name":"maker","type":"address"},{"indexed":true,"name":"taker","type":"address"},{"indexed":false,"name":"makerRelayerFeeRecipient","type":"address"},{"indexed":false,"name":"takerRelayerFeeRecipient","type":"address"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":true,"name":"metadata","type":"bytes32"}],"name":"OrdersMatched","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"maker","type":"address"},{"indexed":false,"name":"newNonce","type":"uint256"}],"name":"NonceIncremented","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousGovernor","type":"address"},{"indexed":true,"name":"newGovernor","type":"address"}],"name":"GovernanceTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newPendingGovernor","type":"address"}],"name":"NewPendingGovernor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60806040526000805460ff191681556007556105dc600855611f406009556101f4600a553480156200003057600080fd5b50604051608080620054a7833981016040818152825160208085015183860151606090960151600080546101003390810261010060a860020a03199092169190911790915560018054600160a060020a03191690911790557f454950373132446f6d61696e28737472696e67206e616d652c737472696e672086527f76657273696f6e2c75696e7432353620636861696e49642c6164647265737320928601929092527f766572696679696e67436f6e7472616374290000000000000000000000000000848601529251938490036052019093209093919290600080516020620052f7833981519152146200012457600080fd5b604080518082018252601e8082527f4e69667479436f6e6e6563742045786368616e676520436f6e74726163740000602083019081529251600080516020620052b78339815191529390918291908083835b60208310620001975780518252601f19909201916020918201910162000176565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916141515620001d557600080fd5b60408051808201825260038082527f312e300000000000000000000000000000000000000000000000000000000000602083019081529251600080516020620052d78339815191529390918291908083835b60208310620002485780518252601f19909201916020918201910162000227565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019161415156200028657600080fd5b6040517ff446866267029076a71bb126e250b9480cd4ac2699baa745a582b10b361ec951908061019062005317823960405190819003610190019020919091149050620002d257600080fd5b620002e564010000000062000365810204565b7f048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a21146200031157600080fd5b60038054600160a060020a03958616600160a060020a031991821617909155600b805494861694821694909417909355600c805492851692841692909217909155600d805491909316911617905562000432565b60408051600080516020620052f7833981519152602080830191909152600080516020620052b783398151915282840152600080516020620052d78339815191526060830152600160808301523060a0808401919091528351808403909101815260c0909201928390528151600093918291908401908083835b60208310620004005780518252601f199092019160209182019101620003df565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b614e7580620004426000396000f3006080604052600436106101f85763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663028e01cf81146101fd57806306fdde03146104155780630c340a241461049f5780630eefdbad146104d05780630f9b4955146104e557806310796a47146104fa5780631f2c56d7146105b35780631f86dbc0146107b9578063238efcbc146108b8578063239e83df146108cf5780633644e515146109a457806337146f2e146109b95780633d1cf52614610a3a5780633df6be1314610a585780633eeb5bc814610b575780634a3b5e0514610b6c578063514f033014610b8157806354fd4d5014610ba2578063562b2ebc14610bb7578063627cdcb914610cca57806363d36c0b14610cdf57806364df049e14610d0c578063715018a614610d215780637da26f5514610d365780637ecebe0014610f315780638076f00514610f5257806381da91a014610f6a5780638da5cb5b14611069578063941461661461107e578063960b26a21461117d57806397cea71b14611192578063ade0ccb2146112b2578063cae6047f146112ca578063e3056a34146112df578063e4e098f7146112f4578063e57d4adb14611309578063e7b74b6414611321578063e8898e6d14611420578063f111357514611435578063f235757f1461144a578063f2fde38b1461146b575b600080fd5b34801561020957600080fd5b5060408051610200818101909252610403913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975061148c9650505050505050565b60408051918252519081900360200190f35b34801561042157600080fd5b5061042a6117ac565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561046457818101518382015260200161044c565b50505050905090810190601f1680156104915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ab57600080fd5b506104b46117e3565b60408051600160a060020a039092168252519081900360200190f35b3480156104dc57600080fd5b506104b46117f2565b3480156104f157600080fd5b50610403611801565b34801561050657600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261059f958335600160a060020a031695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506118079650505050505050565b604080519115158252519081900360200190f35b3480156105bf57600080fd5b506040805161020081810190925261059f913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506118769650505050505050565b3480156107c557600080fd5b50604080516101208181019092526104039136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497505093359450611b869350505050565b3480156108c457600080fd5b506108cd611cbc565b005b3480156108db57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261042a94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750611db29650505050505050565b3480156109b057600080fd5b50610403611dc7565b3480156109c557600080fd5b50604080516020600460e43581810135838102808601850190965280855261042a9583359560248035600160a060020a0390811697604435821697606435909216966084359660a4359660c435963696610104959194019291829185019084908082843750949750611deb9650505050505050565b348015610a4657600080fd5b506108cd60043560243560443561211d565b348015610a6457600080fd5b506040805161012081810190925261059f9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506121ad9350505050565b348015610b6357600080fd5b506104b4612313565b348015610b7857600080fd5b50610403612322565b348015610b8d57600080fd5b506108cd600160a060020a0360043516612328565b348015610bae57600080fd5b5061042a612373565b348015610bc357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261059f94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506123aa9650505050505050565b348015610cd657600080fd5b506108cd6123e8565b348015610ceb57600080fd5b5061040360ff6004358116906024351660443560643560843560a43561243a565b348015610d1857600080fd5b506104b4612455565b348015610d2d57600080fd5b506108cd612464565b604080516102008181019092526108cd913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506124da9350505050565b348015610f3d57600080fd5b50610403600160a060020a03600435166127a4565b348015610f5e57600080fd5b5061059f6004356127b6565b348015610f7657600080fd5b50604080516101208181019092526104039136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506127cb9350505050565b34801561107557600080fd5b506104b46128f9565b34801561108a57600080fd5b50604080516101208181019092526108cd9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750509335945061290d9350505050565b34801561118957600080fd5b50610403612a51565b34801561119e57600080fd5b50604080516101208181019092526108cd9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750506040805180820182529598979681810196955093506002925084915083908082843750939650612a5795505050505050565b3480156112be57600080fd5b506108cd600435612c9d565b3480156112d657600080fd5b50610403612d13565b3480156112eb57600080fd5b506104b4612d19565b34801561130057600080fd5b50610403612d28565b34801561131557600080fd5b5061059f600435612d2e565b34801561132d57600080fd5b506040805161012081810190925261059f9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497505093359450612d459350505050565b34801561142c57600080fd5b50610403612e65565b34801561144157600080fd5b506104b4612e6b565b34801561145657600080fd5b506108cd600160a060020a0360043516612e7a565b34801561147757600080fd5b506108cd600160a060020a0360043516612f5f565b6000611496614d9c565b61149e614d9c565b604080516102608101909152808d600060209081029190910151600160a060020a03168252018d600160209081029190910151600160a060020a03168252018d600260209081029190910151600160a060020a03168252018d600360209081029190910151600160a060020a03168252018d600460209081029190910151600160a060020a03168252018b6000602002015160ff16600181111561153e57fe5b600181111561154957fe5b81526020018b6001602002015160ff16600181111561156457fe5b600181111561156f57fe5b815260a0808f0151600160a060020a031660208301528d8101516040830152606082018c9052608082018a9052018d60066020020151600160a060020a031681526020018681526020018d60076010811015156115c857fe5b60209081029190910151600160a060020a03168252018c6000602090810291909101518252018c6001602090810291909101518252018c6002602090810291909101518252018c6003602090810291909101518252018c600460200201519052604080516102608101909152909250808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff1660018111156116cb57fe5b60018111156116d657fe5b81526020018b6003602002015160ff1660018111156116f157fe5b60018111156116fc57fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a090910152905061179c8282613003565b9c9b505050505050505050505050565b60408051808201909152601e81527f4e69667479436f6e6e6563742045786368616e676520436f6e74726163740000602082015281565b600154600160a060020a031681565b600354600160a060020a031681565b60075481565b60006060600083518551016040519080825280601f01601f19166020018201604052801561183f578160200160208202803883390190505b5091505060208101611851818561308f565b905061185d818661308f565b506000604051835160208501895afa9695505050505050565b6000611880614d9c565b611888614d9c565b604080516102608101909152808d600060209081029190910151600160a060020a03168252018d600160209081029190910151600160a060020a03168252018d600260209081029190910151600160a060020a03168252018d600360209081029190910151600160a060020a03168252018d600460209081029190910151600160a060020a03168252018b6000602002015160ff16600181111561192857fe5b600181111561193357fe5b81526020018b6001602002015160ff16600181111561194e57fe5b600181111561195957fe5b815260a0808f0151600160a060020a031660208301528d8101516040830152606082018c9052608082018a9052018d60066020020151600160a060020a031681526020018681526020018d60076010811015156119b257fe5b60209081029190910151600160a060020a03168252018c6000602090810291909101518252018c6001602090810291909101518252018c6002602090810291909101518252018c6003602090810291909101518252018c600460200201519052604080516102608101909152909250808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff166001811115611ab557fe5b6001811115611ac057fe5b81526020018b6003602002015160ff166001811115611adb57fe5b6001811115611ae657fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a090910152905061179c82826130d3565b60006060611ba88960075b60200201516101008b015160808c01518b8761325a565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01519092169181019190915260006080820152909150611caf9060a08101896001811115611c0957fe5b8152602001886001811115611c1a57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a031682528b51828201528b01516040808301919091528b01516060808301919091528b01516080808301919091528b015160a0909101526133f4565b9998505050505050505050565b600254600090600160a060020a03163314611d47576040805160e560020a62461bcd02815260206004820152603660248201527f616363657074476f7665726e616e63653a2043616c6c206d75737420636f6d6560448201527f2066726f6d2070656e64696e67476f7665726e6f722e00000000000000000000606482015290519081900360840190fd5b506001805473ffffffffffffffffffffffffffffffffffffffff19808216331792839055600280549091169055604051600160a060020a03918216929091169082907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce8090600090a350565b6060611dbf848484613426565b509192915050565b7f048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a2181565b60606000896002811115611dfb57fe5b90506000816002811115611e0b57fe5b1415611eee57604051600160a060020a03808b1660248301908152818b16604484015290891660648301526084820188905260a4820186905260c060c48301908152855160e484015285518c938c938c938c938b938b939291610104909101906020808601910280838360005b83811015611e90578181015183820152602001611e78565b50506040805193909501838103601f19018452909452506020810180517ffb16a59500000000000000000000000000000000000000000000000000000000600160e060020a039091161790529b506121109950505050505050505050565b6001816002811115611efc57fe5b1415611fdf57604051600160a060020a03808b1660248301908152818b16604484015290891660648301526084820188905260a4820186905260c060c48301908152855160e484015285518c938c938c938c938b938b939291610104909101906020808601910280838360005b83811015611f81578181015183820152602001611f69565b50506040805193909501838103601f19018452909452506020810180517fc5a0236e00000000000000000000000000000000000000000000000000000000600160e060020a039091161790529b506121109950505050505050505050565b6002816002811115611fed57fe5b14156120fe57888888888888886040516024018088600160a060020a0316600160a060020a0316815260200187600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a03168152602001858152602001848152602001836000191660001916815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561209f578181015183820152602001612087565b50506040805193909501838103601f19018452909452506020810180517f96809f9000000000000000000000000000000000000000000000000000000000600160e060020a039091161790529c506121109a5050505050505050505050565b60408051600081526020810190915291505b5098975050505050505050565b600154600160a060020a0316331461213457600080fd5b61271061214a61214485856135ad565b836135ad565b1461219f576040805160e560020a62461bcd02815260206004820152601560248201527f696e76616c6964206e6577206665652073686172650000000000000000000000604482015290519081900360640190fd5b600892909255600955600a55565b600060606121b9614d9c565b6121d78a60075b60200201516101008c015160808d01518c8861325a565b60408051610260810182528c51600160a060020a0390811682526020808f01518216908301528d8301518116928201929092526060808e0151909216918101919091526000608082015290925060a0810189600181111561223457fe5b815260200188600181111561224557fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a0390811683528c51838301528c820151604080850191909152808e01516060808601919091528e01516080808601919091528e015160a0909401939093528382015116600090815260069091522054909150612305906122ff9083906135ca565b826136a8565b9a9950505050505050505050565b600d54600160a060020a031681565b60085481565b6000546101009004600160a060020a0316331461234457600080fd5b600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60408051808201909152600381527f312e300000000000000000000000000000000000000000000000000000000000602082015281565b600080845111156123c0576123c0858486613426565b6000825111156123d5576123d5838684613426565b6123df858461372f565b95945050505050565b33600081815260066020908152604091829020805460010190819055825181815292519093927fa82a649bbd060c9099cd7b7326e2b0dc9e9af0836480e0f849dc9eaa79710b3b92908290030190a250565b600061244a8787878787876137f1565b979650505050505050565b600b54600160a060020a031681565b6000546101009004600160a060020a0316331461248057600080fd5b60008054604051610100909104600160a060020a0316917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805474ffffffffffffffffffffffffffffffffffffffff0019169055565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01518316908201526080808d0151909216918101919091528851612798919060a082019060ff16600181111561254357fe5b600181111561254e57fe5b81526020018a6001602002015160ff16600181111561256957fe5b600181111561257457fe5b815260a0808e0151600160a060020a031660208301528c8101516040830152606082018b905260808201899052018c60066020020151600160a060020a031681526020018581526020018c60076010811015156125cd57fe5b60209081029190910151600160a060020a03168252018b6000602090810291909101518252018b6001602090810291909101518252018b6002602090810291909101518252018b6003602090810291909101518252018b600460200201519052604080516102608101909152808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff1660018111156126cd57fe5b60018111156126d857fe5b81526020018b6003602002015160ff1660018111156126f357fe5b60018111156126fe57fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a09091015283613884565b50505050505050505050565b60066020526000908152604090205481565b60046020526000908152604090205460ff1681565b600060606127da896007611b91565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01519092169181019190915260006080820152909150611caf9060a0810189600181111561283b57fe5b815260200188600181111561284c57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a0390811683528c51838301528c820151604080850191909152808e01516060808601919091528e01516080808601919091528e015160a0909401939093528d820151166000908152600690915220546135ca565b6000546101009004600160a060020a031681565b6060612917614d9c565b612922896007611b91565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d0151909216918101919091526000608082015290925060a0810188600181111561297f57fe5b815260200187600181111561299057fe5b815260808b810151600160a060020a03908116602084015260c08c81015160408501526060840187905291830189905260a0808e015190911690830152810186905260e0018a600660209081029190910151600160a060020a0390811683528b51838301528b820151604080850191909152808d01516060808601919091528d01516080808601919091528d015160a0909401939093528382015116600090815260069091522054909150612a46908290613d93565b505050505050505050565b600a5481565b6060612a61614d9c565b60e08901516101008a015160808b01518551612a81939291908c9061325a565b60608a0151909250600160a060020a03161515612b0e576040805160e560020a62461bcd02815260206004820152602960248201527f6d616b657252656c61796572466565526563697069656e74206d757374206e6f60448201527f74206265207a65726f0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8451825114612b8d576040805160e560020a62461bcd02815260206004820152602360248201527f7265706c6163656d656e74207061747465726e206c656e677468206d69736d6160448201527f7463680000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60408051610260810182528a51600160a060020a0390811682526020808d01518216908301528b8301518116928201929092526060808c0151909216918101919091526000608082015260a08101886001811115612be757fe5b8152602001876001811115612bf857fe5b815260808b810151600160a060020a03908116602084015260c08c81015160408501526060840187905291830189905260a0808e015190911690830152810186905260e0018a600660209081029190910151600160a060020a031682528a51828201528a8101516040808401919091528b01516060808401919091528b01516080808401919091528b015160a090920191909152840151909150612a46908290613e00565b600154600160a060020a03163314612cb457600080fd5b6101f4811115612d0e576040805160e560020a62461bcd02815260206004820152601960248201527f696e76616c69642065786368616e676520666565207261746500000000000000604482015290519081900360640190fd5b600755565b61271081565b600254600160a060020a031681565b6101f481565b60008181526005602052604090205415155b919050565b60006060612d51614d9c565b612d5c8a60076121c0565b60408051610260810182528c51600160a060020a0390811682526020808f01518216908301528d8301518116928201929092526060808e0151909216918101919091526000608082015290925060a08101896001811115612db957fe5b8152602001886001811115612dca57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a031682528b51828201528b01516040808301919091528b01516060808301919091528b01516080808301919091528b015160a0909101529050612305816141e0565b60095481565b600c54600160a060020a031681565b600154600160a060020a03163314612f02576040805160e560020a62461bcd02815260206004820152603160248201527f73657450656e64696e67476f7665726e6f723a2043616c6c206d75737420636f60448201527f6d652066726f6d20676f7665726e6f722e000000000000000000000000000000606482015290519081900360840190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907fe6df4d3d01a6133dfdecd1b451c04ec286cb4b10e7235d2b27321b476216e6d790600090a250565b6000546101009004600160a060020a03163314612f7b57600080fd5b600160a060020a0381161515612f9057600080fd5b60008054604051600160a060020a038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b60008060006130328460a001518560c00151866101c00151876101e001518861020001518961022001516137f1565b915061305e8560a001518660c00151876101c00151886101e001518961020001518a61022001516137f1565b90508181101561306d57600080fd5b6060840151600160a060020a0316151561308757806123df565b509392505050565b600080825111156130cc57815180602001830160208401855b600183831014156130c35781518152602091820191016130a8565b50505092909201915b5090919050565b6000808360a0015160018111156130e657fe5b148015613102575060018260a00151600181111561310057fe5b145b80156131295750816101a00151600160a060020a0316836101a00151600160a060020a0316145b801561316357506040820151600160a060020a0316158061316357508260200151600160a060020a03168260400151600160a060020a0316145b801561319d57506040830151600160a060020a0316158061319d57508160200151600160a060020a03168360400151600160a060020a0316145b80156131f857506060820151600160a060020a03161580156131cb57506060830151600160a060020a031615155b806131f857506060820151600160a060020a0316158015906131f857506060830151600160a060020a0316155b801561321d57508160e00151600160a060020a03168360e00151600160a060020a0316145b80156132385750613238836102000151846102200151614241565b80156132535750613253826102000151836102200151614241565b9392505050565b6060806000808080876008602002015115156132f35786156132c6576040805160e560020a62461bcd02815260206004820152601260248201527f696e76616c6964206d65726b6c65526f6f740000000000000000000000000000604482015290519081900360640190fd5b6132ec8860055b60200201518c8c8c8c600660200201518d600760200201518d8c611deb565b95506133e6565b61010088015160021180159061330857508615155b151561335e576040805160e560020a62461bcd02815260206004820152601360248201527f696e76616c6964206d65726b6c65206461746100000000000000000000000000604482015290519081900360640190fd5b6101008801519250600091505b821561339c576002830490508261338382600261425d565b101561338e57600191505b60019093019291508161336b565b8115156133ab57600019909301925b836040519080825280602002602001820160405280156133d5578160200160208202803883390190505b5094506133e38860056132cd565b95505b505050505095945050505050565b60006134208260a001518360c00151846101c00151856101e001518661020001518761022001516137f1565b92915050565b60008060008451865114151561343b57600080fd5b835186511461344957600080fd5b855160209004925060208084029250839083041461346357fe5b5060005b828110156134935760010160208102848101518682015191880180519282169119909216179052613467565b60008311156134c357829050806001016020028085015181870151811682890151821916178289015250506135a5565b50805b85518110156135a55784818151811015156134dd57fe5b90602001015160f860020a900460f860020a0284828151811015156134fe57fe5b90602001015160f860020a900460f860020a0216868281518110151561352057fe5b90602001015160f860020a900460f860020a02858381518110151561354157fe5b90602001015160f860020a900460f860020a0260ff60f860020a02181617868281518110151561356d57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016134c6565b505050505050565b6000828201838110156135bf57600080fd5b8091505b5092915050565b60007f048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a216135f7848461428b565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091526022820194909452604280820193909352815180820390930183526062019081905281519192909182918401908083835b602083106136755780518252601f199092019160209182019101613656565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209695505050505050565b6000806136b4836141e0565b15156136c357600091506135c3565b60008481526004602052604090205460ff16156136e357600091506135c3565b5060008381526005602052604090205480151561370357600091506135c3565b602080840151600160a060020a0316600090815260069091526040902054600101811491505092915050565b6000816040518082805190602001908083835b602083106137615780518252601f199092019160209182019101613742565b51815160209384036101000a6000190180199092169116179052604051919093018190038120885190955088945090928392508401908083835b602083106137ba5780518252601f19909201916020918201910161379b565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120939093149695505050505050565b6000808087600181111561380157fe5b141561380f57859150613879565b600187600181111561381d57fe5b1415613879576138486138398661383442886144fa565b61425d565b61384385876144fa565b614511565b9050600188600181111561385857fe5b141561386f5761386886826144fa565b9150613879565b61386886826135ad565b509695505050505050565b600080548190819060ff161561389957600080fd5b6000805460ff191660011790556020860151600160a060020a031633141561391f576138c4866141e0565b151561391a576040805160e560020a62461bcd02815260206004820152601260248201527f696e76616c69642062757920706172616d730000000000000000000000000000604482015290519081900360640190fd5b61392b565b61392886614534565b92505b6020850151600160a060020a03163314156139a457613949856141e0565b151561399f576040805160e560020a62461bcd02815260206004820152601360248201527f696e76616c69642073656c6c20706172616d7300000000000000000000000000604482015290519081900360640190fd5b6139b0565b6139ad85614534565b91505b6139ba86866130d3565b1515613a10576040805160e560020a62461bcd02815260206004820152601160248201527f6f726465722063616e2774206d61746368000000000000000000000000000000604482015290519081900360640190fd5b6000866101400151511115613a3957613a39866101200151866101200151886101400151613426565b6000856101400151511115613a6257613a62856101200151876101200151876101400151613426565b613a7686610120015186610120015161372f565b1515613acc576040805160e560020a62461bcd02815260206004820152601660248201527f63616c6c6461746120646f65736e277420657175616c00000000000000000000604482015290519081900360640190fd5b6020860151600160a060020a03163314613afa576000838152600460205260409020805460ff191660011790555b6020850151600160a060020a03163314613b28576000828152600460205260409020805460ff191660011790555b613b32868661455d565b600c546101208701516040518151939450600160a060020a03909216929091908190602084019080838360005b83811015613b77578181015183820152602001613b5f565b50505050905090810190601f168015613ba45780820380516001836020036101000a031916815260200191505b50915050600060405180830381855af49150501515613c0d576040805160e560020a62461bcd02815260206004820152601660248201527f6f726465722063616c6c64617461206661696c75726500000000000000000000604482015290519081900360640190fd5b610160860151600160a060020a031615613c4657613c3b866101600151866101200151886101800151611807565b1515613c4657600080fd5b610160850151600160a060020a031615613c7f57613c74856101600151866101200151876101800151611807565b1515613c7f57600080fd5b60608501518490600160a060020a03161515613c9f578560200151613ca5565b86602001515b6060870151600160a060020a0391821691161515613cc7578760200151613ccd565b86602001515b600160a060020a03167f5e89bc5bf129d9595ae14697a763c17e6acd67579b9f1f4fa548f57ec762a05786866000600160a060020a03168b60600151600160a060020a03161415613d22578b60600151613d28565b8a606001515b60608c0151600160a060020a03161515613d46578b60800151613d4c565b8c608001515b604080519485526020850193909352600160a060020a039182168484015216606083015260808201879052519081900360a00190a450506000805460ff1916905550505050565b6000613d9f8383614b76565b6020840151909150600160a060020a03163314613dbb57600080fd5b600081815260046020526040808220805460ff191660011790555182917f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d91a2505050565b6020820151600090600160a060020a03163314613e1c57600080fd5b602080840151600160a060020a0316600090815260069091526040902054613e459084906135ca565b60008181526005602052604090205490915015613eac576040805160e560020a62461bcd02815260206004820152601560248201527f6475706c696361746564206f7264657220686173680000000000000000000000604482015290519081900360640190fd5b600660008460200151600160a060020a0316600160a060020a0316815260200190815260200160002054600101600560008360001916600019168152602001908152602001600020819055508260600151600160a060020a03168360200151600160a060020a031682600019167fbfc991b64000533072b5f27ccd5e8628fea28ae33286778a627005b3156c6fe1866000015187604001518860a001518960c001518a60e001518b61010001518b6040518088600160a060020a0316600160a060020a0316815260200187600160a060020a0316600160a060020a03168152602001866001811115613f9a57fe5b60ff168152602001856001811115613fae57fe5b60ff168152600160a060020a0390941660208501525060408084019290925260608301525190819003608001945092505050a480600019167fb7c210e6374e28618aff2db2406f01343e302b15476278b7795869bccc51f979846101200151856101400151866101600151876101800151886101a00151896101c001518a6101e001518b61020001518c61022001518d61024001516040518080602001806020018b600160a060020a0316600160a060020a03168152602001806020018a600160a060020a0316600160a060020a0316815260200189815260200188815260200187815260200186815260200185815260200184810384528e818151815260200191508051906020019080838360005b838110156140d65781810151838201526020016140be565b50505050905090810190601f1680156141035780820380516001836020036101000a031916815260200191505b5084810383528d5181528d516020918201918f019080838360005b8381101561413657818101518382015260200161411e565b50505050905090810190601f1680156141635780820380516001836020036101000a031916815260200191505b5084810382528b5181528b516020918201918d019080838360005b8381101561419657818101518382015260200161417e565b50505050905090810190601f1680156141c35780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a2505050565b8051600090600160a060020a031630146141fc57506000612d40565b6020820151600160a060020a0316151561421857506000612d40565b61422b8260c00151836102200151614be5565b151561423957506000612d40565b506001919050565b6000428310801561325357508115806132535750504210919050565b60008083151561427057600091506135c3565b5082820282848281151561428057fe5b04146135bf57600080fd5b604080516102a08082526102c0820190925260009190606090839083602082016154008038833901905050915050602081016142e7817ff446866267029076a71bb126e250b9480cd4ac2699baa745a582b10b361ec951614c04565b90506142f7818760000151614c04565b9050614307818760200151614c04565b9050614317818760400151614c04565b9050614327818760600151614c04565b9050614337818760800151614c04565b9050614352818760a00151600181111561434d57fe5b614c04565b9050614368818760c00151600181111561434d57fe5b9050614378818760e00151614c04565b905061438981876101000151614c04565b90506143f6818761012001516040518082805190602001908083835b602083106143c45780518252601f1990920191602091820191016143a5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020614c04565b905061443081876101400151604051808280519060200190808383602083106143c45780518252601f1990920191602091820191016143a5565b905061444181876101600151614c04565b905061447b81876101800151604051808280519060200190808383602083106143c45780518252601f1990920191602091820191016143a5565b905061448c81876101a00151614c04565b905061449d81876101c00151614c04565b90506144ae81876101e00151614c04565b90506144bf81876102000151614c04565b90506144d081876102200151614c04565b90506144e181876102400151614c04565b90506144ed8186614c04565b5050602001209392505050565b6000808383111561450a57600080fd5b5050900390565b60008080831161452057600080fd5b828481151561452b57fe5b04949350505050565b602080820151600160a060020a0316600090815260069091526040812054613420908390614b76565b600080600080600080600080600080600080600160a060020a03168c6101a00151600160a060020a031614151561459957341561459957600080fd5b6145a38d8d613003565b995060008a1180156145c257506101a08c0151600160a060020a031615155b156145e0576145e08c6101a001518e602001518e602001518d614c0c565b8998508997506145fd6145f56007548c61425d565b612710614511565b9650600095506146108c60e00151614cd1565b156146c4578b60e00151600160a060020a0316632a55205a8e61010001518c6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180838152602001828152602001925050506040805180830381600087803b15801561468757600080fd5b505af115801561469b573d6000803e3d6000fd5b505050506040513d60408110156146b157600080fd5b508051602090910151909650945061476d565b600d5460e08d0151604080517f2782d6c7000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018e905281519290931692632782d6c792604480830193928290030181600087803b15801561473457600080fd5b505af1158015614748573d6000803e3d6000fd5b505050506040513d604081101561475e57600080fd5b50805160209091015190965094505b600160a060020a0386161580159061478457508415155b156147fc576101a08c0151600160a060020a031615156147e7576147a889866144fa565b604051909950600160a060020a0387169086156108fc029087906000818181858888f193505050501580156147e1573d6000803e3d6000fd5b506147fc565b6147fc8c6101a001518d602001518888614c0c565b60608c0151600160a060020a03161580159061481757508615155b156149e35761482b6145f56009548961425d565b6101a08d0151909450600160a060020a031615156148905761484d89856144fa565b60608d0151604051919a50600160a060020a03169085156108fc029086906000818181858888f1935050505015801561488a573d6000803e3d6000fd5b506148a9565b6148a98c6101a001518d602001518e6060015187614c0c565b60808d0151600160a060020a031615614949576148cb6145f56008548961425d565b6101a08d0151909350600160a060020a03161515614930576148ed89846144fa565b60808e0151604051919a50600160a060020a03169084156108fc029085906000818181858888f1935050505015801561492a573d6000803e3d6000fd5b50614949565b6149498c6101a001518d602001518f6080015186614c0c565b6149586145f5600a548961425d565b6101a08d0151909250600160a060020a031615156149bb5761497a89836144fa565b600b54604051919a50600160a060020a03169083156108fc029084906000818181858888f193505050501580156149b5573d6000803e3d6000fd5b506149de565b6101a08c015160208d0151600b546149de929190600160a060020a031685614c0c565b614ab1565b60608c0151600160a060020a03161515614ab1576101a08c0151600160a060020a03161515614a1157600080fd5b8615614ab157614a266145f56009548961425d565b9350614a418c6101a001518d602001518f6060015187614c0c565b60808c0151600160a060020a031615614a7e57614a636145f56008548961425d565b9250614a7e8c6101a001518d602001518e6080015186614c0c565b614a8d6145f5600a548961425d565b6101a08d015160208e0151600b54929450614ab192600160a060020a031685614c0c565b6101a08c0151600160a060020a03161515614b655734881115614ad357600080fd5b8b60200151600160a060020a03166108fc8a9081150290604051600060405180830381858888f19350505050158015614b10573d6000803e3d6000fd5b50614b1b34896144fa565b90506000811115614b65578c60200151600160a060020a03166108fc829081150290604051600060405180830381858888f19350505050158015614b63573d6000803e3d6000fd5b505b50979b9a5050505050505050505050565b600080614b8384846135ca565b9050614b8f81856136a8565b15156135bf576040805160e560020a62461bcd02815260206004820152600d60248201527f696e76616c6964206f7264657200000000000000000000000000000000000000604482015290519081900360640190fd5b600080836001811115614bf457fe5b1480613253575050600010919050565b815260200190565b6000811115614ccb57600354604080517f15dacbea000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301528681166024830152858116604483015260648201859052915191909216916315dacbea9160848083019260209291908290030181600087803b158015614c9457600080fd5b505af1158015614ca8573d6000803e3d6000fd5b505050506040513d6020811015614cbe57600080fd5b50511515614ccb57600080fd5b50505050565b604080517f2a55205a00000000000000000000000000000000000000000000000000000000602480830191909152825180830390910181526044909101825260208181018051600160e060020a03167f01ffc9a7000000000000000000000000000000000000000000000000000000001790528251818152808401909352600092839291606091849181602001602082028038833901905050915060208284516020860160008a5af19350831515614d8c5760009450614d93565b5080519350835b50505050919050565b604080516102608101825260008082526020820181905291810182905260608101829052608081018290529060a08201908152602001600081526020016000600160a060020a031681526020016000815260200160608152602001606081526020016000600160a060020a03168152602001606081526020016000600160a060020a03168152602001600081526020016000815260200160008152602001600081526020016000815250905600a165627a7a7230582033844ff19818572d40975a7a52f206c4f20c5ea6cfa35bdc44884f44faf6bbd8002997b3fae253daa304aa40063e4f71c3efec8d260848d7379fc623e35f84c73f47e6bbd6277e1bf288eed5e8d1780f9a50b239e86b153736bceebccf4ea79d90b38b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f4f7264657228616464726573732065786368616e67652c61646472657373206d616b65722c616464726573732074616b65722c61646472657373206d616b657252656c61796572466565526563697069656e742c616464726573732074616b657252656c61796572466565526563697069656e742c75696e743820736964652c75696e74382073616c654b696e642c61646472657373206e6674416464726573732c75696e7420746f6b656e49642c62797465733332206d65726b6c65526f6f742c62797465732063616c6c646174612c6279746573207265706c6163656d656e745061747465726e2c61646472657373207374617469635461726765742c6279746573207374617469634578747261646174612c61646472657373207061796d656e74546f6b656e2c75696e74323536206261736550726963652c75696e743235362065787472612c75696e74323536206c697374696e6754696d652c75696e743235362065787069726174696f6e54696d652c75696e743235362073616c742c75696e74323536206e6f6e636529000000000000000000000000c09f6ebf24d9cc1b4140baa992afb7a5bf41a54700000000000000000000000044a6eaa71ad81f206829dbb59b63e6c733295f4f0000000000000000000000005d01d08834283885b97c4a9eef16631707c83f9b000000000000000000000000d766fab1a146c835ca3ae2b2bf27b179f52b0211

Deployed Bytecode

0x6080604052600436106101f85763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663028e01cf81146101fd57806306fdde03146104155780630c340a241461049f5780630eefdbad146104d05780630f9b4955146104e557806310796a47146104fa5780631f2c56d7146105b35780631f86dbc0146107b9578063238efcbc146108b8578063239e83df146108cf5780633644e515146109a457806337146f2e146109b95780633d1cf52614610a3a5780633df6be1314610a585780633eeb5bc814610b575780634a3b5e0514610b6c578063514f033014610b8157806354fd4d5014610ba2578063562b2ebc14610bb7578063627cdcb914610cca57806363d36c0b14610cdf57806364df049e14610d0c578063715018a614610d215780637da26f5514610d365780637ecebe0014610f315780638076f00514610f5257806381da91a014610f6a5780638da5cb5b14611069578063941461661461107e578063960b26a21461117d57806397cea71b14611192578063ade0ccb2146112b2578063cae6047f146112ca578063e3056a34146112df578063e4e098f7146112f4578063e57d4adb14611309578063e7b74b6414611321578063e8898e6d14611420578063f111357514611435578063f235757f1461144a578063f2fde38b1461146b575b600080fd5b34801561020957600080fd5b5060408051610200818101909252610403913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975061148c9650505050505050565b60408051918252519081900360200190f35b34801561042157600080fd5b5061042a6117ac565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561046457818101518382015260200161044c565b50505050905090810190601f1680156104915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ab57600080fd5b506104b46117e3565b60408051600160a060020a039092168252519081900360200190f35b3480156104dc57600080fd5b506104b46117f2565b3480156104f157600080fd5b50610403611801565b34801561050657600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261059f958335600160a060020a031695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506118079650505050505050565b604080519115158252519081900360200190f35b3480156105bf57600080fd5b506040805161020081810190925261059f913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506118769650505050505050565b3480156107c557600080fd5b50604080516101208181019092526104039136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497505093359450611b869350505050565b3480156108c457600080fd5b506108cd611cbc565b005b3480156108db57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261042a94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750611db29650505050505050565b3480156109b057600080fd5b50610403611dc7565b3480156109c557600080fd5b50604080516020600460e43581810135838102808601850190965280855261042a9583359560248035600160a060020a0390811697604435821697606435909216966084359660a4359660c435963696610104959194019291829185019084908082843750949750611deb9650505050505050565b348015610a4657600080fd5b506108cd60043560243560443561211d565b348015610a6457600080fd5b506040805161012081810190925261059f9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506121ad9350505050565b348015610b6357600080fd5b506104b4612313565b348015610b7857600080fd5b50610403612322565b348015610b8d57600080fd5b506108cd600160a060020a0360043516612328565b348015610bae57600080fd5b5061042a612373565b348015610bc357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261059f94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506123aa9650505050505050565b348015610cd657600080fd5b506108cd6123e8565b348015610ceb57600080fd5b5061040360ff6004358116906024351660443560643560843560a43561243a565b348015610d1857600080fd5b506104b4612455565b348015610d2d57600080fd5b506108cd612464565b604080516102008181019092526108cd913691600491610204919083906010908390839080828437505060408051610180818101909252949796958181019594509250600c9150839083908082843750506040805160808181019092529497969581810195945092506004915083908390808284375050604080516020601f88358a0180359182018390048302840183019094528083529699989781019691955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506124da9350505050565b348015610f3d57600080fd5b50610403600160a060020a03600435166127a4565b348015610f5e57600080fd5b5061059f6004356127b6565b348015610f7657600080fd5b50604080516101208181019092526104039136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050933594506127cb9350505050565b34801561107557600080fd5b506104b46128f9565b34801561108a57600080fd5b50604080516101208181019092526108cd9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750509335945061290d9350505050565b34801561118957600080fd5b50610403612a51565b34801561119e57600080fd5b50604080516101208181019092526108cd9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750506040805180820182529598979681810196955093506002925084915083908082843750939650612a5795505050505050565b3480156112be57600080fd5b506108cd600435612c9d565b3480156112d657600080fd5b50610403612d13565b3480156112eb57600080fd5b506104b4612d19565b34801561130057600080fd5b50610403612d28565b34801561131557600080fd5b5061059f600435612d2e565b34801561132d57600080fd5b506040805161012081810190925261059f9136916004916101249190839060099083908390808284375050604080516101208181019092529497969581810195945092506009915083908390808284375050604080516020601f838901358a018035918201839004830284018301909452808352969960ff893581169a838b01359091169991989097506060909101955091935091820191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497505093359450612d459350505050565b34801561142c57600080fd5b50610403612e65565b34801561144157600080fd5b506104b4612e6b565b34801561145657600080fd5b506108cd600160a060020a0360043516612e7a565b34801561147757600080fd5b506108cd600160a060020a0360043516612f5f565b6000611496614d9c565b61149e614d9c565b604080516102608101909152808d600060209081029190910151600160a060020a03168252018d600160209081029190910151600160a060020a03168252018d600260209081029190910151600160a060020a03168252018d600360209081029190910151600160a060020a03168252018d600460209081029190910151600160a060020a03168252018b6000602002015160ff16600181111561153e57fe5b600181111561154957fe5b81526020018b6001602002015160ff16600181111561156457fe5b600181111561156f57fe5b815260a0808f0151600160a060020a031660208301528d8101516040830152606082018c9052608082018a9052018d60066020020151600160a060020a031681526020018681526020018d60076010811015156115c857fe5b60209081029190910151600160a060020a03168252018c6000602090810291909101518252018c6001602090810291909101518252018c6002602090810291909101518252018c6003602090810291909101518252018c600460200201519052604080516102608101909152909250808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff1660018111156116cb57fe5b60018111156116d657fe5b81526020018b6003602002015160ff1660018111156116f157fe5b60018111156116fc57fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a090910152905061179c8282613003565b9c9b505050505050505050505050565b60408051808201909152601e81527f4e69667479436f6e6e6563742045786368616e676520436f6e74726163740000602082015281565b600154600160a060020a031681565b600354600160a060020a031681565b60075481565b60006060600083518551016040519080825280601f01601f19166020018201604052801561183f578160200160208202803883390190505b5091505060208101611851818561308f565b905061185d818661308f565b506000604051835160208501895afa9695505050505050565b6000611880614d9c565b611888614d9c565b604080516102608101909152808d600060209081029190910151600160a060020a03168252018d600160209081029190910151600160a060020a03168252018d600260209081029190910151600160a060020a03168252018d600360209081029190910151600160a060020a03168252018d600460209081029190910151600160a060020a03168252018b6000602002015160ff16600181111561192857fe5b600181111561193357fe5b81526020018b6001602002015160ff16600181111561194e57fe5b600181111561195957fe5b815260a0808f0151600160a060020a031660208301528d8101516040830152606082018c9052608082018a9052018d60066020020151600160a060020a031681526020018681526020018d60076010811015156119b257fe5b60209081029190910151600160a060020a03168252018c6000602090810291909101518252018c6001602090810291909101518252018c6002602090810291909101518252018c6003602090810291909101518252018c600460200201519052604080516102608101909152909250808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff166001811115611ab557fe5b6001811115611ac057fe5b81526020018b6003602002015160ff166001811115611adb57fe5b6001811115611ae657fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a090910152905061179c82826130d3565b60006060611ba88960075b60200201516101008b015160808c01518b8761325a565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01519092169181019190915260006080820152909150611caf9060a08101896001811115611c0957fe5b8152602001886001811115611c1a57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a031682528b51828201528b01516040808301919091528b01516060808301919091528b01516080808301919091528b015160a0909101526133f4565b9998505050505050505050565b600254600090600160a060020a03163314611d47576040805160e560020a62461bcd02815260206004820152603660248201527f616363657074476f7665726e616e63653a2043616c6c206d75737420636f6d6560448201527f2066726f6d2070656e64696e67476f7665726e6f722e00000000000000000000606482015290519081900360840190fd5b506001805473ffffffffffffffffffffffffffffffffffffffff19808216331792839055600280549091169055604051600160a060020a03918216929091169082907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce8090600090a350565b6060611dbf848484613426565b509192915050565b7f048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a2181565b60606000896002811115611dfb57fe5b90506000816002811115611e0b57fe5b1415611eee57604051600160a060020a03808b1660248301908152818b16604484015290891660648301526084820188905260a4820186905260c060c48301908152855160e484015285518c938c938c938c938b938b939291610104909101906020808601910280838360005b83811015611e90578181015183820152602001611e78565b50506040805193909501838103601f19018452909452506020810180517ffb16a59500000000000000000000000000000000000000000000000000000000600160e060020a039091161790529b506121109950505050505050505050565b6001816002811115611efc57fe5b1415611fdf57604051600160a060020a03808b1660248301908152818b16604484015290891660648301526084820188905260a4820186905260c060c48301908152855160e484015285518c938c938c938c938b938b939291610104909101906020808601910280838360005b83811015611f81578181015183820152602001611f69565b50506040805193909501838103601f19018452909452506020810180517fc5a0236e00000000000000000000000000000000000000000000000000000000600160e060020a039091161790529b506121109950505050505050505050565b6002816002811115611fed57fe5b14156120fe57888888888888886040516024018088600160a060020a0316600160a060020a0316815260200187600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a03168152602001858152602001848152602001836000191660001916815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561209f578181015183820152602001612087565b50506040805193909501838103601f19018452909452506020810180517f96809f9000000000000000000000000000000000000000000000000000000000600160e060020a039091161790529c506121109a5050505050505050505050565b60408051600081526020810190915291505b5098975050505050505050565b600154600160a060020a0316331461213457600080fd5b61271061214a61214485856135ad565b836135ad565b1461219f576040805160e560020a62461bcd02815260206004820152601560248201527f696e76616c6964206e6577206665652073686172650000000000000000000000604482015290519081900360640190fd5b600892909255600955600a55565b600060606121b9614d9c565b6121d78a60075b60200201516101008c015160808d01518c8861325a565b60408051610260810182528c51600160a060020a0390811682526020808f01518216908301528d8301518116928201929092526060808e0151909216918101919091526000608082015290925060a0810189600181111561223457fe5b815260200188600181111561224557fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a0390811683528c51838301528c820151604080850191909152808e01516060808601919091528e01516080808601919091528e015160a0909401939093528382015116600090815260069091522054909150612305906122ff9083906135ca565b826136a8565b9a9950505050505050505050565b600d54600160a060020a031681565b60085481565b6000546101009004600160a060020a0316331461234457600080fd5b600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60408051808201909152600381527f312e300000000000000000000000000000000000000000000000000000000000602082015281565b600080845111156123c0576123c0858486613426565b6000825111156123d5576123d5838684613426565b6123df858461372f565b95945050505050565b33600081815260066020908152604091829020805460010190819055825181815292519093927fa82a649bbd060c9099cd7b7326e2b0dc9e9af0836480e0f849dc9eaa79710b3b92908290030190a250565b600061244a8787878787876137f1565b979650505050505050565b600b54600160a060020a031681565b6000546101009004600160a060020a0316331461248057600080fd5b60008054604051610100909104600160a060020a0316917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805474ffffffffffffffffffffffffffffffffffffffff0019169055565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01518316908201526080808d0151909216918101919091528851612798919060a082019060ff16600181111561254357fe5b600181111561254e57fe5b81526020018a6001602002015160ff16600181111561256957fe5b600181111561257457fe5b815260a0808e0151600160a060020a031660208301528c8101516040830152606082018b905260808201899052018c60066020020151600160a060020a031681526020018581526020018c60076010811015156125cd57fe5b60209081029190910151600160a060020a03168252018b6000602090810291909101518252018b6001602090810291909101518252018b6002602090810291909101518252018b6003602090810291909101518252018b600460200201519052604080516102608101909152808d600860209081029190910151600160a060020a03168252018d600960209081029190910151600160a060020a03168252018d600a60209081029190910151600160a060020a03168252018d600b60209081029190910151600160a060020a03168252018d600c60209081029190910151600160a060020a03168252018b6002602002015160ff1660018111156126cd57fe5b60018111156126d857fe5b81526020018b6003602002015160ff1660018111156126f357fe5b60018111156126fe57fe5b81526101a08e0151600160a060020a0390811660208301526101608e01516040830152606082018b9052608082018990526101c08f01511660a082015260c0810186905260e0018d600f60209081029190910151600160a060020a0316825260c08e01519082015260e08d015160408201526101008d015160608201526101208d015160808201526101408d015160a09091015283613884565b50505050505050505050565b60066020526000908152604090205481565b60046020526000908152604090205460ff1681565b600060606127da896007611b91565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d01519092169181019190915260006080820152909150611caf9060a0810189600181111561283b57fe5b815260200188600181111561284c57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a0390811683528c51838301528c820151604080850191909152808e01516060808601919091528e01516080808601919091528e015160a0909401939093528d820151166000908152600690915220546135ca565b6000546101009004600160a060020a031681565b6060612917614d9c565b612922896007611b91565b60408051610260810182528b51600160a060020a0390811682526020808e01518216908301528c8301518116928201929092526060808d0151909216918101919091526000608082015290925060a0810188600181111561297f57fe5b815260200187600181111561299057fe5b815260808b810151600160a060020a03908116602084015260c08c81015160408501526060840187905291830189905260a0808e015190911690830152810186905260e0018a600660209081029190910151600160a060020a0390811683528b51838301528b820151604080850191909152808d01516060808601919091528d01516080808601919091528d015160a0909401939093528382015116600090815260069091522054909150612a46908290613d93565b505050505050505050565b600a5481565b6060612a61614d9c565b60e08901516101008a015160808b01518551612a81939291908c9061325a565b60608a0151909250600160a060020a03161515612b0e576040805160e560020a62461bcd02815260206004820152602960248201527f6d616b657252656c61796572466565526563697069656e74206d757374206e6f60448201527f74206265207a65726f0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8451825114612b8d576040805160e560020a62461bcd02815260206004820152602360248201527f7265706c6163656d656e74207061747465726e206c656e677468206d69736d6160448201527f7463680000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60408051610260810182528a51600160a060020a0390811682526020808d01518216908301528b8301518116928201929092526060808c0151909216918101919091526000608082015260a08101886001811115612be757fe5b8152602001876001811115612bf857fe5b815260808b810151600160a060020a03908116602084015260c08c81015160408501526060840187905291830189905260a0808e015190911690830152810186905260e0018a600660209081029190910151600160a060020a031682528a51828201528a8101516040808401919091528b01516060808401919091528b01516080808401919091528b015160a090920191909152840151909150612a46908290613e00565b600154600160a060020a03163314612cb457600080fd5b6101f4811115612d0e576040805160e560020a62461bcd02815260206004820152601960248201527f696e76616c69642065786368616e676520666565207261746500000000000000604482015290519081900360640190fd5b600755565b61271081565b600254600160a060020a031681565b6101f481565b60008181526005602052604090205415155b919050565b60006060612d51614d9c565b612d5c8a60076121c0565b60408051610260810182528c51600160a060020a0390811682526020808f01518216908301528d8301518116928201929092526060808e0151909216918101919091526000608082015290925060a08101896001811115612db957fe5b8152602001886001811115612dca57fe5b815260808c810151600160a060020a03908116602084015260c08d8101516040850152606084018790529183018a905260a0808f015190911690830152810187905260e0018b600660209081029190910151600160a060020a031682528b51828201528b01516040808301919091528b01516060808301919091528b01516080808301919091528b015160a0909101529050612305816141e0565b60095481565b600c54600160a060020a031681565b600154600160a060020a03163314612f02576040805160e560020a62461bcd02815260206004820152603160248201527f73657450656e64696e67476f7665726e6f723a2043616c6c206d75737420636f60448201527f6d652066726f6d20676f7665726e6f722e000000000000000000000000000000606482015290519081900360840190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907fe6df4d3d01a6133dfdecd1b451c04ec286cb4b10e7235d2b27321b476216e6d790600090a250565b6000546101009004600160a060020a03163314612f7b57600080fd5b600160a060020a0381161515612f9057600080fd5b60008054604051600160a060020a038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b60008060006130328460a001518560c00151866101c00151876101e001518861020001518961022001516137f1565b915061305e8560a001518660c00151876101c00151886101e001518961020001518a61022001516137f1565b90508181101561306d57600080fd5b6060840151600160a060020a0316151561308757806123df565b509392505050565b600080825111156130cc57815180602001830160208401855b600183831014156130c35781518152602091820191016130a8565b50505092909201915b5090919050565b6000808360a0015160018111156130e657fe5b148015613102575060018260a00151600181111561310057fe5b145b80156131295750816101a00151600160a060020a0316836101a00151600160a060020a0316145b801561316357506040820151600160a060020a0316158061316357508260200151600160a060020a03168260400151600160a060020a0316145b801561319d57506040830151600160a060020a0316158061319d57508160200151600160a060020a03168360400151600160a060020a0316145b80156131f857506060820151600160a060020a03161580156131cb57506060830151600160a060020a031615155b806131f857506060820151600160a060020a0316158015906131f857506060830151600160a060020a0316155b801561321d57508160e00151600160a060020a03168360e00151600160a060020a0316145b80156132385750613238836102000151846102200151614241565b80156132535750613253826102000151836102200151614241565b9392505050565b6060806000808080876008602002015115156132f35786156132c6576040805160e560020a62461bcd02815260206004820152601260248201527f696e76616c6964206d65726b6c65526f6f740000000000000000000000000000604482015290519081900360640190fd5b6132ec8860055b60200201518c8c8c8c600660200201518d600760200201518d8c611deb565b95506133e6565b61010088015160021180159061330857508615155b151561335e576040805160e560020a62461bcd02815260206004820152601360248201527f696e76616c6964206d65726b6c65206461746100000000000000000000000000604482015290519081900360640190fd5b6101008801519250600091505b821561339c576002830490508261338382600261425d565b101561338e57600191505b60019093019291508161336b565b8115156133ab57600019909301925b836040519080825280602002602001820160405280156133d5578160200160208202803883390190505b5094506133e38860056132cd565b95505b505050505095945050505050565b60006134208260a001518360c00151846101c00151856101e001518661020001518761022001516137f1565b92915050565b60008060008451865114151561343b57600080fd5b835186511461344957600080fd5b855160209004925060208084029250839083041461346357fe5b5060005b828110156134935760010160208102848101518682015191880180519282169119909216179052613467565b60008311156134c357829050806001016020028085015181870151811682890151821916178289015250506135a5565b50805b85518110156135a55784818151811015156134dd57fe5b90602001015160f860020a900460f860020a0284828151811015156134fe57fe5b90602001015160f860020a900460f860020a0216868281518110151561352057fe5b90602001015160f860020a900460f860020a02858381518110151561354157fe5b90602001015160f860020a900460f860020a0260ff60f860020a02181617868281518110151561356d57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016134c6565b505050505050565b6000828201838110156135bf57600080fd5b8091505b5092915050565b60007f048b125515112cdaed03d1edbee453f1de399178750917e49ce82b75444d7a216135f7848461428b565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091526022820194909452604280820193909352815180820390930183526062019081905281519192909182918401908083835b602083106136755780518252601f199092019160209182019101613656565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209695505050505050565b6000806136b4836141e0565b15156136c357600091506135c3565b60008481526004602052604090205460ff16156136e357600091506135c3565b5060008381526005602052604090205480151561370357600091506135c3565b602080840151600160a060020a0316600090815260069091526040902054600101811491505092915050565b6000816040518082805190602001908083835b602083106137615780518252601f199092019160209182019101613742565b51815160209384036101000a6000190180199092169116179052604051919093018190038120885190955088945090928392508401908083835b602083106137ba5780518252601f19909201916020918201910161379b565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120939093149695505050505050565b6000808087600181111561380157fe5b141561380f57859150613879565b600187600181111561381d57fe5b1415613879576138486138398661383442886144fa565b61425d565b61384385876144fa565b614511565b9050600188600181111561385857fe5b141561386f5761386886826144fa565b9150613879565b61386886826135ad565b509695505050505050565b600080548190819060ff161561389957600080fd5b6000805460ff191660011790556020860151600160a060020a031633141561391f576138c4866141e0565b151561391a576040805160e560020a62461bcd02815260206004820152601260248201527f696e76616c69642062757920706172616d730000000000000000000000000000604482015290519081900360640190fd5b61392b565b61392886614534565b92505b6020850151600160a060020a03163314156139a457613949856141e0565b151561399f576040805160e560020a62461bcd02815260206004820152601360248201527f696e76616c69642073656c6c20706172616d7300000000000000000000000000604482015290519081900360640190fd5b6139b0565b6139ad85614534565b91505b6139ba86866130d3565b1515613a10576040805160e560020a62461bcd02815260206004820152601160248201527f6f726465722063616e2774206d61746368000000000000000000000000000000604482015290519081900360640190fd5b6000866101400151511115613a3957613a39866101200151866101200151886101400151613426565b6000856101400151511115613a6257613a62856101200151876101200151876101400151613426565b613a7686610120015186610120015161372f565b1515613acc576040805160e560020a62461bcd02815260206004820152601660248201527f63616c6c6461746120646f65736e277420657175616c00000000000000000000604482015290519081900360640190fd5b6020860151600160a060020a03163314613afa576000838152600460205260409020805460ff191660011790555b6020850151600160a060020a03163314613b28576000828152600460205260409020805460ff191660011790555b613b32868661455d565b600c546101208701516040518151939450600160a060020a03909216929091908190602084019080838360005b83811015613b77578181015183820152602001613b5f565b50505050905090810190601f168015613ba45780820380516001836020036101000a031916815260200191505b50915050600060405180830381855af49150501515613c0d576040805160e560020a62461bcd02815260206004820152601660248201527f6f726465722063616c6c64617461206661696c75726500000000000000000000604482015290519081900360640190fd5b610160860151600160a060020a031615613c4657613c3b866101600151866101200151886101800151611807565b1515613c4657600080fd5b610160850151600160a060020a031615613c7f57613c74856101600151866101200151876101800151611807565b1515613c7f57600080fd5b60608501518490600160a060020a03161515613c9f578560200151613ca5565b86602001515b6060870151600160a060020a0391821691161515613cc7578760200151613ccd565b86602001515b600160a060020a03167f5e89bc5bf129d9595ae14697a763c17e6acd67579b9f1f4fa548f57ec762a05786866000600160a060020a03168b60600151600160a060020a03161415613d22578b60600151613d28565b8a606001515b60608c0151600160a060020a03161515613d46578b60800151613d4c565b8c608001515b604080519485526020850193909352600160a060020a039182168484015216606083015260808201879052519081900360a00190a450506000805460ff1916905550505050565b6000613d9f8383614b76565b6020840151909150600160a060020a03163314613dbb57600080fd5b600081815260046020526040808220805460ff191660011790555182917f5152abf959f6564662358c2e52b702259b78bac5ee7842a0f01937e670efcc7d91a2505050565b6020820151600090600160a060020a03163314613e1c57600080fd5b602080840151600160a060020a0316600090815260069091526040902054613e459084906135ca565b60008181526005602052604090205490915015613eac576040805160e560020a62461bcd02815260206004820152601560248201527f6475706c696361746564206f7264657220686173680000000000000000000000604482015290519081900360640190fd5b600660008460200151600160a060020a0316600160a060020a0316815260200190815260200160002054600101600560008360001916600019168152602001908152602001600020819055508260600151600160a060020a03168360200151600160a060020a031682600019167fbfc991b64000533072b5f27ccd5e8628fea28ae33286778a627005b3156c6fe1866000015187604001518860a001518960c001518a60e001518b61010001518b6040518088600160a060020a0316600160a060020a0316815260200187600160a060020a0316600160a060020a03168152602001866001811115613f9a57fe5b60ff168152602001856001811115613fae57fe5b60ff168152600160a060020a0390941660208501525060408084019290925260608301525190819003608001945092505050a480600019167fb7c210e6374e28618aff2db2406f01343e302b15476278b7795869bccc51f979846101200151856101400151866101600151876101800151886101a00151896101c001518a6101e001518b61020001518c61022001518d61024001516040518080602001806020018b600160a060020a0316600160a060020a03168152602001806020018a600160a060020a0316600160a060020a0316815260200189815260200188815260200187815260200186815260200185815260200184810384528e818151815260200191508051906020019080838360005b838110156140d65781810151838201526020016140be565b50505050905090810190601f1680156141035780820380516001836020036101000a031916815260200191505b5084810383528d5181528d516020918201918f019080838360005b8381101561413657818101518382015260200161411e565b50505050905090810190601f1680156141635780820380516001836020036101000a031916815260200191505b5084810382528b5181528b516020918201918d019080838360005b8381101561419657818101518382015260200161417e565b50505050905090810190601f1680156141c35780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a2505050565b8051600090600160a060020a031630146141fc57506000612d40565b6020820151600160a060020a0316151561421857506000612d40565b61422b8260c00151836102200151614be5565b151561423957506000612d40565b506001919050565b6000428310801561325357508115806132535750504210919050565b60008083151561427057600091506135c3565b5082820282848281151561428057fe5b04146135bf57600080fd5b604080516102a08082526102c0820190925260009190606090839083602082016154008038833901905050915050602081016142e7817ff446866267029076a71bb126e250b9480cd4ac2699baa745a582b10b361ec951614c04565b90506142f7818760000151614c04565b9050614307818760200151614c04565b9050614317818760400151614c04565b9050614327818760600151614c04565b9050614337818760800151614c04565b9050614352818760a00151600181111561434d57fe5b614c04565b9050614368818760c00151600181111561434d57fe5b9050614378818760e00151614c04565b905061438981876101000151614c04565b90506143f6818761012001516040518082805190602001908083835b602083106143c45780518252601f1990920191602091820191016143a5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020614c04565b905061443081876101400151604051808280519060200190808383602083106143c45780518252601f1990920191602091820191016143a5565b905061444181876101600151614c04565b905061447b81876101800151604051808280519060200190808383602083106143c45780518252601f1990920191602091820191016143a5565b905061448c81876101a00151614c04565b905061449d81876101c00151614c04565b90506144ae81876101e00151614c04565b90506144bf81876102000151614c04565b90506144d081876102200151614c04565b90506144e181876102400151614c04565b90506144ed8186614c04565b5050602001209392505050565b6000808383111561450a57600080fd5b5050900390565b60008080831161452057600080fd5b828481151561452b57fe5b04949350505050565b602080820151600160a060020a0316600090815260069091526040812054613420908390614b76565b600080600080600080600080600080600080600160a060020a03168c6101a00151600160a060020a031614151561459957341561459957600080fd5b6145a38d8d613003565b995060008a1180156145c257506101a08c0151600160a060020a031615155b156145e0576145e08c6101a001518e602001518e602001518d614c0c565b8998508997506145fd6145f56007548c61425d565b612710614511565b9650600095506146108c60e00151614cd1565b156146c4578b60e00151600160a060020a0316632a55205a8e61010001518c6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180838152602001828152602001925050506040805180830381600087803b15801561468757600080fd5b505af115801561469b573d6000803e3d6000fd5b505050506040513d60408110156146b157600080fd5b508051602090910151909650945061476d565b600d5460e08d0151604080517f2782d6c7000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018e905281519290931692632782d6c792604480830193928290030181600087803b15801561473457600080fd5b505af1158015614748573d6000803e3d6000fd5b505050506040513d604081101561475e57600080fd5b50805160209091015190965094505b600160a060020a0386161580159061478457508415155b156147fc576101a08c0151600160a060020a031615156147e7576147a889866144fa565b604051909950600160a060020a0387169086156108fc029087906000818181858888f193505050501580156147e1573d6000803e3d6000fd5b506147fc565b6147fc8c6101a001518d602001518888614c0c565b60608c0151600160a060020a03161580159061481757508615155b156149e35761482b6145f56009548961425d565b6101a08d0151909450600160a060020a031615156148905761484d89856144fa565b60608d0151604051919a50600160a060020a03169085156108fc029086906000818181858888f1935050505015801561488a573d6000803e3d6000fd5b506148a9565b6148a98c6101a001518d602001518e6060015187614c0c565b60808d0151600160a060020a031615614949576148cb6145f56008548961425d565b6101a08d0151909350600160a060020a03161515614930576148ed89846144fa565b60808e0151604051919a50600160a060020a03169084156108fc029085906000818181858888f1935050505015801561492a573d6000803e3d6000fd5b50614949565b6149498c6101a001518d602001518f6080015186614c0c565b6149586145f5600a548961425d565b6101a08d0151909250600160a060020a031615156149bb5761497a89836144fa565b600b54604051919a50600160a060020a03169083156108fc029084906000818181858888f193505050501580156149b5573d6000803e3d6000fd5b506149de565b6101a08c015160208d0151600b546149de929190600160a060020a031685614c0c565b614ab1565b60608c0151600160a060020a03161515614ab1576101a08c0151600160a060020a03161515614a1157600080fd5b8615614ab157614a266145f56009548961425d565b9350614a418c6101a001518d602001518f6060015187614c0c565b60808c0151600160a060020a031615614a7e57614a636145f56008548961425d565b9250614a7e8c6101a001518d602001518e6080015186614c0c565b614a8d6145f5600a548961425d565b6101a08d015160208e0151600b54929450614ab192600160a060020a031685614c0c565b6101a08c0151600160a060020a03161515614b655734881115614ad357600080fd5b8b60200151600160a060020a03166108fc8a9081150290604051600060405180830381858888f19350505050158015614b10573d6000803e3d6000fd5b50614b1b34896144fa565b90506000811115614b65578c60200151600160a060020a03166108fc829081150290604051600060405180830381858888f19350505050158015614b63573d6000803e3d6000fd5b505b50979b9a5050505050505050505050565b600080614b8384846135ca565b9050614b8f81856136a8565b15156135bf576040805160e560020a62461bcd02815260206004820152600d60248201527f696e76616c6964206f7264657200000000000000000000000000000000000000604482015290519081900360640190fd5b600080836001811115614bf457fe5b1480613253575050600010919050565b815260200190565b6000811115614ccb57600354604080517f15dacbea000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301528681166024830152858116604483015260648201859052915191909216916315dacbea9160848083019260209291908290030181600087803b158015614c9457600080fd5b505af1158015614ca8573d6000803e3d6000fd5b505050506040513d6020811015614cbe57600080fd5b50511515614ccb57600080fd5b50505050565b604080517f2a55205a00000000000000000000000000000000000000000000000000000000602480830191909152825180830390910181526044909101825260208181018051600160e060020a03167f01ffc9a7000000000000000000000000000000000000000000000000000000001790528251818152808401909352600092839291606091849181602001602082028038833901905050915060208284516020860160008a5af19350831515614d8c5760009450614d93565b5080519350835b50505050919050565b604080516102608101825260008082526020820181905291810182905260608101829052608081018290529060a08201908152602001600081526020016000600160a060020a031681526020016000815260200160608152602001606081526020016000600160a060020a03168152602001606081526020016000600160a060020a03168152602001600081526020016000815260200160008152602001600081526020016000815250905600a165627a7a7230582033844ff19818572d40975a7a52f206c4f20c5ea6cfa35bdc44884f44faf6bbd80029

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

000000000000000000000000c09f6ebf24d9cc1b4140baa992afb7a5bf41a54700000000000000000000000044a6eaa71ad81f206829dbb59b63e6c733295f4f0000000000000000000000005d01d08834283885b97c4a9eef16631707c83f9b000000000000000000000000d766fab1a146c835ca3ae2b2bf27b179f52b0211

-----Decoded View---------------
Arg [0] : tokenTransferProxyAddress (address): 0xC09F6EbF24D9cc1B4140BaA992AfB7A5BF41A547
Arg [1] : protocolFeeAddress (address): 0x44a6eAa71ad81F206829dBB59b63e6c733295f4f
Arg [2] : merkleValidatorAddress (address): 0x5D01D08834283885b97c4A9EEF16631707C83F9b
Arg [3] : royaltyRegisterHubAddress (address): 0xD766fAB1A146C835CA3aE2b2bf27B179f52b0211

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000c09f6ebf24d9cc1b4140baa992afb7a5bf41a547
Arg [1] : 00000000000000000000000044a6eaa71ad81f206829dbb59b63e6c733295f4f
Arg [2] : 0000000000000000000000005d01d08834283885b97c4a9eef16631707c83f9b
Arg [3] : 000000000000000000000000d766fab1a146c835ca3ae2b2bf27b179f52b0211


Deployed Bytecode Sourcemap

50408:12233:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60449:1113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;;60449:1113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60449:1113:0;;;;-1:-1:-1;60449:1113:0;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;;;;;;;-1:-1:-1;60449:1113:0;;-1:-1:-1;60449:1113:0;;-1:-1:-1;;;;;;;60449:1113:0;;;;;;;;;;;;;;;;;19052:62;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19052:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;19052:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14969:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14969:23:0;;;;;;;;-1:-1:-1;;;;;14969:23:0;;;;;;;;;;;;;;20591:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20591:44:0;;;;21598:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21598:31:0;;;;30193:594;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30193:594:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30193:594:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30193:594:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30193:594:0;;;;-1:-1:-1;30193:594:0;-1:-1:-1;30193:594:0;;-1:-1:-1;30193:594:0;;;;;;;;-1:-1:-1;30193:594:0;;-1:-1:-1;30193:594:0;;-1:-1:-1;;;;;;;30193:594:0;;;;;;;;;;;;;;;;;;;58771:1103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;;58771:1103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58771:1103:0;;;;-1:-1:-1;58771:1103:0;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;;;;;;;-1:-1:-1;58771:1103:0;;-1:-1:-1;58771:1103:0;;-1:-1:-1;;;;;;;58771:1103:0;58047:716;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58047:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58047:716:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;58047:716:0;-1:-1:-1;58047:716:0;;-1:-1:-1;58047:716:0;;;;;;;;-1:-1:-1;;58047:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58047:716:0;;;;;-1:-1:-1;58047:716:0;;-1:-1:-1;58047:716:0;;;;;;;;;;;;;;-1:-1:-1;;58047:716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58047:716:0;;;;-1:-1:-1;58047:716:0;-1:-1:-1;58047:716:0;;-1:-1:-1;58047:716:0;;;;;;;;-1:-1:-1;58047:716:0;;-1:-1:-1;;58047:716:0;;;-1:-1:-1;58047:716:0;;-1:-1:-1;;;;58047:716:0;15616:336;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15616:336:0;;;;;;53545:211;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;53545:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53545:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53545:211:0;;;;-1:-1:-1;53545:211:0;-1:-1:-1;53545:211:0;;-1:-1:-1;53545:211:0;;;;;;;;-1:-1:-1;;53545:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53545:211:0;;;;-1:-1:-1;53545:211:0;-1:-1:-1;53545:211:0;;-1:-1:-1;53545:211:0;;;;;;;;-1:-1:-1;53545:211:0;;-1:-1:-1;53545:211:0;;-1:-1:-1;;;;;;;53545:211:0;20375:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20375:109:0;;;;51073:1317;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;51073:1317:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51073:1317:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51073:1317:0;;-1:-1:-1;51073:1317:0;;-1:-1:-1;;;;;;;51073:1317:0;28524:493;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28524:493:0;;;;;;;;;55604:791;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55604:791:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55604:791:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;55604:791:0;-1:-1:-1;55604:791:0;;-1:-1:-1;55604:791:0;;;;;;;;-1:-1:-1;;55604:791:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55604:791:0;;;;;-1:-1:-1;55604:791:0;;-1:-1:-1;55604:791:0;;;;;;;;;;;;;;-1:-1:-1;;55604:791:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55604:791:0;;;;-1:-1:-1;55604:791:0;-1:-1:-1;55604:791:0;;-1:-1:-1;55604:791:0;;;;;;;;-1:-1:-1;55604:791:0;;-1:-1:-1;;55604:791:0;;;-1:-1:-1;55604:791:0;;-1:-1:-1;;;;55604:791:0;22393:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22393:33:0;;;;21764:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21764:39:0;;;;29177:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29177:166:0;-1:-1:-1;;;;;29177:166:0;;;;;19121:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19121:38:0;;;;59882:559;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;59882:559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59882:559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59882:559:0;;;;-1:-1:-1;59882:559:0;-1:-1:-1;59882:559:0;;-1:-1:-1;59882:559:0;;;;;;;;-1:-1:-1;;59882:559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59882:559:0;;;;-1:-1:-1;59882:559:0;-1:-1:-1;59882:559:0;;-1:-1:-1;59882:559:0;;;;;;;;-1:-1:-1;;59882:559:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59882:559:0;;;;-1:-1:-1;59882:559:0;-1:-1:-1;59882:559:0;;-1:-1:-1;59882:559:0;;;;;;;;-1:-1:-1;59882:559:0;;-1:-1:-1;59882:559:0;;-1:-1:-1;;;;;;;59882:559:0;27706:144;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27706:144:0;;;;53764:335;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;53764:335:0;;;;;;;;;;;;;;;;;;;;22189:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22189:35:0;;;;14747:124;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14747:124:0;;;;61570:1066;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;;61570:1066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61570:1066:0;;;;-1:-1:-1;61570:1066:0;-1:-1:-1;61570:1066:0;;-1:-1:-1;61570:1066:0;;;;;;;;-1:-1:-1;61570:1066:0;;-1:-1:-1;;61570:1066:0;;;-1:-1:-1;61570:1066:0;;-1:-1:-1;;;;61570:1066:0;21386:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21386:41:0;-1:-1:-1;;;;;21386:41:0;;;;;20694:52;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20694:52:0;;;;;54107:728;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54107:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54107:728:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;54107:728:0;-1:-1:-1;54107:728:0;;-1:-1:-1;54107:728:0;;;;;;;;-1:-1:-1;;54107:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54107:728:0;;;;;-1:-1:-1;54107:728:0;;-1:-1:-1;54107:728:0;;;;;;;;;;;;;;-1:-1:-1;;54107:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54107:728:0;;;;-1:-1:-1;54107:728:0;-1:-1:-1;54107:728:0;;-1:-1:-1;54107:728:0;;;;;;;;-1:-1:-1;54107:728:0;;-1:-1:-1;;54107:728:0;;;-1:-1:-1;54107:728:0;;-1:-1:-1;;;;54107:728:0;13706:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13706:20:0;;;;57302:737;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;57302:737:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57302:737:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;57302:737:0;-1:-1:-1;57302:737:0;;-1:-1:-1;57302:737:0;;;;;;;;-1:-1:-1;;57302:737:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57302:737:0;;;;;-1:-1:-1;57302:737:0;;-1:-1:-1;57302:737:0;;;;;;;;;;;;;;-1:-1:-1;;57302:737:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57302:737:0;;;;-1:-1:-1;57302:737:0;-1:-1:-1;57302:737:0;;-1:-1:-1;57302:737:0;;;;;;;;-1:-1:-1;57302:737:0;;-1:-1:-1;;57302:737:0;;;-1:-1:-1;57302:737:0;;-1:-1:-1;;;;57302:737:0;22107:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22107:34:0;;;;56403:891;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56403:891:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56403:891:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;56403:891:0;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;;;;;;;-1:-1:-1;;56403:891:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56403:891:0;;;;;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;;;;;;;;;;;;;-1:-1:-1;;56403:891:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56403:891:0;;;;-1:-1:-1;56403:891:0;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;;;;;;;-1:-1:-1;;56403:891:0;;;;;;;;;;;;;;;;;-1:-1:-1;56403:891:0;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;;;;;-1:-1:-1;56403:891:0;;-1:-1:-1;56403:891:0;;-1:-1:-1;;;;;;56403:891:0;27983:236;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27983:236:0;;;;;22265:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22265:48:0;;;;14999:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14999:30:0;;;;20493:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20493:51:0;;;;36111:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36111:133:0;;;;;54843:753;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54843:753:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54843:753:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;54843:753:0;-1:-1:-1;54843:753:0;;-1:-1:-1;54843:753:0;;;;;;;;-1:-1:-1;;54843:753:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54843:753:0;;;;;-1:-1:-1;54843:753:0;;-1:-1:-1;54843:753:0;;;;;;;;;;;;;;-1:-1:-1;;54843:753:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54843:753:0;;;;-1:-1:-1;54843:753:0;-1:-1:-1;54843:753:0;;-1:-1:-1;54843:753:0;;;;;;;;-1:-1:-1;54843:753:0;;-1:-1:-1;;54843:753:0;;;-1:-1:-1;54843:753:0;;-1:-1:-1;;;;54843:753:0;21938:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21938:39:0;;;;22334:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22334:38:0;;;;15960:264;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15960:264:0;-1:-1:-1;;;;;15960:264:0;;;;;14452:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14452:192:0;-1:-1:-1;;;;;14452:192:0;;;;;60449:1113;60804:4;60826:16;;:::i;:::-;61147:17;;:::i;:::-;60845:291;;;;;;;;;;60851:5;-1:-1:-1;60851:8:0;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;60861:5;60867:1;60861:8;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;60871:5;60877:1;60871:8;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;60881:5;60887:1;60881:8;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;60891:5;60897:1;60891:8;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;60924:10;60935:1;60924:13;;;;60901:37;;;;;;;;;;60845:291;;;;;;;;;;;;60967:10;60978:1;60967:13;;;;60940:41;;;;;;;;;;60845:291;;;;;;;;;;60983:8;;;;;-1:-1:-1;;;;;60845:291:0;;;;;60993:8;;;;60845:291;;;;-1:-1:-1;60845:291:0;;;;;-1:-1:-1;60845:291:0;;;;;;60983:5;61045:1;61039:8;;;;-1:-1:-1;;;;;60845:291:0;;;;;61049:18;60845:291;;;;61076:5;61082:1;61076:8;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60845:291:0;;;;61087:5;61093:1;61087:8;;;;;;;;;60845:291;;;61097:5;61103:1;61097:8;;;;;;;;;60845:291;;;61107:5;61113:1;61107:8;;;;;;;;;60845:291;;;61117:5;61123:1;61117:8;;;;;;;;;60845:291;;;61127:5;61133:1;61127:8;;;;60845:291;;61167:302;;;;;;;;;60826:310;;-1:-1:-1;61167:302:0;61173:5;61179:1;61173:8;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;;61183:5;61189:1;61183:8;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;;61193:5;61199:2;61193:9;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;;61204:5;61210:2;61204:9;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;;61215:5;61221:2;61215:9;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;;61249:10;61260:1;61249:13;;;;61226:37;;;;;;;;;;61167:302;;;;;;;;;;;;61292:10;61303:1;61292:13;;;;61265:41;;;;;;;;;;61167:302;;;;;;;;;;61308:9;;;;-1:-1:-1;;;;;61167:302:0;;;;;;;61319:9;;;;61167:302;;;;;;;;;;;;;;;;61368:9;;;;61167:302;;;;;;;;;;;;;61308:9;61413:2;61407:9;;;;;;;;;-1:-1:-1;;;;;61167:302:0;;;61419:8;;;;61167:302;;;;61429:8;;;;61167:302;;;;61439:8;;;;61167:302;;;;61449:8;;;;61167:302;;;;61459:9;;;;-1:-1:-1;61167:302:0;;;;61147:322;-1:-1:-1;61487:67:0;61521:3;61147:322;61487:19;:67::i;:::-;61480:74;60449:1113;-1:-1:-1;;;;;;;;;;;;60449:1113:0:o;19052:62::-;;;;;;;;;;;;;;;;;;;:::o;14969:23::-;;;-1:-1:-1;;;;;14969:23:0;;:::o;20591:44::-;;;-1:-1:-1;;;;;20591:44:0;;:::o;21598:31::-;;;;:::o;30193:594::-;30312:11;30341:21;30421:10;30393:9;:16;30375:8;:15;:34;30365:45;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;30365:45:0;-1:-1:-1;30341:69:0;-1:-1:-1;;30489:4:0;30475:19;;30523:45;30475:19;30558:9;30523:27;:45::i;:::-;30515:53;;30579:44;30607:5;30614:8;30579:27;:44::i;:::-;;30743:1;30736:4;30730:11;30719:8;30713:15;30706:4;30696:8;30692:19;30684:6;30679:3;30668:77;30658:87;30193:594;-1:-1:-1;;;;;;30193:594:0:o;58771:1103::-;59121:4;59143:16;;:::i;:::-;59464:17;;:::i;:::-;59162:291;;;;;;;;;;59168:5;-1:-1:-1;59168:8:0;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59178:5;59184:1;59178:8;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59188:5;59194:1;59188:8;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59198:5;59204:1;59198:8;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59208:5;59214:1;59208:8;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59241:10;59252:1;59241:13;;;;59218:37;;;;;;;;;;59162:291;;;;;;;;;;;;59284:10;59295:1;59284:13;;;;59257:41;;;;;;;;;;59162:291;;;;;;;;;;59300:8;;;;;-1:-1:-1;;;;;59162:291:0;;;;;59310:8;;;;59162:291;;;;-1:-1:-1;59162:291:0;;;;;-1:-1:-1;59162:291:0;;;;;;59300:5;59362:1;59356:8;;;;-1:-1:-1;;;;;59162:291:0;;;;;59366:18;59162:291;;;;59393:5;59399:1;59393:8;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59162:291:0;;;;59404:5;59410:1;59404:8;;;;;;;;;59162:291;;;59414:5;59420:1;59414:8;;;;;;;;;59162:291;;;59424:5;59430:1;59424:8;;;;;;;;;59162:291;;;59434:5;59440:1;59434:8;;;;;;;;;59162:291;;;59444:5;59450:1;59444:8;;;;59162:291;;59484:302;;;;;;;;;59143:310;;-1:-1:-1;59484:302:0;59490:5;59496:1;59490:8;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;;59500:5;59506:1;59500:8;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;;59510:5;59516:2;59510:9;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;;59521:5;59527:2;59521:9;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;;59532:5;59538:2;59532:9;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;;59566:10;59577:1;59566:13;;;;59543:37;;;;;;;;;;59484:302;;;;;;;;;;;;59609:10;59620:1;59609:13;;;;59582:41;;;;;;;;;;59484:302;;;;;;;;;;59625:9;;;;-1:-1:-1;;;;;59484:302:0;;;;;;;59636:9;;;;59484:302;;;;;;;;;;;;;;;;59685:9;;;;59484:302;;;;;;;;;;;;;59625:9;59730:2;59724:9;;;;;;;;;-1:-1:-1;;;;;59484:302:0;;;59736:8;;;;59484:302;;;;59746:8;;;;59484:302;;;;59756:8;;;;59484:302;;;;59766:8;;;;59484:302;;;;59776:9;;;;-1:-1:-1;59484:302:0;;;;59464:322;-1:-1:-1;59804:62:0;59833:3;59464:322;59804:14;:62::i;58047:716::-;58347:4;58369:26;58398:66;58420:5;58426:1;58420:8;;;;;58429;;;;58438;;;;58447:5;58453:10;58398:21;:66::i;:::-;58518:226;;;;;;;;58524:8;;-1:-1:-1;;;;;58518:226:0;;;;;58524:8;58534;;;;58518:226;;;;;;58544:8;;;;58518:226;;;;;;;;;;58554:8;;;;58518:226;;;;;;;;;;-1:-1:-1;58518:226:0;;;;58369:95;;-1:-1:-1;58482:273:0;;58518:226;;;58579:4;58540:1;58518:226;;;;;;;;;;;58585:8;58518:226;;;;;;;;;;58595:8;;;;;-1:-1:-1;;;;;58518:226:0;;;;;;;58605:8;;;;;58518:226;;;;-1:-1:-1;58518:226:0;;;;;;;;;;;;58650:8;;;;58518:226;;;;;;;;;;;;;;58595:8;58690:1;58684:8;;;;;;;;;-1:-1:-1;;;;;58518:226:0;;;58695:8;;58518:226;;;;58705:8;;;58518:226;;;;;;;;58715:8;;;58518:226;;;;;;;;58725:8;;;58518:226;;;;;;;;58735:8;;;58518:226;;;;;58482:21;:273::i;:::-;58475:280;58047:716;-1:-1:-1;;;;;;;;;58047:716:0:o;15616:336::-;15686:15;;15771:24;;-1:-1:-1;;;;;15686:15:0;15672:10;:29;15664:96;;;;;-1:-1:-1;;;;;15664:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15798:8:0;;;-1:-1:-1;;15817:21:0;;;15828:10;15817:21;;;;;15849:15;:28;;;;;;;15895:49;;-1:-1:-1;;;;;15798:8:0;;;;15935;;;;15798;;15895:49;;15798:8;;15895:49;15616:336;:::o;53545:211::-;53650:5;53673:52;53704:5;53711:7;53720:4;53673:30;:52::i;:::-;-1:-1:-1;53743:5:0;;53545:211;-1:-1:-1;;53545:211:0:o;20375:109::-;20418:66;20375:109;:::o;51073:1317::-;51338:5;51356:47;51430:8;51406:33;;;;;;;;51356:83;-1:-1:-1;51481:48:0;51454:23;:75;;;;;;;;;51450:933;;;51553:158;;-1:-1:-1;;;;;51553:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51656:4;;51662:2;;51666:10;;51678:7;;51687:10;;51699:11;;51553:158;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;51553:158:0;;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;51553:158:0;;;-1:-1:-1;49:4;25:18;;61:17;;51553:158:0;-1:-1:-1;;;;;182:15;;;179:29;160:49;;51553:158:0;-1:-1:-1;51546:165:0;;-1:-1:-1;;;;;;;;;;51546:165:0;51450:933;51760:64;51733:23;:91;;;;;;;;;51729:654;;;51848:174;;-1:-1:-1;;;;;51848:174:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51967:4;;51973:2;;51977:10;;51989:7;;51998:10;;52010:11;;51848:174;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;51848:174:0;;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;51848:174:0;;;-1:-1:-1;49:4;25:18;;61:17;;51848:174:0;-1:-1:-1;;;;;182:15;;;179:29;160:49;;51848:174:0;-1:-1:-1;51841:181:0;;-1:-1:-1;;;;;;;;;;51841:181:0;51729:654;52071:49;52044:23;:76;;;;;;;;;52040:343;;;52256:4;52262:2;52266:10;52278:7;52287:6;52295:10;52307:11;52144:175;;;;;;-1:-1:-1;;;;;52144:175:0;-1:-1:-1;;;;;52144:175:0;;;;;;-1:-1:-1;;;;;52144:175:0;-1:-1:-1;;;;;52144:175:0;;;;;;-1:-1:-1;;;;;52144:175:0;-1:-1:-1;;;;;52144:175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;52144:175:0;;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;52144:175:0;;;-1:-1:-1;49:4;25:18;;61:17;;52144:175:0;-1:-1:-1;;;;;182:15;;;179:29;160:49;;52144:175:0;-1:-1:-1;52137:182:0;;-1:-1:-1;;;;;;;;;;;52137:182:0;52040:343;52359:12;;;52369:1;52359:12;;;;;;;;;-1:-1:-1;52040:343:0;51073:1317;;;;;;;;;;;:::o;28524:493::-;15579:8;;-1:-1:-1;;;;;15579:8:0;15565:10;:22;15557:31;;;;;;22308:5;28700:97;28713:62;28726:23;28751;28713:12;:62::i;:::-;28777:19;28700:12;:97::i;:::-;:120;28692:154;;;;;-1:-1:-1;;;;;28692:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28857:20;:46;;;;28914:20;:46;28971:16;:38;28524:493::o;55604:791::-;55897:4;55919:26;56025:18;;:::i;:::-;55948:66;55970:5;55976:1;55970:8;;;;;55979;;;;55988;;;;55997:5;56003:10;55948:21;:66::i;:::-;56046:226;;;;;;;;56052:8;;-1:-1:-1;;;;;56046:226:0;;;;;56052:8;56062;;;;56046:226;;;;;;56072:8;;;;56046:226;;;;;;;;;;56082:8;;;;56046:226;;;;;;;;;;-1:-1:-1;56046:226:0;;;;55919:95;;-1:-1:-1;56046:226:0;;;56107:4;56068:1;56046:226;;;;;;;;;;;56113:8;56046:226;;;;;;;;;;56123:8;;;;;-1:-1:-1;;;;;56046:226:0;;;;;;;56133:8;;;;;56046:226;;;;-1:-1:-1;56046:226:0;;;;;;;;;;;;56178:8;;;;56046:226;;;;;;;;;;;;;;56123:8;56218:1;56212:8;;;;;;;;;-1:-1:-1;;;;;56046:226:0;;;;;56223:8;;56046:226;;;;56233:8;;;;56046:226;;;;;;;;56243:8;;;;56046:226;;;;;;;;56253:8;;;56046:226;;;;;;;;56263:8;;;56046:226;;;;;;;;56343:11;;;;56336:19;56229:1;56336:19;;;:6;:19;;;;;56025:247;;-1:-1:-1;56290:97:0;;56318:38;;56025:247;;56318:10;:38::i;:::-;56371:5;56290:13;:97::i;:::-;56283:104;55604:791;-1:-1:-1;;;;;;;;;;55604:791:0:o;22393:33::-;;;-1:-1:-1;;;;;22393:33:0;;:::o;21764:39::-;;;;:::o;29177:166::-;14249:5;;;;;-1:-1:-1;;;;;14249:5:0;14235:10;:19;14227:28;;;;;;29289:20;:46;;-1:-1:-1;;29289:46:0;-1:-1:-1;;;;;29289:46:0;;;;;;;;;;29177:166::o;19121:38::-;;;;;;;;;;;;;;;;;;;:::o;59882:559::-;60047:4;60104:1;60073:21;:28;:32;60069:145;;;60122:80;60153:11;60166:12;60180:21;60122:30;:80::i;:::-;60260:1;60228:22;:29;:33;60224:147;;;60278:81;60309:12;60323:11;60336:22;60278:30;:81::i;:::-;60388:45;60407:11;60420:12;60388:18;:45::i;:::-;60381:52;59882:559;-1:-1:-1;;;;;59882:559:0:o;27706:144::-;27777:10;27752:13;27770:18;;;:6;:18;;;;;;;;;27768:20;;;;;;;;27804:38;;;;;;;27768:20;;27777:10;27804:38;;;;;;;;;27706:144;:::o;53764:335::-;53962:4;53991:100;54029:4;54035:8;54045:9;54056:5;54063:11;54076:14;53991:37;:100::i;:::-;53984:107;53764:335;-1:-1:-1;;;;;;;53764:335:0:o;22189:35::-;;;-1:-1:-1;;;;;22189:35:0;;:::o;14747:124::-;14249:5;;;;;-1:-1:-1;;;;;14249:5:0;14235:10;:19;14227:28;;;;;;14828:5;;;14809:25;;14828:5;;;;-1:-1:-1;;;;;14828:5:0;;14809:25;;;14861:1;14845:18;;-1:-1:-1;;14845:18:0;;;14747:124::o;61570:1066::-;61983:291;;;;;;;;61989:8;;-1:-1:-1;;;;;61983:291:0;;;;;61989:8;61999;;;;61983:291;;;;;;62009:8;;;;61983:291;;;;;;;;;;62019:8;;;;61983:291;;;;;;;62029:8;;;;61983:291;;;;;;;;;;62062:13;;61959:669;;61983:291;;;;;62039:37;;62005:1;62039:37;;;;;;;61983:291;;;;;;;;;;;;62105:10;62116:1;62105:13;;;;62078:41;;;;;;;;;;61983:291;;;;;;;;;;62121:8;;;;;-1:-1:-1;;;;;61983:291:0;;;;;62131:8;;;;61983:291;;;;-1:-1:-1;61983:291:0;;;;;-1:-1:-1;61983:291:0;;;;;;62121:5;62183:1;62177:8;;;;-1:-1:-1;;;;;61983:291:0;;;;;62187:18;61983:291;;;;62214:5;62220:1;62214:8;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61983:291:0;;;;62225:5;62231:1;62225:8;;;;;;;;;61983:291;;;62235:5;62241:1;62235:8;;;;;;;;;61983:291;;;62245:5;62251:1;62245:8;;;;;;;;;61983:291;;;62255:5;62261:1;62255:8;;;;;;;;;61983:291;;;62265:5;62271:1;62265:8;;;;61983:291;;62289:302;;;;;;;;;;62295:5;62301:1;62295:8;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;;62305:5;62311:1;62305:8;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;;62315:5;62321:2;62315:9;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;;62326:5;62332:2;62326:9;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;;62337:5;62343:2;62337:9;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;;62371:10;62382:1;62371:13;;;;62348:37;;;;;;;;;;62289:302;;;;;;;;;;;;62414:10;62425:1;62414:13;;;;62387:41;;;;;;;;;;62289:302;;;;;;;;;;62430:9;;;;-1:-1:-1;;;;;62289:302:0;;;;;;;62441:9;;;;62289:302;;;;;;;;;;;;;;;;62490:9;;;;62289:302;;;;;;;;;;;;;62430:9;62535:2;62529:9;;;;;;;;;-1:-1:-1;;;;;62289:302:0;;;62541:8;;;;62289:302;;;;62551:8;;;;62289:302;;;;62561:8;;;;62289:302;;;;62571:8;;;;62289:302;;;;62581:9;;;;-1:-1:-1;62289:302:0;;;;62606:11;61959:9;:669::i;:::-;61570:1066;;;;;;;;;;:::o;21386:41::-;;;;;;;;;;;;;:::o;20694:52::-;;;;;;;;;;;;;;;:::o;54107:728::-;54396:7;54421:26;54450:66;54472:5;54478:1;54472:8;;54450:66;54559:226;;;;;;;;54565:8;;-1:-1:-1;;;;;54559:226:0;;;;;54565:8;54575;;;;54559:226;;;;;;54585:8;;;;54559:226;;;;;;;;;;54595:8;;;;54559:226;;;;;;;;;;-1:-1:-1;54559:226:0;;;;54421:95;;-1:-1:-1;54534:293:0;;54559:226;;;54620:4;54581:1;54559:226;;;;;;;;;;;54626:8;54559:226;;;;;;;;;;54636:8;;;;;-1:-1:-1;;;;;54559:226:0;;;;;;;54646:8;;;;;54559:226;;;;-1:-1:-1;54559:226:0;;;;;;;;;;;;54691:8;;;;54559:226;;;;;;;;;;;;;;54636:8;54731:1;54725:8;;;;;;;;;-1:-1:-1;;;;;54559:226:0;;;;;54736:8;;54559:226;;;;54746:8;;;;54559:226;;;;;;;;54756:8;;;;54559:226;;;;;;;;54766:8;;;54559:226;;;;;;;;54776:8;;;54559:226;;;;;;;;54807:8;;;;54800:16;54742:1;54800:16;;;:6;:16;;;;;54534:10;:293::i;13706:20::-;;;;;;-1:-1:-1;;;;;13706:20:0;;:::o;57302:737::-;57584:26;57690:18;;:::i;:::-;57613:66;57635:5;57641:1;57635:8;;57613:66;57711:226;;;;;;;;57717:8;;-1:-1:-1;;;;;57711:226:0;;;;;57717:8;57727;;;;57711:226;;;;;;57737:8;;;;57711:226;;;;;;;;;;57747:8;;;;57711:226;;;;;;;;;;-1:-1:-1;57711:226:0;;;;57584:95;;-1:-1:-1;57711:226:0;;;57772:4;57733:1;57711:226;;;;;;;;;;;57778:8;57711:226;;;;;;;;;;57788:8;;;;;-1:-1:-1;;;;;57711:226:0;;;;;;;57798:8;;;;;57711:226;;;;-1:-1:-1;57711:226:0;;;;;;;;;;;;57843:8;;;;57711:226;;;;;;;;;;;;;;57788:8;57883:1;57877:8;;;;;;;;;-1:-1:-1;;;;;57711:226:0;;;;;57888:8;;57711:226;;;;57898:8;;;;57711:226;;;;;;;;57908:8;;;;57711:226;;;;;;;;57918:8;;;57711:226;;;;;;;;57928:8;;;57711:226;;;;;;;;58008:11;;;;58001:19;57894:1;58001:19;;;:6;:19;;;;;57690:247;;-1:-1:-1;57955:76:0;;57690:247;;57955:11;:76::i;:::-;57302:737;;;;;;;;;:::o;22107:34::-;;;;:::o;56403:891::-;56687:26;56990:18;;:::i;:::-;56738:8;;;;56747;;;;56756;;;;56771:13;;56716:69;;56738:8;56747;56756;56765:5;;56716:21;:69::i;:::-;56804:8;;;;56687:98;;-1:-1:-1;;;;;;56804:23:0;;;56796:77;;;;;-1:-1:-1;;;;;56796:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56914:25;;56892:20;;:47;56884:95;;;;;-1:-1:-1;;;;;56884:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57011:226;;;;;;;;57017:8;;-1:-1:-1;;;;;57011:226:0;;;;;57017:8;57027;;;;57011:226;;;;;;57037:8;;;;57011:226;;;;;;;;;;57047:8;;;;57011:226;;;;;;;;;;-1:-1:-1;57011:226:0;;;;;;;57072:4;57033:1;57011:226;;;;;;;;;;;57078:8;57011:226;;;;;;;;;;57088:8;;;;;-1:-1:-1;;;;;57011:226:0;;;;;;;57098:8;;;;;57011:226;;;;-1:-1:-1;57011:226:0;;;;;;;;;;;;57143:8;;;;57011:226;;;;;;;;;;;;;;57088:8;57183:1;57177:8;;;;;;;;;-1:-1:-1;;;;;57011:226:0;;;57188:8;;57011:226;;;;57198:8;;;;57011:226;;;;;;;;57208:8;;;57011:226;;;;;;;;57218:8;;;57011:226;;;;;;;;57228:8;;;57011:226;;;;;;;;57272:13;;;56990:247;;-1:-1:-1;57255:31:0;;56990:247;;57255:9;:31::i;27983:236::-;15579:8;;-1:-1:-1;;;;;15579:8:0;15565:10;:22;15557:31;;;;;;20541:3;28093:41;;;28085:79;;;;;-1:-1:-1;;;;;28085:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28175:15;:36;27983:236::o;22265:48::-;22308:5;22265:48;:::o;14999:30::-;;;-1:-1:-1;;;;;14999:30:0;;:::o;20493:51::-;20541:3;20493:51;:::o;36111:133::-;36170:13;36203:28;;;:22;:28;;;;;;:33;;36111:133;;;;:::o;54843:753::-;55146:4;55163:26;55269:18;;:::i;:::-;55192:66;55214:5;55220:1;55214:8;;55192:66;55290:226;;;;;;;;55296:8;;-1:-1:-1;;;;;55290:226:0;;;;;55296:8;55306;;;;55290:226;;;;;;55316:8;;;;55290:226;;;;;;;;;;55326:8;;;;55290:226;;;;;;;;;;-1:-1:-1;55290:226:0;;;;55163:95;;-1:-1:-1;55290:226:0;;;55351:4;55312:1;55290:226;;;;;;;;;;;55357:8;55290:226;;;;;;;;;;55367:8;;;;;-1:-1:-1;;;;;55290:226:0;;;;;;;55377:8;;;;;55290:226;;;;-1:-1:-1;55290:226:0;;;;;;;;;;;;55422:8;;;;55290:226;;;;;;;;;;;;;;55367:8;55462:1;55456:8;;;;;;;;;-1:-1:-1;;;;;55290:226:0;;;55467:8;;55290:226;;;;55477:8;;;55290:226;;;;;;;;55487:8;;;55290:226;;;;;;;;55497:8;;;55290:226;;;;;;;;55507:8;;;55290:226;;;;;55269:247;-1:-1:-1;55534:54:0;55269:247;55534:23;:54::i;21938:39::-;;;;:::o;22334:38::-;;;-1:-1:-1;;;;;22334:38:0;;:::o;15960:264::-;16056:8;;-1:-1:-1;;;;;16056:8:0;16042:10;:22;16034:84;;;;;-1:-1:-1;;;;;16034:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16129:15;:34;;-1:-1:-1;;16129:34:0;-1:-1:-1;;;;;16129:34:0;;;;;;;;;;;16181:35;;16200:15;;;16181:35;;-1:-1:-1;;16181:35:0;15960:264;:::o;14452:192::-;14249:5;;;;;-1:-1:-1;;;;;14249:5:0;14235:10;:19;14227:28;;;;;;-1:-1:-1;;;;;14533:22:0;;;;14525:31;;;;;;14593:5;;;14572:37;;-1:-1:-1;;;;;14572:37:0;;;;14593:5;;;;;;14572:37;;;14620:5;:16;;-1:-1:-1;;;;;14620:16:0;;;;;-1:-1:-1;;14620:16:0;;;;;;;;;14452:192::o;39048:709::-;39152:4;39211:14;39407:13;39228:130;39266:4;:9;;;39277:4;:13;;;39292:4;:14;;;39308:4;:10;;;39320:4;:16;;;39338:4;:19;;;39228:37;:130::i;:::-;39211:147;;39423:124;39461:3;:8;;;39471:3;:12;;;39485:3;:13;;;39500:3;:9;;;39511:3;:15;;;39528:3;:18;;;39423:37;:124::i;:::-;39407:140;-1:-1:-1;39604:21:0;;;;39596:30;;;;;;39683:29;;;;-1:-1:-1;;;;;39683:43:0;;;:66;;39741:8;39683:66;;;-1:-1:-1;39729:9:0;39676:73;-1:-1:-1;;;39048:709:0:o;3042:712::-;3132:4;3174:1;3158:6;:13;:17;3154:570;;;3240:6;3234:13;3298:6;3292:4;3288:17;3280:6;3276:30;3352:4;3344:6;3340:17;3392:5;3415:238;3445:1;3439:3;3429:8;3426:17;3423:24;3415:238;;;3618:15;;3600:34;;3497:4;3483:19;;;;3537:20;3415:238;;;-1:-1:-1;;;3680:18:0;;;;;3201:512;-1:-1:-1;3741:5:0;;3042:712;-1:-1:-1;3042:712:0:o;45740:1198::-;45839:4;;45918:3;:8;;;:38;;;;;;;;;:82;;;;-1:-1:-1;45973:27:0;45960:4;:9;;;:40;;;;;;;;;45918:82;45917:180;;;;;46079:4;:17;;;-1:-1:-1;;;;;46059:37:0;:3;:16;;;-1:-1:-1;;;;;46059:37:0;;45917:180;:295;;;;-1:-1:-1;46160:10:0;;;;-1:-1:-1;;;;;46160:24:0;;;:51;;;46202:3;:9;;;-1:-1:-1;;;;;46188:23:0;:4;:10;;;-1:-1:-1;;;;;46188:23:0;;46160:51;45917:360;;;;-1:-1:-1;46226:9:0;;;;-1:-1:-1;;;;;46226:23:0;;;:50;;;46266:4;:10;;;-1:-1:-1;;;;;46253:23:0;:3;:9;;;-1:-1:-1;;;;;46253:23:0;;46226:50;45917:649;;;;-1:-1:-1;46380:29:0;;;;-1:-1:-1;;;;;46380:43:0;;:89;;;;-1:-1:-1;46427:28:0;;;;-1:-1:-1;;;;;46427:42:0;;;46380:89;46379:186;;;-1:-1:-1;46475:29:0;;;;-1:-1:-1;;;;;46475:43:0;;;;;:89;;-1:-1:-1;46522:28:0;;;;-1:-1:-1;;;;;46522:42:0;;46475:89;45917:735;;;;;46636:4;:15;;;-1:-1:-1;;;;;46618:33:0;:3;:14;;;-1:-1:-1;;;;;46618:33:0;;45917:735;:867;;;;;46715:69;46748:3;:15;;;46765:3;:18;;;46715:32;:69::i;:::-;45917:1002;;;;;46848:71;46881:4;:16;;;46899:4;:19;;;46848:32;:71::i;:::-;45861:1069;45740:1198;-1:-1:-1;;;45740:1198:0:o;52398:1139::-;52583:5;;52936:25;;;;52644:5;52650:1;52644:8;;;;:11;52640:205;;;52680:25;;52672:56;;;;;-1:-1:-1;;;;;52672:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52750:83;52764:5;52770:1;52764:8;;;;;52773:4;52778:2;52781:10;52792:5;52798:1;52792:8;;;;52801:5;52807:1;52801:8;;;;52810:10;52821:11;52750:13;:83::i;:::-;52743:90;;;;52640:205;52863:8;;;;52873:1;-1:-1:-1;52863:11:0;;;:38;;-1:-1:-1;52876:25:0;;;52863:38;52855:70;;;;;;;-1:-1:-1;;;;;52855:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52992:8;;;;;-1:-1:-1;53025:5:0;;-1:-1:-1;53041:262:0;53046:12;;53041:262;;53110:1;53100:9;:11;53076:35;;53161:9;53130:30;53143:13;53158:1;53130:12;:30::i;:::-;:40;53126:94;;;53200:4;53191:13;;53126:94;53272:19;;;;;53244:13;-1:-1:-1;53244:13:0;53041:262;;;53318:6;53317:7;53313:59;;;-1:-1:-1;;53341:19:0;;;;53313:59;53410:17;53396:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;53396:32:0;-1:-1:-1;53382:46:0;-1:-1:-1;53446:83:0;53460:5;53466:1;53460:8;;53446:83;53439:90;;52398:1139;;;;;;;;;;;;;:::o;38556:263::-;38646:4;38675:136;38713:5;:10;;;38725:5;:14;;;38741:5;:15;;;38758:5;:11;;;38771:5;:17;;;38790:5;:20;;;38675:37;:136::i;:::-;38668:143;38556:263;-1:-1:-1;;38556:263:0:o;673:1829::-;902:10;945;1021:6;827:7;:14;811:5;:12;:30;803:39;;;;;;;;877:11;;861:12;;:27;853:36;;;;;;915:12;;930:4;;915:19;;-1:-1:-1;966:4:0;958:12;;;;-1:-1:-1;915:19:0;;958:12;988;:21;981:29;;;;-1:-1:-1;1049:1:0;1040:475;1056:5;1052:1;:9;1040:475;;;1263:1;1259:9;1253:4;1249:20;;1310:22;;;1304:29;1460:25;;;1454:32;1412:23;;;1406:30;;1439:48;;;1390:14;;1386:51;;;1383:105;1351:138;;1040:475;;;1600:1;1592:5;:9;1588:907;;;1771:5;1767:9;;1855:1;1852;1848:9;1842:4;1838:20;1909:11;1903:4;1899:22;1893:29;2062:11;2053:7;2049:25;2043:32;2032:9;2028:48;2012:11;2005:5;2001:23;1995:30;1983:9;1979:14;1975:51;1972:105;1958:11;1951:5;1947:23;1940:138;1800:293;;;;;-1:-1:-1;2354:5:0;2345:139;2365:5;:12;2361:1;:16;2345:139;;;2457:7;2465:1;2457:10;;;;;;;;;;;;;;;-1:-1:-1;;;2457:10:0;;-1:-1:-1;;;2457:10:0;2447:4;2452:1;2447:7;;;;;;;;;;;;;;;-1:-1:-1;;;2447:7:0;;-1:-1:-1;;;2447:7:0;:20;2434:5;2440:1;2434:8;;;;;;;;;;;;;;;-1:-1:-1;;;2434:8:0;;-1:-1:-1;;;2434:8:0;2416:4;2421:1;2416:7;;;;;;;;;;;;;;;-1:-1:-1;;;2416:7:0;;-1:-1:-1;;;2416:7:0;2426:4;-1:-1:-1;;;2416:14:0;;2415:27;2414:54;2403:5;2409:1;2403:8;;;;;;;;;;;;;;:65;;;;;;;;;;-1:-1:-1;2379:3:0;;2345:139;;;673:1829;;;;;;:::o;8723:136::-;8781:7;8809:5;;;8829:6;;;;8821:15;;;;;;8852:1;8845:8;;8723:136;;;;;;:::o;33374:212::-;33464:7;20418:66;33553:23;33563:5;33570;33553:9;:23::i;:::-;33506:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;33506:71:0;;;;;;33496:82;;33506:71;;;;;;33496:82;;;;33506:71;33496:82;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;33496:82:0;;;;;;;;;;;;-1:-1:-1;;;;;;33374:212:0:o;34964:868::-;35059:4;35608:30;35286;35310:5;35286:23;:30::i;:::-;35285:31;35281:76;;;35340:5;35333:12;;;;35281:76;35441:26;;;;:20;:26;;;;;;;;35437:71;;;35491:5;35484:12;;;;35437:71;-1:-1:-1;35641:28:0;;;;:22;:28;;;;;;35684:30;;35680:75;;;35738:5;35731:12;;;;35680:75;35808:11;;;;;-1:-1:-1;;;;;35801:19:0;;;;;:6;:19;;;;;;;35823:1;35801:23;35772:52;;;-1:-1:-1;34964:868:0;;;;;:::o;2689:152::-;2776:4;2831:1;2821:12;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;2821:12:0;;;;;;;;;;;2805;;2821;;-1:-1:-1;2805:12:0;;-1:-1:-1;2821:12:0;;;;-1:-1:-1;2805:12:0;;;;2821;2805;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;2805:12:0;;;;;;;;;;:28;;;;;;-1:-1:-1;;;;;;2689:152:0:o;18052:838::-;18216:15;;;18253:8;:31;;;;;;;;;18249:634;;;18308:9;18301:16;;;;18249:634;18351:21;18339:8;:33;;;;;;;;;18335:548;;;18401:108;18414:51;18427:5;18434:30;18447:3;18452:11;18434:12;:30::i;:::-;18414:12;:51::i;:::-;18467:41;18480:14;18496:11;18467:12;:41::i;:::-;18401:12;:108::i;:::-;18389:120;-1:-1:-1;18536:9:0;18528:4;:17;;;;;;;;;18524:348;;;18662:29;18675:9;18686:4;18662:12;:29::i;:::-;18655:36;;;;18524:348;18827:29;18840:9;18851:4;18827:12;:29::i;18524:348::-;18052:838;;;;;;;;;:::o;47210:2943::-;47433:15;13477:14;;47433:15;;;;13477:14;;13473:55;;;13508:8;;;13473:55;13538:14;:21;;-1:-1:-1;;13538:21:0;13555:4;13538:21;;;47463:9;;;;-1:-1:-1;;;;;47463:23:0;47476:10;47463:23;47459:190;;;47511:28;47535:3;47511:23;:28::i;:::-;47503:59;;;;;;;-1:-1:-1;;;;;47503:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47459:190;;;47605:32;47633:3;47605:27;:32::i;:::-;47595:42;;47459:190;47767:10;;;;-1:-1:-1;;;;;47767:24:0;47781:10;47767:24;47763:195;;;47816:29;47840:4;47816:23;:29::i;:::-;47808:61;;;;;;;-1:-1:-1;;;;;47808:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47763:195;;;47913:33;47941:4;47913:27;:33::i;:::-;47902:44;;47763:195;48012:25;48027:3;48032:4;48012:14;:25::i;:::-;48004:55;;;;;;;-1:-1:-1;;;;;48004:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48176:1;48144:3;:22;;;:29;:33;48140:149;;;48194:83;48225:3;:12;;;48239:4;:13;;;48254:3;:22;;;48194:30;:83::i;:::-;48336:1;48303:4;:23;;;:30;:34;48299:151;;;48354:84;48385:4;:13;;;48400:3;:12;;;48414:4;:23;;;48354:30;:84::i;:::-;48468:47;48487:3;:12;;;48501:4;:13;;;48468:18;:47::i;:::-;48460:82;;;;;;;-1:-1:-1;;;;;48460:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48669:9;;;;-1:-1:-1;;;;;48655:23:0;:10;:23;48651:92;;48695:29;;;;:20;:29;;;;;:36;;-1:-1:-1;;48695:36:0;48727:4;48695:36;;;48651:92;48771:10;;;;-1:-1:-1;;;;;48757:24:0;:10;:24;48753:94;;48798:30;;;;:20;:30;;;;;:37;;-1:-1:-1;;48798:37:0;48831:4;48798:37;;;48753:94;48954:31;48975:3;48980:4;48954:20;:31::i;:::-;49006:23;;49043:13;;;;49006:51;;;;48941:44;;-1:-1:-1;;;;;;49006:23:0;;;;49043:13;;49006:51;;;;;;;;;;:23;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;49006:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48998:86;;;;;;;-1:-1:-1;;;;;48998:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49271:16;;;;-1:-1:-1;;;;;49271:30:0;;49267:136;;49326:64;49337:3;:16;;;49355:4;:13;;;49370:3;:19;;;49326:10;:64::i;:::-;49318:73;;;;;;;;49477:17;;;;-1:-1:-1;;;;;49477:31:0;;49473:139;;49533:66;49544:4;:17;;;49563:4;:13;;;49578:4;:20;;;49533:10;:66::i;:::-;49525:75;;;;;;;;49804:29;;;;50136:8;;-1:-1:-1;;;;;49804:43:0;;;:68;;49862:4;:10;;;49804:68;;;49850:3;:9;;;49804:68;49721:29;;;;-1:-1:-1;;;;;49661:484:0;;;;49721:43;;;:68;;49780:3;:9;;;49721:68;;;49767:4;:10;;;49721:68;-1:-1:-1;;;;;49661:484:0;;49689:7;49698:8;49928:1;-1:-1:-1;;;;;49887:43:0;:4;:29;;;-1:-1:-1;;;;;49887:43:0;;;:106;;49965:3;:28;;;49887:106;;;49933:4;:29;;;49887:106;50008:29;;;;-1:-1:-1;;;;;50008:43:0;;;:106;;50085:4;:29;;;50008:106;;;50054:3;:28;;;50008:106;49661:484;;;;;;;;;;;;;-1:-1:-1;;;;;49661:484:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13599:5:0;13582:22;;-1:-1:-1;;13582:22:0;;;-1:-1:-1;;;;47210:2943:0:o;37833:521::-;37977:12;37992:31;38010:5;38017;37992:17;:31::i;:::-;38118:11;;;;37977:46;;-1:-1:-1;;;;;;38104:25:0;:10;:25;38096:34;;;;;;38242:26;;;;:20;:26;;;;;;:33;;-1:-1:-1;;38242:33:0;38271:4;38242:33;;;38326:20;38263:4;;38326:20;;;37833:521;;;:::o;36474:1154::-;36668:11;;;;36730:12;;-1:-1:-1;;;;;36654:25:0;:10;:25;36646:34;;;;;;36770:11;;;;;-1:-1:-1;;;;;36763:19:0;;;;;:6;:19;;;;;;;36745:38;;36756:5;;36745:10;:38::i;:::-;36863:28;;;;:22;:28;;;;;;36730:53;;-1:-1:-1;36863:33:0;36855:67;;;;;-1:-1:-1;;;;;36855:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37030:6;:19;37037:5;:11;;;-1:-1:-1;;;;;37030:19:0;-1:-1:-1;;;;;37030:19:0;;;;;;;;;;;;;37052:1;37030:23;36999:22;:28;37022:4;36999:28;;;;;;;;;;;;;;;;;:54;;;;37251:5;:30;;;-1:-1:-1;;;;;37182:171:0;37225:5;:11;;;-1:-1:-1;;;;;37182:171:0;37203:4;37182:171;;;;37209:5;:14;;;37238:5;:11;;;37283:5;:10;;;37295:5;:14;;;37311:5;:16;;;37329:5;:13;;;37344:8;37182:171;;;;-1:-1:-1;;;;;37182:171:0;-1:-1:-1;;;;;37182:171:0;;;;;;-1:-1:-1;;;;;37182:171:0;-1:-1:-1;;;;;37182:171:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37182:171:0;;;;;;;-1:-1:-1;37182:171:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37182:171:0;-1:-1:-1;;;37182:171:0;37416:4;37395:214;;;;37422:5;:14;;;37438:5;:24;;;37464:5;:18;;;37484:5;:21;;;37507:5;:18;;;37527:5;:15;;;37544:5;:11;;;37557:5;:17;;;37576:5;:20;;;37598:5;:10;;;37395:214;;;;;;;;;;-1:-1:-1;;;;;37395:214:0;-1:-1:-1;;;;;37395:214:0;;;;;;;;;-1:-1:-1;;;;;37395:214:0;-1:-1:-1;;;;;37395:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37395:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37395:214:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37395:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37395:214:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37395:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36474:1154;;;:::o;34106:636::-;34312:14;;34197:4;;-1:-1:-1;;;;;34312:31:0;34338:4;34312:31;34308:76;;-1:-1:-1;34367:5:0;34360:12;;34308:76;34440:11;;;;-1:-1:-1;;;;;34440:25:0;;34436:70;;;-1:-1:-1;34489:5:0;34482:12;;34436:70;34596:74;34633:5;:14;;;34649:5;:20;;;34596:36;:74::i;:::-;34595:75;34591:120;;;-1:-1:-1;34694:5:0;34687:12;;34591:120;-1:-1:-1;34730:4:0;34106:636;;;:::o;17440:206::-;17541:4;17585:3;17571:11;:17;17570:68;;;;-1:-1:-1;17594:19:0;;;:43;;-1:-1:-1;;17617:3:0;:20;;17440:206;-1:-1:-1;17440:206:0:o;7617:393::-;7675:7;;7903:6;;7899:37;;;7927:1;7920:8;;;;7899:37;-1:-1:-1;7956:5:0;;;7960:1;7956;:5;7976;;;;;;;;:10;7968:19;;;;;31019:2073;31274:15;;;31239:3;31274:15;;;;;;;;;31108:12;;31239:3;31253:18;;31108:12;;31239:3;31274:15;;;17::-1;;105:10;31274:15:0;88:34:-1;136:17;;-1:-1;;31253:36:0;-1:-1:-1;;31365:4:0;31354:16;;31399:53;31354:16;19633:66;31399:29;:53::i;:::-;31391:61;;31471:56;31505:5;31512;:14;;;31471:33;:56::i;:::-;31463:64;;31546:53;31580:5;31587;:11;;;31546:33;:53::i;:::-;31538:61;;31618:53;31652:5;31659;:11;;;31618:33;:53::i;:::-;31610:61;;31690:72;31724:5;31731;:30;;;31690:33;:72::i;:::-;31682:80;;31781:72;31815:5;31822;:30;;;31781:33;:72::i;:::-;31773:80;;31872:57;31904:5;31917;:10;;;31911:17;;;;;;;;31872:31;:57::i;:::-;31864:65;;31948:61;31980:5;31993;:14;;;31987:21;;;;;;;31948:61;31940:69;;32028:58;32062:5;32069;:16;;;32028:33;:58::i;:::-;32020:66;;32105:48;32132:5;32139;:13;;;32105:26;:48::i;:::-;32097:56;;32172:63;32202:5;32219;:14;;;32209:25;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;32209:25:0;;;;;;;;;;;;;;;;32172:29;:63::i;:::-;32164:71;;32254:73;32284:5;32301;:24;;;32291:35;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;32254:73:0;32246:81;;32346:60;32380:5;32387;:18;;;32346:33;:60::i;:::-;32338:68;;32425:70;32455:5;32472;:21;;;32462:32;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;32425:70:0;32417:78;;32514:60;32548:5;32555;:18;;;32514:33;:60::i;:::-;32506:68;;32593:50;32620:5;32627;:15;;;32593:26;:50::i;:::-;32585:58;;32662:46;32689:5;32696;:11;;;32662:26;:46::i;:::-;32654:54;;32727:52;32754:5;32761;:17;;;32727:26;:52::i;:::-;32719:60;;32798:55;32825:5;32832;:20;;;32798:26;:55::i;:::-;32790:63;;32872:45;32899:5;32906;:10;;;32872:26;:45::i;:::-;32864:53;;32936:40;32963:5;32970;32936:26;:40::i;:::-;-1:-1:-1;;33040:4:0;33029:16;33019:33;;31019:2073;-1:-1:-1;;;31019:2073:0:o;8519:136::-;8577:7;;8601:6;;;;8593:15;;;;;;-1:-1:-1;;8627:5:0;;;8519:136::o;8125:276::-;8183:7;;8207:5;;;8199:14;;;;;;8294:1;8290;:5;;;;;;;;;8125:276;-1:-1:-1;;;;8125:276:0:o;50161:160::-;50300:11;;;;;-1:-1:-1;;;;;50293:19:0;50241:7;50293:19;;;:6;:19;;;;;;;50268:45;;50286:5;;50268:17;:45::i;39976:5441::-;40071:4;40298:10;40738:18;40839:19;40879:16;40982:23;41032:21;42128:20;42671;43184:16;45063:9;40194:1;-1:-1:-1;;;;;40165:31:0;:4;:17;;;-1:-1:-1;;;;;40165:31:0;;;40161:87;;;40221:9;:14;40213:23;;;;;;40311:30;40331:3;40336:4;40311:19;:30::i;:::-;40298:43;;40531:1;40523:5;:9;:44;;;;-1:-1:-1;40536:17:0;;;;-1:-1:-1;;;;;40536:31:0;;;40523:44;40519:140;;;40584:63;40599:4;:17;;;40618:3;:9;;;40629:4;:10;;;40641:5;40584:14;:63::i;:::-;40759:5;40738:26;;40861:5;40839:27;;40898:71;40911:36;40924:15;;40941:5;40911:12;:36::i;:::-;22308:5;40898:12;:71::i;:::-;40879:90;;41016:4;40982:39;;41068:31;41083:4;:15;;;41068:14;:31::i;:::-;41064:299;;;41160:4;:15;;;-1:-1:-1;;;;;41151:37:0;;41189:3;:11;;;41202:5;41151:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41151:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41151:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41151:57:0;;;;;;;;;-1:-1:-1;41151:57:0;-1:-1:-1;41064:299:0;;;41296:18;;41328:15;;;;41276:75;;;;;;-1:-1:-1;;;;;41276:75:0;;;;;;;;;;;;;;;41296:18;;;;;41276:51;;:75;;;;;;;;;;;41296:18;;41276:75;;;5:2:-1;;;;30:1;27;20:12;5:2;41276:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41276:75:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41276:75:0;;;;;;;;;-1:-1:-1;41276:75:0;-1:-1:-1;41064:299:0;-1:-1:-1;;;;;41379:32:0;;;;;;:54;;-1:-1:-1;41415:18:0;;;41379:54;41375:392;;;41454:17;;;;-1:-1:-1;;;;;41454:31:0;;41450:306;;;41522:42;41535:13;41550;41522:12;:42::i;:::-;41583:39;;41506:58;;-1:-1:-1;;;;;;41583:24:0;;;:39;;;;;41608:13;;41583:39;;;;41608:13;41583:24;:39;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41583:39:0;41450:306;;;41663:77;41678:4;:17;;;41697:4;:10;;;41709:15;41726:13;41663:14;:77::i;:::-;41849:29;;;;-1:-1:-1;;;;;41849:43:0;;;;;:63;;-1:-1:-1;41896:16:0;;;41849:63;41845:2900;;;42151:82;42164:47;42177:20;;42199:11;42164:12;:47::i;42151:82::-;42252:17;;;;42128:105;;-1:-1:-1;;;;;;42252:31:0;;42248:340;;;42320:44;42333:13;42348:15;42320:12;:44::i;:::-;42383:29;;;;:55;;42304:60;;-1:-1:-1;;;;;;42383:38:0;;:55;;;;;42422:15;;42383:55;;;;42422:15;42383:38;:55;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42383:55:0;42248:340;;;42479:93;42494:4;:17;;;42513:4;:10;;;42525:4;:29;;;42556:15;42479:14;:93::i;:::-;42608:28;;;;-1:-1:-1;;;;;42608:42:0;;42604:564;;42694:82;42707:47;42720:20;;42742:11;42707:12;:47::i;42694:82::-;42799:17;;;;42671:105;;-1:-1:-1;;;;;;42799:31:0;;42795:358;;;42871:44;42884:13;42899:15;42871:12;:44::i;:::-;42938:28;;;;:54;;42855:60;;-1:-1:-1;;;;;;42938:37:0;;:54;;;;;42976:15;;42938:54;;;;42976:15;42938:37;:54;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42938:54:0;42795:358;;;43041:92;43056:4;:17;;;43075:4;:10;;;43087:3;:28;;;43117:15;43041:14;:92::i;:::-;43203:78;43216:43;43229:16;;43247:11;43216:12;:43::i;43203:78::-;43300:17;;;;43184:97;;-1:-1:-1;;;;;;43300:31:0;;43296:310;;;43368:40;43381:13;43396:11;43368:12;:40::i;:::-;43427:20;;:42;;43352:56;;-1:-1:-1;;;;;;43427:20:0;;:42;;;;;43457:11;;43427:20;:42;:20;:42;43457:11;43427:20;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43427:42:0;43296:310;;;43525:17;;;;43544:10;;;;43556:20;;43510:80;;43525:17;43544:10;-1:-1:-1;;;;;43556:20:0;43578:11;43510:14;:80::i;:::-;41845:2900;;;43627:29;;;;-1:-1:-1;;;;;43627:43:0;;43623:1122;;;43877:17;;;;-1:-1:-1;;;;;43877:31:0;;;43869:40;;;;;;43930:16;;43926:808;;43985:82;43998:47;44011:20;;44033:11;43998:12;:47::i;43985:82::-;43967:100;;44086:92;44101:4;:17;;;44120:4;:10;;;44132:3;:28;;;44162:15;44086:14;:92::i;:::-;44203:29;;;;-1:-1:-1;;;;;44203:43:0;;44199:308;;44289:82;44302:47;44315:20;;44337:11;44302:12;:47::i;44289:82::-;44271:100;;44394:93;44409:4;:17;;;44428:4;:10;;;44440:4;:29;;;44471:15;44394:14;:93::i;:::-;44541:78;44554:43;44567:16;;44585:11;44554:12;:43::i;44541:78::-;44653:17;;;;44672:10;;;;44684:20;;44527:92;;-1:-1:-1;44638:80:0;;-1:-1:-1;;;;;44684:20:0;44527:92;44638:14;:80::i;:::-;44761:17;;;;-1:-1:-1;;;;;44761:31:0;;44757:456;;;44888:9;:27;-1:-1:-1;44888:27:0;44880:36;;;;;;44931:4;:10;;;-1:-1:-1;;;;;44931:19:0;:34;44951:13;44931:34;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44931:34:0;45075:39;45088:9;45099:14;45075:12;:39::i;:::-;45063:51;;45140:1;45133:4;:8;45129:73;;;45162:3;:9;;;-1:-1:-1;;;;;45162:18:0;:24;45181:4;45162:24;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45162:24:0;45129:73;-1:-1:-1;45404:5:0;;39976:5441;-1:-1:-1;;;;;;;;;;;39976:5441:0:o;33748:254::-;33845:7;33870:12;33885:24;33896:5;33903;33885:10;:24::i;:::-;33870:39;;33928:26;33942:4;33948:5;33928:13;:26::i;:::-;33920:52;;;;;;;-1:-1:-1;;;;;33920:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;16933:255;17039:4;;17126:8;:31;;;;;;;;;:53;;;-1:-1:-1;;17178:1:0;-1:-1:-1;17161:18:0;16933:255;-1:-1:-1;16933:255:0:o;6197:241::-;6337:21;;6392:4;6381:16;;6197:241::o;29580:223::-;29701:1;29692:6;:10;29688:108;;;29727:18;;:56;;;;;;-1:-1:-1;;;;;29727:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;;;:31;;:56;;;;;;;;;;;;;;:18;;:56;;;5:2:-1;;;;30:1;27;20:12;5:2;29727:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29727:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29727:56:0;29719:65;;;;;;;;29580:223;;;;:::o;26567:981::-;26688:73;;;26739:21;26688:73;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;26688:73:0;;;;;;;25:18:-1;;;61:17;;-1:-1;;;;;182:15;26711:26:0;179:29:-1;160:49;;26794:13:0;;;;;;;;;;;26628:4;;;;26688:73;26668:17;;26628:4;;26794:13;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;26794:13:0;26772:35;;27282:2;27232:6;27136:4;27130:11;27037:2;27031:4;27027:13;26982:1;26926:9;26876:3;26853:476;26842:487;;27355:7;27354:8;27350:53;;;27386:5;27379:12;;;;27350:53;-1:-1:-1;27485:13:0;;;-1:-1:-1;27485:13:0;26567:981;;;;;;;;:::o;50408:12233::-;;;;;;;;;-1:-1:-1;50408:12233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50408:12233:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50408:12233:0;;;;;;;;;;;-1:-1:-1;;;;;50408:12233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://33844ff19818572d40975a7a52f206c4f20c5ea6cfa35bdc44884f44faf6bbd8

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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