ETH Price: $3,270.30 (+1.59%)
Gas: 3.13 Gwei

Contract

0x2C8982eCb29B9E53dD319874E2cE6EA2a1006afE
 

Overview

ETH Balance

0.004 ETH

Eth Value

$13.08 (@ $3,270.30/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Auction133241182021-09-30 1:20:361198 days ago1632964836IN
0x2C8982eC...2a1006afE
0 ETH0.0057374669.0487671
Create Auction133241152021-09-30 1:20:091198 days ago1632964809IN
0x2C8982eC...2a1006afE
0 ETH0.0059782671.94664444
Cancel Auction133240922021-09-30 1:15:061198 days ago1632964506IN
0x2C8982eC...2a1006afE
0 ETH0.0018790249.42719469
Cancel Auction133240922021-09-30 1:15:061198 days ago1632964506IN
0x2C8982eC...2a1006afE
0 ETH0.0018790249.42719469
Create Auction133239982021-09-30 0:57:311198 days ago1632963451IN
0x2C8982eC...2a1006afE
0 ETH0.0067657781.41234347
Cancel Auction133239922021-09-30 0:55:461198 days ago1632963346IN
0x2C8982eC...2a1006afE
0 ETH0.0032828982.23901887
Create Auction133239912021-09-30 0:55:331198 days ago1632963333IN
0x2C8982eC...2a1006afE
0 ETH0.0065071278.30004552
Cancel Auction133239832021-09-30 0:53:471198 days ago1632963227IN
0x2C8982eC...2a1006afE
0 ETH0.0032355785.11080088
Mint132795582021-09-23 3:24:461205 days ago1632367486IN
0x2C8982eC...2a1006afE
0 ETH0.0181265164.10632707
Create Auction132271802021-09-15 0:46:441213 days ago1631666804IN
0x2C8982eC...2a1006afE
0 ETH0.0029038334.94181061
Create Auction132271792021-09-15 0:46:111213 days ago1631666771IN
0x2C8982eC...2a1006afE
0 ETH0.0025952731.22887085
Cancel Auction132271772021-09-15 0:46:041213 days ago1631666764IN
0x2C8982eC...2a1006afE
0 ETH0.00127333.48612693
Cancel Auction132271692021-09-15 0:45:011213 days ago1631666701IN
0x2C8982eC...2a1006afE
0 ETH0.0014753938.80975078
Create Auction131820082021-09-08 1:04:001220 days ago1631063040IN
0x2C8982eC...2a1006afE
0 ETH0.0066338879.82535488
Create Auction131820052021-09-08 1:03:211220 days ago1631063001IN
0x2C8982eC...2a1006afE
0 ETH0.0073991273.83988167
Create Auction131820022021-09-08 1:02:511220 days ago1631062971IN
0x2C8982eC...2a1006afE
0 ETH0.0081621281.45427442
Auction Mint130359502021-08-16 11:18:541243 days ago1629112734IN
0x2C8982eC...2a1006afE
0 ETH0.0131609239.7924741
Auction Mint129701582021-08-06 7:41:121253 days ago1628235672IN
0x2C8982eC...2a1006afE
0 ETH0.0105088833.50375747
Mint129501652021-08-03 4:15:301256 days ago1627964130IN
0x2C8982eC...2a1006afE
0 ETH0.0107443138
Transfer From129431542021-08-02 1:45:531257 days ago1627868753IN
0x2C8982eC...2a1006afE
0 ETH0.0015376123
Update Sale129431392021-08-02 1:42:401257 days ago1627868560IN
0x2C8982eC...2a1006afE
0 ETH0.0014307624
Buy129428572021-08-02 0:42:121257 days ago1627864932IN
0x2C8982eC...2a1006afE
0.001 ETH0.0030957323
End Auction129191742021-07-29 6:38:431261 days ago1627540723IN
0x2C8982eC...2a1006afE
0 ETH0.0016822220.1
Create Auction129175692021-07-29 0:31:561261 days ago1627518716IN
0x2C8982eC...2a1006afE
0 ETH0.0015789919
Cancel Auction129175602021-07-29 0:30:221261 days ago1627518622IN
0x2C8982eC...2a1006afE
0 ETH0.0004514419
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
129428572021-08-02 0:42:121257 days ago1627864932
0x2C8982eC...2a1006afE
0.00002 ETH
129428572021-08-02 0:42:121257 days ago1627864932
0x2C8982eC...2a1006afE
0.00098 ETH
129191742021-07-29 6:38:431261 days ago1627540723
0x2C8982eC...2a1006afE
0.00002 ETH
129191742021-07-29 6:38:431261 days ago1627540723
0x2C8982eC...2a1006afE
0.00098 ETH
129132602021-07-28 7:56:441262 days ago1627459004
0x2C8982eC...2a1006afE
0.00209999 ETH
129131832021-07-28 7:41:101262 days ago1627458070
0x2C8982eC...2a1006afE
0.00002 ETH
129131832021-07-28 7:41:101262 days ago1627458070
0x2C8982eC...2a1006afE
0.00098 ETH
129131182021-07-28 7:26:571262 days ago1627457217
0x2C8982eC...2a1006afE
0.002 ETH
129118372021-07-28 2:42:291262 days ago1627440149
0x2C8982eC...2a1006afE
0.001 ETH
128804552021-07-23 4:22:291267 days ago1627014149
0x2C8982eC...2a1006afE
0.002 ETH
128802182021-07-23 3:24:181267 days ago1627010658
0x2C8982eC...2a1006afE
0.001 ETH
128293302021-07-15 4:17:491275 days ago1626322669
0x2C8982eC...2a1006afE
0.00002 ETH
128293302021-07-15 4:17:491275 days ago1626322669
0x2C8982eC...2a1006afE
0.00098 ETH
128245142021-07-14 10:09:081276 days ago1626257348
0x2C8982eC...2a1006afE
0.00002 ETH
128245142021-07-14 10:09:081276 days ago1626257348
0x2C8982eC...2a1006afE
0.00098 ETH
128232212021-07-14 5:15:051276 days ago1626239705
0x2C8982eC...2a1006afE
0.00006 ETH
128232212021-07-14 5:15:051276 days ago1626239705
0x2C8982eC...2a1006afE
0.00294 ETH
128050692021-07-11 8:58:241279 days ago1625993904
0x2C8982eC...2a1006afE
0.00002 ETH
128050692021-07-11 8:58:241279 days ago1625993904
0x2C8982eC...2a1006afE
0.00098 ETH
127921212021-07-09 8:31:571281 days ago1625819517
0x2C8982eC...2a1006afE
0.000004 ETH
127921212021-07-09 8:31:571281 days ago1625819517
0x2C8982eC...2a1006afE
0.000196 ETH
127791952021-07-07 8:19:441283 days ago1625645984
0x2C8982eC...2a1006afE
0.0000035 ETH
127791952021-07-07 8:19:441283 days ago1625645984
0x2C8982eC...2a1006afE
0.0000965 ETH
127790102021-07-07 7:42:321283 days ago1625643752
0x2C8982eC...2a1006afE
0.00002 ETH
127790102021-07-07 7:42:321283 days ago1625643752
0x2C8982eC...2a1006afE
0.00098 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AuctionMarket

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-14
*/

pragma solidity >=0.6.0 <0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
abstract contract Ownable {
    address internal _owner;

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

    constructor() {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    modifier onlyOwner() {
        require(
            msg.sender == _owner,
            "Ownable : Function called by unauthorized user."
        );
        _;
    }

    function owner() external view returns (address ownerAddress) {
        ownerAddress = _owner;
    }

    function transferOwnership(address newOwner)
        public
        onlyOwner
        returns (bool success)
    {
        require(newOwner != address(0), "Ownable/transferOwnership : cannot transfer ownership to zero address");
        success = _transferOwnership(newOwner);
    }

    function renounceOwnership() external onlyOwner returns (bool success) {
        success = _transferOwnership(address(0));
    }

    function _transferOwnership(address newOwner) internal returns (bool success) {
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
        success = true;
    }
}
interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    function transferFrom(address from, address to, uint256 tokenId) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
interface IERC721Metadata is IERC721 {

    /**
     * @dev  Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev  Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev  Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
interface IERC721Enumerable is IERC721 {
	
    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) external view returns (uint256);
}
interface IERC721Receiver {
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

abstract contract ERC165 is IERC165 {
	
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


library SafeMath {
    /**
     * @dev  Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev  Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev  Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev  Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev  Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev  Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

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

    /**
     * @dev  Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev  Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

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

    /**
     * @dev  Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev  Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev  Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}
library Address {
    function isContract(address account) internal view returns (bool) {

        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

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

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

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

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev  Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev  Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev  Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

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


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

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

   /**
    * @dev  Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev  Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev  Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev  Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev  Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev  Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev  Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev  Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev  Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev  Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev  Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev  Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

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

    /**
     * @dev  Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev  Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev  Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}
library Strings {
    /**
     * @dev  Converts a `uint256` to its ASCII `string` representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

abstract contract ERC721Pausable is  Context,Ownable {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    constructor () {
        _paused = false;
    }

    function paused() public view virtual returns (bool) {
        return _paused;
    }


    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }


    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    
    function pause() onlyOwner whenNotPaused public {
        _paused = true;
        emit Paused(_msgSender());
    }

    function unpause() onlyOwner whenPaused public {
        _paused = false;
        emit Unpaused(_msgSender());
    }
	
}
abstract contract ERC721Fees is  Context,Ownable {
    event FeePaused();
	event FeeUnPaused();
	
	event CancelFeePaused();
	event CancelFeeUnPaused();

    uint private _feeRate;
    uint private _cancelFeeRate;
	
    bool private _feePaused;
    bool private _cancelFeePaused;

    constructor (uint feeRate_,uint cancelFeeRate_) {
		_feeRate         = feeRate_;
		_cancelFeeRate   = cancelFeeRate_;
		
        _feePaused       = false;
        _cancelFeePaused = false;
    }
	
    function feeRate() public view virtual returns (uint) {
		if(feePaused() == true){
			return 0;
		}
		
        return _feeRate;
    }	
	
    function cancelFeeRate() public view virtual returns (uint) {
		if(cancelFeePaused() == true){
			return 0;
		}
		
        return _cancelFeeRate;
    }	
	
    function feePaused() public view virtual returns (bool) {
        return _feePaused;
    }	
	
    function cancelFeePaused() public view virtual returns (bool) {
        return _cancelFeePaused;
    }
	
    modifier whenNotFeePaused() {
        require(!feePaused(), "Pausable: paused");
        _;
    }

    modifier whenFeePaused() {
        require(feePaused(), "Pausable: not paused");
        _;
    }	
	
    modifier whenNotCancelFeePaused() {
        require(!cancelFeePaused(), "Pausable: paused");
        _;
    }

    modifier whenCancelFeePaused() {
        require(cancelFeePaused(), "Pausable: not paused");
        _;
    }
	
    function feePause() onlyOwner whenNotFeePaused public {
        _feePaused = true;
        emit FeePaused();
    }

    function feeUnPause() onlyOwner whenFeePaused public {
        _feePaused = false;
        emit FeeUnPaused();
    }	
	
    function cancelFeePause() onlyOwner whenNotCancelFeePaused public {
        _cancelFeePaused = true;
        emit CancelFeePaused();
    }

    function cancelFeeUnPause() onlyOwner whenCancelFeePaused public {
        _cancelFeePaused = false;
        emit CancelFeeUnPaused();
    }
}
	
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable 
,ERC721Pausable
,ERC721Fees
{
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using Strings for uint256;
	using EnumerableMap for EnumerableMap.UintToAddressMap;
	
	EnumerableMap.UintToAddressMap internal _tokenOwners;
	
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    mapping (address => EnumerableSet.UintSet) internal _holderTokens;

    mapping (uint256 => address) private _tokenApprovals;

    mapping (address => mapping (address => bool)) internal _operatorApprovals;

    mapping (uint256 => string) internal _tokenURIs;

    string internal _baseURI;
	
    string private _name;

    string private _symbol;
	
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;	
    
	constructor (string memory name_, string memory symbol_) 
	 
	ERC721Fees(20,35)
		{
        _name = name_;
        _symbol = symbol_;

        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }
	
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _tokenOwners.get(tokenId);
    }
	
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data));
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId));
        address owner = _ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || _operatorApprovals[owner][spender]);
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data));
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0));
        require(!_exists(tokenId));

        _beforeTokenTransfer(address(0), to, tokenId);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(address(0), to, tokenId);
    }

    function _burn(uint256 tokenId) internal virtual {
        address owner = _ownerOf(tokenId); // internal owner

        _beforeTokenTransfer(owner, address(0), tokenId);

        _approve(address(0), tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

        emit Transfer(owner, address(0), tokenId);
    }

    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(_ownerOf(tokenId) == from);
        require(to != address(0));

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId));
        _tokenURIs[tokenId] = _tokenURI;
    }

    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

    function _approve(address to, uint256 tokenId) internal {
        _tokenApprovals[tokenId] = to;
        emit Approval(_ownerOf(tokenId), to, tokenId); // internal owner
    }

			function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual {
			require(!paused());
		}
	    
	
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId));

        return _tokenApprovals[tokenId];
    }	
	
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0));
        return _holderTokens[owner].length();
    }
	
    function setBaseURI(string memory baseURI_) public virtual {
        _setBaseURI(baseURI_);
    }	
	
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }
	
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId));

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _tokenOwners.length();
    }
	

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }
	
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }
	
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _ownerOf(tokenId);
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }


    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner);

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()));

        _approve(to, tokenId);
    }

    /**
     * @dev  See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender());

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev  See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev  See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId));
				require(hasAuction(tokenId) == false);
		
        _transfer(from, to, tokenId);
    }

    /**
     * @dev  See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
				require(hasAuction(tokenId) == false);
				
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev  See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId));
				require(hasAuction(tokenId) == false);
				
        _safeTransfer(from, to, tokenId, _data);
    }	
	
		struct Offer {
        bool isForSale;
        address seller;
        uint minValue; 
		uint endTime;
    }

    struct Bid {
        bool hasBid;
        address bidder;
        uint value;
    }
	
	// NFT 경매 등록 목록
    mapping (uint256 => Offer) public offers;

    // NFT 입찰 목록
    mapping (uint256 => Bid) public bids;
	
	event CreateAuction(address indexed owner,uint _tokenId, uint _minValue,uint _endTime);
	event CancelAuction(uint _tokenId);
	event EndAuction(uint _tokenId,uint price);
	
	event Bidding(uint _tokenId,uint value);
	event CancelBid(uint _tokenId);
	
	//경매등록
	function _createAuction(uint256 _tokenId, uint _minValue,uint _auctionTime) internal virtual {
		require(_ownerOf(_tokenId) == msg.sender);//토큰 소유자인지 확인
		
		Offer storage offer =  offers[_tokenId];
		require(offer.isForSale != true);//현재 판매중인지 확인
		
        offers[_tokenId] = Offer(true, msg.sender, _minValue,block.timestamp + _auctionTime);
		emit CreateAuction(msg.sender, _tokenId, _minValue,block.timestamp + _auctionTime);
	}
	
	//경매취소
    function _cancelAuction(uint256 _tokenId) internal virtual {
       require(_ownerOf(_tokenId) == msg.sender);//토큰 소유자인지 체크
	   
	   Offer storage offer =  offers[_tokenId];
	   require(offer.isForSale == true);//현재 경매중인지 체크
	   
	   Bid storage bid = bids[_tokenId];
	   require(bid.hasBid != true);//입찰자가 있을경우 경매 취소 불가능

	   offers[_tokenId] = Offer(false, msg.sender, 0,0);
	   
	   emit CancelAuction(_tokenId);
    }
	
	//입찰하기
    function _bid(uint256 _tokenId) internal virtual {
		require(_ownerOf(_tokenId) != msg.sender);//토큰 보유자
		
		Offer storage offer =  offers[_tokenId];
		require(block.timestamp < offer.endTime);//경매가 종료되었을 경우
		require(msg.value >= offer.minValue);//입찰 금액이 최소 입찰액보다 작은지 체크
		
        Bid storage existing = bids[_tokenId];
		require(msg.value > existing.value);//입찰금액이 이전 입찰금액보다 적을경우 트랜잭션 취소
		
        if (existing.value > 0) {
			//이전 입찰자에게 이더리움을 돌려줌
			address payable bidder = payable(existing.bidder);
			bidder.transfer(existing.value);
        }
		
        bids[_tokenId] = Bid(true, msg.sender, msg.value);
		
		emit Bidding(_tokenId,msg.value);
    }	
	
	//입찰취소
    function _cancelBid(uint256 _tokenId) internal virtual {
		Offer storage offer =  offers[_tokenId];
		require(offer.isForSale == true);//경매가 진행중인지 체크
		require(block.timestamp < offer.endTime);//경매가 종료되었을 경우

        Bid storage bid = bids[_tokenId];
		require(bid.hasBid == true);
		require(bid.bidder == msg.sender);//입찰자가 본인인 경우
		
		
		
		address payable bidder = payable(bid.bidder);
		address payable seller = payable(offer.seller);
		
					uint cancelFee = bid.value * cancelFeeRate() / 1000;
			bidder.transfer(bid.value - cancelFee);
			seller.transfer(cancelFee);
				
		bids[_tokenId] = Bid(false, address(0), 0);
		
		emit CancelBid(_tokenId);
    }
	
	//경매종료
    function _endAuction(uint256 _tokenId) internal virtual {
        Offer storage offer =  offers[_tokenId];
		require(block.timestamp >= offer.endTime);//경매 종료 시간이 아닐경우 오류
		require(offer.isForSale == true);//경매가 이미 종료된 경우
		
		address payable seller = payable(_ownerOf(_tokenId));
		
		Bid storage bid = bids[_tokenId];
		_transfer(offer.seller, bid.bidder, _tokenId);

        
					// 수수료
			uint _commissionValue = bid.value * feeRate() / 1000;
			uint _sellerValue = bid.value - _commissionValue;
			
			seller.transfer(_sellerValue);//판매자에게 판매대금 지급
			
			address payable contractOwner = payable(_owner);
			contractOwner.transfer(_commissionValue);//발행자에게 수수료 지급
				
		emit EndAuction(_tokenId,bid.value);
		_resetAuction(_tokenId);
	}	
	
	
	function _resetAuction(uint256 _tokenId) internal virtual {
        offers[_tokenId] = Offer(false, address(0), 0,0);
        bids[_tokenId] = Bid(false, address(0), 0);
	}
	
	
	function hasAuction(uint256 _tokenId) public view virtual returns (bool){
		Offer storage offer =  offers[_tokenId];
		if(offer.isForSale != true){
			return false;
		}
		
		return true;
	}
	
}


abstract contract ERC721Burnable is ERC721
{
	
    function burn(uint256 _tokenId) external payable{
        require(_isApprovedOrOwner(_msgSender(), _tokenId) || _owner == _msgSender(), "ERC721Burnable: caller is not owner nor approved");
		
				Offer storage offer =  offers[_tokenId];
		if(offer.isForSale == true){
			
			Bid storage bid = bids[_tokenId];
			if(bid.hasBid == true){
				address payable bidder = payable(bid.bidder);
				bidder.transfer(bid.value);
			}
			
			_resetAuction(_tokenId);
		}
				
        _burn(_tokenId);
    }

}
abstract
contract Market is
 ERC721Burnable
{
    address payable public _contractOwner;

    mapping (uint => uint) public price;
    mapping (uint => bool) public listedMap;

    event Purchase(address indexed previousOwner, address indexed newOwner, uint price, uint nftID, string uri);

    event Minted(address indexed minter, uint256 price, uint nftID, string uri);

    event PriceUpdate(address indexed owner, uint oldPrice, uint newPrice, uint nftID);

    event NftListStatus(address indexed owner, uint nftID, bool isListed);
	
		
	//즉시 판매 생성
    function mint(string memory _tokenURI, address _toAddress, uint256 _price) public returns (uint) {
        uint _tokenId = totalSupply() + 1;
        price[_tokenId] = _price;
        listedMap[_tokenId] = true;

        _safeMint(_toAddress, _tokenId);
        _setTokenURI(_tokenId, _tokenURI);

        emit Minted(_toAddress, _price, _tokenId, _tokenURI);

        return _tokenId;
    }
	
    function buy(uint _id) external payable {
        _validate(_id);

        address _previousOwner = ownerOf(_id);
        address _newOwner = msg.sender;

        _trade(_id);

        emit Purchase(_previousOwner, _newOwner, price[_id], _id, tokenURI(_id));
    }

    function _validate(uint _id) internal {
        bool isItemListed = listedMap[_id];
        require(_exists(_id));
        require(isItemListed);
        require(msg.value >= price[_id]);
        require(msg.sender != ownerOf(_id));
    }

    function _trade(uint _id) internal {
        address payable contractOwner = payable(_owner);
        address payable _buyer = payable(msg.sender);
        address payable _owner = payable(ownerOf(_id));

        _transfer(_owner, _buyer, _id);
		

					uint _commissionValue = price[_id] * feeRate() / 1000;
			uint _sellerValue = price[_id] - _commissionValue;

			_owner.transfer(_sellerValue);
			contractOwner.transfer(_commissionValue);
		
        // If buyer sent more than price, we send them back their rest of funds
        if (msg.value > price[_id]) {
            _buyer.transfer(msg.value - price[_id]);
        }

        listedMap[_id] = false;
    }
	
    function updatePrice(uint _tokenId, uint _price) public returns (bool) {
				require(hasAuction(_tokenId) == false);
		        uint oldPrice = price[_tokenId];
        require(msg.sender == ownerOf(_tokenId));
        price[_tokenId] = _price;

        emit PriceUpdate(msg.sender, oldPrice, _price, _tokenId);
        return true;
    }
	
    function updateListingStatus(uint _tokenId, bool shouldBeListed) public returns (bool) {
        require(msg.sender == ownerOf(_tokenId));
		        require(hasAuction(_tokenId) == false);
		
        listedMap[_tokenId] = shouldBeListed;

        emit NftListStatus(msg.sender, _tokenId, shouldBeListed);

        return true;
    }	
	
    function updateSale(uint256 _tokenId, uint256 _price) public returns (bool) {
				require(hasAuction(_tokenId) == false);
		        uint oldPrice = price[_tokenId];
        require(msg.sender == ownerOf(_tokenId));
		
        price[_tokenId] = _price;
		emit NftListStatus(msg.sender, _tokenId, true);
		
		if (listedMap[_tokenId] != true) {
			listedMap[_tokenId] = true;
			emit PriceUpdate(msg.sender, oldPrice, _price, _tokenId);
		}
        return true;
    }
	
}


contract AuctionMarket is Market {
	
    constructor() ERC721("BLOCKSDK", "BLOCKSDK") {
        
    }
	
	//경매 판매 생성
    function auctionMint(string memory _tokenURI, address _toAddress,uint _minValue,uint _auctionTime) public returns (uint) {
        uint _tokenId = totalSupply() + 1;
        price[_tokenId] = _minValue;

        _safeMint(_toAddress, _tokenId);
        _setTokenURI(_tokenId, _tokenURI);

        emit Minted(_toAddress, _minValue, _tokenId, _tokenURI);
		
		_createAuction(_tokenId,_minValue,_auctionTime);
        return _tokenId;
    }
	
	//경매생성
    function createAuction(uint _tokenId, uint _minValue,uint _auctionTime)  public virtual {
		require(listedMap[_tokenId] == false); // 즉시판매 진행중
		
		_createAuction(_tokenId,_minValue,_auctionTime);
    }
	
	//경매취소
	function cancelAuction(uint _tokenId)  public virtual {
		
		_cancelAuction(_tokenId);
	}	
	
	//입찰
	function bid(uint _tokenId) external payable {
		_bid(_tokenId);
	}
	
		//입찰취소
	function cancelBid(uint _tokenId) external payable {
		
		_cancelBid(_tokenId);
	}	
		
	//경매종료
	function endAuction(uint _tokenId) external payable {
		
		_endAuction(_tokenId);
	}
	

	
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Bidding","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"CancelAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"CancelBid","type":"event"},{"anonymous":false,"inputs":[],"name":"CancelFeePaused","type":"event"},{"anonymous":false,"inputs":[],"name":"CancelFeeUnPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_minValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"CreateAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"EndAuction","type":"event"},{"anonymous":false,"inputs":[],"name":"FeePaused","type":"event"},{"anonymous":false,"inputs":[],"name":"FeeUnPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isListed","type":"bool"}],"name":"NftListStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currentOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"}],"name":"PriceUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"Purchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_contractOwner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_minValue","type":"uint256"},{"internalType":"uint256","name":"_auctionTime","type":"uint256"}],"name":"auctionMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bids","outputs":[{"internalType":"bool","name":"hasBid","type":"bool"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"cancelAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"cancelBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cancelFeePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelFeePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelFeeUnPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minValue","type":"uint256"},{"internalType":"uint256","name":"_auctionTime","type":"uint256"}],"name":"createAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"endAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeUnPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hasAuction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listedMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offers","outputs":[{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"ownerAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"shouldBeListed","type":"bool"}],"name":"updateListingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updatePrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600881526020017f424c4f434b53444b0000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f424c4f434b53444b000000000000000000000000000000000000000000000000815250601460236200009a6301ffc9a760e01b6200021960201b60201c565b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160146101000a81548160ff02191690831515021790555081600281905550806003819055506000600460006101000a81548160ff0219169083151502179055506000600460016101000a81548160ff021916908315150217905550505081600c9080519060200190620001af92919062000322565b5080600d9080519060200190620001c892919062000322565b50620001e16380ac58cd60e01b6200021960201b60201c565b620001f9635b5e139f60e01b6200021960201b60201c565b6200021163780e9d6360e01b6200021960201b60201c565b5050620003d8565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200035a5760008555620003a6565b82601f106200037557805160ff1916838001178555620003a6565b82800160010185558215620003a6579182015b82811115620003a557825182559160200191906001019062000388565b5b509050620003b59190620003b9565b5090565b5b80821115620003d4576000816000905550600101620003ba565b5090565b61599580620003e86000396000f3fe6080604052600436106102c95760003560e01c80637e8816b911610175578063a22cb465116100dc578063ca52a43311610095578063d96a094a1161006f578063d96a094a14611354578063e985e9c514611382578063f146292114611409578063f2fde38b1461145a576102c9565b8063ca52a433146112d7578063cda4beef146112ee578063d16fd8d41461133d576102c9565b8063a22cb46514610fda578063b88d4fde14611037578063b9a2de3a14611149578063bc8ba28f14611177578063bdde7897146111c8578063c87b56dd14611223576102c9565b806395d89b411161012e57806395d89b4114610e4257806396b5a75514610ed25780639703ef3514610f0d578063978bbdb914610f3b5780639819826a14610f6657806398214bcb14610f7d576102c9565b80637e8816b914610afd57806382367b2d14610c035780638456cb5914610c5e5780638804da6314610c755780638a72ea6a14610d855780638da5cb5b14610e01576102c9565b806342842e0e1161023457806350f1c94f116101ed5780636352211e116101c75780636352211e146109765780636c0360eb146109db57806370a0823114610a6b578063715018a614610ad0576102c9565b806350f1c94f1461085457806355f804b3146108815780635c975abb14610949576102c9565b806342842e0e146106a257806342966c681461071d5780634423c5f11461074b578063454a2ab3146107c05780634e79f1a1146107ee5780634f6ccce714610805576102c9565b806326a49e371161028657806326a49e371461053457806327fbe123146105835780632bb3b114146105b05780632f745c59146105f15780633c4da553146106605780633f4ba83a1461068b576102c9565b806301ffc9a7146102ce57806306fdde031461033e578063081812fc146103ce578063095ea7b31461043357806318160ddd1461048e57806323b872dd146104b9575b600080fd5b3480156102da57600080fd5b50610326600480360360208110156102f157600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506114c1565b60405180821515815260200191505060405180910390f35b34801561034a57600080fd5b50610353611528565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610393578082015181840152602081019050610378565b50505050905090810190601f1680156103c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103da57600080fd5b50610407600480360360208110156103f157600080fd5b81019080803590602001909291905050506115ca565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561043f57600080fd5b5061048c6004803603604081101561045657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611619565b005b34801561049a57600080fd5b506104a36116c5565b6040518082815260200191505060405180910390f35b3480156104c557600080fd5b50610532600480360360608110156104dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116d6565b005b34801561054057600080fd5b5061056d6004803603602081101561055757600080fd5b8101908080359060200190929190505050611719565b6040518082815260200191505060405180910390f35b34801561058f57600080fd5b50610598611731565b60405180821515815260200191505060405180910390f35b3480156105bc57600080fd5b506105c5611748565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105fd57600080fd5b5061064a6004803603604081101561061457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061176e565b6040518082815260200191505060405180910390f35b34801561066c57600080fd5b506106756117c9565b6040518082815260200191505060405180910390f35b34801561069757600080fd5b506106a06117f1565b005b3480156106ae57600080fd5b5061071b600480360360608110156106c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611982565b005b6107496004803603602081101561073357600080fd5b81019080803590602001909291905050506119bb565b005b34801561075757600080fd5b506107846004803603602081101561076e57600080fd5b8101908080359060200190929190505050611b78565b6040518084151581526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390f35b6107ec600480360360208110156107d657600080fd5b8101908080359060200190929190505050611bcf565b005b3480156107fa57600080fd5b50610803611bdb565b005b34801561081157600080fd5b5061083e6004803603602081101561082857600080fd5b8101908080359060200190929190505050611d44565b6040518082815260200191505060405180910390f35b34801561086057600080fd5b50610869611d67565b60405180821515815260200191505060405180910390f35b34801561088d57600080fd5b50610947600480360360208110156108a457600080fd5b81019080803590602001906401000000008111156108c157600080fd5b8201836020820111156108d357600080fd5b803590602001918460018302840111640100000000831117156108f557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d7e565b005b34801561095557600080fd5b5061095e611d8a565b60405180821515815260200191505060405180910390f35b34801561098257600080fd5b506109af6004803603602081101561099957600080fd5b8101908080359060200190929190505050611da1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109e757600080fd5b506109f0611db3565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a30578082015181840152602081019050610a15565b50505050905090810190601f168015610a5d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a7757600080fd5b50610aba60048036036020811015610a8e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e55565b6040518082815260200191505060405180910390f35b348015610adc57600080fd5b50610ae5611ede565b60405180821515815260200191505060405180910390f35b348015610b0957600080fd5b50610bed60048036036060811015610b2057600080fd5b8101908080359060200190640100000000811115610b3d57600080fd5b820183602082011115610b4f57600080fd5b80359060200191846001830284011164010000000083111715610b7157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f95565b6040518082815260200191505060405180910390f35b348015610c0f57600080fd5b50610c4660048036036040811015610c2657600080fd5b8101908080359060200190929190803590602001909291905050506120cb565b60405180821515815260200191505060405180910390f35b348015610c6a57600080fd5b50610c736121be565b005b348015610c8157600080fd5b50610d6f60048036036080811015610c9857600080fd5b8101908080359060200190640100000000811115610cb557600080fd5b820183602082011115610cc757600080fd5b80359060200191846001830284011164010000000083111715610ce957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061234f565b6040518082815260200191505060405180910390f35b348015610d9157600080fd5b50610dbe60048036036020811015610da857600080fd5b8101908080359060200190929190505050612465565b6040518085151581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390f35b348015610e0d57600080fd5b50610e166124c2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e4e57600080fd5b50610e576124ec565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e97578082015181840152602081019050610e7c565b50505050905090810190601f168015610ec45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ede57600080fd5b50610f0b60048036036020811015610ef557600080fd5b810190808035906020019092919050505061258e565b005b610f3960048036036020811015610f2357600080fd5b810190808035906020019092919050505061259a565b005b348015610f4757600080fd5b50610f506125a6565b6040518082815260200191505060405180910390f35b348015610f7257600080fd5b50610f7b6125ce565b005b348015610f8957600080fd5b50610fc260048036036040811015610fa057600080fd5b8101908080359060200190929190803515159060200190929190505050612738565b60405180821515815260200191505060405180910390f35b348015610fe657600080fd5b5061103560048036036040811015610ffd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612820565b005b34801561104357600080fd5b506111476004803603608081101561105a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156110c157600080fd5b8201836020820111156110d357600080fd5b803590602001918460018302840111640100000000831117156110f557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061296d565b005b6111756004803603602081101561115f57600080fd5b81019080803590602001909291905050506129b2565b005b34801561118357600080fd5b506111b06004803603602081101561119a57600080fd5b81019080803590602001909291905050506129be565b60405180821515815260200191505060405180910390f35b3480156111d457600080fd5b5061120b600480360360408110156111eb57600080fd5b8101908080359060200190929190803590602001909291905050506129de565b60405180821515815260200191505060405180910390f35b34801561122f57600080fd5b5061125c6004803603602081101561124657600080fd5b8101908080359060200190929190505050612b83565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561129c578082015181840152602081019050611281565b50505050905090810190601f1680156112c95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156112e357600080fd5b506112ec612e08565b005b3480156112fa57600080fd5b5061133b6004803603606081101561131157600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612f71565b005b34801561134957600080fd5b50611352612fb2565b005b6113806004803603602081101561136a57600080fd5b810190808035906020019092919050505061311c565b005b34801561138e57600080fd5b506113f1600480360360408110156113a557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061323a565b60405180821515815260200191505060405180910390f35b34801561141557600080fd5b506114426004803603602081101561142c57600080fd5b81019080803590602001909291905050506132ce565b60405180821515815260200191505060405180910390f35b34801561146657600080fd5b506114a96004803603602081101561147d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613318565b60405180821515815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115c05780601f10611595576101008083540402835291602001916115c0565b820191906000526020600020905b8154815290600101906020018083116115a357829003601f168201915b5050505050905090565b60006115d582613456565b6115de57600080fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061162482611da1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561165f57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1661167e613473565b73ffffffffffffffffffffffffffffffffffffffff1614806116ad57506116ac816116a7613473565b61323a565b5b6116b657600080fd5b6116c0838361347b565b505050565b60006116d16005613534565b905090565b6116e76116e1613473565b82613549565b6116f057600080fd5b600015156116fd826132ce565b15151461170957600080fd5b611714838383613671565b505050565b60116020528060005260406000206000915090505481565b6000600460019054906101000a900460ff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006117c182600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061381c90919063ffffffff16565b905092915050565b6000600115156117d7611731565b151514156117e857600090506117ee565b60035490505b90565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b61189f611d8a565b611911576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600160146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611955613473565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000151561198f826132ce565b15151461199b57600080fd5b6119b68383836040518060200160405280600081525061296d565b505050565b6119cc6119c6613473565b82613549565b80611a2b57506119da613473565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611a80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806158eb6030913960400191505060405180910390fd5b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415611b6b576000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415611b605760008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015611b5d573d6000803e3d6000fd5b50505b611b6983613836565b505b611b74826139c4565b5050565b600f6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905083565b611bd881613afe565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b611c89611d67565b611cfb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600460006101000a81548160ff0219169083151502179055507f0a9d058aff97d3ed3388247bac7d508f44a460217484407ce5bba66affc17daf60405160405180910390a1565b600080611d5b836005613d2090919063ffffffff16565b50905080915050919050565b6000600460009054906101000a900460ff16905090565b611d8781613d4c565b50565b6000600160149054906101000a900460ff16905090565b6000611dac82613d66565b9050919050565b6060600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e4b5780601f10611e2057610100808354040283529160200191611e4b565b820191906000526020600020905b815481529060010190602001808311611e2e57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e9057600080fd5b611ed7600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613d83565b9050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b611f906000613d98565b905090565b6000806001611fa26116c5565b01905082601160008381526020019081526020016000208190555060016012600083815260200190815260200160002060006101000a81548160ff021916908315150217905550611ff38482613e60565b611ffd8186613e7e565b8373ffffffffffffffffffffffffffffffffffffffff167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b48483886040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612084578082015181840152602081019050612069565b50505050905090810190601f1680156120b15780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2809150509392505050565b60008015156120d9846132ce565b1515146120e557600080fd5b60006011600085815260200190815260200160002054905061210684611da1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461213d57600080fd5b8260116000868152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e011682858760405180848152602001838152602001828152602001935050505060405180910390a2600191505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b61226c611d8a565b156122df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60018060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612322613473565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600080600161235c6116c5565b0190508360116000838152602001908152602001600020819055506123818582613e60565b61238b8187613e7e565b8473ffffffffffffffffffffffffffffffffffffffff167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b48583896040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156124125780820151818401526020810190506123f7565b50505050905090810190601f16801561243f5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2612459818585613ebc565b80915050949350505050565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905084565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125845780601f1061255957610100808354040283529160200191612584565b820191906000526020600020905b81548152906001019060200180831161256757829003601f168201915b5050505050905090565b61259781614069565b50565b6125a381614225565b50565b6000600115156125b4611d67565b151514156125c557600090506125cb565b60025490505b90565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b61267c611d67565b156126ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600460006101000a81548160ff0219169083151502179055507f51f99560a97e6809d74ff4458c12419031c9b6d4d8eae6a6b26bf8386fb0c4fa60405160405180910390a1565b600061274383611da1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461277a57600080fd5b60001515612787846132ce565b15151461279357600080fd5b816012600085815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc84846040518083815260200182151581526020019250505060405180910390a26001905092915050565b612828613473565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561286057600080fd5b806009600061286d613473565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661291a613473565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b61297e612978613473565b83613549565b61298757600080fd5b60001515612994836132ce565b1515146129a057600080fd5b6129ac84848484614502565b50505050565b6129bb81614528565b50565b60126020528060005260406000206000915054906101000a900460ff1681565b60008015156129ec846132ce565b1515146129f857600080fd5b600060116000858152602001908152602001600020549050612a1984611da1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a5057600080fd5b8260116000868152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc8560016040518083815260200182151581526020019250505060405180910390a2600115156012600086815260200190815260200160002060009054906101000a900460ff16151514612b785760016012600086815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e011682858760405180848152602001838152602001828152602001935050505060405180910390a25b600191505092915050565b6060612b8e82613456565b612b9757600080fd5b6000600a60008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c405780601f10612c1557610100808354040283529160200191612c40565b820191906000526020600020905b815481529060010190602001808311612c2357829003601f168201915b505050505090506000612c51611db3565b9050600081511415612c67578192505050612e03565b600082511115612d385780826040516020018083805190602001908083835b60208310612ca95780518252602082019150602081019050602083039250612c86565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310612cfa5780518252602082019150602081019050602083039250612cd7565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050612e03565b80612d428561471b565b6040516020018083805190602001908083835b60208310612d785780518252602082019150602081019050602083039250612d55565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310612dc95780518252602082019150602081019050602083039250612da6565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050505b919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b612eb6611731565b612f28576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600460016101000a81548160ff0219169083151502179055507f67592efac9ad4bc8a051561f7008dd48427e81ea709a2f61ad386fa68189b35c60405160405180910390a1565b600015156012600085815260200190815260200160002060009054906101000a900460ff16151514612fa257600080fd5b612fad838383613ebc565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b613060611731565b156130d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600460016101000a81548160ff0219169083151502179055507f6f941072281a73a3d1a56154741446c3752559d3c97ae913f09e25382677933560405160405180910390a1565b61312581614862565b600061313082611da1565b9050600033905061314083614908565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fef258f47a33a1cba99d81ea828f234ff5d6cb31034c0f79ecb5198f8c6d118f66011600087815260200190815260200160002054866131ad88612b83565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156131f95780820151818401526020810190506131de565b50505050905090810190601f1680156132265780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a3505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600e60008481526020019081526020016000209050600115158160000160009054906101000a900460ff1615151461330d576000915050613313565b60019150505b919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146133c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604581526020018061591b6045913960600191505060405180910390fd5b61344f82613d98565b9050919050565b600061346c826005614acc90919063ffffffff16565b9050919050565b600033905090565b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166134ee83613d66565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061354282600001614ae6565b9050919050565b600061355482613456565b61355d57600080fd5b600061356883613d66565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806135d757508373ffffffffffffffffffffffffffffffffffffffff166135bf846115ca565b73ffffffffffffffffffffffffffffffffffffffff16145b806136685750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661369182613d66565b73ffffffffffffffffffffffffffffffffffffffff16146136b157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136eb57600080fd5b6136f6838383614af7565b61370160008261347b565b61375281600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b0e90919063ffffffff16565b506137a481600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b2890919063ffffffff16565b506137bb81836005614b429092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061382b8360000183614b77565b60001c905092915050565b6040518060800160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815250600e600083815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050506040518060600160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f600083815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015590505050565b60006139cf82613d66565b90506139dd81600084614af7565b6139e860008361347b565b6000600a600084815260200190815260200160002080546001816001161561010002031660029004905014613a3757600a60008381526020019081526020016000206000613a36919061572c565b5b613a8882600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b0e90919063ffffffff16565b50613a9d826005614bfa90919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b3373ffffffffffffffffffffffffffffffffffffffff16613b1e82613d66565b73ffffffffffffffffffffffffffffffffffffffff161415613b3f57600080fd5b6000600e6000838152602001908152602001600020905080600201544210613b6657600080fd5b8060010154341015613b7757600080fd5b6000600f6000848152602001908152602001600020905080600101543411613b9e57600080fd5b600081600101541115613c215760008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015613c1e573d6000803e3d6000fd5b50505b60405180606001604052806001151581526020013373ffffffffffffffffffffffffffffffffffffffff16815260200134815250600f600085815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600101559050507f6fe605fcf3f0af8122bf2ca880af248fc500eed81268c984dc2f51f73d96fc668334604051808381526020018281526020019250505060405180910390a1505050565b600080600080613d338660000186614c14565b915091508160001c8160001c9350935050509250929050565b80600b9080519060200190613d62929190615774565b5050565b6000613d7c826005614cad90919063ffffffff16565b9050919050565b6000613d9182600001614cca565b9050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a381600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b613e7a828260405180602001604052806000815250614cdb565b5050565b613e8782613456565b613e9057600080fd5b80600a60008481526020019081526020016000209080519060200190613eb7929190615774565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16613edc84613d66565b73ffffffffffffffffffffffffffffffffffffffff1614613efc57600080fd5b6000600e60008581526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415613f3657600080fd5b60405180608001604052806001151581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001834201815250600e600086815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050503373ffffffffffffffffffffffffffffffffffffffff167f5e4dbe799442580e0983dedea209e02d0497b6e3383338a9e1ac3aa117b491ec858585420160405180848152602001838152602001828152602001935050505060405180910390a250505050565b3373ffffffffffffffffffffffffffffffffffffffff1661408982613d66565b73ffffffffffffffffffffffffffffffffffffffff16146140a957600080fd5b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff161515146140e257600080fd5b6000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff161515141561411c57600080fd5b60405180608001604052806000151581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815250600e600085815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050507fbea0e66c2d42b9131695ceea7d1aaa21b37e93070cde19c9b5fbd686a3259292836040518082815260200191505060405180910390a1505050565b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff1615151461425e57600080fd5b8060020154421061426e57600080fd5b6000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff161515146142a757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461430357600080fd5b60008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006103e86143626117c9565b8560010154028161436f57fe5b0490508273ffffffffffffffffffffffffffffffffffffffff166108fc828660010154039081150290604051600060405180830381858888f193505050501580156143be573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614405573d6000803e3d6000fd5b506040518060600160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f600088815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600101559050507f7687efe94566d20f7ebb8eff43bb57b2c014749dfd9ad179089e58c338ecdfa7866040518082815260200191505060405180910390a1505050505050565b61450d848484613671565b61451984848484614d00565b61452257600080fd5b50505050565b6000600e60008381526020019081526020016000209050806002015442101561455057600080fd5b600115158160000160009054906101000a900460ff1615151461457257600080fd5b600061457d83613d66565b90506000600f600085815260200190815260200160002090506145e98360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686613671565b60006103e86145f66125a6565b8360010154028161460357fe5b04905060008183600101540390508373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614657573d6000803e3d6000fd5b506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156146c5573d6000803e3d6000fd5b507fc87036081503cc1fd53dc456ee0c40aef140882f77b06b4b4b554fee2b60816a878560010154604051808381526020018281526020019250505060405180910390a161471287613836565b50505050505050565b60606000821415614763576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061485d565b600082905060005b6000821461478d578080600101915050600a828161478557fe5b04915061476b565b60008167ffffffffffffffff811180156147a657600080fd5b506040519080825280601f01601f1916602001820160405280156147d95781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461485557600a84816147fa57fe5b0660300160f81b8282806001900393508151811061481457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a848161484d57fe5b0493506147e8565b819450505050505b919050565b60006012600083815260200190815260200160002060009054906101000a900460ff16905061489082613456565b61489957600080fd5b806148a357600080fd5b60116000838152602001908152602001600020543410156148c357600080fd5b6148cc82611da1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561490457600080fd5b5050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000339050600061493f84611da1565b905061494c818386613671565b60006103e86149596125a6565b6011600088815260200190815260200160002054028161497557fe5b04905060008160116000888152602001908152602001600020540390508273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156149d8573d6000803e3d6000fd5b508473ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015614a1f573d6000803e3d6000fd5b506011600087815260200190815260200160002054341115614a98578373ffffffffffffffffffffffffffffffffffffffff166108fc601160008981526020019081526020016000205434039081150290604051600060405180830381858888f19350505050158015614a96573d6000803e3d6000fd5b505b60006012600088815260200190815260200160002060006101000a81548160ff021916908315150217905550505050505050565b6000614ade836000018360001b614f19565b905092915050565b600081600001805490509050919050565b614aff611d8a565b15614b0957600080fd5b505050565b6000614b20836000018360001b614f3c565b905092915050565b6000614b3a836000018360001b615024565b905092915050565b6000614b6e846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b615094565b90509392505050565b600081836000018054905011614bd8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158206022913960400191505060405180910390fd5b826000018281548110614be757fe5b9060005260206000200154905092915050565b6000614c0c836000018360001b615170565b905092915050565b60008082846000018054905011614c76576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158c96022913960400191505060405180910390fd5b6000846000018481548110614c8757fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000614cbf836000018360001b615289565b60001c905092915050565b600081600001805490509050919050565b614ce58383615348565b614cf26000848484614d00565b614cfb57600080fd5b505050565b6000614d218473ffffffffffffffffffffffffffffffffffffffff1661546a565b614d2e5760019050614f11565b6000614e9863150b7a0260e01b614d43613473565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614dc7578082015181840152602081019050614dac565b50505050905090810190601f168015614df45780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615842603291398773ffffffffffffffffffffffffffffffffffffffff1661547d9092919063ffffffff16565b90506000818060200190516020811015614eb157600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146150185760006001820390506000600186600001805490500390506000866000018281548110614f8757fe5b9060005260206000200154905080876000018481548110614fa457fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480614fdc57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061501e565b60009150505b92915050565b60006150308383615495565b61508957826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061508e565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561513b57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050615169565b8285600001600183038154811061514e57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b6000808360010160008481526020019081526020016000205490506000811461527d57600060018203905060006001866000018054905003905060008660000182815481106151bb57fe5b90600052602060002090600202019050808760000184815481106151db57fe5b906000526020600020906002020160008201548160000155600182015481600101559050506001830187600101600083600001548152602001908152602001600020819055508660000180548061522e57fe5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055866001016000878152602001908152602001600020600090556001945050505050615283565b60009150505b92915050565b600080836001016000848152602001908152602001600020549050600081141561531b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000081525060200191505060405180910390fd5b83600001600182038154811061532d57fe5b90600052602060002090600202016001015491505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561538257600080fd5b61538b81613456565b1561539557600080fd5b6153a160008383614af7565b6153f281600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b2890919063ffffffff16565b5061540981836005614b429092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606061548c84846000856154b8565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015615513576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806158746026913960400191505060405180910390fd5b61551c8561546a565b61558e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106155dd57805182526020820191506020810190506020830392506155ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461563f576040519150601f19603f3d011682016040523d82523d6000602084013e615644565b606091505b5091509150615654828286615660565b92505050949350505050565b6060831561567057829050615725565b6000835111156156835782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156156ea5780820151818401526020810190506156cf565b50505050905090810190601f1680156157175780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b50805460018160011615610100020316600290046000825580601f106157525750615771565b601f0160209004906000526020600020908101906157709190615802565b5b50565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826157aa57600085556157f1565b82601f106157c357805160ff19168380011785556157f1565b828001600101855582156157f1579182015b828111156157f05782518255916020019190600101906157d5565b5b5090506157fe9190615802565b5090565b5b8082111561581b576000816000905550600101615803565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4f776e61626c65203a2046756e6374696f6e2063616c6c656420627920756e617574686f72697a656420757365722e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732314275726e61626c653a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644f776e61626c652f7472616e736665724f776e657273686970203a2063616e6e6f74207472616e73666572206f776e65727368697020746f207a65726f2061646472657373a26469706673582212209773c6821252322ac378e301c14f196e7e72b4481780800ce0e74de1e487570464736f6c6343000706003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000008424c4f434b53444b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008424c4f434b53444b000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102c95760003560e01c80637e8816b911610175578063a22cb465116100dc578063ca52a43311610095578063d96a094a1161006f578063d96a094a14611354578063e985e9c514611382578063f146292114611409578063f2fde38b1461145a576102c9565b8063ca52a433146112d7578063cda4beef146112ee578063d16fd8d41461133d576102c9565b8063a22cb46514610fda578063b88d4fde14611037578063b9a2de3a14611149578063bc8ba28f14611177578063bdde7897146111c8578063c87b56dd14611223576102c9565b806395d89b411161012e57806395d89b4114610e4257806396b5a75514610ed25780639703ef3514610f0d578063978bbdb914610f3b5780639819826a14610f6657806398214bcb14610f7d576102c9565b80637e8816b914610afd57806382367b2d14610c035780638456cb5914610c5e5780638804da6314610c755780638a72ea6a14610d855780638da5cb5b14610e01576102c9565b806342842e0e1161023457806350f1c94f116101ed5780636352211e116101c75780636352211e146109765780636c0360eb146109db57806370a0823114610a6b578063715018a614610ad0576102c9565b806350f1c94f1461085457806355f804b3146108815780635c975abb14610949576102c9565b806342842e0e146106a257806342966c681461071d5780634423c5f11461074b578063454a2ab3146107c05780634e79f1a1146107ee5780634f6ccce714610805576102c9565b806326a49e371161028657806326a49e371461053457806327fbe123146105835780632bb3b114146105b05780632f745c59146105f15780633c4da553146106605780633f4ba83a1461068b576102c9565b806301ffc9a7146102ce57806306fdde031461033e578063081812fc146103ce578063095ea7b31461043357806318160ddd1461048e57806323b872dd146104b9575b600080fd5b3480156102da57600080fd5b50610326600480360360208110156102f157600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506114c1565b60405180821515815260200191505060405180910390f35b34801561034a57600080fd5b50610353611528565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610393578082015181840152602081019050610378565b50505050905090810190601f1680156103c05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103da57600080fd5b50610407600480360360208110156103f157600080fd5b81019080803590602001909291905050506115ca565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561043f57600080fd5b5061048c6004803603604081101561045657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611619565b005b34801561049a57600080fd5b506104a36116c5565b6040518082815260200191505060405180910390f35b3480156104c557600080fd5b50610532600480360360608110156104dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116d6565b005b34801561054057600080fd5b5061056d6004803603602081101561055757600080fd5b8101908080359060200190929190505050611719565b6040518082815260200191505060405180910390f35b34801561058f57600080fd5b50610598611731565b60405180821515815260200191505060405180910390f35b3480156105bc57600080fd5b506105c5611748565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105fd57600080fd5b5061064a6004803603604081101561061457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061176e565b6040518082815260200191505060405180910390f35b34801561066c57600080fd5b506106756117c9565b6040518082815260200191505060405180910390f35b34801561069757600080fd5b506106a06117f1565b005b3480156106ae57600080fd5b5061071b600480360360608110156106c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611982565b005b6107496004803603602081101561073357600080fd5b81019080803590602001909291905050506119bb565b005b34801561075757600080fd5b506107846004803603602081101561076e57600080fd5b8101908080359060200190929190505050611b78565b6040518084151581526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390f35b6107ec600480360360208110156107d657600080fd5b8101908080359060200190929190505050611bcf565b005b3480156107fa57600080fd5b50610803611bdb565b005b34801561081157600080fd5b5061083e6004803603602081101561082857600080fd5b8101908080359060200190929190505050611d44565b6040518082815260200191505060405180910390f35b34801561086057600080fd5b50610869611d67565b60405180821515815260200191505060405180910390f35b34801561088d57600080fd5b50610947600480360360208110156108a457600080fd5b81019080803590602001906401000000008111156108c157600080fd5b8201836020820111156108d357600080fd5b803590602001918460018302840111640100000000831117156108f557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d7e565b005b34801561095557600080fd5b5061095e611d8a565b60405180821515815260200191505060405180910390f35b34801561098257600080fd5b506109af6004803603602081101561099957600080fd5b8101908080359060200190929190505050611da1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109e757600080fd5b506109f0611db3565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a30578082015181840152602081019050610a15565b50505050905090810190601f168015610a5d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a7757600080fd5b50610aba60048036036020811015610a8e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e55565b6040518082815260200191505060405180910390f35b348015610adc57600080fd5b50610ae5611ede565b60405180821515815260200191505060405180910390f35b348015610b0957600080fd5b50610bed60048036036060811015610b2057600080fd5b8101908080359060200190640100000000811115610b3d57600080fd5b820183602082011115610b4f57600080fd5b80359060200191846001830284011164010000000083111715610b7157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f95565b6040518082815260200191505060405180910390f35b348015610c0f57600080fd5b50610c4660048036036040811015610c2657600080fd5b8101908080359060200190929190803590602001909291905050506120cb565b60405180821515815260200191505060405180910390f35b348015610c6a57600080fd5b50610c736121be565b005b348015610c8157600080fd5b50610d6f60048036036080811015610c9857600080fd5b8101908080359060200190640100000000811115610cb557600080fd5b820183602082011115610cc757600080fd5b80359060200191846001830284011164010000000083111715610ce957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061234f565b6040518082815260200191505060405180910390f35b348015610d9157600080fd5b50610dbe60048036036020811015610da857600080fd5b8101908080359060200190929190505050612465565b6040518085151581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390f35b348015610e0d57600080fd5b50610e166124c2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e4e57600080fd5b50610e576124ec565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e97578082015181840152602081019050610e7c565b50505050905090810190601f168015610ec45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ede57600080fd5b50610f0b60048036036020811015610ef557600080fd5b810190808035906020019092919050505061258e565b005b610f3960048036036020811015610f2357600080fd5b810190808035906020019092919050505061259a565b005b348015610f4757600080fd5b50610f506125a6565b6040518082815260200191505060405180910390f35b348015610f7257600080fd5b50610f7b6125ce565b005b348015610f8957600080fd5b50610fc260048036036040811015610fa057600080fd5b8101908080359060200190929190803515159060200190929190505050612738565b60405180821515815260200191505060405180910390f35b348015610fe657600080fd5b5061103560048036036040811015610ffd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612820565b005b34801561104357600080fd5b506111476004803603608081101561105a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156110c157600080fd5b8201836020820111156110d357600080fd5b803590602001918460018302840111640100000000831117156110f557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061296d565b005b6111756004803603602081101561115f57600080fd5b81019080803590602001909291905050506129b2565b005b34801561118357600080fd5b506111b06004803603602081101561119a57600080fd5b81019080803590602001909291905050506129be565b60405180821515815260200191505060405180910390f35b3480156111d457600080fd5b5061120b600480360360408110156111eb57600080fd5b8101908080359060200190929190803590602001909291905050506129de565b60405180821515815260200191505060405180910390f35b34801561122f57600080fd5b5061125c6004803603602081101561124657600080fd5b8101908080359060200190929190505050612b83565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561129c578082015181840152602081019050611281565b50505050905090810190601f1680156112c95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156112e357600080fd5b506112ec612e08565b005b3480156112fa57600080fd5b5061133b6004803603606081101561131157600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612f71565b005b34801561134957600080fd5b50611352612fb2565b005b6113806004803603602081101561136a57600080fd5b810190808035906020019092919050505061311c565b005b34801561138e57600080fd5b506113f1600480360360408110156113a557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061323a565b60405180821515815260200191505060405180910390f35b34801561141557600080fd5b506114426004803603602081101561142c57600080fd5b81019080803590602001909291905050506132ce565b60405180821515815260200191505060405180910390f35b34801561146657600080fd5b506114a96004803603602081101561147d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613318565b60405180821515815260200191505060405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115c05780601f10611595576101008083540402835291602001916115c0565b820191906000526020600020905b8154815290600101906020018083116115a357829003601f168201915b5050505050905090565b60006115d582613456565b6115de57600080fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061162482611da1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561165f57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1661167e613473565b73ffffffffffffffffffffffffffffffffffffffff1614806116ad57506116ac816116a7613473565b61323a565b5b6116b657600080fd5b6116c0838361347b565b505050565b60006116d16005613534565b905090565b6116e76116e1613473565b82613549565b6116f057600080fd5b600015156116fd826132ce565b15151461170957600080fd5b611714838383613671565b505050565b60116020528060005260406000206000915090505481565b6000600460019054906101000a900460ff16905090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006117c182600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061381c90919063ffffffff16565b905092915050565b6000600115156117d7611731565b151514156117e857600090506117ee565b60035490505b90565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b61189f611d8a565b611911576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600160146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611955613473565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b6000151561198f826132ce565b15151461199b57600080fd5b6119b68383836040518060200160405280600081525061296d565b505050565b6119cc6119c6613473565b82613549565b80611a2b57506119da613473565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611a80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806158eb6030913960400191505060405180910390fd5b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415611b6b576000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415611b605760008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015611b5d573d6000803e3d6000fd5b50505b611b6983613836565b505b611b74826139c4565b5050565b600f6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905083565b611bd881613afe565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b611c89611d67565b611cfb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600460006101000a81548160ff0219169083151502179055507f0a9d058aff97d3ed3388247bac7d508f44a460217484407ce5bba66affc17daf60405160405180910390a1565b600080611d5b836005613d2090919063ffffffff16565b50905080915050919050565b6000600460009054906101000a900460ff16905090565b611d8781613d4c565b50565b6000600160149054906101000a900460ff16905090565b6000611dac82613d66565b9050919050565b6060600b8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e4b5780601f10611e2057610100808354040283529160200191611e4b565b820191906000526020600020905b815481529060010190602001808311611e2e57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e9057600080fd5b611ed7600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613d83565b9050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b611f906000613d98565b905090565b6000806001611fa26116c5565b01905082601160008381526020019081526020016000208190555060016012600083815260200190815260200160002060006101000a81548160ff021916908315150217905550611ff38482613e60565b611ffd8186613e7e565b8373ffffffffffffffffffffffffffffffffffffffff167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b48483886040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612084578082015181840152602081019050612069565b50505050905090810190601f1680156120b15780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2809150509392505050565b60008015156120d9846132ce565b1515146120e557600080fd5b60006011600085815260200190815260200160002054905061210684611da1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461213d57600080fd5b8260116000868152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e011682858760405180848152602001838152602001828152602001935050505060405180910390a2600191505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b61226c611d8a565b156122df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60018060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612322613473565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600080600161235c6116c5565b0190508360116000838152602001908152602001600020819055506123818582613e60565b61238b8187613e7e565b8473ffffffffffffffffffffffffffffffffffffffff167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b48583896040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156124125780820151818401526020810190506123f7565b50505050905090810190601f16801561243f5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2612459818585613ebc565b80915050949350505050565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905084565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125845780601f1061255957610100808354040283529160200191612584565b820191906000526020600020905b81548152906001019060200180831161256757829003601f168201915b5050505050905090565b61259781614069565b50565b6125a381614225565b50565b6000600115156125b4611d67565b151514156125c557600090506125cb565b60025490505b90565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b61267c611d67565b156126ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600460006101000a81548160ff0219169083151502179055507f51f99560a97e6809d74ff4458c12419031c9b6d4d8eae6a6b26bf8386fb0c4fa60405160405180910390a1565b600061274383611da1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461277a57600080fd5b60001515612787846132ce565b15151461279357600080fd5b816012600085815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc84846040518083815260200182151581526020019250505060405180910390a26001905092915050565b612828613473565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561286057600080fd5b806009600061286d613473565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661291a613473565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b61297e612978613473565b83613549565b61298757600080fd5b60001515612994836132ce565b1515146129a057600080fd5b6129ac84848484614502565b50505050565b6129bb81614528565b50565b60126020528060005260406000206000915054906101000a900460ff1681565b60008015156129ec846132ce565b1515146129f857600080fd5b600060116000858152602001908152602001600020549050612a1984611da1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a5057600080fd5b8260116000868152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc8560016040518083815260200182151581526020019250505060405180910390a2600115156012600086815260200190815260200160002060009054906101000a900460ff16151514612b785760016012600086815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e011682858760405180848152602001838152602001828152602001935050505060405180910390a25b600191505092915050565b6060612b8e82613456565b612b9757600080fd5b6000600a60008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c405780601f10612c1557610100808354040283529160200191612c40565b820191906000526020600020905b815481529060010190602001808311612c2357829003601f168201915b505050505090506000612c51611db3565b9050600081511415612c67578192505050612e03565b600082511115612d385780826040516020018083805190602001908083835b60208310612ca95780518252602082019150602081019050602083039250612c86565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310612cfa5780518252602082019150602081019050602083039250612cd7565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050612e03565b80612d428561471b565b6040516020018083805190602001908083835b60208310612d785780518252602082019150602081019050602083039250612d55565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310612dc95780518252602082019150602081019050602083039250612da6565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050505b919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b612eb6611731565b612f28576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6000600460016101000a81548160ff0219169083151502179055507f67592efac9ad4bc8a051561f7008dd48427e81ea709a2f61ad386fa68189b35c60405160405180910390a1565b600015156012600085815260200190815260200160002060009054906101000a900460ff16151514612fa257600080fd5b612fad838383613ebc565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b613060611731565b156130d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6001600460016101000a81548160ff0219169083151502179055507f6f941072281a73a3d1a56154741446c3752559d3c97ae913f09e25382677933560405160405180910390a1565b61312581614862565b600061313082611da1565b9050600033905061314083614908565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fef258f47a33a1cba99d81ea828f234ff5d6cb31034c0f79ecb5198f8c6d118f66011600087815260200190815260200160002054866131ad88612b83565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156131f95780820151818401526020810190506131de565b50505050905090810190601f1680156132265780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a3505050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600e60008481526020019081526020016000209050600115158160000160009054906101000a900460ff1615151461330d576000915050613313565b60019150505b919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146133c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061589a602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604581526020018061591b6045913960600191505060405180910390fd5b61344f82613d98565b9050919050565b600061346c826005614acc90919063ffffffff16565b9050919050565b600033905090565b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166134ee83613d66565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061354282600001614ae6565b9050919050565b600061355482613456565b61355d57600080fd5b600061356883613d66565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806135d757508373ffffffffffffffffffffffffffffffffffffffff166135bf846115ca565b73ffffffffffffffffffffffffffffffffffffffff16145b806136685750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661369182613d66565b73ffffffffffffffffffffffffffffffffffffffff16146136b157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136eb57600080fd5b6136f6838383614af7565b61370160008261347b565b61375281600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b0e90919063ffffffff16565b506137a481600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b2890919063ffffffff16565b506137bb81836005614b429092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061382b8360000183614b77565b60001c905092915050565b6040518060800160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815250600e600083815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050506040518060600160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f600083815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816001015590505050565b60006139cf82613d66565b90506139dd81600084614af7565b6139e860008361347b565b6000600a600084815260200190815260200160002080546001816001161561010002031660029004905014613a3757600a60008381526020019081526020016000206000613a36919061572c565b5b613a8882600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b0e90919063ffffffff16565b50613a9d826005614bfa90919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b3373ffffffffffffffffffffffffffffffffffffffff16613b1e82613d66565b73ffffffffffffffffffffffffffffffffffffffff161415613b3f57600080fd5b6000600e6000838152602001908152602001600020905080600201544210613b6657600080fd5b8060010154341015613b7757600080fd5b6000600f6000848152602001908152602001600020905080600101543411613b9e57600080fd5b600081600101541115613c215760008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015613c1e573d6000803e3d6000fd5b50505b60405180606001604052806001151581526020013373ffffffffffffffffffffffffffffffffffffffff16815260200134815250600f600085815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600101559050507f6fe605fcf3f0af8122bf2ca880af248fc500eed81268c984dc2f51f73d96fc668334604051808381526020018281526020019250505060405180910390a1505050565b600080600080613d338660000186614c14565b915091508160001c8160001c9350935050509250929050565b80600b9080519060200190613d62929190615774565b5050565b6000613d7c826005614cad90919063ffffffff16565b9050919050565b6000613d9182600001614cca565b9050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a381600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b613e7a828260405180602001604052806000815250614cdb565b5050565b613e8782613456565b613e9057600080fd5b80600a60008481526020019081526020016000209080519060200190613eb7929190615774565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16613edc84613d66565b73ffffffffffffffffffffffffffffffffffffffff1614613efc57600080fd5b6000600e60008581526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415613f3657600080fd5b60405180608001604052806001151581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001834201815250600e600086815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050503373ffffffffffffffffffffffffffffffffffffffff167f5e4dbe799442580e0983dedea209e02d0497b6e3383338a9e1ac3aa117b491ec858585420160405180848152602001838152602001828152602001935050505060405180910390a250505050565b3373ffffffffffffffffffffffffffffffffffffffff1661408982613d66565b73ffffffffffffffffffffffffffffffffffffffff16146140a957600080fd5b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff161515146140e257600080fd5b6000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff161515141561411c57600080fd5b60405180608001604052806000151581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815250600e600085815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010155606082015181600201559050507fbea0e66c2d42b9131695ceea7d1aaa21b37e93070cde19c9b5fbd686a3259292836040518082815260200191505060405180910390a1505050565b6000600e60008381526020019081526020016000209050600115158160000160009054906101000a900460ff1615151461425e57600080fd5b8060020154421061426e57600080fd5b6000600f60008481526020019081526020016000209050600115158160000160009054906101000a900460ff161515146142a757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461430357600080fd5b60008160000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006103e86143626117c9565b8560010154028161436f57fe5b0490508273ffffffffffffffffffffffffffffffffffffffff166108fc828660010154039081150290604051600060405180830381858888f193505050501580156143be573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614405573d6000803e3d6000fd5b506040518060600160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f600088815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600101559050507f7687efe94566d20f7ebb8eff43bb57b2c014749dfd9ad179089e58c338ecdfa7866040518082815260200191505060405180910390a1505050505050565b61450d848484613671565b61451984848484614d00565b61452257600080fd5b50505050565b6000600e60008381526020019081526020016000209050806002015442101561455057600080fd5b600115158160000160009054906101000a900460ff1615151461457257600080fd5b600061457d83613d66565b90506000600f600085815260200190815260200160002090506145e98360000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686613671565b60006103e86145f66125a6565b8360010154028161460357fe5b04905060008183600101540390508373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015614657573d6000803e3d6000fd5b506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156146c5573d6000803e3d6000fd5b507fc87036081503cc1fd53dc456ee0c40aef140882f77b06b4b4b554fee2b60816a878560010154604051808381526020018281526020019250505060405180910390a161471287613836565b50505050505050565b60606000821415614763576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061485d565b600082905060005b6000821461478d578080600101915050600a828161478557fe5b04915061476b565b60008167ffffffffffffffff811180156147a657600080fd5b506040519080825280601f01601f1916602001820160405280156147d95781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461485557600a84816147fa57fe5b0660300160f81b8282806001900393508151811061481457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a848161484d57fe5b0493506147e8565b819450505050505b919050565b60006012600083815260200190815260200160002060009054906101000a900460ff16905061489082613456565b61489957600080fd5b806148a357600080fd5b60116000838152602001908152602001600020543410156148c357600080fd5b6148cc82611da1565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561490457600080fd5b5050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000339050600061493f84611da1565b905061494c818386613671565b60006103e86149596125a6565b6011600088815260200190815260200160002054028161497557fe5b04905060008160116000888152602001908152602001600020540390508273ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156149d8573d6000803e3d6000fd5b508473ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015614a1f573d6000803e3d6000fd5b506011600087815260200190815260200160002054341115614a98578373ffffffffffffffffffffffffffffffffffffffff166108fc601160008981526020019081526020016000205434039081150290604051600060405180830381858888f19350505050158015614a96573d6000803e3d6000fd5b505b60006012600088815260200190815260200160002060006101000a81548160ff021916908315150217905550505050505050565b6000614ade836000018360001b614f19565b905092915050565b600081600001805490509050919050565b614aff611d8a565b15614b0957600080fd5b505050565b6000614b20836000018360001b614f3c565b905092915050565b6000614b3a836000018360001b615024565b905092915050565b6000614b6e846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b615094565b90509392505050565b600081836000018054905011614bd8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158206022913960400191505060405180910390fd5b826000018281548110614be757fe5b9060005260206000200154905092915050565b6000614c0c836000018360001b615170565b905092915050565b60008082846000018054905011614c76576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806158c96022913960400191505060405180910390fd5b6000846000018481548110614c8757fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000614cbf836000018360001b615289565b60001c905092915050565b600081600001805490509050919050565b614ce58383615348565b614cf26000848484614d00565b614cfb57600080fd5b505050565b6000614d218473ffffffffffffffffffffffffffffffffffffffff1661546a565b614d2e5760019050614f11565b6000614e9863150b7a0260e01b614d43613473565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614dc7578082015181840152602081019050614dac565b50505050905090810190601f168015614df45780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615842603291398773ffffffffffffffffffffffffffffffffffffffff1661547d9092919063ffffffff16565b90506000818060200190516020811015614eb157600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146150185760006001820390506000600186600001805490500390506000866000018281548110614f8757fe5b9060005260206000200154905080876000018481548110614fa457fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480614fdc57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061501e565b60009150505b92915050565b60006150308383615495565b61508957826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061508e565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561513b57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050615169565b8285600001600183038154811061514e57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b6000808360010160008481526020019081526020016000205490506000811461527d57600060018203905060006001866000018054905003905060008660000182815481106151bb57fe5b90600052602060002090600202019050808760000184815481106151db57fe5b906000526020600020906002020160008201548160000155600182015481600101559050506001830187600101600083600001548152602001908152602001600020819055508660000180548061522e57fe5b6001900381819060005260206000209060020201600080820160009055600182016000905550509055866001016000878152602001908152602001600020600090556001945050505050615283565b60009150505b92915050565b600080836001016000848152602001908152602001600020549050600081141561531b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000081525060200191505060405180910390fd5b83600001600182038154811061532d57fe5b90600052602060002090600202016001015491505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561538257600080fd5b61538b81613456565b1561539557600080fd5b6153a160008383614af7565b6153f281600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020614b2890919063ffffffff16565b5061540981836005614b429092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606061548c84846000856154b8565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015615513576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806158746026913960400191505060405180910390fd5b61551c8561546a565b61558e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106155dd57805182526020820191506020810190506020830392506155ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461563f576040519150601f19603f3d011682016040523d82523d6000602084013e615644565b606091505b5091509150615654828286615660565b92505050949350505050565b6060831561567057829050615725565b6000835111156156835782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156156ea5780820151818401526020810190506156cf565b50505050905090810190601f1680156157175780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b50805460018160011615610100020316600290046000825580601f106157525750615771565b601f0160209004906000526020600020908101906157709190615802565b5b50565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826157aa57600085556157f1565b82601f106157c357805160ff19168380011785556157f1565b828001600101855582156157f1579182015b828111156157f05782518255916020019190600101906157d5565b5b5090506157fe9190615802565b5090565b5b8082111561581b576000816000905550600101615803565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4f776e61626c65203a2046756e6374696f6e2063616c6c656420627920756e617574686f72697a656420757365722e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732314275726e61626c653a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644f776e61626c652f7472616e736665724f776e657273686970203a2063616e6e6f74207472616e73666572206f776e65727368697020746f207a65726f2061646472657373a26469706673582212209773c6821252322ac378e301c14f196e7e72b4481780800ce0e74de1e487570464736f6c63430007060033

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

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000008424c4f434b53444b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008424c4f434b53444b000000000000000000000000000000000000000000000000

-----Decoded View---------------

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 424c4f434b53444b000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [7] : 424c4f434b53444b000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

52772:1269:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4021:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42228:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40285:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42450:270;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41616:117;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43363:245;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49451:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34119:104;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49405:37;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41925:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33850:157;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33068:119;;;;;;;;;;;;;:::i;:::-;;43680:201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48834:510;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44565:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53740:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34816:119;;;;;;;;;;;;;:::i;:::-;;41744:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34017:92;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40652:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32635:86;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42096:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40761:97;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40468:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1299:130;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49940:402;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51578:345;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32943:117;;;;;;;;;;;;;:::i;:::-;;52912:449;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44490:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;892:102;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42336:104;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53630:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53833:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33701:139;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34691:117;;;;;;;;;;;;;:::i;:::-;;51932:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42793:266;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43953:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53943:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49493:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52283:477;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40867:741;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35094:143;;;;;;;;;;;;;:::i;:::-;;53387:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34945:141;;;;;;;;;;;;;:::i;:::-;;50351:273;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43131:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48572:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1002:289;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4021:150;4106:4;4130:20;:33;4151:11;4130:33;;;;;;;;;;;;;;;;;;;;;;;;;;;4123:40;;4021:150;;;:::o;42228:100::-;42282:13;42315:5;42308:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42228:100;:::o;40285:173::-;40361:7;40389:16;40397:7;40389;:16::i;:::-;40381:25;;;;;;40426:15;:24;40442:7;40426:24;;;;;;;;;;;;;;;;;;;;;40419:31;;40285:173;;;:::o;42450:270::-;42531:13;42547:16;42555:7;42547;:16::i;:::-;42531:32;;42588:5;42582:11;;:2;:11;;;;42574:20;;;;;;42631:5;42615:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;42640:37;42657:5;42664:12;:10;:12::i;:::-;42640:16;:37::i;:::-;42615:62;42607:71;;;;;;42691:21;42700:2;42704:7;42691:8;:21::i;:::-;42450:270;;;:::o;41616:117::-;41677:7;41704:21;:12;:19;:21::i;:::-;41697:28;;41616:117;:::o;43363:245::-;43471:41;43490:12;:10;:12::i;:::-;43504:7;43471:18;:41::i;:::-;43463:50;;;;;;43551:5;43528:28;;:19;43539:7;43528:10;:19::i;:::-;:28;;;43520:37;;;;;;43572:28;43582:4;43588:2;43592:7;43572:9;:28::i;:::-;43363:245;;;:::o;49451:35::-;;;;;;;;;;;;;;;;;:::o;34119:104::-;34175:4;34199:16;;;;;;;;;;;34192:23;;34119:104;:::o;49405:37::-;;;;;;;;;;;;;:::o;41925:162::-;42022:7;42049:30;42073:5;42049:13;:20;42063:5;42049:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;42042:37;;41925:162;;;;:::o;33850:157::-;33904:4;33939;33918:25;;:17;:15;:17::i;:::-;:25;;;33915:49;;;33957:1;33950:8;;;;33915:49;33985:14;;33978:21;;33850:157;;:::o;33068:119::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32876:8:::1;:6;:8::i;:::-;32868:41;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33136:5:::2;33126:7;;:15;;;;;;;;;;;;;;;;;;33157:22;33166:12;:10;:12::i;:::-;33157:22;;;;;;;;;;;;;;;;;;;;33068:119::o:0;43680:201::-;43811:5;43788:28;;:19;43799:7;43788:10;:19::i;:::-;:28;;;43780:37;;;;;;43834:39;43851:4;43857:2;43861:7;43834:39;;;;;;;;;;;;:16;:39::i;:::-;43680:201;;;:::o;48834:510::-;48901:42;48920:12;:10;:12::i;:::-;48934:8;48901:18;:42::i;:::-;:68;;;;48957:12;:10;:12::i;:::-;48947:22;;:6;;;;;;;;;;;:22;;;48901:68;48893:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49033:19;49056:6;:16;49063:8;49056:16;;;;;;;;;;;49033:39;;49099:4;49080:23;;:5;:15;;;;;;;;;;;;:23;;;49077:228;;;49115:15;49133:4;:14;49138:8;49133:14;;;;;;;;;;;49115:32;;49170:4;49156:18;;:3;:10;;;;;;;;;;;;:18;;;49153:113;;;49182:22;49215:3;:10;;;;;;;;;;;;49182:44;;49233:6;:15;;:26;49249:3;:9;;;49233:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49153:113;;49276:23;49290:8;49276:13;:23::i;:::-;49077:228;;49321:15;49327:8;49321:5;:15::i;:::-;48834:510;;:::o;44565:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53740:69::-;53790:14;53795:8;53790:4;:14::i;:::-;53740:69;:::o;34816:119::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34384:11:::1;:9;:11::i;:::-;34376:44;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;34893:5:::2;34880:10;;:18;;;;;;;;;;;;;;;;;;34914:13;;;;;;;;;;34816:119::o:0;41744:172::-;41819:7;41840:15;41861:22;41877:5;41861:12;:15;;:22;;;;:::i;:::-;41839:44;;;41901:7;41894:14;;;41744:172;;;:::o;34017:92::-;34067:4;34091:10;;;;;;;;;;;34084:17;;34017:92;:::o;40652:99::-;40722:21;40734:8;40722:11;:21::i;:::-;40652:99;:::o;32635:86::-;32682:4;32706:7;;;;;;;;;;;32699:14;;32635:86;:::o;42096:124::-;42168:7;42195:17;42204:7;42195:8;:17::i;:::-;42188:24;;42096:124;;;:::o;40761:97::-;40809:13;40842:8;40835:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40761:97;:::o;40468:175::-;40540:7;40585:1;40568:19;;:5;:19;;;;40560:28;;;;;;40606:29;:13;:20;40620:5;40606:20;;;;;;;;;;;;;;;:27;:29::i;:::-;40599:36;;40468:175;;;:::o;1299:130::-;1356:12;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1391:30:::1;1418:1;1391:18;:30::i;:::-;1381:40;;1299:130:::0;:::o;49940:402::-;50031:4;50048:13;50080:1;50064:13;:11;:13::i;:::-;:17;50048:33;;50110:6;50092:5;:15;50098:8;50092:15;;;;;;;;;;;:24;;;;50149:4;50127:9;:19;50137:8;50127:19;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;50166:31;50176:10;50188:8;50166:9;:31::i;:::-;50208:33;50221:8;50231:9;50208:12;:33::i;:::-;50266:10;50259:47;;;50278:6;50286:8;50296:9;50259:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50326:8;50319:15;;;49940:402;;;;;:::o;51578:345::-;51643:4;51688:5;51664:29;;:20;51675:8;51664:10;:20::i;:::-;:29;;;51656:38;;;;;;51707:13;51723:5;:15;51729:8;51723:15;;;;;;;;;;;;51707:31;;51771:17;51779:8;51771:7;:17::i;:::-;51757:31;;:10;:31;;;51749:40;;;;;;51818:6;51800:5;:15;51806:8;51800:15;;;;;;;;;;;:24;;;;51854:10;51842:51;;;51866:8;51876:6;51884:8;51842:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51911:4;51904:11;;;51578:345;;;;:::o;32943:117::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32776:8:::1;:6;:8::i;:::-;32775:9;32767:38;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33012:4:::2;33002:7:::0;::::2;:14;;;;;;;;;;;;;;;;;;33032:20;33039:12;:10;:12::i;:::-;33032:20;;;;;;;;;;;;;;;;;;;;32943:117::o:0;52912:449::-;53027:4;53044:13;53076:1;53060:13;:11;:13::i;:::-;:17;53044:33;;53106:9;53088:5;:15;53094:8;53088:15;;;;;;;;;;;:27;;;;53128:31;53138:10;53150:8;53128:9;:31::i;:::-;53170:33;53183:8;53193:9;53170:12;:33::i;:::-;53228:10;53221:50;;;53240:9;53251:8;53261:9;53221:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53280:47;53295:8;53304:9;53314:12;53280:14;:47::i;:::-;53345:8;53338:15;;;52912:449;;;;;;:::o;44490:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;892:102::-;932:20;980:6;;;;;;;;;;;965:21;;892:102;:::o;42336:104::-;42392:13;42425:7;42418:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42336:104;:::o;53630:92::-;53693:24;53708:8;53693:14;:24::i;:::-;53630:92;:::o;53833:85::-;53893:20;53904:8;53893:10;:20::i;:::-;53833:85;:::o;33701:139::-;33749:4;33778;33763:19;;:11;:9;:11::i;:::-;:19;;;33760:43;;;33796:1;33789:8;;;;33760:43;33824:8;;33817:15;;33701:139;;:::o;34691:117::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34280:11:::1;:9;:11::i;:::-;34279:12;34271:41;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;34769:4:::2;34756:10;;:17;;;;;;;;;;;;;;;;;;34789:11;;;;;;;;;;34691:117::o:0;51932:341::-;52013:4;52052:17;52060:8;52052:7;:17::i;:::-;52038:31;;:10;:31;;;52030:40;;;;;;52115:5;52091:29;;:20;52102:8;52091:10;:20::i;:::-;:29;;;52083:38;;;;;;52158:14;52136:9;:19;52146:8;52136:19;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;52204:10;52190:51;;;52216:8;52226:14;52190:51;;;;;;;;;;;;;;;;;;;;;;;;;;52261:4;52254:11;;51932:341;;;;:::o;42793:266::-;42908:12;:10;:12::i;:::-;42896:24;;:8;:24;;;;42888:33;;;;;;42979:8;42934:18;:32;42953:12;:10;:12::i;:::-;42934:32;;;;;;;;;;;;;;;:42;42967:8;42934:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;43032:8;43003:48;;43018:12;:10;:12::i;:::-;43003:48;;;43042:8;43003:48;;;;;;;;;;;;;;;;;;;;42793:266;;:::o;43953:282::-;44085:41;44104:12;:10;:12::i;:::-;44118:7;44085:18;:41::i;:::-;44077:50;;;;;;44165:5;44142:28;;:19;44153:7;44142:10;:19::i;:::-;:28;;;44134:37;;;;;;44188:39;44202:4;44208:2;44212:7;44221:5;44188:13;:39::i;:::-;43953:282;;;;:::o;53943:87::-;54004:21;54016:8;54004:11;:21::i;:::-;53943:87;:::o;49493:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;52283:477::-;52353:4;52398:5;52374:29;;:20;52385:8;52374:10;:20::i;:::-;:29;;;52366:38;;;;;;52417:13;52433:5;:15;52439:8;52433:15;;;;;;;;;;;;52417:31;;52481:17;52489:8;52481:7;:17::i;:::-;52467:31;;:10;:31;;;52459:40;;;;;;52532:6;52514:5;:15;52520:8;52514:15;;;;;;;;;;;:24;;;;52562:10;52548:41;;;52574:8;52584:4;52548:41;;;;;;;;;;;;;;;;;;;;;;;;;;52625:4;52602:27;;:9;:19;52612:8;52602:19;;;;;;;;;;;;;;;;;;;;;:27;;;52598:133;;52659:4;52637:9;:19;52647:8;52637:19;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;52686:10;52674:51;;;52698:8;52708:6;52716:8;52674:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52598:133;52748:4;52741:11;;;52283:477;;;;:::o;40867:741::-;40940:13;40974:16;40982:7;40974;:16::i;:::-;40966:25;;;;;;41004:23;41030:10;:19;41041:7;41030:19;;;;;;;;;;;41004:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41060:18;41081:9;:7;:9::i;:::-;41060:30;;41188:1;41172:4;41166:18;:23;41162:72;;;41213:9;41206:16;;;;;;41162:72;41364:1;41344:9;41338:23;:27;41334:108;;;41413:4;41419:9;41396:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41382:48;;;;;;41334:108;41574:4;41580:18;:7;:16;:18::i;:::-;41557:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41543:57;;;;40867:741;;;;:::o;35094:143::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34620:17:::1;:15;:17::i;:::-;34612:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35189:5:::2;35170:16;;:24;;;;;;;;;;;;;;;;;;35210:19;;;;;;;;;;35094:143::o:0;53387:220::-;53511:5;53488:28;;:9;:19;53498:8;53488:19;;;;;;;;;;;;;;;;;;;;;:28;;;53480:37;;;;;;53552:47;53567:8;53576:9;53586:12;53552:14;:47::i;:::-;53387:220;;;:::o;34945:141::-;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34504:17:::1;:15;:17::i;:::-;34503:18;34495:47;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35041:4:::2;35022:16;;:23;;;;;;;;;;;;;;;;;;35061:17;;;;;;;;;;34945:141::o:0;50351:273::-;50402:14;50412:3;50402:9;:14::i;:::-;50429:22;50454:12;50462:3;50454:7;:12::i;:::-;50429:37;;50477:17;50497:10;50477:30;;50520:11;50527:3;50520:6;:11::i;:::-;50574:9;50549:67;;50558:14;50549:67;;;50585:5;:10;50591:3;50585:10;;;;;;;;;;;;50597:3;50602:13;50611:3;50602:8;:13::i;:::-;50549:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50351:273;;;:::o;43131:164::-;43228:4;43252:18;:25;43271:5;43252:25;;;;;;;;;;;;;;;:35;43278:8;43252:35;;;;;;;;;;;;;;;;;;;;;;;;;43245:42;;43131:164;;;;:::o;48572:196::-;48639:4;48649:19;48672:6;:16;48679:8;48672:16;;;;;;;;;;;48649:39;;48715:4;48696:23;;:5;:15;;;;;;;;;;;;:23;;;48693:51;;48733:5;48726:12;;;;;48693:51;48759:4;48752:11;;;48572:196;;;;:::o;1002:289::-;1100:12;783:6;;;;;;;;;;;769:20;;:10;:20;;;747:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1158:1:::1;1138:22;;:8;:22;;;;1130:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1255:28;1274:8;1255:18;:28::i;:::-;1245:38;;1002:289:::0;;;:::o;36983:127::-;37048:4;37072:30;37094:7;37072:12;:21;;:30;;;;:::i;:::-;37065:37;;36983:127;;;:::o;68:98::-;121:7;148:10;141:17;;68:98;:::o;39964:178::-;40058:2;40031:15;:24;40047:7;40031:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40108:7;40104:2;40076:40;;40085:17;40094:7;40085:8;:17::i;:::-;40076:40;;;;;;;;;;;;39964:178;;:::o;29576:123::-;29645:7;29672:19;29680:3;:10;;29672:7;:19::i;:::-;29665:26;;29576:123;;;:::o;37118:296::-;37211:4;37236:16;37244:7;37236;:16::i;:::-;37228:25;;;;;;37264:13;37280:17;37289:7;37280:8;:17::i;:::-;37264:33;;37327:5;37316:16;;:7;:16;;;:51;;;;37360:7;37336:31;;:20;37348:7;37336:11;:20::i;:::-;:31;;;37316:51;:89;;;;37371:18;:25;37390:5;37371:25;;;;;;;;;;;;;;;:34;37397:7;37371:34;;;;;;;;;;;;;;;;;;;;;;;;;37316:89;37308:98;;;37118:296;;;;:::o;38571:490::-;38690:4;38669:25;;:17;38678:7;38669:8;:17::i;:::-;:25;;;38661:34;;;;;;38728:1;38714:16;;:2;:16;;;;38706:25;;;;;;38744:39;38765:4;38771:2;38775:7;38744:20;:39::i;:::-;38848:29;38865:1;38869:7;38848:8;:29::i;:::-;38890:35;38917:7;38890:13;:19;38904:4;38890:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;38936:30;38958:7;38936:13;:17;38950:2;38936:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;38979:29;38996:7;39005:2;38979:12;:16;;:29;;;;;:::i;:::-;;39045:7;39041:2;39026:27;;39035:4;39026:27;;;;;;;;;;;;38571:490;;;:::o;22186:137::-;22257:7;22292:22;22296:3;:10;;22308:5;22292:3;:22::i;:::-;22284:31;;22277:38;;22186:137;;;;:::o;48388:175::-;48476:29;;;;;;;;48482:5;48476:29;;;;;;48497:1;48476:29;;;;;;48501:1;48476:29;;;;48503:1;48476:29;;;48457:6;:16;48464:8;48457:16;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48533:25;;;;;;;;48537:5;48533:25;;;;;;48552:1;48533:25;;;;;;48556:1;48533:25;;;48516:4;:14;48521:8;48516:14;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48388:175;:::o;38088:475::-;38148:13;38164:17;38173:7;38164:8;:17::i;:::-;38148:33;;38212:48;38233:5;38248:1;38252:7;38212:20;:48::i;:::-;38273:29;38290:1;38294:7;38273:8;:29::i;:::-;38356:1;38325:10;:19;38336:7;38325:19;;;;;;;;;;;38319:33;;;;;;;;;;;;;;;;:38;38315:97;;38381:10;:19;38392:7;38381:19;;;;;;;;;;;;38374:26;;;;:::i;:::-;38315:97;38424:36;38452:7;38424:13;:20;38438:5;38424:20;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;;38473:28;38493:7;38473:12;:19;;:28;;;;:::i;:::-;;38547:7;38543:1;38519:36;;38528:5;38519:36;;;;;;;;;;;;38088:475;;:::o;45910:817::-;45994:10;45972:32;;:18;45981:8;45972;:18::i;:::-;:32;;;;45964:41;;;;;;46032:19;46055:6;:16;46062:8;46055:16;;;;;;;;;;;46032:39;;46102:5;:13;;;46084:15;:31;46076:40;;;;;;46176:5;:14;;;46163:9;:27;;46155:36;;;;;;46264:20;46287:4;:14;46292:8;46287:14;;;;;;;;;;;46264:37;;46326:8;:14;;;46314:9;:26;46306:35;;;;;;46453:1;46436:8;:14;;;:18;46432:183;;;46517:22;46550:8;:15;;;;;;;;;;;;46517:49;;46572:6;:15;;:31;46588:8;:14;;;46572:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46432:183;;46646:32;;;;;;;;46650:4;46646:32;;;;;;46656:10;46646:32;;;;;;46668:9;46646:32;;;46629:4;:14;46634:8;46629:14;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46692:27;46700:8;46709:9;46692:27;;;;;;;;;;;;;;;;;;;;;;;;45910:817;;;:::o;30039:236::-;30119:7;30128;30149:11;30162:13;30179:22;30183:3;:10;;30195:5;30179:3;:22::i;:::-;30148:53;;;;30228:3;30220:12;;30258:5;30250:14;;30212:55;;;;;;30039:236;;;;;:::o;39244:100::-;39328:8;39317;:19;;;;;;;;;;;;:::i;:::-;;39244:100;:::o;36622:126::-;36688:7;36715:25;36732:7;36715:12;:16;;:25;;;;:::i;:::-;36708:32;;36622:126;;;:::o;21727:114::-;21787:7;21814:19;21822:3;:10;;21814:7;:19::i;:::-;21807:26;;21727:114;;;:::o;1437:193::-;1501:12;1560:8;1531:38;;1552:6;;;;;;;;;;;1531:38;;;;;;;;;;;;1589:8;1580:6;;:17;;;;;;;;;;;;;;;;;;1618:4;1608:14;;1437:193;;;:::o;37422:110::-;37498:26;37508:2;37512:7;37498:26;;;;;;;;;;;;:9;:26::i;:::-;37422:110;;:::o;39069:167::-;39169:16;39177:7;39169;:16::i;:::-;39161:25;;;;;;39219:9;39197:10;:19;39208:7;39197:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;39069:167;;:::o;44882:477::-;45010:10;44988:32;;:18;44997:8;44988;:18::i;:::-;:32;;;44980:41;;;;;;45061:19;45084:6;:16;45091:8;45084:16;;;;;;;;;;;45061:39;;45132:4;45113:23;;:5;:15;;;;;;;;;;;;:23;;;;45105:32;;;;;;45202:65;;;;;;;;45208:4;45202:65;;;;;;45214:10;45202:65;;;;;;45226:9;45202:65;;;;45254:12;45236:15;:30;45202:65;;;45183:6;:16;45190:8;45183:16;;;;;;;;;;;:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45291:10;45277:77;;;45303:8;45313:9;45341:12;45323:15;:30;45277:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44882:477;;;;:::o;45385:499::-;45484:10;45462:32;;:18;45471:8;45462;:18::i;:::-;:32;;;45454:41;;;;;;45539:19;45562:6;:16;45569:8;45562:16;;;;;;;;;;;45539:39;;45612:4;45593:23;;:5;:15;;;;;;;;;;;;:23;;;45585:32;;;;;;45661:15;45679:4;:14;45684:8;45679:14;;;;;;;;;;;45661:32;;45722:4;45708:18;;:3;:10;;;;;;;;;;;;:18;;;;45700:27;;;;;;45806:29;;;;;;;;45812:5;45806:29;;;;;;45819:10;45806:29;;;;;;45831:1;45806:29;;;;45833:1;45806:29;;;45787:6;:16;45794:8;45787:16;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45853:23;45867:8;45853:23;;;;;;;;;;;;;;;;;;45385:499;;;:::o;46754:740::-;46814:19;46837:6;:16;46844:8;46837:16;;;;;;;;;;;46814:39;;46885:4;46866:23;;:5;:15;;;;;;;;;;;;:23;;;46858:32;;;;;;46955:5;:13;;;46937:15;:31;46929:40;;;;;;47016:15;47034:4;:14;47039:8;47034:14;;;;;;;;;;;47016:32;;47075:4;47061:18;;:3;:10;;;;;;;;;;;;:18;;;47053:27;;;;;;47107:10;47093:24;;:3;:10;;;;;;;;;;;;:24;;;47085:33;;;;;;47166:22;47199:3;:10;;;;;;;;;;;;47166:44;;47215:22;47248:5;:12;;;;;;;;;;;;47215:46;;47273:14;47320:4;47302:15;:13;:15::i;:::-;47290:3;:9;;;:27;:34;;;;;;47273:51;;47330:6;:15;;:38;47358:9;47346:3;:9;;;:21;47330:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47374:6;:15;;:26;47390:9;47374:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47428:25;;;;;;;;47432:5;47428:25;;;;;;47447:1;47428:25;;;;;;47451:1;47428:25;;;47411:4;:14;47416:8;47411:14;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47467:19;47477:8;47467:19;;;;;;;;;;;;;;;;;;46754:740;;;;;;:::o;36757:218::-;36871:28;36881:4;36887:2;36891:7;36871:9;:28::i;:::-;36918:48;36941:4;36947:2;36951:7;36960:5;36918:22;:48::i;:::-;36910:57;;;;;;36757:218;;;;:::o;47520:858::-;47587:19;47610:6;:16;47617:8;47610:16;;;;;;;;;;;47587:39;;47658:5;:13;;;47639:15;:32;;47631:41;;;;;;47749:4;47730:23;;:5;:15;;;;;;;;;;;;:23;;;47722:32;;;;;;47798:22;47831:18;47840:8;47831;:18::i;:::-;47798:52;;47859:15;47877:4;:14;47882:8;47877:14;;;;;;;;;;;47859:32;;47896:45;47906:5;:12;;;;;;;;;;;;47920:3;:10;;;;;;;;;;;;47932:8;47896:9;:45::i;:::-;47978:21;48026:4;48014:9;:7;:9::i;:::-;48002:3;:9;;;:21;:28;;;;;;47978:52;;48036:17;48068:16;48056:3;:9;;;:28;48036:48;;48095:6;:15;;:29;48111:12;48095:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48172;48212:6;;;;;;;;;;;48172:47;;48225:13;:22;;:40;48248:16;48225:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48315:30;48326:8;48335:3;:9;;;48315:30;;;;;;;;;;;;;;;;;;;;;;;;48350:23;48364:8;48350:13;:23::i;:::-;47520:858;;;;;;;:::o;31660:746::-;31716:13;31946:1;31937:5;:10;31933:53;;;31964:10;;;;;;;;;;;;;;;;;;;;;31933:53;31996:12;32011:5;31996:20;;32027:14;32052:78;32067:1;32059:4;:9;32052:78;;32085:8;;;;;;;32116:2;32108:10;;;;;;;;;32052:78;;;32140:19;32172:6;32162:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32140:39;;32190:13;32215:1;32206:6;:10;32190:26;;32234:5;32227:12;;32250:117;32265:1;32257:4;:9;32250:117;;32326:2;32319:4;:9;;;;;;32314:2;:14;32301:29;;32283:6;32290:7;;;;;;;32283:15;;;;;;;;;;;:47;;;;;;;;;;;32353:2;32345:10;;;;;;;;;32250:117;;;32391:6;32377:21;;;;;;31660:746;;;;:::o;50632:244::-;50681:17;50701:9;:14;50711:3;50701:14;;;;;;;;;;;;;;;;;;;;;50681:34;;50734:12;50742:3;50734:7;:12::i;:::-;50726:21;;;;;;50766:12;50758:21;;;;;;50811:5;:10;50817:3;50811:10;;;;;;;;;;;;50798:9;:23;;50790:32;;;;;;50855:12;50863:3;50855:7;:12::i;:::-;50841:26;;:10;:26;;;;50833:35;;;;;;50632:244;;:::o;50884:685::-;50930:29;50970:6;;;;;;;;;;;50930:47;;50988:22;51021:10;50988:44;;51043:22;51076:12;51084:3;51076:7;:12::i;:::-;51043:46;;51102:30;51112:6;51120;51128:3;51102:9;:30::i;:::-;51146:21;51195:4;51183:9;:7;:9::i;:::-;51170:5;:10;51176:3;51170:10;;;;;;;;;;;;:22;:29;;;;;;51146:53;;51205:17;51238:16;51225:5;:10;51231:3;51225:10;;;;;;;;;;;;:29;51205:49;;51262:6;:15;;:29;51278:12;51262:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51297:13;:22;;:40;51320:16;51297:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51449:5;:10;51455:3;51449:10;;;;;;;;;;;;51437:9;:22;51433:94;;;51476:6;:15;;:39;51504:5;:10;51510:3;51504:10;;;;;;;;;;;;51492:9;:22;51476:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51433:94;51556:5;51539:9;:14;51549:3;51539:14;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;50884:685;;;;;;:::o;29336:151::-;29420:4;29444:35;29454:3;:10;;29474:3;29466:12;;29444:9;:35::i;:::-;29437:42;;29336:151;;;;:::o;26147:110::-;26203:7;26230:3;:12;;:19;;;;26223:26;;26147:110;;;:::o;40149:120::-;40254:8;:6;:8::i;:::-;40253:9;40245:18;;;;;;40149:120;;;:::o;21270:137::-;21340:4;21364:35;21372:3;:10;;21392:5;21384:14;;21364:7;:35::i;:::-;21357:42;;21270:137;;;;:::o;20962:131::-;21029:4;21053:32;21058:3;:10;;21078:5;21070:14;;21053:4;:32::i;:::-;21046:39;;20962:131;;;;:::o;28757:185::-;28846:4;28870:64;28875:3;:10;;28895:3;28887:12;;28925:5;28909:23;;28901:32;;28870:4;:64::i;:::-;28863:71;;28757:185;;;;;:::o;17209:204::-;17276:7;17325:5;17304:3;:11;;:18;;;;:26;17296:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17387:3;:11;;17399:5;17387:18;;;;;;;;;;;;;;;;17380:25;;17209:204;;;;:::o;29109:142::-;29186:4;29210:33;29218:3;:10;;29238:3;29230:12;;29210:7;:33::i;:::-;29203:40;;29109:142;;;;:::o;26613:279::-;26680:7;26689;26739:5;26717:3;:12;;:19;;;;:27;26709:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26796:22;26821:3;:12;;26834:5;26821:19;;;;;;;;;;;;;;;;;;26796:44;;26859:5;:10;;;26871:5;:12;;;26851:33;;;;;26613:279;;;;;:::o;30868:171::-;30947:7;30998:30;31003:3;:10;;31023:3;31015:12;;30998:4;:30::i;:::-;30990:39;;30967:64;;30868:171;;;;:::o;16755:109::-;16811:7;16838:3;:11;;:18;;;;16831:25;;16755:109;;;:::o;37540:196::-;37636:18;37642:2;37646:7;37636:5;:18::i;:::-;37673:54;37704:1;37708:2;37712:7;37721:5;37673:22;:54::i;:::-;37665:63;;;;;;37540:196;;;:::o;39352:604::-;39473:4;39500:15;:2;:13;;;:15::i;:::-;39495:60;;39539:4;39532:11;;;;39495:60;39565:23;39591:252;39644:45;;;39704:12;:10;:12::i;:::-;39731:4;39750:7;39772:5;39607:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39591:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;39565:278;;39854:13;39881:10;39870:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39854:48;;35685:10;39931:16;;39921:26;;;:6;:26;;;;39913:35;;;;39352:604;;;;;;;:::o;25926:125::-;25997:4;26042:1;26021:3;:12;;:17;26034:3;26021:17;;;;;;;;;;;;:22;;26014:29;;25926:125;;;;:::o;14908:1544::-;14974:4;15092:18;15113:3;:12;;:19;15126:5;15113:19;;;;;;;;;;;;15092:40;;15163:1;15149:10;:15;15145:1300;;15511:21;15548:1;15535:10;:14;15511:38;;15564:17;15605:1;15584:3;:11;;:18;;;;:22;15564:42;;15851:17;15871:3;:11;;15883:9;15871:22;;;;;;;;;;;;;;;;15851:42;;16017:9;15988:3;:11;;16000:13;15988:26;;;;;;;;;;;;;;;:38;;;;16136:1;16120:13;:17;16094:3;:12;;:23;16107:9;16094:23;;;;;;;;;;;:43;;;;16246:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;16341:3;:12;;:19;16354:5;16341:19;;;;;;;;;;;16334:26;;;16384:4;16377:11;;;;;;;;15145:1300;16428:5;16421:12;;;14908:1544;;;;;:::o;14317:414::-;14380:4;14402:21;14412:3;14417:5;14402:9;:21::i;:::-;14397:327;;14440:3;:11;;14457:5;14440:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14623:3;:11;;:18;;;;14601:3;:12;;:19;14614:5;14601:19;;;;;;;;;;;:40;;;;14663:4;14656:11;;;;14397:327;14707:5;14700:12;;14317:414;;;;;:::o;23424:692::-;23500:4;23616:16;23635:3;:12;;:17;23648:3;23635:17;;;;;;;;;;;;23616:36;;23681:1;23669:8;:13;23665:444;;;23736:3;:12;;23754:38;;;;;;;;23771:3;23754:38;;;;23784:5;23754:38;;;23736:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23951:3;:12;;:19;;;;23931:3;:12;;:17;23944:3;23931:17;;;;;;;;;;;:39;;;;23992:4;23985:11;;;;;23665:444;24065:5;24029:3;:12;;24053:1;24042:8;:12;24029:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;24092:5;24085:12;;;23424:692;;;;;;:::o;24292:1549::-;24356:4;24472:16;24491:3;:12;;:17;24504:3;24491:17;;;;;;;;;;;;24472:36;;24537:1;24525:8;:13;24521:1313;;24886:21;24921:1;24910:8;:12;24886:36;;24937:17;24979:1;24957:3;:12;;:19;;;;:23;24937:43;;25225:26;25254:3;:12;;25267:9;25254:23;;;;;;;;;;;;;;;;;;25225:52;;25402:9;25372:3;:12;;25385:13;25372:27;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;;25526:1;25510:13;:17;25479:3;:12;;:28;25492:9;:14;;;25479:28;;;;;;;;;;;:48;;;;25636:3;:12;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25732:3;:12;;:17;25745:3;25732:17;;;;;;;;;;;25725:24;;;25773:4;25766:11;;;;;;;;24521:1313;25817:5;25810:12;;;24292:1549;;;;;:::o;27511:311::-;27577:7;27597:16;27616:3;:12;;:17;27629:3;27616:17;;;;;;;;;;;;27597:36;;27664:1;27652:8;:13;;27644:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27754:3;:12;;27778:1;27767:8;:12;27754:26;;;;;;;;;;;;;;;;;;:33;;;27747:40;;;27511:311;;;;:::o;37744:336::-;37838:1;37824:16;;:2;:16;;;;37816:25;;;;;;37861:16;37869:7;37861;:16::i;:::-;37860:17;37852:26;;;;;;37891:45;37920:1;37924:2;37928:7;37891:20;:45::i;:::-;37949:30;37971:7;37949:13;:17;37963:2;37949:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;37992:29;38009:7;38018:2;37992:12;:16;;:29;;;;;:::i;:::-;;38064:7;38060:2;38039:33;;38056:1;38039:33;;;;;;;;;;;;37744:336;;:::o;11217:176::-;11277:4;11296:12;11350:7;11338:20;11330:28;;11384:1;11377:4;:8;11370:15;;;11217:176;;;:::o;11909:195::-;12012:12;12044:52;12066:6;12074:4;12080:1;12083:12;12044:21;:52::i;:::-;12037:59;;11909:195;;;;;:::o;16539:129::-;16612:4;16659:1;16636:3;:12;;:19;16649:5;16636:19;;;;;;;;;;;;:24;;16629:31;;16539:129;;;;:::o;12346:530::-;12473:12;12531:5;12506:21;:30;;12498:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12598:18;12609:6;12598:10;:18::i;:::-;12590:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12724:12;12738:23;12765:6;:11;;12785:5;12793:4;12765:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12723:75;;;;12816:52;12834:7;12843:10;12855:12;12816:17;:52::i;:::-;12809:59;;;;12346:530;;;;;;:::o;12884:515::-;12999:12;13028:7;13024:368;;;13059:10;13052:17;;;;13024:368;13126:1;13106:10;:17;:21;13102:279;;;13209:10;13203:17;13270:15;13257:10;13253:2;13249:19;13242:44;13157:148;13352:12;13345:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12884:515;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://9773c6821252322ac378e301c14f196e7e72b4481780800ce0e74de1e4875704

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.