ETH Price: $3,089.29 (+0.61%)
Gas: 7 Gwei

Token

Golden Key Society (GKS)
 

Overview

Max Total Supply

1,315 GKS

Holders

252

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GKS
0xC8f9711387A6E6966D039B554d656a5c375cA97E
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GoldenKeySociety

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU LGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-03
*/

// SPDX-License-Identifier: GPL-3.0

/*

 ######   ##    ##  ######  
##    ##  ##   ##  ##    ## 
##        ##  ##   ##       
##   #### #####     ######  
##    ##  ##  ##         ## 
##    ##  ##   ##  ##    ## 
 ######   ##    ##  ######  

*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {
    
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
}


// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


// File: @openzeppelin/contracts/access/Ownable.sol

pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 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");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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


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

  
    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 setApprovalForAll(address operator, bool _approved) external;


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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
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);
}

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}


// File: erc721a/contracts/ERC721A.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _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 {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }


    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

 
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}


    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


// File: contracts/goldenkeysociety.sol

pragma solidity >= 0.8.0 < 0.9.0;

contract GoldenKeySociety is ERC721A, Ownable, ReentrancyGuard {

    using Strings for uint256;

    address signerAddress;

    uint256 public MAX_SUPPLY = 15000;
    uint256 public MAX_PUBLIC_MINT = 100;
    uint256 public MAX_PER_TRX = 20;
    uint256 public PUBLIC_SALE_PRICE = 0.2 ether;

    string public uriPrefix;
    string public uriSuffix = ".json";

    bool public pause = true;

    mapping(address => uint256) public totalPublicMint;

    constructor( address _signerAddress ) ERC721A ( "Golden Key Society", "GKS" ) {
    setTokenUri( "ipfs://bafybeif4z7r3kwsolekg7uwdpf5icz445i5b5k24hkecx4ng42p3omab5e" );
    signerAddress = _signerAddress;
    }

// ~~~~~~~~~~~~~~~~~~~~ URI's ~~~~~~~~~~~~~~~~~~~~
    function _baseURI() internal view virtual override returns (string memory) {
        return uriPrefix;
    }

// ~~~~~~~~~~~~~~~~~~~~ Modifiers ~~~~~~~~~~~~~~~~~~~~
    modifier mintCompliance(uint256 _quantity) {
        if (msg.sender != owner()) {
            require(!pause, "The contract is paused!");
            require(_quantity <= MAX_PER_TRX, "Max mint per transaction exceeded!");
            }
        require(_quantity > 0, "Mint amount can't be zero.");
        require(tx.origin == msg.sender, "The caller is another contract");
        require(totalSupply() + _quantity <= MAX_SUPPLY, "Golden Key Society :: Beyond Max Supply");
    _;
    }

// ~~~~~~~~~~~~~~~~~~~~ Mint Functions ~~~~~~~~~~~~~~~~~~~~
    // Public MINT
    function mint(uint256 _quantity, bytes memory sig) public payable mintCompliance(_quantity) {

        if(isValidData(msg.sender, sig) != true) {
            require(totalPublicMint[msg.sender] + _quantity <= MAX_PUBLIC_MINT, "Golden Key Society :: Already minted 100 times!");
            require(msg.value >= PUBLIC_SALE_PRICE * _quantity, "Insufficient funds!");
            totalPublicMint[msg.sender] += _quantity;
            }

        _safeMint(msg.sender, _quantity);
    }

    // MINT for address
    function mintToAddress(uint256 _mintAmount, address _receiver) public onlyOwner {
        require(totalSupply() + _mintAmount <= MAX_SUPPLY, "Mint amount exceeds max supply!");
        _safeMint(_receiver, _mintAmount);
    }

// ~~~~~~~~~~~~~~~~~~~~ SIGNATURES ~~~~~~~~~~~~~~~~~~~~
  function isValidData(address _user, bytes memory sig) public view returns (bool) {
    bytes32 message = keccak256(abi.encodePacked(_user));
    return (recoverSigner(message, sig) == signerAddress);
  }

  function recoverSigner(bytes32 message, bytes memory sig) public pure returns (address) {
    uint8 v; bytes32 r; bytes32 s;
    (v, r, s) = splitSignature(sig);
    return ecrecover(message, v, r, s);
  }

  function splitSignature(bytes memory sig) public pure returns (uint8, bytes32, bytes32) {
    require(sig.length == 65);
    bytes32 r; bytes32 s; uint8 v;
    assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) v := byte(0, mload(add(sig, 96))) }
    return (v, r, s);
  }

// ~~~~~~~~~~~~~~~~~~~~ Checks ~~~~~~~~~~~~~~~~~~~~
    // TOKEN URI <= If you are reading this you are awesome!!
  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token.");

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
    ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
    : "";
    }

    // Start Token
  function _startTokenId() internal view virtual override returns (uint256) {
    return 1;
  }

  // Check Wallet assets
  function walletOfOwner(address _owner) public view returns (uint256[] memory) {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = _startTokenId();
    uint256 ownedTokenIndex = 0;
    address latestOwnerAddress;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId < _currentIndex) {
      TokenOwnership memory ownership = _ownerships[currentTokenId];

      if (!ownership.burned) {
        if (ownership.addr != address(0)) {
          latestOwnerAddress = ownership.addr;
        }

        if (latestOwnerAddress == _owner) {
          ownedTokenIds[ownedTokenIndex] = currentTokenId;
          ownedTokenIndex++;
        }
      }
      currentTokenId++;
    }
    return ownedTokenIds;
  }

// ~~~~~~~~~~~~~~~~~~~~ onlyOwner Functions ~~~~~~~~~~~~~~~~~~~~
    function setTokenUri(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    function setCostPublic(uint256 _cost) public onlyOwner {
        PUBLIC_SALE_PRICE = _cost;
    }

    function setMaxPB(uint256 _maxPB) public onlyOwner {
        MAX_PUBLIC_MINT = _maxPB;
    }

    function setPause(bool _state) public onlyOwner {
        pause = _state;
    }

    function withdraw() external onlyOwner nonReentrant {
    (bool success, ) = payable(0xDf18896426A836aE3E4F74f347b183e88100B009).call{value: address(this).balance}("");
    require(success);
  }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_TRX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"_user","type":"address"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"isValidData","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","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":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"message","type":"bytes32"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCostPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPB","type":"uint256"}],"name":"setMaxPB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"splitSignature","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052613a98600b556064600c556014600d556702c68af0bb140000600e556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601090805190602001906200006d929190620003b8565b506001601160006101000a81548160ff0219169083151502179055503480156200009657600080fd5b5060405162004bd938038062004bd98339818101604052810190620000bc91906200047f565b6040518060400160405280601281526020017f476f6c64656e204b657920536f636965747900000000000000000000000000008152506040518060400160405280600381526020017f474b530000000000000000000000000000000000000000000000000000000000815250816002908051906020019062000140929190620003b8565b50806003908051906020019062000159929190620003b8565b506200016a6200020c60201b60201c565b600081905550505062000192620001866200021560201b60201c565b6200021d60201b60201c565b6001600981905550620001c460405180608001604052806042815260200162004b9760429139620002e360201b60201c565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620005ec565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002f36200021560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003196200038e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000372576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036990620004d8565b60405180910390fd5b80600f90805190602001906200038a929190620003b8565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003c6906200053f565b90600052602060002090601f016020900481019282620003ea576000855562000436565b82601f106200040557805160ff191683800117855562000436565b8280016001018555821562000436579182015b828111156200043557825182559160200191906001019062000418565b5b50905062000445919062000449565b5090565b5b80821115620004645760008160009055506001016200044a565b5090565b6000815190506200047981620005d2565b92915050565b600060208284031215620004985762000497620005a4565b5b6000620004a88482850162000468565b91505092915050565b6000620004c0602083620004fa565b9150620004cd82620005a9565b602082019050919050565b60006020820190508181036000830152620004f381620004b1565b9050919050565b600082825260208201905092915050565b600062000518826200051f565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200055857607f821691505b602082108114156200056f576200056e62000575565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620005dd816200050b565b8114620005e957600080fd5b50565b61459b80620005fc6000396000f3fe60806040526004361061020f5760003560e01c80636352211e11610118578063a22cb465116100a0578063bedb86fb1161006f578063bedb86fb146107b3578063c87b56dd146107dc578063db7fd40814610819578063e985e9c514610835578063f2fde38b146108725761020f565b8063a22cb465146106e5578063a7bb58031461070e578063b0940d451461074d578063b88d4fde1461078a5761020f565b8063715018a6116100e7578063715018a6146106105780638456cb59146106275780638da5cb5b1461065257806395d89b411461067d57806397aba7f9146106a85761020f565b80636352211e1461054057806365f130971461057d5780636a14550c146105a857806370a08231146105d35761020f565b80632f9a7c581161019b578063438b63001161016a578063438b63001461045b578063512b658d146104985780635503a0e8146104c157806362b99ad4146104ec57806362e84eff146105175761020f565b80632f9a7c58146103c757806332cb6b0c146103f05780633ccfd60b1461041b57806342842e0e146104325761020f565b8063081812fc116101e2578063081812fc146102d0578063095ea7b31461030d57806318160ddd146103365780631c16521c1461036157806323b872dd1461039e5761020f565b806301ffc9a7146102145780630675b7c61461025157806306fdde031461027a57806307e89ec0146102a5575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061345f565b61089b565b6040516102489190613ace565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190613502565b61097d565b005b34801561028657600080fd5b5061028f610a13565b60405161029c9190613b2e565b60405180910390f35b3480156102b157600080fd5b506102ba610aa5565b6040516102c79190613cd0565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f2919061354b565b610aab565b6040516103049190613a45565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190613396565b610b27565b005b34801561034257600080fd5b5061034b610c2c565b6040516103589190613cd0565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906131b7565b610c43565b6040516103959190613cd0565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190613224565b610c5b565b005b3480156103d357600080fd5b506103ee60048036038101906103e9919061354b565b610c6b565b005b3480156103fc57600080fd5b50610405610cf1565b6040516104129190613cd0565b60405180910390f35b34801561042757600080fd5b50610430610cf7565b005b34801561043e57600080fd5b5061045960048036038101906104549190613224565b610e56565b005b34801561046757600080fd5b50610482600480360381019061047d91906131b7565b610e76565b60405161048f9190613aac565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba9190613578565b61108a565b005b3480156104cd57600080fd5b506104d661116b565b6040516104e39190613b2e565b60405180910390f35b3480156104f857600080fd5b506105016111f9565b60405161050e9190613b2e565b60405180910390f35b34801561052357600080fd5b5061053e6004803603810190610539919061354b565b611287565b005b34801561054c57600080fd5b506105676004803603810190610562919061354b565b61130d565b6040516105749190613a45565b60405180910390f35b34801561058957600080fd5b50610592611323565b60405161059f9190613cd0565b60405180910390f35b3480156105b457600080fd5b506105bd611329565b6040516105ca9190613cd0565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f591906131b7565b61132f565b6040516106079190613cd0565b60405180910390f35b34801561061c57600080fd5b506106256113ff565b005b34801561063357600080fd5b5061063c611487565b6040516106499190613ace565b60405180910390f35b34801561065e57600080fd5b5061066761149a565b6040516106749190613a45565b60405180910390f35b34801561068957600080fd5b506106926114c4565b60405161069f9190613b2e565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca9190613403565b611556565b6040516106dc9190613a45565b60405180910390f35b3480156106f157600080fd5b5061070c600480360381019061070791906132fa565b6115cb565b005b34801561071a57600080fd5b50610735600480360381019061073091906134b9565b611743565b60405161074493929190613ceb565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f919061333a565b611786565b6040516107819190613ace565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613277565b611815565b005b3480156107bf57600080fd5b506107da60048036038101906107d591906133d6565b61188d565b005b3480156107e857600080fd5b5061080360048036038101906107fe919061354b565b611926565b6040516108109190613b2e565b60405180910390f35b610833600480360381019061082e91906135b8565b6119d0565b005b34801561084157600080fd5b5061085c600480360381019061085791906131e4565b611d03565b6040516108699190613ace565b60405180910390f35b34801561087e57600080fd5b50610899600480360381019061089491906131b7565b611d97565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610976575061097582611e8f565b5b9050919050565b610985611ef9565b73ffffffffffffffffffffffffffffffffffffffff166109a361149a565b73ffffffffffffffffffffffffffffffffffffffff16146109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f090613bf0565b60405180910390fd5b80600f9080519060200190610a0f929190612f73565b5050565b606060028054610a2290614027565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e90614027565b8015610a9b5780601f10610a7057610100808354040283529160200191610a9b565b820191906000526020600020905b815481529060010190602001808311610a7e57829003601f168201915b5050505050905090565b600e5481565b6000610ab682611f01565b610aec576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b328261130d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb9611ef9565b73ffffffffffffffffffffffffffffffffffffffff1614610c1c57610be581610be0611ef9565b611d03565b610c1b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610c27838383611f4f565b505050565b6000610c36612001565b6001546000540303905090565b60126020528060005260406000206000915090505481565b610c6683838361200a565b505050565b610c73611ef9565b73ffffffffffffffffffffffffffffffffffffffff16610c9161149a565b73ffffffffffffffffffffffffffffffffffffffff1614610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde90613bf0565b60405180910390fd5b80600e8190555050565b600b5481565b610cff611ef9565b73ffffffffffffffffffffffffffffffffffffffff16610d1d61149a565b73ffffffffffffffffffffffffffffffffffffffff1614610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a90613bf0565b60405180910390fd5b60026009541415610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db090613c50565b60405180910390fd5b6002600981905550600073df18896426a836ae3e4f74f347b183e88100b00973ffffffffffffffffffffffffffffffffffffffff1647604051610dfb90613a30565b60006040518083038185875af1925050503d8060008114610e38576040519150601f19603f3d011682016040523d82523d6000602084013e610e3d565b606091505b5050905080610e4b57600080fd5b506001600981905550565b610e7183838360405180602001604052806000815250611815565b505050565b60606000610e838361132f565b905060008167ffffffffffffffff811115610ea157610ea06141e4565b5b604051908082528060200260200182016040528015610ecf5781602001602082028036833780820191505090505b5090506000610edc612001565b90506000805b8482108015610ef2575060005483105b1561107d576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161106957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461100557806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611068578385848151811061104d5761104c6141b5565b5b60200260200101818152505082806110649061408a565b9350505b5b83806110749061408a565b94505050610ee2565b8395505050505050919050565b611092611ef9565b73ffffffffffffffffffffffffffffffffffffffff166110b061149a565b73ffffffffffffffffffffffffffffffffffffffff1614611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90613bf0565b60405180910390fd5b600b5482611112610c2c565b61111c9190613e45565b111561115d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115490613b70565b60405180910390fd5b61116781836124c0565b5050565b6010805461117890614027565b80601f01602080910402602001604051908101604052809291908181526020018280546111a490614027565b80156111f15780601f106111c6576101008083540402835291602001916111f1565b820191906000526020600020905b8154815290600101906020018083116111d457829003601f168201915b505050505081565b600f805461120690614027565b80601f016020809104026020016040519081016040528092919081815260200182805461123290614027565b801561127f5780601f106112545761010080835404028352916020019161127f565b820191906000526020600020905b81548152906001019060200180831161126257829003601f168201915b505050505081565b61128f611ef9565b73ffffffffffffffffffffffffffffffffffffffff166112ad61149a565b73ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa90613bf0565b60405180910390fd5b80600c8190555050565b6000611318826124de565b600001519050919050565b600c5481565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611397576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611407611ef9565b73ffffffffffffffffffffffffffffffffffffffff1661142561149a565b73ffffffffffffffffffffffffffffffffffffffff161461147b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147290613bf0565b60405180910390fd5b6114856000612769565b565b601160009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546114d390614027565b80601f01602080910402602001604051908101604052809291908181526020018280546114ff90614027565b801561154c5780601f106115215761010080835404028352916020019161154c565b820191906000526020600020905b81548152906001019060200180831161152f57829003601f168201915b5050505050905090565b60008060008061156585611743565b809350819450829550505050600186848484604051600081526020016040526040516115949493929190613ae9565b6020604051602081039080840390855afa1580156115b6573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6115d3611ef9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611638576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611645611ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116f2611ef9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117379190613ace565b60405180910390a35050565b6000806000604184511461175657600080fd5b60008060006020870151925060408701519150606087015160001a90508083839550955095505050509193909250565b6000808360405160200161179a91906139e4565b604051602081830303815290604052805190602001209050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166117f58285611556565b73ffffffffffffffffffffffffffffffffffffffff161491505092915050565b61182084848461200a565b61183f8373ffffffffffffffffffffffffffffffffffffffff1661282f565b156118875761185084848484612852565b611886576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611895611ef9565b73ffffffffffffffffffffffffffffffffffffffff166118b361149a565b73ffffffffffffffffffffffffffffffffffffffff1614611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190090613bf0565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b606061193182611f01565b611970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196790613c70565b60405180910390fd5b600061197a6129b2565b9050600081511161199a57604051806020016040528060008152506119c8565b806119a484612a44565b60106040516020016119b8939291906139ff565b6040516020818303038152906040525b915050919050565b816119d961149a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aa157601160009054906101000a900460ff1615611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5290613c10565b60405180910390fd5b600d54811115611aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9790613c30565b60405180910390fd5b5b60008111611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb90613bd0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4990613b90565b60405180910390fd5b600b5481611b5e610c2c565b611b689190613e45565b1115611ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba090613bb0565b60405180910390fd5b60011515611bb73384611786565b151514611cf457600c5483601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c0c9190613e45565b1115611c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4490613c90565b60405180910390fd5b82600e54611c5b9190613ecc565b341015611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490613cb0565b60405180910390fd5b82601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cec9190613e45565b925050819055505b611cfe33846124c0565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d9f611ef9565b73ffffffffffffffffffffffffffffffffffffffff16611dbd61149a565b73ffffffffffffffffffffffffffffffffffffffff1614611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a90613bf0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a90613b50565b60405180910390fd5b611e8c81612769565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611f0c612001565b11158015611f1b575060005482105b8015611f48575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612015826124de565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612080576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166120a1611ef9565b73ffffffffffffffffffffffffffffffffffffffff1614806120d057506120cf856120ca611ef9565b611d03565b5b8061211557506120de611ef9565b73ffffffffffffffffffffffffffffffffffffffff166120fd84610aab565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061214e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121b5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121c28585856001612ba5565b6121ce60008487611f4f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561244e57600054821461244d57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124b98585856001612bab565b5050505050565b6124da828260405180602001604052806000815250612bb1565b5050565b6124e6612ff9565b6000829050806124f4612001565b1161273257600054811015612731576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161272f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612613578092505050612764565b5b60011561272e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612729578092505050612764565b612614565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612878611ef9565b8786866040518563ffffffff1660e01b815260040161289a9493929190613a60565b602060405180830381600087803b1580156128b457600080fd5b505af19250505080156128e557506040513d601f19601f820116820180604052508101906128e2919061348c565b60015b61295f573d8060008114612915576040519150601f19603f3d011682016040523d82523d6000602084013e61291a565b606091505b50600081511415612957576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546129c190614027565b80601f01602080910402602001604051908101604052809291908181526020018280546129ed90614027565b8015612a3a5780601f10612a0f57610100808354040283529160200191612a3a565b820191906000526020600020905b815481529060010190602001808311612a1d57829003601f168201915b5050505050905090565b60606000821415612a8c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ba0565b600082905060005b60008214612abe578080612aa79061408a565b915050600a82612ab79190613e9b565b9150612a94565b60008167ffffffffffffffff811115612ada57612ad96141e4565b5b6040519080825280601f01601f191660200182016040528015612b0c5781602001600182028036833780820191505090505b5090505b60008514612b9957600182612b259190613f26565b9150600a85612b3491906140f7565b6030612b409190613e45565b60f81b818381518110612b5657612b556141b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b929190613e9b565b9450612b10565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c1e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612c59576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c666000858386612ba5565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612e278673ffffffffffffffffffffffffffffffffffffffff1661282f565b15612eec575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e9c6000878480600101955087612852565b612ed2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612e2d578260005414612ee757600080fd5b612f57565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612eed575b816000819055505050612f6d6000858386612bab565b50505050565b828054612f7f90614027565b90600052602060002090601f016020900481019282612fa15760008555612fe8565b82601f10612fba57805160ff1916838001178555612fe8565b82800160010185558215612fe8579182015b82811115612fe7578251825591602001919060010190612fcc565b5b509050612ff5919061303c565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561305557600081600090555060010161303d565b5090565b600061306c61306784613d47565b613d22565b90508281526020810184848401111561308857613087614218565b5b613093848285613fe5565b509392505050565b60006130ae6130a984613d78565b613d22565b9050828152602081018484840111156130ca576130c9614218565b5b6130d5848285613fe5565b509392505050565b6000813590506130ec816144f2565b92915050565b60008135905061310181614509565b92915050565b60008135905061311681614520565b92915050565b60008135905061312b81614537565b92915050565b60008151905061314081614537565b92915050565b600082601f83011261315b5761315a614213565b5b813561316b848260208601613059565b91505092915050565b600082601f83011261318957613188614213565b5b813561319984826020860161309b565b91505092915050565b6000813590506131b18161454e565b92915050565b6000602082840312156131cd576131cc614222565b5b60006131db848285016130dd565b91505092915050565b600080604083850312156131fb576131fa614222565b5b6000613209858286016130dd565b925050602061321a858286016130dd565b9150509250929050565b60008060006060848603121561323d5761323c614222565b5b600061324b868287016130dd565b935050602061325c868287016130dd565b925050604061326d868287016131a2565b9150509250925092565b6000806000806080858703121561329157613290614222565b5b600061329f878288016130dd565b94505060206132b0878288016130dd565b93505060406132c1878288016131a2565b925050606085013567ffffffffffffffff8111156132e2576132e161421d565b5b6132ee87828801613146565b91505092959194509250565b6000806040838503121561331157613310614222565b5b600061331f858286016130dd565b9250506020613330858286016130f2565b9150509250929050565b6000806040838503121561335157613350614222565b5b600061335f858286016130dd565b925050602083013567ffffffffffffffff8111156133805761337f61421d565b5b61338c85828601613146565b9150509250929050565b600080604083850312156133ad576133ac614222565b5b60006133bb858286016130dd565b92505060206133cc858286016131a2565b9150509250929050565b6000602082840312156133ec576133eb614222565b5b60006133fa848285016130f2565b91505092915050565b6000806040838503121561341a57613419614222565b5b600061342885828601613107565b925050602083013567ffffffffffffffff8111156134495761344861421d565b5b61345585828601613146565b9150509250929050565b60006020828403121561347557613474614222565b5b60006134838482850161311c565b91505092915050565b6000602082840312156134a2576134a1614222565b5b60006134b084828501613131565b91505092915050565b6000602082840312156134cf576134ce614222565b5b600082013567ffffffffffffffff8111156134ed576134ec61421d565b5b6134f984828501613146565b91505092915050565b60006020828403121561351857613517614222565b5b600082013567ffffffffffffffff8111156135365761353561421d565b5b61354284828501613174565b91505092915050565b60006020828403121561356157613560614222565b5b600061356f848285016131a2565b91505092915050565b6000806040838503121561358f5761358e614222565b5b600061359d858286016131a2565b92505060206135ae858286016130dd565b9150509250929050565b600080604083850312156135cf576135ce614222565b5b60006135dd858286016131a2565b925050602083013567ffffffffffffffff8111156135fe576135fd61421d565b5b61360a85828601613146565b9150509250929050565b600061362083836139b7565b60208301905092915050565b61363581613f5a565b82525050565b61364c61364782613f5a565b6140d3565b82525050565b600061365d82613dce565b6136678185613dfc565b935061367283613da9565b8060005b838110156136a357815161368a8882613614565b975061369583613def565b925050600181019050613676565b5085935050505092915050565b6136b981613f6c565b82525050565b6136c881613f78565b82525050565b60006136d982613dd9565b6136e38185613e0d565b93506136f3818560208601613ff4565b6136fc81614227565b840191505092915050565b600061371282613de4565b61371c8185613e29565b935061372c818560208601613ff4565b61373581614227565b840191505092915050565b600061374b82613de4565b6137558185613e3a565b9350613765818560208601613ff4565b80840191505092915050565b6000815461377e81614027565b6137888186613e3a565b945060018216600081146137a357600181146137b4576137e7565b60ff198316865281860193506137e7565b6137bd85613db9565b60005b838110156137df578154818901526001820191506020810190506137c0565b838801955050505b50505092915050565b60006137fd602683613e29565b915061380882614245565b604082019050919050565b6000613820601f83613e29565b915061382b82614294565b602082019050919050565b6000613843601e83613e29565b915061384e826142bd565b602082019050919050565b6000613866602783613e29565b9150613871826142e6565b604082019050919050565b6000613889601a83613e29565b915061389482614335565b602082019050919050565b60006138ac602083613e29565b91506138b78261435e565b602082019050919050565b60006138cf601783613e29565b91506138da82614387565b602082019050919050565b60006138f2600083613e1e565b91506138fd826143b0565b600082019050919050565b6000613915602283613e29565b9150613920826143b3565b604082019050919050565b6000613938601f83613e29565b915061394382614402565b602082019050919050565b600061395b603083613e29565b91506139668261442b565b604082019050919050565b600061397e602f83613e29565b91506139898261447a565b604082019050919050565b60006139a1601383613e29565b91506139ac826144c9565b602082019050919050565b6139c081613fce565b82525050565b6139cf81613fce565b82525050565b6139de81613fd8565b82525050565b60006139f0828461363b565b60148201915081905092915050565b6000613a0b8286613740565b9150613a178285613740565b9150613a238284613771565b9150819050949350505050565b6000613a3b826138e5565b9150819050919050565b6000602082019050613a5a600083018461362c565b92915050565b6000608082019050613a75600083018761362c565b613a82602083018661362c565b613a8f60408301856139c6565b8181036060830152613aa181846136ce565b905095945050505050565b60006020820190508181036000830152613ac68184613652565b905092915050565b6000602082019050613ae360008301846136b0565b92915050565b6000608082019050613afe60008301876136bf565b613b0b60208301866139d5565b613b1860408301856136bf565b613b2560608301846136bf565b95945050505050565b60006020820190508181036000830152613b488184613707565b905092915050565b60006020820190508181036000830152613b69816137f0565b9050919050565b60006020820190508181036000830152613b8981613813565b9050919050565b60006020820190508181036000830152613ba981613836565b9050919050565b60006020820190508181036000830152613bc981613859565b9050919050565b60006020820190508181036000830152613be98161387c565b9050919050565b60006020820190508181036000830152613c098161389f565b9050919050565b60006020820190508181036000830152613c29816138c2565b9050919050565b60006020820190508181036000830152613c4981613908565b9050919050565b60006020820190508181036000830152613c698161392b565b9050919050565b60006020820190508181036000830152613c898161394e565b9050919050565b60006020820190508181036000830152613ca981613971565b9050919050565b60006020820190508181036000830152613cc981613994565b9050919050565b6000602082019050613ce560008301846139c6565b92915050565b6000606082019050613d0060008301866139d5565b613d0d60208301856136bf565b613d1a60408301846136bf565b949350505050565b6000613d2c613d3d565b9050613d388282614059565b919050565b6000604051905090565b600067ffffffffffffffff821115613d6257613d616141e4565b5b613d6b82614227565b9050602081019050919050565b600067ffffffffffffffff821115613d9357613d926141e4565b5b613d9c82614227565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e5082613fce565b9150613e5b83613fce565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e9057613e8f614128565b5b828201905092915050565b6000613ea682613fce565b9150613eb183613fce565b925082613ec157613ec0614157565b5b828204905092915050565b6000613ed782613fce565b9150613ee283613fce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f1b57613f1a614128565b5b828202905092915050565b6000613f3182613fce565b9150613f3c83613fce565b925082821015613f4f57613f4e614128565b5b828203905092915050565b6000613f6582613fae565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614012578082015181840152602081019050613ff7565b83811115614021576000848401525b50505050565b6000600282049050600182168061403f57607f821691505b6020821081141561405357614052614186565b5b50919050565b61406282614227565b810181811067ffffffffffffffff82111715614081576140806141e4565b5b80604052505050565b600061409582613fce565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140c8576140c7614128565b5b600182019050919050565b60006140de826140e5565b9050919050565b60006140f082614238565b9050919050565b600061410282613fce565b915061410d83613fce565b92508261411d5761411c614157565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742065786365656473206d617820737570706c792100600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f476f6c64656e204b657920536f6369657479203a3a204265796f6e64204d617860008201527f20537570706c7900000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742063616e2774206265207a65726f2e000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b50565b7f4d6178206d696e7420706572207472616e73616374696f6e206578636565646560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b7f476f6c64656e204b657920536f6369657479203a3a20416c7265616479206d6960008201527f6e746564203130302074696d6573210000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6144fb81613f5a565b811461450657600080fd5b50565b61451281613f6c565b811461451d57600080fd5b50565b61452981613f78565b811461453457600080fd5b50565b61454081613f82565b811461454b57600080fd5b50565b61455781613fce565b811461456257600080fd5b5056fea2646970667358221220bf2eb5575c97ae333d37844edef07c68dd15987e0b560a20c6f7e41dc7465df164736f6c63430008070033697066733a2f2f6261667962656966347a3772336b77736f6c656b673775776470663569637a343435693562356b3234686b656378346e67343270336f6d61623565000000000000000000000000a1e8edc7afeb333a8c8001249a8cb8b8eb86c5c2

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80636352211e11610118578063a22cb465116100a0578063bedb86fb1161006f578063bedb86fb146107b3578063c87b56dd146107dc578063db7fd40814610819578063e985e9c514610835578063f2fde38b146108725761020f565b8063a22cb465146106e5578063a7bb58031461070e578063b0940d451461074d578063b88d4fde1461078a5761020f565b8063715018a6116100e7578063715018a6146106105780638456cb59146106275780638da5cb5b1461065257806395d89b411461067d57806397aba7f9146106a85761020f565b80636352211e1461054057806365f130971461057d5780636a14550c146105a857806370a08231146105d35761020f565b80632f9a7c581161019b578063438b63001161016a578063438b63001461045b578063512b658d146104985780635503a0e8146104c157806362b99ad4146104ec57806362e84eff146105175761020f565b80632f9a7c58146103c757806332cb6b0c146103f05780633ccfd60b1461041b57806342842e0e146104325761020f565b8063081812fc116101e2578063081812fc146102d0578063095ea7b31461030d57806318160ddd146103365780631c16521c1461036157806323b872dd1461039e5761020f565b806301ffc9a7146102145780630675b7c61461025157806306fdde031461027a57806307e89ec0146102a5575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061345f565b61089b565b6040516102489190613ace565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190613502565b61097d565b005b34801561028657600080fd5b5061028f610a13565b60405161029c9190613b2e565b60405180910390f35b3480156102b157600080fd5b506102ba610aa5565b6040516102c79190613cd0565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f2919061354b565b610aab565b6040516103049190613a45565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190613396565b610b27565b005b34801561034257600080fd5b5061034b610c2c565b6040516103589190613cd0565b60405180910390f35b34801561036d57600080fd5b50610388600480360381019061038391906131b7565b610c43565b6040516103959190613cd0565b60405180910390f35b3480156103aa57600080fd5b506103c560048036038101906103c09190613224565b610c5b565b005b3480156103d357600080fd5b506103ee60048036038101906103e9919061354b565b610c6b565b005b3480156103fc57600080fd5b50610405610cf1565b6040516104129190613cd0565b60405180910390f35b34801561042757600080fd5b50610430610cf7565b005b34801561043e57600080fd5b5061045960048036038101906104549190613224565b610e56565b005b34801561046757600080fd5b50610482600480360381019061047d91906131b7565b610e76565b60405161048f9190613aac565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba9190613578565b61108a565b005b3480156104cd57600080fd5b506104d661116b565b6040516104e39190613b2e565b60405180910390f35b3480156104f857600080fd5b506105016111f9565b60405161050e9190613b2e565b60405180910390f35b34801561052357600080fd5b5061053e6004803603810190610539919061354b565b611287565b005b34801561054c57600080fd5b506105676004803603810190610562919061354b565b61130d565b6040516105749190613a45565b60405180910390f35b34801561058957600080fd5b50610592611323565b60405161059f9190613cd0565b60405180910390f35b3480156105b457600080fd5b506105bd611329565b6040516105ca9190613cd0565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f591906131b7565b61132f565b6040516106079190613cd0565b60405180910390f35b34801561061c57600080fd5b506106256113ff565b005b34801561063357600080fd5b5061063c611487565b6040516106499190613ace565b60405180910390f35b34801561065e57600080fd5b5061066761149a565b6040516106749190613a45565b60405180910390f35b34801561068957600080fd5b506106926114c4565b60405161069f9190613b2e565b60405180910390f35b3480156106b457600080fd5b506106cf60048036038101906106ca9190613403565b611556565b6040516106dc9190613a45565b60405180910390f35b3480156106f157600080fd5b5061070c600480360381019061070791906132fa565b6115cb565b005b34801561071a57600080fd5b50610735600480360381019061073091906134b9565b611743565b60405161074493929190613ceb565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f919061333a565b611786565b6040516107819190613ace565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613277565b611815565b005b3480156107bf57600080fd5b506107da60048036038101906107d591906133d6565b61188d565b005b3480156107e857600080fd5b5061080360048036038101906107fe919061354b565b611926565b6040516108109190613b2e565b60405180910390f35b610833600480360381019061082e91906135b8565b6119d0565b005b34801561084157600080fd5b5061085c600480360381019061085791906131e4565b611d03565b6040516108699190613ace565b60405180910390f35b34801561087e57600080fd5b50610899600480360381019061089491906131b7565b611d97565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610976575061097582611e8f565b5b9050919050565b610985611ef9565b73ffffffffffffffffffffffffffffffffffffffff166109a361149a565b73ffffffffffffffffffffffffffffffffffffffff16146109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f090613bf0565b60405180910390fd5b80600f9080519060200190610a0f929190612f73565b5050565b606060028054610a2290614027565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e90614027565b8015610a9b5780601f10610a7057610100808354040283529160200191610a9b565b820191906000526020600020905b815481529060010190602001808311610a7e57829003601f168201915b5050505050905090565b600e5481565b6000610ab682611f01565b610aec576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b328261130d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb9611ef9565b73ffffffffffffffffffffffffffffffffffffffff1614610c1c57610be581610be0611ef9565b611d03565b610c1b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610c27838383611f4f565b505050565b6000610c36612001565b6001546000540303905090565b60126020528060005260406000206000915090505481565b610c6683838361200a565b505050565b610c73611ef9565b73ffffffffffffffffffffffffffffffffffffffff16610c9161149a565b73ffffffffffffffffffffffffffffffffffffffff1614610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde90613bf0565b60405180910390fd5b80600e8190555050565b600b5481565b610cff611ef9565b73ffffffffffffffffffffffffffffffffffffffff16610d1d61149a565b73ffffffffffffffffffffffffffffffffffffffff1614610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a90613bf0565b60405180910390fd5b60026009541415610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db090613c50565b60405180910390fd5b6002600981905550600073df18896426a836ae3e4f74f347b183e88100b00973ffffffffffffffffffffffffffffffffffffffff1647604051610dfb90613a30565b60006040518083038185875af1925050503d8060008114610e38576040519150601f19603f3d011682016040523d82523d6000602084013e610e3d565b606091505b5050905080610e4b57600080fd5b506001600981905550565b610e7183838360405180602001604052806000815250611815565b505050565b60606000610e838361132f565b905060008167ffffffffffffffff811115610ea157610ea06141e4565b5b604051908082528060200260200182016040528015610ecf5781602001602082028036833780820191505090505b5090506000610edc612001565b90506000805b8482108015610ef2575060005483105b1561107d576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161106957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461100557806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611068578385848151811061104d5761104c6141b5565b5b60200260200101818152505082806110649061408a565b9350505b5b83806110749061408a565b94505050610ee2565b8395505050505050919050565b611092611ef9565b73ffffffffffffffffffffffffffffffffffffffff166110b061149a565b73ffffffffffffffffffffffffffffffffffffffff1614611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90613bf0565b60405180910390fd5b600b5482611112610c2c565b61111c9190613e45565b111561115d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115490613b70565b60405180910390fd5b61116781836124c0565b5050565b6010805461117890614027565b80601f01602080910402602001604051908101604052809291908181526020018280546111a490614027565b80156111f15780601f106111c6576101008083540402835291602001916111f1565b820191906000526020600020905b8154815290600101906020018083116111d457829003601f168201915b505050505081565b600f805461120690614027565b80601f016020809104026020016040519081016040528092919081815260200182805461123290614027565b801561127f5780601f106112545761010080835404028352916020019161127f565b820191906000526020600020905b81548152906001019060200180831161126257829003601f168201915b505050505081565b61128f611ef9565b73ffffffffffffffffffffffffffffffffffffffff166112ad61149a565b73ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa90613bf0565b60405180910390fd5b80600c8190555050565b6000611318826124de565b600001519050919050565b600c5481565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611397576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611407611ef9565b73ffffffffffffffffffffffffffffffffffffffff1661142561149a565b73ffffffffffffffffffffffffffffffffffffffff161461147b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147290613bf0565b60405180910390fd5b6114856000612769565b565b601160009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546114d390614027565b80601f01602080910402602001604051908101604052809291908181526020018280546114ff90614027565b801561154c5780601f106115215761010080835404028352916020019161154c565b820191906000526020600020905b81548152906001019060200180831161152f57829003601f168201915b5050505050905090565b60008060008061156585611743565b809350819450829550505050600186848484604051600081526020016040526040516115949493929190613ae9565b6020604051602081039080840390855afa1580156115b6573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6115d3611ef9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611638576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611645611ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116f2611ef9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117379190613ace565b60405180910390a35050565b6000806000604184511461175657600080fd5b60008060006020870151925060408701519150606087015160001a90508083839550955095505050509193909250565b6000808360405160200161179a91906139e4565b604051602081830303815290604052805190602001209050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166117f58285611556565b73ffffffffffffffffffffffffffffffffffffffff161491505092915050565b61182084848461200a565b61183f8373ffffffffffffffffffffffffffffffffffffffff1661282f565b156118875761185084848484612852565b611886576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611895611ef9565b73ffffffffffffffffffffffffffffffffffffffff166118b361149a565b73ffffffffffffffffffffffffffffffffffffffff1614611909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190090613bf0565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b606061193182611f01565b611970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196790613c70565b60405180910390fd5b600061197a6129b2565b9050600081511161199a57604051806020016040528060008152506119c8565b806119a484612a44565b60106040516020016119b8939291906139ff565b6040516020818303038152906040525b915050919050565b816119d961149a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aa157601160009054906101000a900460ff1615611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5290613c10565b60405180910390fd5b600d54811115611aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9790613c30565b60405180910390fd5b5b60008111611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb90613bd0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4990613b90565b60405180910390fd5b600b5481611b5e610c2c565b611b689190613e45565b1115611ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba090613bb0565b60405180910390fd5b60011515611bb73384611786565b151514611cf457600c5483601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c0c9190613e45565b1115611c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4490613c90565b60405180910390fd5b82600e54611c5b9190613ecc565b341015611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490613cb0565b60405180910390fd5b82601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cec9190613e45565b925050819055505b611cfe33846124c0565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d9f611ef9565b73ffffffffffffffffffffffffffffffffffffffff16611dbd61149a565b73ffffffffffffffffffffffffffffffffffffffff1614611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a90613bf0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a90613b50565b60405180910390fd5b611e8c81612769565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611f0c612001565b11158015611f1b575060005482105b8015611f48575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000612015826124de565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612080576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166120a1611ef9565b73ffffffffffffffffffffffffffffffffffffffff1614806120d057506120cf856120ca611ef9565b611d03565b5b8061211557506120de611ef9565b73ffffffffffffffffffffffffffffffffffffffff166120fd84610aab565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061214e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121b5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121c28585856001612ba5565b6121ce60008487611f4f565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561244e57600054821461244d57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124b98585856001612bab565b5050505050565b6124da828260405180602001604052806000815250612bb1565b5050565b6124e6612ff9565b6000829050806124f4612001565b1161273257600054811015612731576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161272f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612613578092505050612764565b5b60011561272e57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612729578092505050612764565b612614565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612878611ef9565b8786866040518563ffffffff1660e01b815260040161289a9493929190613a60565b602060405180830381600087803b1580156128b457600080fd5b505af19250505080156128e557506040513d601f19601f820116820180604052508101906128e2919061348c565b60015b61295f573d8060008114612915576040519150601f19603f3d011682016040523d82523d6000602084013e61291a565b606091505b50600081511415612957576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546129c190614027565b80601f01602080910402602001604051908101604052809291908181526020018280546129ed90614027565b8015612a3a5780601f10612a0f57610100808354040283529160200191612a3a565b820191906000526020600020905b815481529060010190602001808311612a1d57829003601f168201915b5050505050905090565b60606000821415612a8c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ba0565b600082905060005b60008214612abe578080612aa79061408a565b915050600a82612ab79190613e9b565b9150612a94565b60008167ffffffffffffffff811115612ada57612ad96141e4565b5b6040519080825280601f01601f191660200182016040528015612b0c5781602001600182028036833780820191505090505b5090505b60008514612b9957600182612b259190613f26565b9150600a85612b3491906140f7565b6030612b409190613e45565b60f81b818381518110612b5657612b556141b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b929190613e9b565b9450612b10565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c1e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612c59576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c666000858386612ba5565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612e278673ffffffffffffffffffffffffffffffffffffffff1661282f565b15612eec575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e9c6000878480600101955087612852565b612ed2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612e2d578260005414612ee757600080fd5b612f57565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612eed575b816000819055505050612f6d6000858386612bab565b50505050565b828054612f7f90614027565b90600052602060002090601f016020900481019282612fa15760008555612fe8565b82601f10612fba57805160ff1916838001178555612fe8565b82800160010185558215612fe8579182015b82811115612fe7578251825591602001919060010190612fcc565b5b509050612ff5919061303c565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561305557600081600090555060010161303d565b5090565b600061306c61306784613d47565b613d22565b90508281526020810184848401111561308857613087614218565b5b613093848285613fe5565b509392505050565b60006130ae6130a984613d78565b613d22565b9050828152602081018484840111156130ca576130c9614218565b5b6130d5848285613fe5565b509392505050565b6000813590506130ec816144f2565b92915050565b60008135905061310181614509565b92915050565b60008135905061311681614520565b92915050565b60008135905061312b81614537565b92915050565b60008151905061314081614537565b92915050565b600082601f83011261315b5761315a614213565b5b813561316b848260208601613059565b91505092915050565b600082601f83011261318957613188614213565b5b813561319984826020860161309b565b91505092915050565b6000813590506131b18161454e565b92915050565b6000602082840312156131cd576131cc614222565b5b60006131db848285016130dd565b91505092915050565b600080604083850312156131fb576131fa614222565b5b6000613209858286016130dd565b925050602061321a858286016130dd565b9150509250929050565b60008060006060848603121561323d5761323c614222565b5b600061324b868287016130dd565b935050602061325c868287016130dd565b925050604061326d868287016131a2565b9150509250925092565b6000806000806080858703121561329157613290614222565b5b600061329f878288016130dd565b94505060206132b0878288016130dd565b93505060406132c1878288016131a2565b925050606085013567ffffffffffffffff8111156132e2576132e161421d565b5b6132ee87828801613146565b91505092959194509250565b6000806040838503121561331157613310614222565b5b600061331f858286016130dd565b9250506020613330858286016130f2565b9150509250929050565b6000806040838503121561335157613350614222565b5b600061335f858286016130dd565b925050602083013567ffffffffffffffff8111156133805761337f61421d565b5b61338c85828601613146565b9150509250929050565b600080604083850312156133ad576133ac614222565b5b60006133bb858286016130dd565b92505060206133cc858286016131a2565b9150509250929050565b6000602082840312156133ec576133eb614222565b5b60006133fa848285016130f2565b91505092915050565b6000806040838503121561341a57613419614222565b5b600061342885828601613107565b925050602083013567ffffffffffffffff8111156134495761344861421d565b5b61345585828601613146565b9150509250929050565b60006020828403121561347557613474614222565b5b60006134838482850161311c565b91505092915050565b6000602082840312156134a2576134a1614222565b5b60006134b084828501613131565b91505092915050565b6000602082840312156134cf576134ce614222565b5b600082013567ffffffffffffffff8111156134ed576134ec61421d565b5b6134f984828501613146565b91505092915050565b60006020828403121561351857613517614222565b5b600082013567ffffffffffffffff8111156135365761353561421d565b5b61354284828501613174565b91505092915050565b60006020828403121561356157613560614222565b5b600061356f848285016131a2565b91505092915050565b6000806040838503121561358f5761358e614222565b5b600061359d858286016131a2565b92505060206135ae858286016130dd565b9150509250929050565b600080604083850312156135cf576135ce614222565b5b60006135dd858286016131a2565b925050602083013567ffffffffffffffff8111156135fe576135fd61421d565b5b61360a85828601613146565b9150509250929050565b600061362083836139b7565b60208301905092915050565b61363581613f5a565b82525050565b61364c61364782613f5a565b6140d3565b82525050565b600061365d82613dce565b6136678185613dfc565b935061367283613da9565b8060005b838110156136a357815161368a8882613614565b975061369583613def565b925050600181019050613676565b5085935050505092915050565b6136b981613f6c565b82525050565b6136c881613f78565b82525050565b60006136d982613dd9565b6136e38185613e0d565b93506136f3818560208601613ff4565b6136fc81614227565b840191505092915050565b600061371282613de4565b61371c8185613e29565b935061372c818560208601613ff4565b61373581614227565b840191505092915050565b600061374b82613de4565b6137558185613e3a565b9350613765818560208601613ff4565b80840191505092915050565b6000815461377e81614027565b6137888186613e3a565b945060018216600081146137a357600181146137b4576137e7565b60ff198316865281860193506137e7565b6137bd85613db9565b60005b838110156137df578154818901526001820191506020810190506137c0565b838801955050505b50505092915050565b60006137fd602683613e29565b915061380882614245565b604082019050919050565b6000613820601f83613e29565b915061382b82614294565b602082019050919050565b6000613843601e83613e29565b915061384e826142bd565b602082019050919050565b6000613866602783613e29565b9150613871826142e6565b604082019050919050565b6000613889601a83613e29565b915061389482614335565b602082019050919050565b60006138ac602083613e29565b91506138b78261435e565b602082019050919050565b60006138cf601783613e29565b91506138da82614387565b602082019050919050565b60006138f2600083613e1e565b91506138fd826143b0565b600082019050919050565b6000613915602283613e29565b9150613920826143b3565b604082019050919050565b6000613938601f83613e29565b915061394382614402565b602082019050919050565b600061395b603083613e29565b91506139668261442b565b604082019050919050565b600061397e602f83613e29565b91506139898261447a565b604082019050919050565b60006139a1601383613e29565b91506139ac826144c9565b602082019050919050565b6139c081613fce565b82525050565b6139cf81613fce565b82525050565b6139de81613fd8565b82525050565b60006139f0828461363b565b60148201915081905092915050565b6000613a0b8286613740565b9150613a178285613740565b9150613a238284613771565b9150819050949350505050565b6000613a3b826138e5565b9150819050919050565b6000602082019050613a5a600083018461362c565b92915050565b6000608082019050613a75600083018761362c565b613a82602083018661362c565b613a8f60408301856139c6565b8181036060830152613aa181846136ce565b905095945050505050565b60006020820190508181036000830152613ac68184613652565b905092915050565b6000602082019050613ae360008301846136b0565b92915050565b6000608082019050613afe60008301876136bf565b613b0b60208301866139d5565b613b1860408301856136bf565b613b2560608301846136bf565b95945050505050565b60006020820190508181036000830152613b488184613707565b905092915050565b60006020820190508181036000830152613b69816137f0565b9050919050565b60006020820190508181036000830152613b8981613813565b9050919050565b60006020820190508181036000830152613ba981613836565b9050919050565b60006020820190508181036000830152613bc981613859565b9050919050565b60006020820190508181036000830152613be98161387c565b9050919050565b60006020820190508181036000830152613c098161389f565b9050919050565b60006020820190508181036000830152613c29816138c2565b9050919050565b60006020820190508181036000830152613c4981613908565b9050919050565b60006020820190508181036000830152613c698161392b565b9050919050565b60006020820190508181036000830152613c898161394e565b9050919050565b60006020820190508181036000830152613ca981613971565b9050919050565b60006020820190508181036000830152613cc981613994565b9050919050565b6000602082019050613ce560008301846139c6565b92915050565b6000606082019050613d0060008301866139d5565b613d0d60208301856136bf565b613d1a60408301846136bf565b949350505050565b6000613d2c613d3d565b9050613d388282614059565b919050565b6000604051905090565b600067ffffffffffffffff821115613d6257613d616141e4565b5b613d6b82614227565b9050602081019050919050565b600067ffffffffffffffff821115613d9357613d926141e4565b5b613d9c82614227565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e5082613fce565b9150613e5b83613fce565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e9057613e8f614128565b5b828201905092915050565b6000613ea682613fce565b9150613eb183613fce565b925082613ec157613ec0614157565b5b828204905092915050565b6000613ed782613fce565b9150613ee283613fce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f1b57613f1a614128565b5b828202905092915050565b6000613f3182613fce565b9150613f3c83613fce565b925082821015613f4f57613f4e614128565b5b828203905092915050565b6000613f6582613fae565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614012578082015181840152602081019050613ff7565b83811115614021576000848401525b50505050565b6000600282049050600182168061403f57607f821691505b6020821081141561405357614052614186565b5b50919050565b61406282614227565b810181811067ffffffffffffffff82111715614081576140806141e4565b5b80604052505050565b600061409582613fce565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156140c8576140c7614128565b5b600182019050919050565b60006140de826140e5565b9050919050565b60006140f082614238565b9050919050565b600061410282613fce565b915061410d83613fce565b92508261411d5761411c614157565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742065786365656473206d617820737570706c792100600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f476f6c64656e204b657920536f6369657479203a3a204265796f6e64204d617860008201527f20537570706c7900000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742063616e2774206265207a65726f2e000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b50565b7f4d6178206d696e7420706572207472616e73616374696f6e206578636565646560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b7f476f6c64656e204b657920536f6369657479203a3a20416c7265616479206d6960008201527f6e746564203130302074696d6573210000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6144fb81613f5a565b811461450657600080fd5b50565b61451281613f6c565b811461451d57600080fd5b50565b61452981613f78565b811461453457600080fd5b50565b61454081613f82565b811461454b57600080fd5b50565b61455781613fce565b811461456257600080fd5b5056fea2646970667358221220bf2eb5575c97ae333d37844edef07c68dd15987e0b560a20c6f7e41dc7465df164736f6c63430008070033

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

000000000000000000000000a1e8edc7afeb333a8c8001249a8cb8b8eb86c5c2

-----Decoded View---------------
Arg [0] : _signerAddress (address): 0xA1e8EdC7AfEB333A8c8001249A8cb8B8Eb86c5c2

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a1e8edc7afeb333a8c8001249a8cb8b8eb86c5c2


Deployed Bytecode Sourcemap

37034:5196:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19906:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41613:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23021:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37291:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24525:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24087:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19146:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37449:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25390:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41726:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37170:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42024:197;;;;;;;;;;;;;:::i;:::-;;25631:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40712:827;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39065:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37374:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37344:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41833:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22829:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37210:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37253:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20275:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4293:103;;;;;;;;;;;;;:::i;:::-;;37416:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3642:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23190:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39568:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24801:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39783;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;39356:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25887:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41935:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40192:367;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38541:491;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25159:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4551:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19906:305;20008:4;20060:25;20045:40;;;:11;:40;;;;:105;;;;20117:33;20102:48;;;:11;:48;;;;20045:105;:158;;;;20167:36;20191:11;20167:23;:36::i;:::-;20045:158;20025:178;;19906:305;;;:::o;41613:105::-;3873:12;:10;:12::i;:::-;3862:23;;:7;:5;:7::i;:::-;:23;;;3854:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41700:10:::1;41688:9;:22;;;;;;;;;;;;:::i;:::-;;41613:105:::0;:::o;23021:100::-;23075:13;23108:5;23101:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23021:100;:::o;37291:44::-;;;;:::o;24525:204::-;24593:7;24618:16;24626:7;24618;:16::i;:::-;24613:64;;24643:34;;;;;;;;;;;;;;24613:64;24697:15;:24;24713:7;24697:24;;;;;;;;;;;;;;;;;;;;;24690:31;;24525:204;;;:::o;24087:372::-;24160:13;24176:24;24192:7;24176:15;:24::i;:::-;24160:40;;24221:5;24215:11;;:2;:11;;;24211:48;;;24235:24;;;;;;;;;;;;;;24211:48;24292:5;24276:21;;:12;:10;:12::i;:::-;:21;;;24272:139;;24303:37;24320:5;24327:12;:10;:12::i;:::-;24303:16;:37::i;:::-;24299:112;;24364:35;;;;;;;;;;;;;;24299:112;24272:139;24423:28;24432:2;24436:7;24445:5;24423:8;:28::i;:::-;24149:310;24087:372;;:::o;19146:312::-;19199:7;19424:15;:13;:15::i;:::-;19409:12;;19393:13;;:28;:46;19386:53;;19146:312;:::o;37449:50::-;;;;;;;;;;;;;;;;;:::o;25390:170::-;25524:28;25534:4;25540:2;25544:7;25524:9;:28::i;:::-;25390:170;;;:::o;41726:99::-;3873:12;:10;:12::i;:::-;3862:23;;:7;:5;:7::i;:::-;:23;;;3854:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41812:5:::1;41792:17;:25;;;;41726:99:::0;:::o;37170:33::-;;;;:::o;42024:197::-;3873:12;:10;:12::i;:::-;3862:23;;:7;:5;:7::i;:::-;:23;;;3854:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;486:1:::1;706:7;;:19;;698:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;486:1;839:7;:18;;;;42084:12:::2;42110:42;42102:56;;42166:21;42102:90;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42083:109;;;42207:7;42199:16;;;::::0;::::2;;42076:145;442:1:::1;884:7;:22;;;;42024:197::o:0;25631:185::-;25769:39;25786:4;25792:2;25796:7;25769:39;;;;;;;;;;;;:16;:39::i;:::-;25631:185;;;:::o;40712:827::-;40772:16;40797:23;40823:17;40833:6;40823:9;:17::i;:::-;40797:43;;40847:30;40894:15;40880:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40847:63;;40917:22;40942:15;:13;:15::i;:::-;40917:40;;40964:23;40998:26;41033:474;41058:15;41040;:33;:67;;;;;41094:13;;41077:14;:30;41040:67;41033:474;;;41118:31;41152:11;:27;41164:14;41152:27;;;;;;;;;;;41118:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41195:9;:16;;;41190:285;;41254:1;41228:28;;:9;:14;;;:28;;;41224:94;;41292:9;:14;;;41271:35;;41224:94;41356:6;41334:28;;:18;:28;;;41330:136;;;41410:14;41377:13;41391:15;41377:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;41437:17;;;;;:::i;:::-;;;;41330:136;41190:285;41483:16;;;;;:::i;:::-;;;;41109:398;41033:474;;;41520:13;41513:20;;;;;;;40712:827;;;:::o;39065:228::-;3873:12;:10;:12::i;:::-;3862:23;;:7;:5;:7::i;:::-;:23;;;3854:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39195:10:::1;;39180:11;39164:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:41;;39156:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39252:33;39262:9;39273:11;39252:9;:33::i;:::-;39065:228:::0;;:::o;37374:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37344:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41833:94::-;3873:12;:10;:12::i;:::-;3862:23;;:7;:5;:7::i;:::-;:23;;;3854:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41913:6:::1;41895:15;:24;;;;41833:94:::0;:::o;22829:125::-;22893:7;22920:21;22933:7;22920:12;:21::i;:::-;:26;;;22913:33;;22829:125;;;:::o;37210:36::-;;;;:::o;37253:31::-;;;;:::o;20275:206::-;20339:7;20380:1;20363:19;;:5;:19;;;20359:60;;;20391:28;;;;;;;;;;;;;;20359:60;20445:12;:19;20458:5;20445:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;20437:36;;20430:43;;20275:206;;;:::o;4293:103::-;3873:12;:10;:12::i;:::-;3862:23;;:7;:5;:7::i;:::-;:23;;;3854:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4358:30:::1;4385:1;4358:18;:30::i;:::-;4293:103::o:0;37416:24::-;;;;;;;;;;;;;:::o;3642:87::-;3688:7;3715:6;;;;;;;;;;;3708:13;;3642:87;:::o;23190:104::-;23246:13;23279:7;23272:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23190:104;:::o;39568:209::-;39647:7;39663;39672:9;39683;39711:19;39726:3;39711:14;:19::i;:::-;39699:31;;;;;;;;;;;;39744:27;39754:7;39763:1;39766;39769;39744:27;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39737:34;;;;;39568:209;;;;:::o;24801:287::-;24912:12;:10;:12::i;:::-;24900:24;;:8;:24;;;24896:54;;;24933:17;;;;;;;;;;;;;;24896:54;25008:8;24963:18;:32;24982:12;:10;:12::i;:::-;24963:32;;;;;;;;;;;;;;;:42;24996:8;24963:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25061:8;25032:48;;25047:12;:10;:12::i;:::-;25032:48;;;25071:8;25032:48;;;;;;:::i;:::-;;;;;;;;24801:287;;:::o;39783:::-;39846:5;39853:7;39862;39900:2;39886:3;:10;:16;39878:25;;;;;;39910:9;39921;39932:7;39977:2;39972:3;39968:12;39962:19;39957:24;;40002:2;39997:3;39993:12;39987:19;39982:24;;40035:2;40030:3;40026:12;40020:19;40017:1;40012:28;40007:33;;40056:1;40059;40062;40048:16;;;;;;;;;39783:287;;;;;:::o;39356:206::-;39431:4;39444:15;39489:5;39472:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;39462:34;;;;;;39444:52;;39542:13;;;;;;;;;;;39511:44;;:27;39525:7;39534:3;39511:13;:27::i;:::-;:44;;;39503:53;;;39356:206;;;;:::o;25887:370::-;26054:28;26064:4;26070:2;26074:7;26054:9;:28::i;:::-;26097:15;:2;:13;;;:15::i;:::-;26093:157;;;26118:56;26149:4;26155:2;26159:7;26168:5;26118:30;:56::i;:::-;26114:136;;26198:40;;;;;;;;;;;;;;26114:136;26093:157;25887:370;;;;:::o;41935:81::-;3873:12;:10;:12::i;:::-;3862:23;;:7;:5;:7::i;:::-;:23;;;3854:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42002:6:::1;41994:5;;:14;;;;;;;;;;;;;;;;;;41935:81:::0;:::o;40192:367::-;40266:13;40296:17;40304:8;40296:7;:17::i;:::-;40288:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;40374:28;40405:10;:8;:10::i;:::-;40374:41;;40460:1;40435:14;40429:28;:32;:122;;;;;;;;;;;;;;;;;40493:14;40509:19;:8;:17;:19::i;:::-;40530:9;40476:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40429:122;40422:129;;;40192:367;;;:::o;38541:491::-;38622:9;38027:7;:5;:7::i;:::-;38013:21;;:10;:21;;;38009:186;;38060:5;;;;;;;;;;;38059:6;38051:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;38129:11;;38116:9;:24;;38108:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38009:186;38225:1;38213:9;:13;38205:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;38289:10;38276:23;;:9;:23;;;38268:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;38382:10;;38369:9;38353:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;38345:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;38681:4:::1;38649:36;;:28;38661:10;38673:3;38649:11;:28::i;:::-;:36;;;38646:334;;38753:15;;38740:9;38710:15;:27;38726:10;38710:27;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:58;;38702:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;38876:9;38856:17;;:29;;;;:::i;:::-;38843:9;:42;;38835:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;38955:9;38924:15;:27;38940:10;38924:27;;;;;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;;;;;;;38646:334;38992:32;39002:10;39014:9;38992;:32::i;:::-;38541:491:::0;;;:::o;25159:164::-;25256:4;25280:18;:25;25299:5;25280:25;;;;;;;;;;;;;;;:35;25306:8;25280:35;;;;;;;;;;;;;;;;;;;;;;;;;25273:42;;25159:164;;;;:::o;4551:201::-;3873:12;:10;:12::i;:::-;3862:23;;:7;:5;:7::i;:::-;:23;;;3854:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4660:1:::1;4640:22;;:8;:22;;;;4632:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4716:28;4735:8;4716:18;:28::i;:::-;4551:201:::0;:::o;11134:157::-;11219:4;11258:25;11243:40;;;:11;:40;;;;11236:47;;11134:157;;;:::o;2932:98::-;2985:7;3012:10;3005:17;;2932:98;:::o;26512:174::-;26569:4;26612:7;26593:15;:13;:15::i;:::-;:26;;:53;;;;;26633:13;;26623:7;:23;26593:53;:85;;;;;26651:11;:20;26663:7;26651:20;;;;;;;;;;;:27;;;;;;;;;;;;26650:28;26593:85;26586:92;;26512:174;;;:::o;35734:196::-;35876:2;35849:15;:24;35865:7;35849:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35914:7;35910:2;35894:28;;35903:5;35894:28;;;;;;;;;;;;35734:196;;;:::o;40585:95::-;40650:7;40673:1;40666:8;;40585:95;:::o;30682:2130::-;30797:35;30835:21;30848:7;30835:12;:21::i;:::-;30797:59;;30895:4;30873:26;;:13;:18;;;:26;;;30869:67;;30908:28;;;;;;;;;;;;;;30869:67;30949:22;30991:4;30975:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;31012:36;31029:4;31035:12;:10;:12::i;:::-;31012:16;:36::i;:::-;30975:73;:126;;;;31089:12;:10;:12::i;:::-;31065:36;;:20;31077:7;31065:11;:20::i;:::-;:36;;;30975:126;30949:153;;31120:17;31115:66;;31146:35;;;;;;;;;;;;;;31115:66;31210:1;31196:16;;:2;:16;;;31192:52;;;31221:23;;;;;;;;;;;;;;31192:52;31257:43;31279:4;31285:2;31289:7;31298:1;31257:21;:43::i;:::-;31365:35;31382:1;31386:7;31395:4;31365:8;:35::i;:::-;31726:1;31696:12;:18;31709:4;31696:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31770:1;31742:12;:16;31755:2;31742:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31788:31;31822:11;:20;31834:7;31822:20;;;;;;;;;;;31788:54;;31873:2;31857:8;:13;;;:18;;;;;;;;;;;;;;;;;;31923:15;31890:8;:23;;;:49;;;;;;;;;;;;;;;;;;32191:19;32223:1;32213:7;:11;32191:33;;32239:31;32273:11;:24;32285:11;32273:24;;;;;;;;;;;32239:58;;32341:1;32316:27;;:8;:13;;;;;;;;;;;;:27;;;32312:384;;;32526:13;;32511:11;:28;32507:174;;32580:4;32564:8;:13;;;:20;;;;;;;;;;;;;;;;;;32633:13;:28;;;32607:8;:23;;;:54;;;;;;;;;;;;;;;;;;32507:174;32312:384;31671:1036;;;32743:7;32739:2;32724:27;;32733:4;32724:27;;;;;;;;;;;;32762:42;32783:4;32789:2;32793:7;32802:1;32762:20;:42::i;:::-;30786:2026;;30682:2130;;;:::o;26770:104::-;26839:27;26849:2;26853:8;26839:27;;;;;;;;;;;;:9;:27::i;:::-;26770:104;;:::o;21656:1111::-;21718:21;;:::i;:::-;21752:12;21767:7;21752:22;;21835:4;21816:15;:13;:15::i;:::-;:23;21812:888;;21852:13;;21845:4;:20;21841:859;;;21886:31;21920:11;:17;21932:4;21920:17;;;;;;;;;;;21886:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21961:9;:16;;;21956:729;;22032:1;22006:28;;:9;:14;;;:28;;;22002:101;;22070:9;22063:16;;;;;;22002:101;22405:261;22412:4;22405:261;;;22445:6;;;;;;;;22490:11;:17;22502:4;22490:17;;;;;;;;;;;22478:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22564:1;22538:28;;:9;:14;;;:28;;;22534:109;;22606:9;22599:16;;;;;;22534:109;22405:261;;;21956:729;21867:833;21841:859;21812:888;22728:31;;;;;;;;;;;;;;21656:1111;;;;:::o;4912:191::-;4986:16;5005:6;;;;;;;;;;;4986:25;;5031:8;5022:6;;:17;;;;;;;;;;;;;;;;;;5086:8;5055:40;;5076:8;5055:40;;;;;;;;;;;;4975:128;4912:191;:::o;5364:115::-;5424:4;5470:1;5448:7;:19;;;:23;5441:30;;5364:115;;;:::o;35940:667::-;36103:4;36140:2;36124:36;;;36161:12;:10;:12::i;:::-;36175:4;36181:7;36190:5;36124:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36120:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36375:1;36358:6;:13;:18;36354:235;;;36404:40;;;;;;;;;;;;;;36354:235;36547:6;36541:13;36532:6;36528:2;36524:15;36517:38;36120:480;36253:45;;;36243:55;;;:6;:55;;;;36236:62;;;35940:667;;;;;;:::o;37781:110::-;37841:13;37874:9;37867:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37781:110;:::o;1190:534::-;1246:13;1287:1;1278:5;:10;1274:53;;;1305:10;;;;;;;;;;;;;;;;;;;;;1274:53;1337:12;1352:5;1337:20;;1368:14;1393:78;1408:1;1400:4;:9;1393:78;;1426:8;;;;;:::i;:::-;;;;1457:2;1449:10;;;;;:::i;:::-;;;1393:78;;;1481:19;1513:6;1503:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1481:39;;1531:154;1547:1;1538:5;:10;1531:154;;1575:1;1565:11;;;;;:::i;:::-;;;1642:2;1634:5;:10;;;;:::i;:::-;1621:2;:24;;;;:::i;:::-;1608:39;;1591:6;1598;1591:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1671:2;1662:11;;;;;:::i;:::-;;;1531:154;;;1709:6;1695:21;;;;;1190:534;;;;:::o;36618:159::-;;;;;:::o;36787:158::-;;;;;:::o;27247:1749::-;27370:20;27393:13;;27370:36;;27435:1;27421:16;;:2;:16;;;27417:48;;;27446:19;;;;;;;;;;;;;;27417:48;27492:1;27480:8;:13;27476:44;;;27502:18;;;;;;;;;;;;;;27476:44;27533:61;27563:1;27567:2;27571:12;27585:8;27533:21;:61::i;:::-;27906:8;27871:12;:16;27884:2;27871:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27970:8;27930:12;:16;27943:2;27930:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28029:2;27996:11;:25;28008:12;27996:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;28096:15;28046:11;:25;28058:12;28046:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;28129:20;28152:12;28129:35;;28179:11;28208:8;28193:12;:23;28179:37;;28237:15;:2;:13;;;:15::i;:::-;28233:631;;;28273:313;28329:12;28325:2;28304:38;;28321:1;28304:38;;;;;;;;;;;;28370:69;28409:1;28413:2;28417:14;;;;;;28433:5;28370:30;:69::i;:::-;28365:174;;28475:40;;;;;;;;;;;;;;28365:174;28581:3;28566:12;:18;28273:313;;28667:12;28650:13;;:29;28646:43;;28681:8;;;28646:43;28233:631;;;28730:119;28786:14;;;;;;28782:2;28761:40;;28778:1;28761:40;;;;;;;;;;;;28844:3;28829:12;:18;28730:119;;28233:631;28894:12;28878:13;:28;;;;27846:1072;;28928:60;28957:1;28961:2;28965:12;28979:8;28928:20;:60::i;:::-;27359:1637;27247:1749;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:329::-;2481:6;2530:2;2518:9;2509:7;2505:23;2501:32;2498:119;;;2536:79;;:::i;:::-;2498:119;2656:1;2681:53;2726:7;2717:6;2706:9;2702:22;2681:53;:::i;:::-;2671:63;;2627:117;2422:329;;;;:::o;2757:474::-;2825:6;2833;2882:2;2870:9;2861:7;2857:23;2853:32;2850:119;;;2888:79;;:::i;:::-;2850:119;3008:1;3033:53;3078:7;3069:6;3058:9;3054:22;3033:53;:::i;:::-;3023:63;;2979:117;3135:2;3161:53;3206:7;3197:6;3186:9;3182:22;3161:53;:::i;:::-;3151:63;;3106:118;2757:474;;;;;:::o;3237:619::-;3314:6;3322;3330;3379:2;3367:9;3358:7;3354:23;3350:32;3347:119;;;3385:79;;:::i;:::-;3347:119;3505:1;3530:53;3575:7;3566:6;3555:9;3551:22;3530:53;:::i;:::-;3520:63;;3476:117;3632:2;3658:53;3703:7;3694:6;3683:9;3679:22;3658:53;:::i;:::-;3648:63;;3603:118;3760:2;3786:53;3831:7;3822:6;3811:9;3807:22;3786:53;:::i;:::-;3776:63;;3731:118;3237:619;;;;;:::o;3862:943::-;3957:6;3965;3973;3981;4030:3;4018:9;4009:7;4005:23;4001:33;3998:120;;;4037:79;;:::i;:::-;3998:120;4157:1;4182:53;4227:7;4218:6;4207:9;4203:22;4182:53;:::i;:::-;4172:63;;4128:117;4284:2;4310:53;4355:7;4346:6;4335:9;4331:22;4310:53;:::i;:::-;4300:63;;4255:118;4412:2;4438:53;4483:7;4474:6;4463:9;4459:22;4438:53;:::i;:::-;4428:63;;4383:118;4568:2;4557:9;4553:18;4540:32;4599:18;4591:6;4588:30;4585:117;;;4621:79;;:::i;:::-;4585:117;4726:62;4780:7;4771:6;4760:9;4756:22;4726:62;:::i;:::-;4716:72;;4511:287;3862:943;;;;;;;:::o;4811:468::-;4876:6;4884;4933:2;4921:9;4912:7;4908:23;4904:32;4901:119;;;4939:79;;:::i;:::-;4901:119;5059:1;5084:53;5129:7;5120:6;5109:9;5105:22;5084:53;:::i;:::-;5074:63;;5030:117;5186:2;5212:50;5254:7;5245:6;5234:9;5230:22;5212:50;:::i;:::-;5202:60;;5157:115;4811:468;;;;;:::o;5285:652::-;5362:6;5370;5419:2;5407:9;5398:7;5394:23;5390:32;5387:119;;;5425:79;;:::i;:::-;5387:119;5545:1;5570:53;5615:7;5606:6;5595:9;5591:22;5570:53;:::i;:::-;5560:63;;5516:117;5700:2;5689:9;5685:18;5672:32;5731:18;5723:6;5720:30;5717:117;;;5753:79;;:::i;:::-;5717:117;5858:62;5912:7;5903:6;5892:9;5888:22;5858:62;:::i;:::-;5848:72;;5643:287;5285:652;;;;;:::o;5943:474::-;6011:6;6019;6068:2;6056:9;6047:7;6043:23;6039:32;6036:119;;;6074:79;;:::i;:::-;6036:119;6194:1;6219:53;6264:7;6255:6;6244:9;6240:22;6219:53;:::i;:::-;6209:63;;6165:117;6321:2;6347:53;6392:7;6383:6;6372:9;6368:22;6347:53;:::i;:::-;6337:63;;6292:118;5943:474;;;;;:::o;6423:323::-;6479:6;6528:2;6516:9;6507:7;6503:23;6499:32;6496:119;;;6534:79;;:::i;:::-;6496:119;6654:1;6679:50;6721:7;6712:6;6701:9;6697:22;6679:50;:::i;:::-;6669:60;;6625:114;6423:323;;;;:::o;6752:652::-;6829:6;6837;6886:2;6874:9;6865:7;6861:23;6857:32;6854:119;;;6892:79;;:::i;:::-;6854:119;7012:1;7037:53;7082:7;7073:6;7062:9;7058:22;7037:53;:::i;:::-;7027:63;;6983:117;7167:2;7156:9;7152:18;7139:32;7198:18;7190:6;7187:30;7184:117;;;7220:79;;:::i;:::-;7184:117;7325:62;7379:7;7370:6;7359:9;7355:22;7325:62;:::i;:::-;7315:72;;7110:287;6752:652;;;;;:::o;7410:327::-;7468:6;7517:2;7505:9;7496:7;7492:23;7488:32;7485:119;;;7523:79;;:::i;:::-;7485:119;7643:1;7668:52;7712:7;7703:6;7692:9;7688:22;7668:52;:::i;:::-;7658:62;;7614:116;7410:327;;;;:::o;7743:349::-;7812:6;7861:2;7849:9;7840:7;7836:23;7832:32;7829:119;;;7867:79;;:::i;:::-;7829:119;7987:1;8012:63;8067:7;8058:6;8047:9;8043:22;8012:63;:::i;:::-;8002:73;;7958:127;7743:349;;;;:::o;8098:507::-;8166:6;8215:2;8203:9;8194:7;8190:23;8186:32;8183:119;;;8221:79;;:::i;:::-;8183:119;8369:1;8358:9;8354:17;8341:31;8399:18;8391:6;8388:30;8385:117;;;8421:79;;:::i;:::-;8385:117;8526:62;8580:7;8571:6;8560:9;8556:22;8526:62;:::i;:::-;8516:72;;8312:286;8098:507;;;;:::o;8611:509::-;8680:6;8729:2;8717:9;8708:7;8704:23;8700:32;8697:119;;;8735:79;;:::i;:::-;8697:119;8883:1;8872:9;8868:17;8855:31;8913:18;8905:6;8902:30;8899:117;;;8935:79;;:::i;:::-;8899:117;9040:63;9095:7;9086:6;9075:9;9071:22;9040:63;:::i;:::-;9030:73;;8826:287;8611:509;;;;:::o;9126:329::-;9185:6;9234:2;9222:9;9213:7;9209:23;9205:32;9202:119;;;9240:79;;:::i;:::-;9202:119;9360:1;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9331:117;9126:329;;;;:::o;9461:474::-;9529:6;9537;9586:2;9574:9;9565:7;9561:23;9557:32;9554:119;;;9592:79;;:::i;:::-;9554:119;9712:1;9737:53;9782:7;9773:6;9762:9;9758:22;9737:53;:::i;:::-;9727:63;;9683:117;9839:2;9865:53;9910:7;9901:6;9890:9;9886:22;9865:53;:::i;:::-;9855:63;;9810:118;9461:474;;;;;:::o;9941:652::-;10018:6;10026;10075:2;10063:9;10054:7;10050:23;10046:32;10043:119;;;10081:79;;:::i;:::-;10043:119;10201:1;10226:53;10271:7;10262:6;10251:9;10247:22;10226:53;:::i;:::-;10216:63;;10172:117;10356:2;10345:9;10341:18;10328:32;10387:18;10379:6;10376:30;10373:117;;;10409:79;;:::i;:::-;10373:117;10514:62;10568:7;10559:6;10548:9;10544:22;10514:62;:::i;:::-;10504:72;;10299:287;9941:652;;;;;:::o;10599:179::-;10668:10;10689:46;10731:3;10723:6;10689:46;:::i;:::-;10767:4;10762:3;10758:14;10744:28;;10599:179;;;;:::o;10784:118::-;10871:24;10889:5;10871:24;:::i;:::-;10866:3;10859:37;10784:118;;:::o;10908:157::-;11013:45;11033:24;11051:5;11033:24;:::i;:::-;11013:45;:::i;:::-;11008:3;11001:58;10908:157;;:::o;11101:732::-;11220:3;11249:54;11297:5;11249:54;:::i;:::-;11319:86;11398:6;11393:3;11319:86;:::i;:::-;11312:93;;11429:56;11479:5;11429:56;:::i;:::-;11508:7;11539:1;11524:284;11549:6;11546:1;11543:13;11524:284;;;11625:6;11619:13;11652:63;11711:3;11696:13;11652:63;:::i;:::-;11645:70;;11738:60;11791:6;11738:60;:::i;:::-;11728:70;;11584:224;11571:1;11568;11564:9;11559:14;;11524:284;;;11528:14;11824:3;11817:10;;11225:608;;;11101:732;;;;:::o;11839:109::-;11920:21;11935:5;11920:21;:::i;:::-;11915:3;11908:34;11839:109;;:::o;11954:118::-;12041:24;12059:5;12041:24;:::i;:::-;12036:3;12029:37;11954:118;;:::o;12078:360::-;12164:3;12192:38;12224:5;12192:38;:::i;:::-;12246:70;12309:6;12304:3;12246:70;:::i;:::-;12239:77;;12325:52;12370:6;12365:3;12358:4;12351:5;12347:16;12325:52;:::i;:::-;12402:29;12424:6;12402:29;:::i;:::-;12397:3;12393:39;12386:46;;12168:270;12078:360;;;;:::o;12444:364::-;12532:3;12560:39;12593:5;12560:39;:::i;:::-;12615:71;12679:6;12674:3;12615:71;:::i;:::-;12608:78;;12695:52;12740:6;12735:3;12728:4;12721:5;12717:16;12695:52;:::i;:::-;12772:29;12794:6;12772:29;:::i;:::-;12767:3;12763:39;12756:46;;12536:272;12444:364;;;;:::o;12814:377::-;12920:3;12948:39;12981:5;12948:39;:::i;:::-;13003:89;13085:6;13080:3;13003:89;:::i;:::-;12996:96;;13101:52;13146:6;13141:3;13134:4;13127:5;13123:16;13101:52;:::i;:::-;13178:6;13173:3;13169:16;13162:23;;12924:267;12814:377;;;;:::o;13221:845::-;13324:3;13361:5;13355:12;13390:36;13416:9;13390:36;:::i;:::-;13442:89;13524:6;13519:3;13442:89;:::i;:::-;13435:96;;13562:1;13551:9;13547:17;13578:1;13573:137;;;;13724:1;13719:341;;;;13540:520;;13573:137;13657:4;13653:9;13642;13638:25;13633:3;13626:38;13693:6;13688:3;13684:16;13677:23;;13573:137;;13719:341;13786:38;13818:5;13786:38;:::i;:::-;13846:1;13860:154;13874:6;13871:1;13868:13;13860:154;;;13948:7;13942:14;13938:1;13933:3;13929:11;13922:35;13998:1;13989:7;13985:15;13974:26;;13896:4;13893:1;13889:12;13884:17;;13860:154;;;14043:6;14038:3;14034:16;14027:23;;13726:334;;13540:520;;13328:738;;13221:845;;;;:::o;14072:366::-;14214:3;14235:67;14299:2;14294:3;14235:67;:::i;:::-;14228:74;;14311:93;14400:3;14311:93;:::i;:::-;14429:2;14424:3;14420:12;14413:19;;14072:366;;;:::o;14444:::-;14586:3;14607:67;14671:2;14666:3;14607:67;:::i;:::-;14600:74;;14683:93;14772:3;14683:93;:::i;:::-;14801:2;14796:3;14792:12;14785:19;;14444:366;;;:::o;14816:::-;14958:3;14979:67;15043:2;15038:3;14979:67;:::i;:::-;14972:74;;15055:93;15144:3;15055:93;:::i;:::-;15173:2;15168:3;15164:12;15157:19;;14816:366;;;:::o;15188:::-;15330:3;15351:67;15415:2;15410:3;15351:67;:::i;:::-;15344:74;;15427:93;15516:3;15427:93;:::i;:::-;15545:2;15540:3;15536:12;15529:19;;15188:366;;;:::o;15560:::-;15702:3;15723:67;15787:2;15782:3;15723:67;:::i;:::-;15716:74;;15799:93;15888:3;15799:93;:::i;:::-;15917:2;15912:3;15908:12;15901:19;;15560:366;;;:::o;15932:::-;16074:3;16095:67;16159:2;16154:3;16095:67;:::i;:::-;16088:74;;16171:93;16260:3;16171:93;:::i;:::-;16289:2;16284:3;16280:12;16273:19;;15932:366;;;:::o;16304:::-;16446:3;16467:67;16531:2;16526:3;16467:67;:::i;:::-;16460:74;;16543:93;16632:3;16543:93;:::i;:::-;16661:2;16656:3;16652:12;16645:19;;16304:366;;;:::o;16676:398::-;16835:3;16856:83;16937:1;16932:3;16856:83;:::i;:::-;16849:90;;16948:93;17037:3;16948:93;:::i;:::-;17066:1;17061:3;17057:11;17050:18;;16676:398;;;:::o;17080:366::-;17222:3;17243:67;17307:2;17302:3;17243:67;:::i;:::-;17236:74;;17319:93;17408:3;17319:93;:::i;:::-;17437:2;17432:3;17428:12;17421:19;;17080:366;;;:::o;17452:::-;17594:3;17615:67;17679:2;17674:3;17615:67;:::i;:::-;17608:74;;17691:93;17780:3;17691:93;:::i;:::-;17809:2;17804:3;17800:12;17793:19;;17452:366;;;:::o;17824:::-;17966:3;17987:67;18051:2;18046:3;17987:67;:::i;:::-;17980:74;;18063:93;18152:3;18063:93;:::i;:::-;18181:2;18176:3;18172:12;18165:19;;17824:366;;;:::o;18196:::-;18338:3;18359:67;18423:2;18418:3;18359:67;:::i;:::-;18352:74;;18435:93;18524:3;18435:93;:::i;:::-;18553:2;18548:3;18544:12;18537:19;;18196:366;;;:::o;18568:::-;18710:3;18731:67;18795:2;18790:3;18731:67;:::i;:::-;18724:74;;18807:93;18896:3;18807:93;:::i;:::-;18925:2;18920:3;18916:12;18909:19;;18568:366;;;:::o;18940:108::-;19017:24;19035:5;19017:24;:::i;:::-;19012:3;19005:37;18940:108;;:::o;19054:118::-;19141:24;19159:5;19141:24;:::i;:::-;19136:3;19129:37;19054:118;;:::o;19178:112::-;19261:22;19277:5;19261:22;:::i;:::-;19256:3;19249:35;19178:112;;:::o;19296:256::-;19408:3;19423:75;19494:3;19485:6;19423:75;:::i;:::-;19523:2;19518:3;19514:12;19507:19;;19543:3;19536:10;;19296:256;;;;:::o;19558:589::-;19783:3;19805:95;19896:3;19887:6;19805:95;:::i;:::-;19798:102;;19917:95;20008:3;19999:6;19917:95;:::i;:::-;19910:102;;20029:92;20117:3;20108:6;20029:92;:::i;:::-;20022:99;;20138:3;20131:10;;19558:589;;;;;;:::o;20153:379::-;20337:3;20359:147;20502:3;20359:147;:::i;:::-;20352:154;;20523:3;20516:10;;20153:379;;;:::o;20538:222::-;20631:4;20669:2;20658:9;20654:18;20646:26;;20682:71;20750:1;20739:9;20735:17;20726:6;20682:71;:::i;:::-;20538:222;;;;:::o;20766:640::-;20961:4;20999:3;20988:9;20984:19;20976:27;;21013:71;21081:1;21070:9;21066:17;21057:6;21013:71;:::i;:::-;21094:72;21162:2;21151:9;21147:18;21138:6;21094:72;:::i;:::-;21176;21244:2;21233:9;21229:18;21220:6;21176:72;:::i;:::-;21295:9;21289:4;21285:20;21280:2;21269:9;21265:18;21258:48;21323:76;21394:4;21385:6;21323:76;:::i;:::-;21315:84;;20766:640;;;;;;;:::o;21412:373::-;21555:4;21593:2;21582:9;21578:18;21570:26;;21642:9;21636:4;21632:20;21628:1;21617:9;21613:17;21606:47;21670:108;21773:4;21764:6;21670:108;:::i;:::-;21662:116;;21412:373;;;;:::o;21791:210::-;21878:4;21916:2;21905:9;21901:18;21893:26;;21929:65;21991:1;21980:9;21976:17;21967:6;21929:65;:::i;:::-;21791:210;;;;:::o;22007:545::-;22180:4;22218:3;22207:9;22203:19;22195:27;;22232:71;22300:1;22289:9;22285:17;22276:6;22232:71;:::i;:::-;22313:68;22377:2;22366:9;22362:18;22353:6;22313:68;:::i;:::-;22391:72;22459:2;22448:9;22444:18;22435:6;22391:72;:::i;:::-;22473;22541:2;22530:9;22526:18;22517:6;22473:72;:::i;:::-;22007:545;;;;;;;:::o;22558:313::-;22671:4;22709:2;22698:9;22694:18;22686:26;;22758:9;22752:4;22748:20;22744:1;22733:9;22729:17;22722:47;22786:78;22859:4;22850:6;22786:78;:::i;:::-;22778:86;;22558:313;;;;:::o;22877:419::-;23043:4;23081:2;23070:9;23066:18;23058:26;;23130:9;23124:4;23120:20;23116:1;23105:9;23101:17;23094:47;23158:131;23284:4;23158:131;:::i;:::-;23150:139;;22877:419;;;:::o;23302:::-;23468:4;23506:2;23495:9;23491:18;23483:26;;23555:9;23549:4;23545:20;23541:1;23530:9;23526:17;23519:47;23583:131;23709:4;23583:131;:::i;:::-;23575:139;;23302:419;;;:::o;23727:::-;23893:4;23931:2;23920:9;23916:18;23908:26;;23980:9;23974:4;23970:20;23966:1;23955:9;23951:17;23944:47;24008:131;24134:4;24008:131;:::i;:::-;24000:139;;23727:419;;;:::o;24152:::-;24318:4;24356:2;24345:9;24341:18;24333:26;;24405:9;24399:4;24395:20;24391:1;24380:9;24376:17;24369:47;24433:131;24559:4;24433:131;:::i;:::-;24425:139;;24152:419;;;:::o;24577:::-;24743:4;24781:2;24770:9;24766:18;24758:26;;24830:9;24824:4;24820:20;24816:1;24805:9;24801:17;24794:47;24858:131;24984:4;24858:131;:::i;:::-;24850:139;;24577:419;;;:::o;25002:::-;25168:4;25206:2;25195:9;25191:18;25183:26;;25255:9;25249:4;25245:20;25241:1;25230:9;25226:17;25219:47;25283:131;25409:4;25283:131;:::i;:::-;25275:139;;25002:419;;;:::o;25427:::-;25593:4;25631:2;25620:9;25616:18;25608:26;;25680:9;25674:4;25670:20;25666:1;25655:9;25651:17;25644:47;25708:131;25834:4;25708:131;:::i;:::-;25700:139;;25427:419;;;:::o;25852:::-;26018:4;26056:2;26045:9;26041:18;26033:26;;26105:9;26099:4;26095:20;26091:1;26080:9;26076:17;26069:47;26133:131;26259:4;26133:131;:::i;:::-;26125:139;;25852:419;;;:::o;26277:::-;26443:4;26481:2;26470:9;26466:18;26458:26;;26530:9;26524:4;26520:20;26516:1;26505:9;26501:17;26494:47;26558:131;26684:4;26558:131;:::i;:::-;26550:139;;26277:419;;;:::o;26702:::-;26868:4;26906:2;26895:9;26891:18;26883:26;;26955:9;26949:4;26945:20;26941:1;26930:9;26926:17;26919:47;26983:131;27109:4;26983:131;:::i;:::-;26975:139;;26702:419;;;:::o;27127:::-;27293:4;27331:2;27320:9;27316:18;27308:26;;27380:9;27374:4;27370:20;27366:1;27355:9;27351:17;27344:47;27408:131;27534:4;27408:131;:::i;:::-;27400:139;;27127:419;;;:::o;27552:::-;27718:4;27756:2;27745:9;27741:18;27733:26;;27805:9;27799:4;27795:20;27791:1;27780:9;27776:17;27769:47;27833:131;27959:4;27833:131;:::i;:::-;27825:139;;27552:419;;;:::o;27977:222::-;28070:4;28108:2;28097:9;28093:18;28085:26;;28121:71;28189:1;28178:9;28174:17;28165:6;28121:71;:::i;:::-;27977:222;;;;:::o;28205:434::-;28350:4;28388:2;28377:9;28373:18;28365:26;;28401:67;28465:1;28454:9;28450:17;28441:6;28401:67;:::i;:::-;28478:72;28546:2;28535:9;28531:18;28522:6;28478:72;:::i;:::-;28560;28628:2;28617:9;28613:18;28604:6;28560:72;:::i;:::-;28205:434;;;;;;:::o;28645:129::-;28679:6;28706:20;;:::i;:::-;28696:30;;28735:33;28763:4;28755:6;28735:33;:::i;:::-;28645:129;;;:::o;28780:75::-;28813:6;28846:2;28840:9;28830:19;;28780:75;:::o;28861:307::-;28922:4;29012:18;29004:6;29001:30;28998:56;;;29034:18;;:::i;:::-;28998:56;29072:29;29094:6;29072:29;:::i;:::-;29064:37;;29156:4;29150;29146:15;29138:23;;28861:307;;;:::o;29174:308::-;29236:4;29326:18;29318:6;29315:30;29312:56;;;29348:18;;:::i;:::-;29312:56;29386:29;29408:6;29386:29;:::i;:::-;29378:37;;29470:4;29464;29460:15;29452:23;;29174:308;;;:::o;29488:132::-;29555:4;29578:3;29570:11;;29608:4;29603:3;29599:14;29591:22;;29488:132;;;:::o;29626:141::-;29675:4;29698:3;29690:11;;29721:3;29718:1;29711:14;29755:4;29752:1;29742:18;29734:26;;29626:141;;;:::o;29773:114::-;29840:6;29874:5;29868:12;29858:22;;29773:114;;;:::o;29893:98::-;29944:6;29978:5;29972:12;29962:22;;29893:98;;;:::o;29997:99::-;30049:6;30083:5;30077:12;30067:22;;29997:99;;;:::o;30102:113::-;30172:4;30204;30199:3;30195:14;30187:22;;30102:113;;;:::o;30221:184::-;30320:11;30354:6;30349:3;30342:19;30394:4;30389:3;30385:14;30370:29;;30221:184;;;;:::o;30411:168::-;30494:11;30528:6;30523:3;30516:19;30568:4;30563:3;30559:14;30544:29;;30411:168;;;;:::o;30585:147::-;30686:11;30723:3;30708:18;;30585:147;;;;:::o;30738:169::-;30822:11;30856:6;30851:3;30844:19;30896:4;30891:3;30887:14;30872:29;;30738:169;;;;:::o;30913:148::-;31015:11;31052:3;31037:18;;30913:148;;;;:::o;31067:305::-;31107:3;31126:20;31144:1;31126:20;:::i;:::-;31121:25;;31160:20;31178:1;31160:20;:::i;:::-;31155:25;;31314:1;31246:66;31242:74;31239:1;31236:81;31233:107;;;31320:18;;:::i;:::-;31233:107;31364:1;31361;31357:9;31350:16;;31067:305;;;;:::o;31378:185::-;31418:1;31435:20;31453:1;31435:20;:::i;:::-;31430:25;;31469:20;31487:1;31469:20;:::i;:::-;31464:25;;31508:1;31498:35;;31513:18;;:::i;:::-;31498:35;31555:1;31552;31548:9;31543:14;;31378:185;;;;:::o;31569:348::-;31609:7;31632:20;31650:1;31632:20;:::i;:::-;31627:25;;31666:20;31684:1;31666:20;:::i;:::-;31661:25;;31854:1;31786:66;31782:74;31779:1;31776:81;31771:1;31764:9;31757:17;31753:105;31750:131;;;31861:18;;:::i;:::-;31750:131;31909:1;31906;31902:9;31891:20;;31569:348;;;;:::o;31923:191::-;31963:4;31983:20;32001:1;31983:20;:::i;:::-;31978:25;;32017:20;32035:1;32017:20;:::i;:::-;32012:25;;32056:1;32053;32050:8;32047:34;;;32061:18;;:::i;:::-;32047:34;32106:1;32103;32099:9;32091:17;;31923:191;;;;:::o;32120:96::-;32157:7;32186:24;32204:5;32186:24;:::i;:::-;32175:35;;32120:96;;;:::o;32222:90::-;32256:7;32299:5;32292:13;32285:21;32274:32;;32222:90;;;:::o;32318:77::-;32355:7;32384:5;32373:16;;32318:77;;;:::o;32401:149::-;32437:7;32477:66;32470:5;32466:78;32455:89;;32401:149;;;:::o;32556:126::-;32593:7;32633:42;32626:5;32622:54;32611:65;;32556:126;;;:::o;32688:77::-;32725:7;32754:5;32743:16;;32688:77;;;:::o;32771:86::-;32806:7;32846:4;32839:5;32835:16;32824:27;;32771:86;;;:::o;32863:154::-;32947:6;32942:3;32937;32924:30;33009:1;33000:6;32995:3;32991:16;32984:27;32863:154;;;:::o;33023:307::-;33091:1;33101:113;33115:6;33112:1;33109:13;33101:113;;;33200:1;33195:3;33191:11;33185:18;33181:1;33176:3;33172:11;33165:39;33137:2;33134:1;33130:10;33125:15;;33101:113;;;33232:6;33229:1;33226:13;33223:101;;;33312:1;33303:6;33298:3;33294:16;33287:27;33223:101;33072:258;33023:307;;;:::o;33336:320::-;33380:6;33417:1;33411:4;33407:12;33397:22;;33464:1;33458:4;33454:12;33485:18;33475:81;;33541:4;33533:6;33529:17;33519:27;;33475:81;33603:2;33595:6;33592:14;33572:18;33569:38;33566:84;;;33622:18;;:::i;:::-;33566:84;33387:269;33336:320;;;:::o;33662:281::-;33745:27;33767:4;33745:27;:::i;:::-;33737:6;33733:40;33875:6;33863:10;33860:22;33839:18;33827:10;33824:34;33821:62;33818:88;;;33886:18;;:::i;:::-;33818:88;33926:10;33922:2;33915:22;33705:238;33662:281;;:::o;33949:233::-;33988:3;34011:24;34029:5;34011:24;:::i;:::-;34002:33;;34057:66;34050:5;34047:77;34044:103;;;34127:18;;:::i;:::-;34044:103;34174:1;34167:5;34163:13;34156:20;;33949:233;;;:::o;34188:100::-;34227:7;34256:26;34276:5;34256:26;:::i;:::-;34245:37;;34188:100;;;:::o;34294:94::-;34333:7;34362:20;34376:5;34362:20;:::i;:::-;34351:31;;34294:94;;;:::o;34394:176::-;34426:1;34443:20;34461:1;34443:20;:::i;:::-;34438:25;;34477:20;34495:1;34477:20;:::i;:::-;34472:25;;34516:1;34506:35;;34521:18;;:::i;:::-;34506:35;34562:1;34559;34555:9;34550:14;;34394:176;;;;:::o;34576:180::-;34624:77;34621:1;34614:88;34721:4;34718:1;34711:15;34745:4;34742:1;34735:15;34762:180;34810:77;34807:1;34800:88;34907:4;34904:1;34897:15;34931:4;34928:1;34921:15;34948:180;34996:77;34993:1;34986:88;35093:4;35090:1;35083:15;35117:4;35114:1;35107:15;35134:180;35182:77;35179:1;35172:88;35279:4;35276:1;35269:15;35303:4;35300:1;35293:15;35320:180;35368:77;35365:1;35358:88;35465:4;35462:1;35455:15;35489:4;35486:1;35479:15;35506:117;35615:1;35612;35605:12;35629:117;35738:1;35735;35728:12;35752:117;35861:1;35858;35851:12;35875:117;35984:1;35981;35974:12;35998:102;36039:6;36090:2;36086:7;36081:2;36074:5;36070:14;36066:28;36056:38;;35998:102;;;:::o;36106:94::-;36139:8;36187:5;36183:2;36179:14;36158:35;;36106:94;;;:::o;36206:225::-;36346:34;36342:1;36334:6;36330:14;36323:58;36415:8;36410:2;36402:6;36398:15;36391:33;36206:225;:::o;36437:181::-;36577:33;36573:1;36565:6;36561:14;36554:57;36437:181;:::o;36624:180::-;36764:32;36760:1;36752:6;36748:14;36741:56;36624:180;:::o;36810:226::-;36950:34;36946:1;36938:6;36934:14;36927:58;37019:9;37014:2;37006:6;37002:15;36995:34;36810:226;:::o;37042:176::-;37182:28;37178:1;37170:6;37166:14;37159:52;37042:176;:::o;37224:182::-;37364:34;37360:1;37352:6;37348:14;37341:58;37224:182;:::o;37412:173::-;37552:25;37548:1;37540:6;37536:14;37529:49;37412:173;:::o;37591:114::-;;:::o;37711:221::-;37851:34;37847:1;37839:6;37835:14;37828:58;37920:4;37915:2;37907:6;37903:15;37896:29;37711:221;:::o;37938:181::-;38078:33;38074:1;38066:6;38062:14;38055:57;37938:181;:::o;38125:235::-;38265:34;38261:1;38253:6;38249:14;38242:58;38334:18;38329:2;38321:6;38317:15;38310:43;38125:235;:::o;38366:234::-;38506:34;38502:1;38494:6;38490:14;38483:58;38575:17;38570:2;38562:6;38558:15;38551:42;38366:234;:::o;38606:169::-;38746:21;38742:1;38734:6;38730:14;38723:45;38606:169;:::o;38781:122::-;38854:24;38872:5;38854:24;:::i;:::-;38847:5;38844:35;38834:63;;38893:1;38890;38883:12;38834:63;38781:122;:::o;38909:116::-;38979:21;38994:5;38979:21;:::i;:::-;38972:5;38969:32;38959:60;;39015:1;39012;39005:12;38959:60;38909:116;:::o;39031:122::-;39104:24;39122:5;39104:24;:::i;:::-;39097:5;39094:35;39084:63;;39143:1;39140;39133:12;39084:63;39031:122;:::o;39159:120::-;39231:23;39248:5;39231:23;:::i;:::-;39224:5;39221:34;39211:62;;39269:1;39266;39259:12;39211:62;39159:120;:::o;39285:122::-;39358:24;39376:5;39358:24;:::i;:::-;39351:5;39348:35;39338:63;;39397:1;39394;39387:12;39338:63;39285:122;:::o

Swarm Source

ipfs://bf2eb5575c97ae333d37844edef07c68dd15987e0b560a20c6f7e41dc7465df1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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