Contract 0x5755Ab845dDEaB27E1cfCe00cd629B2e135Acc3d 5

 
 
Txn Hash
Method
Block
From
To
Value
0x0d0b74db0e6d8e4948861909fdda0d30267ad7ab9108f8b51e11675cf476bec6Set Approval For...153692572022-08-19 4:25:0020 hrs 10 mins agoENS Name graphicography.eth IN  Larva Lads: LARVA Token0 Ether0.00041659 9.04449287
0x0fdae94e101e49881ecf340b5d64d89aa8fb094950ef8e4df434e1d438da5fa7Set Approval For...153650792022-08-18 12:46:071 day 11 hrs ago0x1d6d748ec67dd90fe79cfaafa9e843cc6a71809d IN  Larva Lads: LARVA Token0 Ether0.00020937 8.64021389
0xb1bdbcb50c21e08133ca665a0d8146431ce375ba3525799d5870f72c21953de3Set Approval For...153638462022-08-18 8:02:131 day 16 hrs ago0xfa885614eb0364d1dec16309176755e5e85b805e IN  Larva Lads: LARVA Token0 Ether0.0003508 7.60233221
0x41317eab2bb6076a73d7edf11e8c9199af39a3ed0c9eec45f9b30d3e9315632cSafe Transfer Fr...153620712022-08-18 1:16:131 day 23 hrs ago0x59d2090836ac16ec782655fe0069eea3e70cbf08 IN  Larva Lads: LARVA Token0 Ether0.00168973 19.53111662
0xd3eb9b9379d0e3720392c4df541d13d92f84fd45358e8c39d731a4dc91a882a1Set Approval For...153608472022-08-17 20:31:402 days 4 hrs ago0x044a6413b409ca2f95a384647005c8baf3c8032e IN  Larva Lads: LARVA Token0 Ether0.00035362 13.51728226
0xa642008c548c47be740e957542f7a889b9ea4f5a5cc2bb9cfc8536b9a78b7b38Set Approval For...153608462022-08-17 20:30:562 days 4 hrs ago0x044a6413b409ca2f95a384647005c8baf3c8032e IN  Larva Lads: LARVA Token0 Ether0.00056371 12.23835197
0xadb12825cc82187c60fdea251cdd6ed8046159f393e9786363be1d4441063856Set Approval For...153582762022-08-17 10:44:162 days 13 hrs ago0xe3db42b9c80c54030e45a3072b59494c7cda10f2 IN  Larva Lads: LARVA Token0 Ether0.00026901 5.84043928
0x32b974ea4b654ab3f01bcb4f7ef8cf018974dfaa96e657defa8d2348100c1714Set Approval For...153581012022-08-17 10:06:012 days 14 hrs agoENS Name mattetre.eth IN  Larva Lads: LARVA Token0 Ether0.00038493 8.35716962
0x8a4673dfe3b686ee570398fc222f181c6558452a9539e32fee5338165ae5cc6aSet Approval For...153575542022-08-17 8:06:132 days 16 hrs ago0xe8996228b2a7a7937af6ecb2bee5b99baba6af3c IN  Larva Lads: LARVA Token0 Ether0.00033247 7.21822267
0x4387df42424ed4f2e85a3e62f39b389be75c173638410d760d89152857c4523aSafe Transfer Fr...153564402022-08-17 3:55:152 days 20 hrs agoENS Name monalaserz.eth IN  Larva Lads: LARVA Token0 Ether0.00051189 5.286354
0x53fdcb6b9180709e5b031bec4cbe4ba06e561387c7222c27eb4ecea23f0b5163Set Approval For...153560212022-08-17 2:22:042 days 22 hrs ago0xe735b24a5cf27a86f9b6d58fcdd23e7e9be8e8d9 IN  Larva Lads: LARVA Token0 Ether0.00068325 14.83372791
0x10525fcc8c50c17ccc6799c67eedb401ea90b52ee3fcb5aefc0ae2b9a897bef7Set Approval For...153558852022-08-17 1:48:502 days 22 hrs ago0x4ed58e2e14eda471307b51441cf7bcde051dd6dd IN  Larva Lads: LARVA Token0 Ether0.00075174 16.3207135
0x6f9e1b7706136392ad5f11cf72cf7e13379503522bad510448fabdcde4831a59Set Approval For...153547092022-08-16 21:19:063 days 3 hrs ago0x636be37a4b3786ae4f4238bb40a5b379f57570a0 IN  Larva Lads: LARVA Token0 Ether0.00066211 14.37465677
0xfd4fb92700598d133c69dc2b41c3cf710d408cc3ffec42a9d98096fccf74440fSet Approval For...153510612022-08-16 7:36:533 days 16 hrs ago0x7ccf1aacb0ea7432826cb0fbea121faff58dd8a1 IN  Larva Lads: LARVA Token0 Ether0.0004936 10.71626065
0x2874cee668dba868ac42303b664dcec0f7be733b0a575bf0c7e698e18b3d37cdSet Approval For...153503532022-08-16 4:53:583 days 19 hrs agoENS Name toothtube.eth IN  Larva Lads: LARVA Token0 Ether0.00055149 11.97312037
0xb44eb33ed0f33133c1c98113e1f6cd64e30e0898b57c389f37d6d4037a8d43d0Set Approval For...153482532022-08-15 21:01:264 days 3 hrs ago0xf3b8b04d1594cee1b4edfac15083b26e93c6e73f IN  Larva Lads: LARVA Token0 Ether0.00066624 27.58876754
0x0867787738c706be2defa3f0911aa74de0f9a21a8771285514c55b8a3518d8acSet Approval For...153468982022-08-15 15:50:134 days 8 hrs agoENS Name ezur11.eth IN  Larva Lads: LARVA Token0 Ether0.00080795 17.54097046
0xb682711db4758c90dd2079d295428e08f069deecb9567bfd6ae66605019dd494Set Approval For...153403152022-08-14 14:34:145 days 10 hrs ago0x4e2d24af7086810dacb44134489f53b00637df34 IN  Larva Lads: LARVA Token0 Ether0.00054011 11.72607263
0xa20813d63834915f479384c695ab31c9cd31e32eeb05cf5e904e2014ae50220cSet Approval For...153390932022-08-14 10:00:065 days 14 hrs agoENS Name rangerhou.eth IN  Larva Lads: LARVA Token0 Ether0.00027664 6.00610977
0xecd624c2178901f2326a995d39833204581bfbdff3d3a99dde895db449f58d60Set Approval For...153383542022-08-14 7:16:595 days 17 hrs agoENS Name docalt.eth IN  Larva Lads: LARVA Token0 Ether0.00037025 8.03837047
0x4021e57b1c685210d89a01a04da801d534c645d7c9a4f5dc69536ab1e7433b15Transfer From153358062022-08-13 21:33:056 days 3 hrs agoENS Name dasdas.eth IN  Larva Lads: LARVA Token0 Ether0.00130013 13.42855319
0xa4ca47217a281891f4986d641e85a95b499fafdd41ce075e3dda9a494f111107Transfer From153358012022-08-13 21:31:356 days 3 hrs agoENS Name dasdas.eth IN  Larva Lads: LARVA Token0 Ether0.00120127 12.40740941
0x17fc2212b3ae78864849e734fdea3614b4eb76dad30827b98b53ef3a4df19cbaSet Approval For...153346582022-08-13 17:14:366 days 7 hrs agoENS Name hfdsagfbljusbgljihrfasdgb.eth IN  Larva Lads: LARVA Token0 Ether0.00091737 19.91660829
0xb87ab184eabe517387748049229ef2fc646bebc099b58258605848253c48518aSet Approval For...153330402022-08-13 11:06:236 days 13 hrs agoENS Name yvmeng.eth IN  Larva Lads: LARVA Token0 Ether0.00038496 8.3576744
0xb949c8927bc2a3d149090bb62c8f10c64e5a50c78dbf000b8928f02ef74d3401Set Approval For...153328002022-08-13 10:12:546 days 14 hrs agoENS Name gnomelabs.eth IN  Larva Lads: LARVA Token0 Ether0.00046145 10
[ Download CSV Export 

OVERVIEW

Larva Lads are a play on the CryptoPunks and their creators, Larva Labs. The artwork and metadata are fully on-chain and are randomly generated at mint.

Latest 1 internal transaction
Parent Txn Hash Block From To Value
0xa6007b3e12b5099a385e6bfeaff863cbdea555c236c04d61a393b8e4646566ff138894032021-12-27 20:30:01235 days 4 hrs ago Larva Lads: LARVA TokenLarva Lads: Deployer0.7 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LarvaLads

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-21
*/

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

interface IERC165 {

    function supportsInterface(bytes4 interfaceId) external view returns (bool);

}

interface IERC721 is IERC165 {

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

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

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

    function approve(address to, uint256 tokenId) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);

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

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);
    }

    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);
    }

    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);
    }

}

abstract contract Context {

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

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

}

abstract contract Ownable is Context {

    address private _owner;

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

    constructor() {
        _setOwner(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

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

abstract contract ReentrancyGuard {

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {

        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        _status = _ENTERED; _; _status = _NOT_ENTERED;

    }

}

interface IERC721Receiver {

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

}

interface IERC721Metadata is IERC721 {

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);

}

library Address {

    function isContract(address account) internal view returns (bool) {

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

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

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

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

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

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

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

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

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

    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);
    }

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

    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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

abstract contract ERC165 is IERC165 {

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }

}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {

    using Address for address;
    using Strings for uint256;

    string private _name;
    string private _symbol;

    mapping(uint256 => address) private _owners;
    mapping(address => uint256) private _balances;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

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

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            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("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

interface IERC721Enumerable is IERC721 {

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

}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {

    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
    mapping(uint256 => uint256) private _ownedTokensIndex;

    uint256[] private _allTokens;

    mapping(uint256 => uint256) private _allTokensIndex;

    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId;
            _ownedTokensIndex[lastTokenId] = tokenIndex;
        }

        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId;
        _allTokensIndex[lastTokenId] = tokenIndex;

        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


//██///////█████//██████//██////██//█████//////██///////█████//██████//███████//
//██//////██///██/██///██/██////██/██///██/////██//////██///██/██///██/██///////
//██//////███████/██████//██////██/███████/////██//////███████/██///██/███████//
//██//////██///██/██///██//██//██//██///██/////██//////██///██/██///██//////██//
//███████/██///██/██///██///████///██///██/////███████/██///██/██████//███████//


contract LarvaLads is ERC721Enumerable, ReentrancyGuard, Ownable {

    uint256 public maxSupply = 5000;
    uint256 public price = 0.05 ether;
    uint256 public maxMint = 10;
    uint256 public numTokensMinted;

    string[8] private baseColors = ['#AE8B61','#DBB181','#E8AA96','#FFC2C2','#EECFA0','#C9CDAF','#D5C6E1','#EAD9D9'];
    string[7] private thirdNames = ['Smile', 'Frown', 'Handlebars', 'Zombie', 'Alien', 'Ape', 'Normal'];
    string[7] private thirdLayers = [
        '<path fill="#000" d="M16 17h1v1h-1z"/>',
        '<path fill="#000" d="M16 19h1v1h-1z"/>',
        '<path stroke="#A66E2C" d="M16.5 20v-2m3.5-.5h-3m3.5.5v2"/><path stroke="#C28946" d="M16 17.5h1m3 0h1"/>',
        '<path fill="#7DA269" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path fill="#000" fill-opacity=".4" d="M17 12h-2v1h2v-1zM20 12v1h2v-1h-2zM22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1zM16 14h-1v1h1v-1zM21 14h-1v1h1v-1zM18 19h-1v1h1v-1z"/><path fill="red" d="M15 13h1v1h-1v-1zM20 13h1v1h-1v-1z"/><path fill="#000" d="M17 13h-1v1h1v-1zM22 13h-1v1h1v-1zM20 16v-1h-2v1h2zM17 18v1h3v-1h-3z"/>',
        '<path fill="#C8FBFB" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path stroke="#75BDBD" d="M15.5 12v1m5-1v1"/><path fill="#000" d="M21 19v-1h-5v1h5zM15 13h1v-1h1v1h-1v1h-1v-1zM21 12h1v1h-1v1h-1v-1h1v-1z"/><path fill="#9BE0E0" d="M22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1zM17 13h-1v1h1v-1zM22 13h-1v1h1v-1zM19 14h-1v3h1v-3z"/>',
        '<path fill="#61503D" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path fill="#958A7D" stroke="#958A7D" d="M16.5 19.5v-1h-1v-1h1v-2h-1v-1h-1v-3h2v-1h3v1h2v4h-1v2h1v1h-1v1h-4z"/><path fill="#000" fill-opacity=".4" d="M17 12h-2v1h2v-1zM20 12v1h2v-1h-2zM22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1z"/><path fill="#000" d="M16 13h-1v1h1v-1zM21 13h-1v1h1v-1zM18 16v-1h-1v1h1zM17 18v1h3v-1h-3zM19.724 16v-1h-1v1h1z"/><path fill="#AAA197" d="M17 14h-1v-1h1v1zM22 14h-1v-1h1v1z"/>',
        ''];
    string[8] private fourthNames = ['3D Glasses','VR','Small Shades','Eye Patch','Classic Shades','Regular Shades','Horned Rim Glasses','None'];
    string[8] private fourthLayers = [
        '<path fill="#F0F0F0" d="M12 11h11v4h-9v-3h-2v-1z"/><path fill="#FD3232" d="M19 12h3v2h-3z"/><path fill="#328DFD" d="M15 12h3v2h-3z"/>',
        '<path fill="#B4B4B4" d="M14 11h9v4h-9z"/><path stroke="#000" d="M14 15.5h8m-8-5h8M13.5 14v1m10-4v4m-10-4v1m2 .5v1h6v-1h-6z"/><path stroke="#8D8D8D" d="M13.5 12v2m1 0v1m0-4v1m8-1v1m0 2v1"/>',
        '<path fill="#000" d="M13 13v-1h9v3h-2v-2h-3v2h-2v-2h-2z"/>',
        '<path fill="#000" d="M13 11h9v1h-4v2h-1v1h-2v-1h-1v-2h-1v-1z"/>',
        '<path stroke="#000" d="M13 11.5h9m-7 3h2m.5-.5v-2m2 0v2m.5.5h2m-7.5-.5v-2"/><path stroke="#5C390F" d="M15 12.5h2m3 0h2"/><path stroke="#C77514" d="M15 13.5h2m3 0h2"/>',
        '<path fill="#000" d="M13 12h11v2h-1v1h-2v-1h-1v-1h-2v1h-1v1h-2v-1h-1v-1h-1v-1z"/>',
        '<path fill="#fff" fill-opacity=".5" d="M14 12h3v3h-3zM19 12h3v3h-3z"/><path fill="#000" d="M13 11h11v2h-1v-1h-4v1h-2v-1h-3v1h-1v-2z"/>',
        ''];
    string[14] private fifthNames = ['Beanie','Cowboy Hat','Fedora','Police Cap','Do-rag','Knitted Cap','Bandana','Peak Spike','Wild Hair','Messy Hair','Cap Forward','Cap','Top Hat','None'];
    string[14] private fifthLayers = [
        '<path fill="#3CC300" d="M14 10h7v1h-7z"/><path fill="#0060C3" d="M16 6v4h-4V8h1V7h1V6h2z"/><path fill="#D60404" d="M19 6v4h4V8h-1V7h-1V6h-2z"/><path fill="#E4EB17" d="M14 9h1V8h1V6h3v2h1v1h1v1h-7V9z"/><path fill="#000" d="M17 5h1v1h-1z"/><path fill="#0060C3" d="M15 4h5v1h-5z"/>',
        '<path fill="#794B11" d="M8 7h1v1h4V4h1V3h2v1h3V3h2v1h1v4h4V7h1v2h-1v1H9V9H8V7z"/><path fill="#502F05" d="M12 7h11v1H12z"/>',
        '<path fill="#3D2F1E" d="M9 9h1V8h3V6h1V4h1V3h5v1h1v2h1v2h3v1h1v1H9V9z"/><path fill="#000" d="M12 7h11v1H12z"/>',
        '<path fill="#26314A" d="M12 5h11v5H12z"/><path stroke="#fff" d="M13 8.5h1m1 0h1m1 0h1m1 0h1m1 0h1"/><path stroke="#FFD800" d="M17 6.5h1"/><path fill="#000" fill-rule="evenodd" d="M23 6V5h-4V4h-3v1h-4v1h-1v2h1v2h3v1h9V9h-1V8h1V6h-1zm0 0h-4V5h-3v1h-4v2h1v1h1V8h1v2h8V9h-1V8h1V6zm-7 3h1V8h-1v1zm2 0h1V8h-1v1zm2 0h1V8h-1v1z" clip-rule="evenodd"/>',
        '<path fill="#4C4C4C" d="M13 7h9v4h-9z"/><path fill="#000" d="M13 10h-1V8h1V7h1V6h7v1h2v2h-1V8h-1V7h-7v1h-1v2z"/><path stroke="#636363" d="M14 9.5h1m0-1h1"/>',
        '<path fill="#CA4E11" d="M14 7h-1v3h9V7h-1V6h-7v1z"/><path fill="#933709" d="M12 8h11v2h-1V9h-1v1h-1V9h-1v1h-1V9h-1v1h-1V9h-1v1h-1V9h-1v1h-1V8z"/><path stroke="#000" d="M11.5 10V8m1 0V7m1 0V6m.5-.5h7m.5.5v1m1 0v1m1 0v2"/>',
        '<path fill="#1A43C8" d="M13 7h9v3H10v3H9v-3H8V9h5V7z"/><path stroke="#1637A4" d="M22 9.5h-1m0 1h-3m0-1h-4m8.5-.5V7m-.5-.5h-8m0 1h-1m0 1h-1m0 1h-1m0 1h-1m0-1H9"/><path stroke="#142C7C" d="M11 11.5h-1m2-1h-1m2-1h-1"/>',
        '<path fill="#000" d="M14 7V5h1V4h1v1h1V4h1v1h1V4h1v1h1v2h1v2h-3v1h-1v1h-1v-1h-1V9h-3V7h1zM12 9v1h1V9h-1z"/>',
        '<path stroke="#000" d="M12 4.5h2m4 0h5m-14 1h1m2 0h10m2 0h2m-17 1h16m-16 1h17m-16 1h15m-16 1h9m2 0h5m-17 1h7m2 0h2m2 0h3m-14 1h4m9 0h2m-16 1h5m9 0h2m-16 1h1m1 0h3m9.5-.5v2M10 14.5h4m-4 1h2"/>',
        '<path fill="#000" d="M14 11h1v1h-1zM15 10h1v1h-1zM18 9h1v3h-1zM12 9h6v1h-6zM13 10h1v1h-1zM11 10h1v1h-1zM11 8h3v1h-3zM12 7h2v1h-2zM13 6h2v1h-2zM14 5h6v1h-6zM21 5h1v2h-1zM21 7h3v1h-3zM21 10h3v1h-3zM20 8h3v2h-3zM15 7h4v2h-4z"/><path fill="#000" d="M17 6h4v2h-4z"/><path fill="#000" d="M14 6h4v3h-4z"/><path stroke="#000" d="M14 5.5h6m1 0h1m-9 1h9m-10 1h12m-13 1h8m1 0h3m-11 1h7m1 0h3m-12 1h1m1 0h1m1 0h1m-2 1h1m3.5-1.5v2m2.5-1.5h3"/>',
        '<path fill="#515151" d="M13 6h9v4h-9V6z"/><path stroke="#000" d="M12 10.5h12.5V9m-.5-.5h-8m0 1h-1m8-2h-1m0-1h-1m0-1h-7m0 1h-1m-.5.5v3"/><path stroke="#353535" d="M24 9.5h-8m-1-3h-1m0 1h-1"/>',
        '<path fill="#8119B7" d="M12 7h1V6h1V5h7v1h1v2h3v1h1v1H12V7z"/><path stroke="#B261DC" d="M21 7.5h-1m0-1h-1"/>',
        '<path fill="#000" d="M13 2h9v1h1v5h1v1h1v1H10V9h1V8h1V3h1V2z"/><path fill="#DC1D1D" d="M12 7h11v1H12z"/>',
        ''];
    string[5] private sixthNames = ['Earring','Vape','Cigarette','Pipe','None'];
    string[5] private sixthLayers = [
        '<path fill="#FFD926" d="M12 14h1v1h-1z"/>',
        '<path stroke="#000" d="M20 17.5h7m1 1h-1m0 1h-7"/><path stroke="#595959" d="M20 18.5h6"/><path stroke="#0040FF" d="M26 18.5h1"/>',
        '<path stroke="#000" d="M20 17.5h7m1 1h-1m0 1h-7"/><path stroke="#D7D1D1" d="M20 18.5h6"/><path stroke="#E7A600" d="M26 18.5h1"/><path fill="#fff" fill-opacity=".4" d="M26 11h1v5h-1z"/>',
        '<path stroke="#000" d="M20 18.5h1m0 1h1m0 1h1m0 1h1.5v-2h4V22m-1 0v1m-.5.5h-4m0-1h-1m0-1h-1m0-1h-1m0-1h-1"/><path stroke="#855114" d="M20 19.5h1m0 1h1m0 1h1m0 1h3m-1-2h3m-2 1h1"/><path stroke="#683C08" d="M25 21.5h1m0 1h1m0-1h1"/><path stroke="#fff" stroke-opacity=".4" d="M26.5 12v1.5m0 0H25m1.5 0H28M26.5 15v1m0 1v1"/>',
        ''];

    struct LarvaObject {
        uint256 baseColor;
        uint256 layerThree;
        uint256 layerFour;
        uint256 layerFive;
        uint256 layerSix;
    }

    function randomLarvaLad(uint256 tokenId) internal view returns (LarvaObject memory) {
        
        LarvaObject memory larvaLad;

        larvaLad.baseColor = getBaseColor(tokenId);
        larvaLad.layerThree = getLayerThree(tokenId);
        larvaLad.layerFour = getLayerFour(tokenId);
        larvaLad.layerFive = getLayerFive(tokenId);
        larvaLad.layerSix = getLayerSix(tokenId);

        return larvaLad;
    }
    
    function getTraits(LarvaObject memory larvaLad) internal view returns (string memory) {
        
        string[20] memory parts;
        
        parts[0] = ', "attributes": [{"trait_type": "Type","value": "';
        if (larvaLad.layerThree == 3) {
            parts[1] = 'Zombie"}, {"trait_type": "Mouth","value": "Zombie"},'; 
        }
        if (larvaLad.layerThree == 4) {
            parts[2] = 'Alien"}, {"trait_type": "Mouth","value": "Alien"},'; 
        }
        if (larvaLad.layerThree == 5) {
            parts[3] = 'Ape"}, {"trait_type": "Mouth","value": "Ape"},'; 
        }
        if (larvaLad.layerThree < 3 || larvaLad.layerThree > 5) {
            parts[4] = 'Normal"}, {"trait_type": "Mouth","value": "';
            parts[5] = thirdNames[larvaLad.layerThree];
            parts[6] = '"},';
        }
        parts[7] = ' {"trait_type": "Eyewear","value": "';
        parts[8] = fourthNames[larvaLad.layerFour];
        parts[9] = '"}, {"trait_type": "Headwear","value": "';
        parts[10] = fifthNames[larvaLad.layerFive];
        parts[11] = '"}, {"trait_type": "Accessory","value": "';
        parts[12] = sixthNames[larvaLad.layerSix];
        parts[13] = '"}], ';
        
        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7]));
                      output = string(abi.encodePacked(output, parts[8], parts[9], parts[10], parts[11], parts[12], parts[13]));
        return output;
    }

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getBaseColor(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("BASE COLOR", toString(tokenId))));

        uint256 rn1 = rand % 79;
        uint256 bc = 0;

        if (rn1 >= 10 && rn1 < 20) { bc = 1; }
        if (rn1 >= 20 && rn1 < 30) { bc = 2; }
        if (rn1 >= 30 && rn1 < 40) { bc = 3; }
        if (rn1 >= 40 && rn1 < 50) { bc = 4; }
        if (rn1 >= 50 && rn1 < 60) { bc = 5; }
        if (rn1 >= 60 && rn1 < 70) { bc = 6; }
        if (rn1 >= 70) { bc = 7; }

        return bc;
    }

    function getLayerThree(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER THREE", toString(tokenId))));

        uint256 rn3 = rand % 170;
        uint256 l3 = 0;

        if (rn3 >= 46 && rn3 < 64) { l3 = 1; }
        if (rn3 >= 64 && rn3 < 81) { l3 = 2; }
        if (rn3 >= 81 && rn3 < 85) { l3 = 3; }
        if (rn3 == 85) { l3 = 4; }
        if (rn3 >= 86 && rn3 < 88) { l3 = 5; }
        if (rn3 >= 88) { l3 = 6; }
        
        return l3;
    }

    function getLayerFour(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER FOUR", toString(tokenId))));

        uint256 rn4 = rand % 500;
        uint256 l4 = 0;

        if (rn4 >= 41 && rn4 < 81) { l4 = 1; }
        if (rn4 >= 81 && rn4 < 121) { l4 = 2; }
        if (rn4 >= 121 && rn4 < 161) { l4 = 3; }
        if (rn4 >= 161 && rn4 < 201) { l4 = 4; }
        if (rn4 >= 201 && rn4 < 261) { l4 = 5; }
        if (rn4 >= 261 && rn4 < 281) { l4 = 6; }
        if (rn4 >= 281) { l4 = 7; }
        
        return l4;
    }

    function getLayerFive(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER FIVE", toString(tokenId))));

        uint256 rn5 = rand % 240;
        uint256 l5 = 0;

        if (rn5 >= 10 && rn5 < 20) { l5 = 1; }
        if (rn5 >= 20 && rn5 < 30) { l5 = 2; }
        if (rn5 >= 30 && rn5 < 40) { l5 = 3; }
        if (rn5 >= 40 && rn5 < 50) { l5 = 4; }
        if (rn5 >= 50 && rn5 < 60) { l5 = 5; }
        if (rn5 >= 60 && rn5 < 70) { l5 = 6; }
        if (rn5 >= 70 && rn5 < 80) { l5 = 7; }
        if (rn5 >= 80 && rn5 < 90) { l5 = 8; }
        if (rn5 >= 90 && rn5 < 100) { l5 = 9; }
        if (rn5 >= 100 && rn5 < 110) { l5 = 10; }
        if (rn5 >= 110 && rn5 < 120) { l5 = 11; }
        if (rn5 >= 120 && rn5 < 130) { l5 = 12; }
        if (rn5 >= 130) { l5 = 13; }
        
        return l5;
    }

    function getLayerSix(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER SIX", toString(tokenId))));

        uint256 rn6 = rand % 120;
        uint256 l6 = 0;

        if (rn6 >= 10 && rn6 < 20) { l6 = 1; }
        if (rn6 >= 20 && rn6 < 30) { l6 = 2; }
        if (rn6 >= 30 && rn6 < 40) { l6 = 3; }
        if (rn6 >= 40) { l6 = 4; }
        
        return l6;
    }

    function getSVG(LarvaObject memory larvaLad) internal view returns (string memory) {
        string[9] memory parts;

        parts[0] = '<svg id="x" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 30"><path fill="#638596" d="M0 0h30v30H0z"/>';
        parts[1] = '<path fill="';
        parts[2] = baseColors[larvaLad.baseColor];
        parts[3] = '" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path fill="#000" d="M4 24v2h16v-2h-1v1H5v-1H4zM6 23H5v1h1v-1zM7 22H6v1h1v-1zM8 21H7v1h1v-1zM9 20H8v1h1v-1zM11 19H9v1h2v-1zM12 10v8h-1v1h2v-9h-1zM14 10V9h-1v1h1zM15 8V7h-1v2h2V8h-1zM18 6h-3v1h3V6zM19 7h-1v1h1V7zM21 8h-2v1h2V8zM23 22V9h-2v1h1v12h1zM21 24v-1h1v-1h-2v2h1zM15 13h1v1h-1v-1zM20 13h1v1h-1v-1zM18 15h2v1h-2v-1zM17 18h3v1h-3v-1z"/><path fill="#000" fill-opacity=".2" d="M17 13h-1v1h1v-1zM22 13h-1v1h1v-1z"/><path fill="#000" fill-opacity=".4" d="M17 12h-2v1h2v-1zM20 12v1h2v-1h-2zM22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1z"/>';
        parts[4] = thirdLayers[larvaLad.layerThree];
        parts[5] = fourthLayers[larvaLad.layerFour];
        parts[6] = fifthLayers[larvaLad.layerFive];
        parts[7] = sixthLayers[larvaLad.layerSix];
        parts[8] = '<style>#x{shape-rendering: crispedges;}</style></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));

        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        LarvaObject memory larvaLad = randomLarvaLad(tokenId);
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Larva Lad #', toString(tokenId), '", "description": "Larva Lads are a play on the CryptoPunks and their creators, Larva Labs. The artwork and metadata are fully on-chain and were randomly generated at mint."', getTraits(larvaLad), '"image": "data:image/svg+xml;base64,', Base64.encode(bytes(getSVG(larvaLad))), '"}'))));
        json = string(abi.encodePacked('data:application/json;base64,', json));
        return json;
    }

    function mint(address destination, uint256 amountOfTokens) private {
        require(totalSupply() < maxSupply, "All tokens have been minted");
        require(totalSupply() + amountOfTokens <= maxSupply, "Minting would exceed max supply");
        require(amountOfTokens <= maxMint, "Cannot purchase this many tokens in a transaction");
        require(amountOfTokens > 0, "Must mint at least one token");
        require(price * amountOfTokens == msg.value, "ETH amount is incorrect");

        for (uint256 i = 0; i < amountOfTokens; i++) {
            uint256 tokenId = numTokensMinted + 1;
            _safeMint(destination, tokenId);
            numTokensMinted += 1;
        }
    }

    function mintForSelf(uint256 amountOfTokens) public payable virtual {
        mint(_msgSender(),amountOfTokens);
    }

    function mintForFriend(address walletAddress, uint256 amountOfTokens) public payable virtual {
        mint(walletAddress,amountOfTokens);
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

    function setMaxMint(uint256 newMaxMint) public onlyOwner {
        maxMint = newMaxMint;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(_msgSender()).send(address(this).balance));
    }

    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);
    }
    
    constructor() ERC721("Larva Lads", "LARVA") Ownable() {}
}

library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        uint256 encodedLen = 4 * ((len + 2) / 3);

        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[{"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":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"},{"internalType":"uint256","name":"amountOfTokens","type":"uint256"}],"name":"mintForFriend","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfTokens","type":"uint256"}],"name":"mintForSelf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"newMaxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

611388600c5566b1a2bc2ec50000600d55600a600e556007610180818152662341453842363160c81b6101a05260809081526101c0828152662344424231383160c81b6101e05260a0526102008281526611a29c20a09c9b60c91b6102205260c0526102408281526611a3232199219960c91b6102605260e052610280828152660234545434641360cc1b6102a052610100526102c08281526611a19ca1a220a360c91b6102e05261012052610300828152662344354336453160c81b6103205261014052610380604052610340918252662345414439443960c81b6103605261016091909152620000f690601090600862000b04565b506040805161012081018252600560e0820181815264536d696c6560d81b61010084015282528251808401845281815264233937bbb760d91b6020828101919091528084019190915283518085018552600a81526948616e646c656261727360b01b8183015283850152835180850185526006808252655a6f6d62696560d01b828401526060850191909152845180860186529283526420b634b2b760d91b83830152608084019290925283518085018552600381526241706560e81b8183015260a0840152835180850190945290835265139bdc9b585b60d21b9083015260c0810191909152620001ed90601890600762000b5b565b50604080516101408101909152602660e08201818152829162005a2c610100840139815260200160405180606001604052806026815260200162004d8c6026913981526020016040518060a001604052806067815260200162004a866067913981526020016040518061020001604052806101e081526020016200584c6101e091398152602001604051806101e001604052806101a68152602001620050626101a6913981526020016040518061026001604052806102358152602001620053996102359139815260408051602081810190925260008152910152620002d890601f90600762000b5b565b506040805161014081018252600a610100820190815269334420476c617373657360b01b61012083015281528151808301835260028152612b2960f11b6020828101919091528083019190915282518084018452600c81526b536d616c6c2053686164657360a01b818301528284015282518084018452600981526808af2ca40a0c2e8c6d60bb1b81830152606083015282518084018452600e8082526d436c61737369632053686164657360901b828401526080840191909152835180850185529081526d526567756c61722053686164657360901b8183015260a0830152825180840184526012815271486f726e65642052696d20476c617373657360701b8183015260c0830152825180840190935260048352634e6f6e6560e01b9083015260e08101919091526200041290602690600862000b04565b50604080516101c0810190915260856101008201818152829162004a0161012084013981526020016040518060e0016040528060bc81526020016200572460bc913981526020016040518060600160405280603a815260200162004aed603a913981526020016040518060600160405280603f815260200162004758603f913981526020016040518060e0016040528060a681526020016200468960a691398152602001604051806080016040528060518152602001620052086051913981526020016040518060c001604052806086815260200162004e20608691398152604080516020818101909252600081529101526200051490602e90600862000b04565b50604080516102008101825260066101c08201818152654265616e696560d01b6101e0840152825282518084018452600a8082526910dbddd89bde4812185d60b21b6020838101919091528085019290925284518086018652838152654665646f726160d01b818401528486015284518086018652818152690506f6c696365204361760b41b8184015260608501528451808601865292835265446f2d72616760d01b83830152608084019290925283518085018552600b8082526a04b6e6974746564204361760ac1b8284015260a08501919091528451808601865260078082526642616e64616e6160c81b8285015260c086019190915285518087018752848152695065616b205370696b6560b01b8185015260e08601528551808701875260098152682bb4b632102430b4b960b91b81850152610100860152855180870187529384526926b2b9b9bc902430b4b960b11b84840152610120850193909352845180860186529081526a10d85c08119bdc9dd85c9960aa1b8183015261014084015283518085018552600381526204361760ec1b818301526101608401528351808501855291825266151bdc0812185d60ca1b82820152610180830191909152825180840190935260048352634e6f6e6560e01b908301526101a08101919091526200070790603690600e62000ba0565b506040805161030081019091526101166101c082018181528291620048eb6101e084013981526020016040518060a00160405280607a815260200162004f7d607a913981526020016040518060a00160405280606e815260200162004db2606e913981526020016040518061018001604052806101568152602001620055ce610156913981526020016040518060c00160405280609c815260200162004797609c9139815260200160405180610100016040528060dc815260200162005c0060dc9139815260200160405180610100016040528060d7815260200162004ea660d7913981526020016040518060a00160405280606b815260200162004ff7606b913981526020016040518060e0016040528060bf815260200162004ccd60bf91398152602001604051806101e001604052806101ae815260200162005a526101ae913981526020016040518060e0016040528060be815260200162004c0f60be913981526020016040518060a00160405280606c8152602001620057e0606c913981526020016040518060a001604052806068815260200162004ba760689139815260408051602081810190925260008152910152620008cc90604490600e62000ba0565b506040805160e081018252600760a082019081526645617272696e6760c81b60c08301528152815180830183526004808252635661706560e01b6020838101919091528084019290925283518085018552600981526843696761726574746560b81b818401528385015283518085018552818152635069706560e01b81840152606084015283518085019094528352634e6f6e6560e01b9083015260808101919091526200097f90605290600562000be5565b50604080516101008101909152602960a0820181815282916200472f60c084013981526020016040518060a001604052806080815260200162004b276080913981526020016040518060e0016040528060b881526020016200483360b891398152602001604051806101600160405280610140815260200162005259610140913981526040805160208181019092526000815291015262000a2590605790600562000be5565b5034801562000a3357600080fd5b50604080518082018252600a8152694c61727661204c61647360b01b6020808301918252835180850190945260058452644c4152564160d81b90840152815191929162000a839160009162000c2a565b50805162000a9990600190602084019062000c2a565b50506001600a555062000aac3362000ab2565b62000d6c565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b826008810192821562000b49579160200282015b8281111562000b49578251805162000b3891849160209091019062000c2a565b509160200191906001019062000b18565b5062000b5792915062000cb5565b5090565b826007810192821562000b49579160200282015b8281111562000b49578251805162000b8f91849160209091019062000c2a565b509160200191906001019062000b6f565b82600e810192821562000b49579160200282015b8281111562000b49578251805162000bd491849160209091019062000c2a565b509160200191906001019062000bb4565b826005810192821562000b49579160200282015b8281111562000b49578251805162000c1991849160209091019062000c2a565b509160200191906001019062000bf9565b82805462000c389062000d2f565b90600052602060002090601f01602090048101928262000c5c576000855562000ca7565b82601f1062000c7757805160ff191683800117855562000ca7565b8280016001018555821562000ca7579182015b8281111562000ca757825182559160200191906001019062000c8a565b5062000b5792915062000cd6565b8082111562000b5757600062000ccc828262000ced565b5060010162000cb5565b5b8082111562000b57576000815560010162000cd7565b50805462000cfb9062000d2f565b6000825580601f1062000d0c575050565b601f01602090049060005260206000209081019062000d2c919062000cd6565b50565b600181811c9082168062000d4457607f821691505b6020821081141562000d6657634e487b7160e01b600052602260045260246000fd5b50919050565b61390d8062000d7c6000396000f3fe6080604052600436106101b75760003560e01c80637501f741116100ec578063a22cb4651161008a578063c87b56dd11610064578063c87b56dd14610484578063d5abeb01146104a4578063e985e9c5146104ba578063f2fde38b1461050357600080fd5b8063a22cb46514610431578063b88d4fde14610451578063c49b3d541461047157600080fd5b806391b7f5ed116100c657806391b7f5ed146103d357806395d89b41146103f3578063a035b1fe14610408578063a108f5291461041e57600080fd5b80637501f74114610397578063853828b6146103ad5780638da5cb5b146103b557600080fd5b80634230baee11610159578063547520fe11610133578063547520fe146103225780636352211e1461034257806370a0823114610362578063715018a61461038257600080fd5b80634230baee146102cc57806342842e0e146102e25780634f6ccce71461030257600080fd5b8063095ea7b311610195578063095ea7b31461024b57806318160ddd1461026d57806323b872dd1461028c5780632f745c59146102ac57600080fd5b806301ffc9a7146101bc57806306fdde03146101f1578063081812fc14610213575b600080fd5b3480156101c857600080fd5b506101dc6101d7366004612bde565b610523565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b5061020661054e565b6040516101e89190613162565b34801561021f57600080fd5b5061023361022e366004612c18565b6105e0565b6040516001600160a01b0390911681526020016101e8565b34801561025757600080fd5b5061026b610266366004612bb4565b61067a565b005b34801561027957600080fd5b506008545b6040519081526020016101e8565b34801561029857600080fd5b5061026b6102a7366004612a60565b610790565b3480156102b857600080fd5b5061027e6102c7366004612bb4565b6107c1565b3480156102d857600080fd5b5061027e600f5481565b3480156102ee57600080fd5b5061026b6102fd366004612a60565b610857565b34801561030e57600080fd5b5061027e61031d366004612c18565b610872565b34801561032e57600080fd5b5061026b61033d366004612c18565b610905565b34801561034e57600080fd5b5061023361035d366004612c18565b610934565b34801561036e57600080fd5b5061027e61037d366004612a0b565b6109ab565b34801561038e57600080fd5b5061026b610a32565b3480156103a357600080fd5b5061027e600e5481565b61026b610a68565b3480156103c157600080fd5b50600b546001600160a01b0316610233565b3480156103df57600080fd5b5061026b6103ee366004612c18565b610ab6565b3480156103ff57600080fd5b50610206610ae5565b34801561041457600080fd5b5061027e600d5481565b61026b61042c366004612bb4565b610af4565b34801561043d57600080fd5b5061026b61044c366004612b78565b610b02565b34801561045d57600080fd5b5061026b61046c366004612a9c565b610bc7565b61026b61047f366004612c18565b610bff565b34801561049057600080fd5b5061020661049f366004612c18565b610c0c565b3480156104b057600080fd5b5061027e600c5481565b3480156104c657600080fd5b506101dc6104d5366004612a2d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561050f57600080fd5b5061026b61051e366004612a0b565b610c94565b60006001600160e01b0319821663780e9d6360e01b1480610548575061054882610d2c565b92915050565b60606000805461055d906132db565b80601f0160208091040260200160405190810160405280929190818152602001828054610589906132db565b80156105d65780601f106105ab576101008083540402835291602001916105d6565b820191906000526020600020905b8154815290600101906020018083116105b957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661065e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061068582610934565b9050806001600160a01b0316836001600160a01b031614156106f35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610655565b336001600160a01b038216148061070f575061070f81336104d5565b6107815760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610655565b61078b8383610d7c565b505050565b61079a3382610dea565b6107b65760405162461bcd60e51b8152600401610655906131fc565b61078b838383610ee1565b60006107cc836109ab565b821061082e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610655565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61078b83838360405180602001604052806000815250610bc7565b600061087d60085490565b82106108e05760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610655565b600882815481106108f3576108f3613387565b90600052602060002001549050919050565b600b546001600160a01b0316331461092f5760405162461bcd60e51b8152600401610655906131c7565b600e55565b6000818152600260205260408120546001600160a01b0316806105485760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610655565b60006001600160a01b038216610a165760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610655565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610a5c5760405162461bcd60e51b8152600401610655906131c7565b610a66600061108c565b565b600b546001600160a01b03163314610a925760405162461bcd60e51b8152600401610655906131c7565b60405133904780156108fc02916000818181858888f19350505050610a6657600080fd5b600b546001600160a01b03163314610ae05760405162461bcd60e51b8152600401610655906131c7565b600d55565b60606001805461055d906132db565b610afe82826110de565b5050565b6001600160a01b038216331415610b5b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610655565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610bd13383610dea565b610bed5760405162461bcd60e51b8152600401610655906131fc565b610bf984848484611303565b50505050565b610c0933826110de565b50565b60606000610c1983611336565b90506000610c69610c29856113e3565b610c32846114e1565b610c43610c3e86611a05565b611e80565b604051602001610c5593929190612e8e565b604051602081830303815290604052611e80565b905080604051602001610c7c91906130c5565b60408051601f19818403018152919052949350505050565b600b546001600160a01b03163314610cbe5760405162461bcd60e51b8152600401610655906131c7565b6001600160a01b038116610d235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610655565b610c098161108c565b60006001600160e01b031982166380ac58cd60e01b1480610d5d57506001600160e01b03198216635b5e139f60e01b145b8061054857506301ffc9a760e01b6001600160e01b0319831614610548565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610db182610934565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316610e635760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610655565b6000610e6e83610934565b9050806001600160a01b0316846001600160a01b03161480610ea95750836001600160a01b0316610e9e846105e0565b6001600160a01b0316145b80610ed957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316610ef482610934565b6001600160a01b031614610f5c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610655565b6001600160a01b038216610fbe5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610655565b610fc9838383611fe6565b610fd4600082610d7c565b6001600160a01b0383166000908152600360205260408120805460019290610ffd908490613298565b90915550506001600160a01b038216600090815260036020526040812080546001929061102b90849061324d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600c54600854106111315760405162461bcd60e51b815260206004820152601b60248201527f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006044820152606401610655565b600c548161113e60085490565b611148919061324d565b11156111965760405162461bcd60e51b815260206004820152601f60248201527f4d696e74696e6720776f756c6420657863656564206d617820737570706c79006044820152606401610655565b600e548111156112025760405162461bcd60e51b815260206004820152603160248201527f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736044820152701034b71030903a3930b739b0b1ba34b7b760791b6064820152608401610655565b600081116112525760405162461bcd60e51b815260206004820152601c60248201527f4d757374206d696e74206174206c65617374206f6e6520746f6b656e000000006044820152606401610655565b3481600d546112619190613279565b146112ae5760405162461bcd60e51b815260206004820152601760248201527f45544820616d6f756e7420697320696e636f72726563740000000000000000006044820152606401610655565b60005b8181101561078b576000600f5460016112ca919061324d565b90506112d6848261209e565b6001600f60008282546112e9919061324d565b909155508291506112fb905081613316565b9150506112b1565b61130e848484610ee1565b61131a848484846120b8565b610bf95760405162461bcd60e51b815260040161065590613175565b6113686040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b61139a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6113a3836121c5565b81526113ae836122ba565b60208201526113bc83612374565b60408201526113ca8361245a565b60608201526113d8836125d7565b608082015292915050565b6060816114075750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611431578061141b81613316565b915061142a9050600a83613265565b915061140b565b60008167ffffffffffffffff81111561144c5761144c61339d565b6040519080825280601f01601f191660200182016040528015611476576020820181803683370190505b5090505b8415610ed95761148b600183613298565b9150611498600a86613331565b6114a390603061324d565b60f81b8183815181106114b8576114b8613387565b60200101906001600160f81b031916908160001a9053506114da600a86613265565b945061147a565b60606114eb6129ac565b6040518060600160405280603181526020016137f4603191398152602083015160031415611532576040518060600160405280603481526020016134a66034913960208201525b82602001516004141561155e576040518060600160405280603281526020016138256032913960408201525b82602001516005141561158a576040518060600160405280602e81526020016138aa602e913960608201525b6003836020015110806115a1575060058360200151115b156116b6576040518060600160405280602b815260200161387f602b913960808201526020830151601890600781106115dc576115dc613387565b0180546115e8906132db565b80601f0160208091040260200160405190810160405280929190818152602001828054611614906132db565b80156116615780601f1061163657610100808354040283529160200191611661565b820191906000526020600020905b81548152906001019060200180831161164457829003601f168201915b50505050508160056014811061167957611679613387565b602002018190525060405180604001604052806003815260200162089f4b60ea1b815250816006601481106116b0576116b0613387565b60200201525b6040518060600160405280602481526020016134826024913960e08201526040830151602690600881106116ec576116ec613387565b0180546116f8906132db565b80601f0160208091040260200160405190810160405280929190818152602001828054611724906132db565b80156117715780601f1061174657610100808354040283529160200191611771565b820191906000526020600020905b81548152906001019060200180831161175457829003601f168201915b50505050508160086014811061178957611789613387565b6020020181905250604051806060016040528060288152602001613857602891396101208201526060830151603690600e81106117c8576117c8613387565b0180546117d4906132db565b80601f0160208091040260200160405190810160405280929190818152602001828054611800906132db565b801561184d5780601f106118225761010080835404028352916020019161184d565b820191906000526020600020905b81548152906001019060200180831161183057829003601f168201915b505050505081600a6014811061186557611865613387565b60200201819052506040518060600160405280602981526020016133ca602991396101608201526080830151605290600581106118a4576118a4613387565b0180546118b0906132db565b80601f01602080910402602001604051908101604052809291908181526020018280546118dc906132db565b80156119295780601f106118fe57610100808354040283529160200191611929565b820191906000526020600020905b81548152906001019060200180831161190c57829003601f168201915b505050505081600c6014811061194157611941613387565b6020020181905250604051806040016040528060058152602001640113eae96160dd1b81525081600d6014811061197a5761197a613387565b602090810291909101919091528151828201516040808501516060860151608087015160a088015160c089015160e08a015195516000996119be9998979101612d27565b60408051808303601f19018152908290526101008401516101208501516101408601516101608701516101808801516101a0890151959750610c7c96889690602001612c95565b6060611a0f6129d4565b6040518060c00160405280608f81526020016133f3608f9139815260408051808201909152600c81526b1e3830ba34103334b6361e9160a11b60208201528160016020020152825160109060088110611a6a57611a6a613387565b018054611a76906132db565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa2906132db565b8015611aef5780601f10611ac457610100808354040283529160200191611aef565b820191906000526020600020905b815481529060010190602001808311611ad257829003601f168201915b505050505081600260098110611b0757611b07613387565b6020020181905250604051806102e001604052806102a581526020016134da6102a5913960608201526020830151601f9060078110611b4857611b48613387565b018054611b54906132db565b80601f0160208091040260200160405190810160405280929190818152602001828054611b80906132db565b8015611bcd5780601f10611ba257610100808354040283529160200191611bcd565b820191906000526020600020905b815481529060010190602001808311611bb057829003601f168201915b505050505081600460098110611be557611be5613387565b60200201526040830151602e9060088110611c0257611c02613387565b018054611c0e906132db565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3a906132db565b8015611c875780601f10611c5c57610100808354040283529160200191611c87565b820191906000526020600020905b815481529060010190602001808311611c6a57829003601f168201915b505050505081600560098110611c9f57611c9f613387565b60200201526060830151604490600e8110611cbc57611cbc613387565b018054611cc8906132db565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf4906132db565b8015611d415780601f10611d1657610100808354040283529160200191611d41565b820191906000526020600020905b815481529060010190602001808311611d2457829003601f168201915b505050505081600660098110611d5957611d59613387565b6020020152608083015160579060058110611d7657611d76613387565b018054611d82906132db565b80601f0160208091040260200160405190810160405280929190818152602001828054611dae906132db565b8015611dfb5780601f10611dd057610100808354040283529160200191611dfb565b820191906000526020600020905b815481529060010190602001808311611dde57829003601f168201915b505050505081600760098110611e1357611e13613387565b602002018190525060405180606001604052806035815260200161377f60359139610100820181905281516020808401516040808601516060870151608088015160a089015160c08a015160e08b0151955160009a610c7c9a999697959694959394929392909101612dcc565b805160609080611ea0575050604080516020810190915260008152919050565b60006003611eaf83600261324d565b611eb99190613265565b611ec4906004613279565b90506000611ed382602061324d565b67ffffffffffffffff811115611eeb57611eeb61339d565b6040519080825280601f01601f191660200182016040528015611f15576020820181803683370190505b50905060006040518060600160405280604081526020016137b4604091399050600181016020830160005b86811015611fa1576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611f40565b506003860660018114611fbb5760028114611fcc57611fd8565b613d3d60f01b600119830152611fd8565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0383166120415761203c81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612064565b816001600160a01b0316836001600160a01b03161461206457612064838261266a565b6001600160a01b03821661207b5761078b81612707565b826001600160a01b0316826001600160a01b03161461078b5761078b82826127b6565b610afe8282604051806020016040528060008152506127fa565b60006001600160a01b0384163b156121ba57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120fc90339089908890889060040161312f565b602060405180830381600087803b15801561211657600080fd5b505af1925050508015612146575060408051601f3d908101601f1916820190925261214391810190612bfb565b60015b6121a0573d808015612174576040519150601f19603f3d011682016040523d82523d6000602084013e612179565b606091505b5080516121985760405162461bcd60e51b815260040161065590613175565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610ed9565b506001949350505050565b6000806121f86121d4846113e3565b6040516020016121e491906130a0565b60405160208183030381529060405261282d565b90506000612207604f83613331565b90506000600a821015801561221c5750601482105b15612225575060015b601482101580156122365750601e82105b1561223f575060025b601e82101580156122505750602882105b15612259575060035b6028821015801561226a5750603282105b15612273575060045b603282101580156122845750603c82105b1561228d575060055b603c821015801561229e5750604682105b156122a7575060065b60468210610ed957506007949350505050565b6000806122d96122c9846113e3565b6040516020016121e4919061300a565b905060006122e860aa83613331565b90506000602e82101580156122fd5750604082105b15612306575060015b604082101580156123175750605182105b15612320575060025b605182101580156123315750605582105b1561233a575060035b8160551415612347575060045b605682101580156123585750605882105b15612361575060055b60588210610ed957506006949350505050565b600080612393612383846113e3565b6040516020016121e4919061310a565b905060006123a36101f483613331565b90506000602982101580156123b85750605182105b156123c1575060015b605182101580156123d25750607982105b156123db575060025b607982101580156123ec575060a182105b156123f5575060035b60a18210158015612406575060c982105b1561240f575060045b60c98210158015612421575061010582105b1561242a575060055b610105821015801561243d575061011982105b15612446575060065b6101198210610ed957506007949350505050565b600080612479612469846113e3565b6040516020016121e4919061303d565b9050600061248860f083613331565b90506000600a821015801561249d5750601482105b156124a6575060015b601482101580156124b75750601e82105b156124c0575060025b601e82101580156124d15750602882105b156124da575060035b602882101580156124eb5750603282105b156124f4575060045b603282101580156125055750603c82105b1561250e575060055b603c821015801561251f5750604682105b15612528575060065b604682101580156125395750605082105b15612542575060075b605082101580156125535750605a82105b1561255c575060085b605a821015801561256d5750606482105b15612576575060095b606482101580156125875750606e82105b156125905750600a5b606e82101580156125a15750607882105b156125aa5750600b5b607882101580156125bb5750608282105b156125c45750600c5b60828210610ed95750600d949350505050565b6000806125f66125e6846113e3565b6040516020016121e4919061306f565b90506000612605607883613331565b90506000600a821015801561261a5750601482105b15612623575060015b601482101580156126345750601e82105b1561263d575060025b601e821015801561264e5750602882105b15612657575060035b60288210610ed957506004949350505050565b60006001612677846109ab565b6126819190613298565b6000838152600760205260409020549091508082146126d4576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061271990600190613298565b6000838152600960205260408120546008805493945090928490811061274157612741613387565b90600052602060002001549050806008838154811061276257612762613387565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061279a5761279a613371565b6001900381819060005260206000200160009055905550505050565b60006127c1836109ab565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b612804838361285e565b61281160008484846120b8565b61078b5760405162461bcd60e51b815260040161065590613175565b6000816040516020016128409190612c79565b60408051601f19818403018152919052805160209091012092915050565b6001600160a01b0382166128b45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610655565b6000818152600260205260409020546001600160a01b0316156129195760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610655565b61292560008383611fe6565b6001600160a01b038216600090815260036020526040812080546001929061294e90849061324d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518061028001604052806014905b60608152602001906001900390816129bc5790505090565b604080516101208101909152606081526008602082016129bc565b80356001600160a01b0381168114612a0657600080fd5b919050565b600060208284031215612a1d57600080fd5b612a26826129ef565b9392505050565b60008060408385031215612a4057600080fd5b612a49836129ef565b9150612a57602084016129ef565b90509250929050565b600080600060608486031215612a7557600080fd5b612a7e846129ef565b9250612a8c602085016129ef565b9150604084013590509250925092565b60008060008060808587031215612ab257600080fd5b612abb856129ef565b9350612ac9602086016129ef565b925060408501359150606085013567ffffffffffffffff80821115612aed57600080fd5b818701915087601f830112612b0157600080fd5b813581811115612b1357612b1361339d565b604051601f8201601f19908116603f01168101908382118183101715612b3b57612b3b61339d565b816040528281528a6020848701011115612b5457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612b8b57600080fd5b612b94836129ef565b915060208301358015158114612ba957600080fd5b809150509250929050565b60008060408385031215612bc757600080fd5b612bd0836129ef565b946020939093013593505050565b600060208284031215612bf057600080fd5b8135612a26816133b3565b600060208284031215612c0d57600080fd5b8151612a26816133b3565b600060208284031215612c2a57600080fd5b5035919050565b60008151808452612c498160208601602086016132af565b601f01601f19169290920160200192915050565b60008151612c6f8185602086016132af565b9290920192915050565b60008251612c8b8184602087016132af565b9190910192915050565b600088516020612ca88285838e016132af565b895191840191612cbb8184848e016132af565b8951920191612ccd8184848d016132af565b8851920191612cdf8184848c016132af565b8751920191612cf18184848b016132af565b8651920191612d038184848a016132af565b8551920191612d1581848489016132af565b919091019a9950505050505050505050565b600089516020612d3a8285838f016132af565b8a5191840191612d4d8184848f016132af565b8a51920191612d5f8184848e016132af565b8951920191612d718184848d016132af565b8851920191612d838184848c016132af565b8751920191612d958184848b016132af565b8651920191612da78184848a016132af565b8551920191612db981848489016132af565b919091019b9a5050505050505050505050565b60008a51612dde818460208f016132af565b8a5190830190612df2818360208f016132af565b8a51612e048183850160208f016132af565b8a51929091010190612e1a818360208d016132af565b8851612e2c8183850160208d016132af565b8851929091010190612e42818360208b016132af565b8651612e548183850160208b016132af565b8651929091010190612e6a8183602089016132af565b8451612e7c81838501602089016132af565b9101019b9a5050505050505050505050565b747b226e616d65223a20224c61727661204c6164202360581b81528351600090612ebf8160158501602089016132af565b7f222c20226465736372697074696f6e223a20224c61727661204c6164732061726015918401918201527f65206120706c6179206f6e207468652043727970746f50756e6b7320616e642060358201527f74686569722063726561746f72732c204c61727661204c6162732e205468652060558201527f617274776f726b20616e64206d65746164617461206172652066756c6c79206f60758201527f6e2d636861696e20616e6420776572652072616e646f6d6c792067656e65726160958201526c3a32b21030ba1036b4b73a171160991b60b58201528451612faa8160c28401602089016132af565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360c2929091019182015263194d8d0b60e21b60e2820152613000612ff260e6830186612c5d565b61227d60f01b815260020190565b9695505050505050565b6a4c4159455220544852454560a81b81526000825161303081600b8501602087016132af565b91909101600b0192915050565b694c41594552204649564560b01b81526000825161306281600a8501602087016132af565b91909101600a0192915050565b6809882b28aa440a692b60bb1b8152600082516130938160098501602087016132af565b9190910160090192915050565b692120a9a29021a7a627a960b11b81526000825161306281600a8501602087016132af565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516130fd81601d8501602087016132af565b91909101601d0192915050565b692620aca2a9102327aaa960b11b81526000825161306281600a8501602087016132af565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061300090830184612c31565b602081526000612a266020830184612c31565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561326057613260613345565b500190565b6000826132745761327461335b565b500490565b600081600019048311821515161561329357613293613345565b500290565b6000828210156132aa576132aa613345565b500390565b60005b838110156132ca5781810151838201526020016132b2565b83811115610bf95750506000910152565b600181811c908216806132ef57607f821691505b6020821081141561331057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561332a5761332a613345565b5060010190565b6000826133405761334061335b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610c0957600080fdfe227d2c207b2274726169745f74797065223a20224163636573736f7279222c2276616c7565223a20223c7376672069643d22782220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d22302030203330203330223e3c706174682066696c6c3d22233633383539362220643d224d30203068333076333048307a222f3e207b2274726169745f74797065223a202245796577656172222c2276616c7565223a20225a6f6d626965227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a20225a6f6d626965227d2c2220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c706174682066696c6c3d22233030302220643d224d342032347632683136762d32682d3176314835762d3148347a4d36203233483576316831762d317a4d37203232483676316831762d317a4d38203231483776316831762d317a4d39203230483876316831762d317a4d3131203139483976316832762d317a4d31322031307638682d3176316832762d39682d317a4d31342031305639682d31763168317a4d313520385637682d31763268325638682d317a4d31382036682d337631683356367a4d31392037682d317631683156377a4d32312038682d327631683256387a4d32332032325639682d327631683176313268317a4d3231203234762d316831762d31682d32763268317a4d313520313368317631682d31762d317a4d323020313368317631682d31762d317a4d313820313568327631682d32762d317a4d313720313868337631682d33762d317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e322220643d224d3137203133682d3176316831762d317a4d3232203133682d3176316831762d317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e342220643d224d3137203132682d3276316832762d317a4d323020313276316832762d31682d327a4d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a222f3e3c7374796c653e23787b73686170652d72656e646572696e673a20637269737065646765733b7d3c2f7374796c653e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f2c202261747472696275746573223a205b7b2274726169745f74797065223a202254797065222c2276616c7565223a2022416c69656e227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022416c69656e227d2c227d2c207b2274726169745f74797065223a20224865616477656172222c2276616c7565223a20224e6f726d616c227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022417065227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022417065227d2ca2646970667358221220751e2223928166e6c366430224c4872b56fb8ef9463b06e19669c5f205a48ef164736f6c634300080700333c70617468207374726f6b653d22233030302220643d224d31332031312e3568396d2d37203368326d2e352d2e35762d326d32203076326d2e352e3568326d2d372e352d2e35762d32222f3e3c70617468207374726f6b653d22233543333930462220643d224d31352031322e3568326d3320306832222f3e3c70617468207374726f6b653d22234337373531342220643d224d31352031332e3568326d3320306832222f3e3c706174682066696c6c3d22234646443932362220643d224d313220313468317631682d317a222f3e3c706174682066696c6c3d22233030302220643d224d313320313168397631682d347632682d317631682d32762d31682d31762d32682d31762d317a222f3e3c706174682066696c6c3d22233443344334432220643d224d3133203768397634682d397a222f3e3c706174682066696c6c3d22233030302220643d224d3133203130682d31563868315637683156366837763168327632682d315638682d315637682d377631682d3176327a222f3e3c70617468207374726f6b653d22233633363336332220643d224d313420392e3568316d302d316831222f3e3c70617468207374726f6b653d22233030302220643d224d32302031372e3568376d312031682d316d302031682d37222f3e3c70617468207374726f6b653d22234437443144312220643d224d32302031382e356836222f3e3c70617468207374726f6b653d22234537413630302220643d224d32362031382e356831222f3e3c706174682066696c6c3d2223666666222066696c6c2d6f7061636974793d222e342220643d224d323620313168317635682d317a222f3e3c706174682066696c6c3d22233343433330302220643d224d313420313068377631682d377a222f3e3c706174682066696c6c3d22233030363043332220643d224d313620367634682d345638683156376831563668327a222f3e3c706174682066696c6c3d22234436303430342220643d224d31392036763468345638682d315637682d315636682d327a222f3e3c706174682066696c6c3d22234534454231372220643d224d313420396831563868315636683376326831763168317631682d3756397a222f3e3c706174682066696c6c3d22233030302220643d224d3137203568317631682d317a222f3e3c706174682066696c6c3d22233030363043332220643d224d3135203468357631682d357a222f3e3c706174682066696c6c3d22234630463046302220643d224d31322031316831317634682d39762d33682d32762d317a222f3e3c706174682066696c6c3d22234644333233322220643d224d313920313268337632682d337a222f3e3c706174682066696c6c3d22233332384446442220643d224d313520313268337632682d337a222f3e3c70617468207374726f6b653d22234136364532432220643d224d31362e35203230762d326d332e352d2e35682d336d332e352e357632222f3e3c70617468207374726f6b653d22234332383934362220643d224d31362031372e3568316d3320306831222f3e3c706174682066696c6c3d22233030302220643d224d3133203133762d3168397633682d32762d32682d337632682d32762d32682d327a222f3e3c70617468207374726f6b653d22233030302220643d224d32302031372e3568376d312031682d316d302031682d37222f3e3c70617468207374726f6b653d22233539353935392220643d224d32302031382e356836222f3e3c70617468207374726f6b653d22233030343046462220643d224d32362031382e356831222f3e3c706174682066696c6c3d22233030302220643d224d313320326839763168317635683176316831763148313056396831563868315633683156327a222f3e3c706174682066696c6c3d22234443314431442220643d224d3132203768313176314831327a222f3e3c706174682066696c6c3d22233531353135312220643d224d3133203668397634682d3956367a222f3e3c70617468207374726f6b653d22233030302220643d224d31322031302e356831322e3556396d2d2e352d2e35682d386d302031682d316d382d32682d316d302d31682d316d302d31682d376d302031682d316d2d2e352e357633222f3e3c70617468207374726f6b653d22233335333533352220643d224d323420392e35682d386d2d312d33682d316d302031682d31222f3e3c70617468207374726f6b653d22233030302220643d224d313220342e3568326d34203068356d2d3134203168316d3220306831306d32203068326d2d313720316831366d2d313620316831376d2d313620316831356d2d3136203168396d32203068356d2d3137203168376d32203068326d32203068336d2d3134203168346d39203068326d2d3136203168356d39203068326d2d3136203168316d31203068336d392e352d2e3576324d31302031342e3568346d2d3420316832222f3e3c706174682066696c6c3d22233030302220643d224d313620313968317631682d317a222f3e3c706174682066696c6c3d22233344324631452220643d224d392039683156386833563668315634683156336835763168317632683176326833763168317631483956397a222f3e3c706174682066696c6c3d22233030302220643d224d3132203768313176314831327a222f3e3c706174682066696c6c3d2223666666222066696c6c2d6f7061636974793d222e352220643d224d313420313268337633682d337a4d313920313268337633682d337a222f3e3c706174682066696c6c3d22233030302220643d224d31332031316831317632682d31762d31682d347631682d32762d31682d337631682d31762d327a222f3e3c706174682066696c6c3d22233141343343382220643d224d313320376839763348313076334839762d3348385639683556377a222f3e3c70617468207374726f6b653d22233136333741342220643d224d323220392e35682d316d302031682d336d302d31682d346d382e352d2e3556376d2d2e352d2e35682d386d302031682d316d302031682d316d302031682d316d302031682d316d302d314839222f3e3c70617468207374726f6b653d22233134324337432220643d224d31312031312e35682d316d322d31682d316d322d31682d31222f3e3c706174682066696c6c3d22233739344231312220643d224d382037683176316834563468315633683276316833563368327631683176346834563768317632682d31763148395639483856377a222f3e3c706174682066696c6c3d22233530324630352220643d224d3132203768313176314831327a222f3e3c706174682066696c6c3d22233030302220643d224d3134203756356831563468317631683156346831763168315634683176316831763268317632682d337631682d317631682d31762d31682d315639682d33563768317a4d31322039763168315639682d317a222f3e3c706174682066696c6c3d22234338464246422220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c70617468207374726f6b653d22233735424442442220643d224d31352e3520313276316d352d317631222f3e3c706174682066696c6c3d22233030302220643d224d3231203139762d31682d35763168357a4d31352031336831762d3168317631682d317631682d31762d317a4d323120313268317631682d317631682d31762d316831762d317a222f3e3c706174682066696c6c3d22233942453045302220643d224d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a4d3137203133682d3176316831762d317a4d3232203133682d3176316831762d317a4d3139203134682d3176336831762d337a222f3e3c706174682066696c6c3d22233030302220643d224d31332031326831317632682d317631682d32762d31682d31762d31682d327631682d317631682d32762d31682d31762d31682d31762d317a222f3e3c70617468207374726f6b653d22233030302220643d224d32302031382e3568316d30203168316d30203168316d30203168312e35762d3268345632326d2d31203076316d2d2e352e35682d346d302d31682d316d302d31682d316d302d31682d316d302d31682d31222f3e3c70617468207374726f6b653d22233835353131342220643d224d32302031392e3568316d30203168316d30203168316d30203168336d2d312d3268336d2d3220316831222f3e3c70617468207374726f6b653d22233638334330382220643d224d32352032312e3568316d30203168316d302d316831222f3e3c70617468207374726f6b653d222366666622207374726f6b652d6f7061636974793d222e342220643d224d32362e3520313276312e356d3020304832356d312e3520304832384d32362e3520313576316d3020317631222f3e3c706174682066696c6c3d22233631353033442220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c706174682066696c6c3d222339353841374422207374726f6b653d22233935384137442220643d224d31362e352031392e35762d31682d31762d316831762d32682d31762d31682d31762d336832762d316833763168327634682d31763268317631682d317631682d347a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e342220643d224d3137203132682d3276316832762d317a4d323020313276316832762d31682d327a4d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a222f3e3c706174682066696c6c3d22233030302220643d224d3136203133682d3176316831762d317a4d3231203133682d3176316831762d317a4d3138203136762d31682d31763168317a4d313720313876316833762d31682d337a4d31392e373234203136762d31682d31763168317a222f3e3c706174682066696c6c3d22234141413139372220643d224d3137203134682d31762d31683176317a4d3232203134682d31762d31683176317a222f3e3c706174682066696c6c3d22233236333134412220643d224d3132203568313176354831327a222f3e3c70617468207374726f6b653d22236666662220643d224d313320382e3568316d31203068316d31203068316d31203068316d3120306831222f3e3c70617468207374726f6b653d22234646443830302220643d224d313720362e356831222f3e3c706174682066696c6c3d2223303030222066696c6c2d72756c653d226576656e6f64642220643d224d323320365635682d345634682d337631682d347631682d317632683176326833763168395639682d31563868315636682d317a6d302030682d345635682d337631682d34763268317631683156386831763268385639682d315638683156367a6d2d37203368315638682d3176317a6d32203068315638682d3176317a6d32203068315638682d3176317a2220636c69702d72756c653d226576656e6f6464222f3e3c706174682066696c6c3d22234234423442342220643d224d313420313168397634682d397a222f3e3c70617468207374726f6b653d22233030302220643d224d31342031352e3568386d2d382d3568384d31332e3520313476316d31302d3476346d2d31302d3476316d32202e3576316836762d31682d367a222f3e3c70617468207374726f6b653d22233844384438442220643d224d31332e3520313276326d31203076316d302d3476316d382d3176316d3020327631222f3e3c706174682066696c6c3d22233831313942372220643d224d3132203768315636683156356837763168317632683376316831763148313256377a222f3e3c70617468207374726f6b653d22234232363144432220643d224d323120372e35682d316d302d31682d31222f3e3c706174682066696c6c3d22233744413236392220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e342220643d224d3137203132682d3276316832762d317a4d323020313276316832762d31682d327a4d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a4d3136203134682d3176316831762d317a4d3231203134682d3176316831762d317a4d3138203139682d3176316831762d317a222f3e3c706174682066696c6c3d227265642220643d224d313520313368317631682d31762d317a4d323020313368317631682d31762d317a222f3e3c706174682066696c6c3d22233030302220643d224d3137203133682d3176316831762d317a4d3232203133682d3176316831762d317a4d3230203136762d31682d32763168327a4d313720313876316833762d31682d337a222f3e3c706174682066696c6c3d22233030302220643d224d313620313768317631682d317a222f3e3c706174682066696c6c3d22233030302220643d224d313420313168317631682d317a4d313520313068317631682d317a4d3138203968317633682d317a4d3132203968367631682d367a4d313320313068317631682d317a4d313120313068317631682d317a4d3131203868337631682d337a4d3132203768327631682d327a4d3133203668327631682d327a4d3134203568367631682d367a4d3231203568317632682d317a4d3231203768337631682d337a4d323120313068337631682d337a4d3230203868337632682d337a4d3135203768347632682d347a222f3e3c706174682066696c6c3d22233030302220643d224d3137203668347632682d347a222f3e3c706174682066696c6c3d22233030302220643d224d3134203668347633682d347a222f3e3c70617468207374726f6b653d22233030302220643d224d313420352e3568366d31203068316d2d39203168396d2d313020316831326d2d3133203168386d31203068336d2d3131203168376d31203068336d2d3132203168316d31203068316d31203068316d2d32203168316d332e352d312e3576326d322e352d312e356833222f3e3c706174682066696c6c3d22234341344531312220643d224d31342037682d31763368395637682d315636682d3776317a222f3e3c706174682066696c6c3d22233933333730392220643d224d313220386831317632682d315639682d317631682d315639682d317631682d315639682d317631682d315639682d317631682d315639682d317631682d3156387a222f3e3c70617468207374726f6b653d22233030302220643d224d31312e3520313056386d31203056376d31203056366d2e352d2e3568376d2e352e3576316d31203076316d3120307632222f3e

Deployed ByteCode Sourcemap

20538:16728:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16879:224;;;;;;;;;;-1:-1:-1;16879:224:0;;;;;:::i;:::-;;:::i;:::-;;;14317:14:1;;14310:22;14292:41;;14280:2;14265:18;16879:224:0;;;;;;;;9938:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;11021:221::-;;;;;;;;;;-1:-1:-1;11021:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;13615:32:1;;;13597:51;;13585:2;13570:18;11021:221:0;13451:203:1;10602:411:0;;;;;;;;;;-1:-1:-1;10602:411:0;;;;;:::i;:::-;;:::i;:::-;;17375:113;;;;;;;;;;-1:-1:-1;17463:10:0;:17;17375:113;;;23348:25:1;;;23336:2;23321:18;17375:113:0;23202:177:1;11725:339:0;;;;;;;;;;-1:-1:-1;11725:339:0;;;;;:::i;:::-;;:::i;17111:256::-;;;;;;;;;;-1:-1:-1;17111:256:0;;;;;:::i;:::-;;:::i;20724:30::-;;;;;;;;;;;;;;;;12072:185;;;;;;;;;;-1:-1:-1;12072:185:0;;;;;:::i;:::-;;:::i;17496:233::-;;;;;;;;;;-1:-1:-1;17496:233:0;;;;;:::i;:::-;;:::i;36424:96::-;;;;;;;;;;-1:-1:-1;36424:96:0;;;;;:::i;:::-;;:::i;9691:239::-;;;;;;;;;;-1:-1:-1;9691:239:0;;;;;:::i;:::-;;:::i;9475:208::-;;;;;;;;;;-1:-1:-1;9475:208:0;;;;;:::i;:::-;;:::i;3501:94::-;;;;;;;;;;;;;:::i;20690:27::-;;;;;;;;;;;;;;;;36528:125;;;:::i;3278:87::-;;;;;;;;;;-1:-1:-1;3351:6:0;;-1:-1:-1;;;;;3351:6:0;3278:87;;36328:88;;;;;;;;;;-1:-1:-1;36328:88:0;;;;;:::i;:::-;;:::i;10046:104::-;;;;;;;;;;;;;:::i;20650:33::-;;;;;;;;;;;;;;;;36174:146;;;;;;:::i;:::-;;:::i;11250:295::-;;;;;;;;;;-1:-1:-1;11250:295:0;;;;;:::i;:::-;;:::i;12265:328::-;;;;;;;;;;-1:-1:-1;12265:328:0;;;;;:::i;:::-;;:::i;36046:120::-;;;;;;:::i;:::-;;:::i;34668:661::-;;;;;;;;;;-1:-1:-1;34668:661:0;;;;;:::i;:::-;;:::i;20612:31::-;;;;;;;;;;;;;;;;11553:164;;;;;;;;;;-1:-1:-1;11553:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;11674:25:0;;;11650:4;11674:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;11553:164;3603:192;;;;;;;;;;-1:-1:-1;3603:192:0;;;;;:::i;:::-;;:::i;16879:224::-;16981:4;-1:-1:-1;;;;;;17005:50:0;;-1:-1:-1;;;17005:50:0;;:90;;;17059:36;17083:11;17059:23;:36::i;:::-;16998:97;16879:224;-1:-1:-1;;16879:224:0:o;9938:100::-;9992:13;10025:5;10018:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9938:100;:::o;11021:221::-;11097:7;13013:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13013:16:0;11117:73;;;;-1:-1:-1;;;11117:73:0;;20274:2:1;11117:73:0;;;20256:21:1;20313:2;20293:18;;;20286:30;20352:34;20332:18;;;20325:62;-1:-1:-1;;;20403:18:1;;;20396:42;20455:19;;11117:73:0;;;;;;;;;-1:-1:-1;11210:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;11210:24:0;;11021:221::o;10602:411::-;10683:13;10699:23;10714:7;10699:14;:23::i;:::-;10683:39;;10747:5;-1:-1:-1;;;;;10741:11:0;:2;-1:-1:-1;;;;;10741:11:0;;;10733:57;;;;-1:-1:-1;;;10733:57:0;;21815:2:1;10733:57:0;;;21797:21:1;21854:2;21834:18;;;21827:30;21893:34;21873:18;;;21866:62;-1:-1:-1;;;21944:18:1;;;21937:31;21985:19;;10733:57:0;21613:397:1;10733:57:0;2909:10;-1:-1:-1;;;;;10825:21:0;;;;:62;;-1:-1:-1;10850:37:0;10867:5;2909:10;11553:164;:::i;10850:37::-;10803:168;;;;-1:-1:-1;;;10803:168:0;;17537:2:1;10803:168:0;;;17519:21:1;17576:2;17556:18;;;17549:30;17615:34;17595:18;;;17588:62;17686:26;17666:18;;;17659:54;17730:19;;10803:168:0;17335:420:1;10803:168:0;10984:21;10993:2;10997:7;10984:8;:21::i;:::-;10672:341;10602:411;;:::o;11725:339::-;11920:41;2909:10;11953:7;11920:18;:41::i;:::-;11912:103;;;;-1:-1:-1;;;11912:103:0;;;;;;;:::i;:::-;12028:28;12038:4;12044:2;12048:7;12028:9;:28::i;17111:256::-;17208:7;17244:23;17261:5;17244:16;:23::i;:::-;17236:5;:31;17228:87;;;;-1:-1:-1;;;17228:87:0;;14770:2:1;17228:87:0;;;14752:21:1;14809:2;14789:18;;;14782:30;14848:34;14828:18;;;14821:62;-1:-1:-1;;;14899:18:1;;;14892:41;14950:19;;17228:87:0;14568:407:1;17228:87:0;-1:-1:-1;;;;;;17333:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;17111:256::o;12072:185::-;12210:39;12227:4;12233:2;12237:7;12210:39;;;;;;;;;;;;:16;:39::i;17496:233::-;17571:7;17607:30;17463:10;:17;;17375:113;17607:30;17599:5;:38;17591:95;;;;-1:-1:-1;;;17591:95:0;;22635:2:1;17591:95:0;;;22617:21:1;22674:2;22654:18;;;22647:30;22713:34;22693:18;;;22686:62;-1:-1:-1;;;22764:18:1;;;22757:42;22816:19;;17591:95:0;22433:408:1;17591:95:0;17704:10;17715:5;17704:17;;;;;;;;:::i;:::-;;;;;;;;;17697:24;;17496:233;;;:::o;36424:96::-;3351:6;;-1:-1:-1;;;;;3351:6:0;2909:10;3413:23;3405:68;;;;-1:-1:-1;;;3405:68:0;;;;;;;:::i;:::-;36492:7:::1;:20:::0;36424:96::o;9691:239::-;9763:7;9799:16;;;:7;:16;;;;;;-1:-1:-1;;;;;9799:16:0;9834:19;9826:73;;;;-1:-1:-1;;;9826:73:0;;18373:2:1;9826:73:0;;;18355:21:1;18412:2;18392:18;;;18385:30;18451:34;18431:18;;;18424:62;-1:-1:-1;;;18502:18:1;;;18495:39;18551:19;;9826:73:0;18171:405:1;9475:208:0;9547:7;-1:-1:-1;;;;;9575:19:0;;9567:74;;;;-1:-1:-1;;;9567:74:0;;17962:2:1;9567:74:0;;;17944:21:1;18001:2;17981:18;;;17974:30;18040:34;18020:18;;;18013:62;-1:-1:-1;;;18091:18:1;;;18084:40;18141:19;;9567:74:0;17760:406:1;9567:74:0;-1:-1:-1;;;;;;9659:16:0;;;;;:9;:16;;;;;;;9475:208::o;3501:94::-;3351:6;;-1:-1:-1;;;;;3351:6:0;2909:10;3413:23;3405:68;;;;-1:-1:-1;;;3405:68:0;;;;;;;:::i;:::-;3566:21:::1;3584:1;3566:9;:21::i;:::-;3501:94::o:0;36528:125::-;3351:6;;-1:-1:-1;;;;;3351:6:0;2909:10;3413:23;3405:68;;;;-1:-1:-1;;;3405:68:0;;;;;;;:::i;:::-;36595:49:::1;::::0;2909:10;;36622:21:::1;36595:49:::0;::::1;;;::::0;::::1;::::0;;;36622:21;2909:10;36595:49;::::1;;;;;;36587:58;;;::::0;::::1;36328:88:::0;3351:6;;-1:-1:-1;;;;;3351:6:0;2909:10;3413:23;3405:68;;;;-1:-1:-1;;;3405:68:0;;;;;;;:::i;:::-;36392:5:::1;:16:::0;36328:88::o;10046:104::-;10102:13;10135:7;10128:14;;;;;:::i;36174:146::-;36278:34;36283:13;36297:14;36278:4;:34::i;:::-;36174:146;;:::o;11250:295::-;-1:-1:-1;;;;;11353:24:0;;2909:10;11353:24;;11345:62;;;;-1:-1:-1;;;11345:62:0;;16770:2:1;11345:62:0;;;16752:21:1;16809:2;16789:18;;;16782:30;16848:27;16828:18;;;16821:55;16893:18;;11345:62:0;16568:349:1;11345:62:0;2909:10;11420:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;11420:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;11420:53:0;;;;;;;;;;11489:48;;14292:41:1;;;11420:42:0;;2909:10;11489:48;;14265:18:1;11489:48:0;;;;;;;11250:295;;:::o;12265:328::-;12440:41;2909:10;12473:7;12440:18;:41::i;:::-;12432:103;;;;-1:-1:-1;;;12432:103:0;;;;;;;:::i;:::-;12546:39;12560:4;12566:2;12570:7;12579:5;12546:13;:39::i;:::-;12265:328;;;;:::o;36046:120::-;36125:33;2909:10;36143:14;36125:4;:33::i;:::-;36046:120;:::o;34668:661::-;34733:13;34759:27;34789:23;34804:7;34789:14;:23::i;:::-;34759:53;;34823:18;34844:374;34913:17;34922:7;34913:8;:17::i;:::-;35109:19;35119:8;35109:9;:19::i;:::-;35170:38;35190:16;35197:8;35190:6;:16::i;:::-;35170:13;:38::i;:::-;34871:344;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34844:13;:374::i;:::-;34823:395;;35293:4;35243:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;35243:55:0;;;;;;;;;;34668:661;-1:-1:-1;;;;34668:661:0:o;3603:192::-;3351:6;;-1:-1:-1;;;;;3351:6:0;2909:10;3413:23;3405:68;;;;-1:-1:-1;;;3405:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3692:22:0;::::1;3684:73;;;::::0;-1:-1:-1;;;3684:73:0;;15601:2:1;3684:73:0::1;::::0;::::1;15583:21:1::0;15640:2;15620:18;;;15613:30;15679:34;15659:18;;;15652:62;-1:-1:-1;;;15730:18:1;;;15723:36;15776:19;;3684:73:0::1;15399:402:1::0;3684:73:0::1;3768:19;3778:8;3768:9;:19::i;9162:305::-:0;9264:4;-1:-1:-1;;;;;;9301:40:0;;-1:-1:-1;;;9301:40:0;;:105;;-1:-1:-1;;;;;;;9358:48:0;;-1:-1:-1;;;9358:48:0;9301:105;:158;;;-1:-1:-1;;;;;;;;;;8547:40:0;;;9423:36;8438:157;15154:174;15229:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;15229:29:0;-1:-1:-1;;;;;15229:29:0;;;;;;;;:24;;15283:23;15229:24;15283:14;:23::i;:::-;-1:-1:-1;;;;;15274:46:0;;;;;;;;;;;15154:174;;:::o;13059:348::-;13152:4;13013:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13013:16:0;13169:73;;;;-1:-1:-1;;;13169:73:0;;17124:2:1;13169:73:0;;;17106:21:1;17163:2;17143:18;;;17136:30;17202:34;17182:18;;;17175:62;-1:-1:-1;;;17253:18:1;;;17246:42;17305:19;;13169:73:0;16922:408:1;13169:73:0;13253:13;13269:23;13284:7;13269:14;:23::i;:::-;13253:39;;13322:5;-1:-1:-1;;;;;13311:16:0;:7;-1:-1:-1;;;;;13311:16:0;;:51;;;;13355:7;-1:-1:-1;;;;;13331:31:0;:20;13343:7;13331:11;:20::i;:::-;-1:-1:-1;;;;;13331:31:0;;13311:51;:87;;;-1:-1:-1;;;;;;11674:25:0;;;11650:4;11674:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;13366:32;13303:96;13059:348;-1:-1:-1;;;;13059:348:0:o;14620:526::-;14779:4;-1:-1:-1;;;;;14752:31:0;:23;14767:7;14752:14;:23::i;:::-;-1:-1:-1;;;;;14752:31:0;;14744:85;;;;-1:-1:-1;;;14744:85:0;;21048:2:1;14744:85:0;;;21030:21:1;21087:2;21067:18;;;21060:30;21126:34;21106:18;;;21099:62;-1:-1:-1;;;21177:18:1;;;21170:39;21226:19;;14744:85:0;20846:405:1;14744:85:0;-1:-1:-1;;;;;14848:16:0;;14840:65;;;;-1:-1:-1;;;14840:65:0;;16365:2:1;14840:65:0;;;16347:21:1;16404:2;16384:18;;;16377:30;16443:34;16423:18;;;16416:62;-1:-1:-1;;;16494:18:1;;;16487:34;16538:19;;14840:65:0;16163:400:1;14840:65:0;14918:39;14939:4;14945:2;14949:7;14918:20;:39::i;:::-;14970:29;14987:1;14991:7;14970:8;:29::i;:::-;-1:-1:-1;;;;;15012:15:0;;;;;;:9;:15;;;;;:20;;15031:1;;15012:15;:20;;15031:1;;15012:20;:::i;:::-;;;;-1:-1:-1;;;;;;;15043:13:0;;;;;;:9;:13;;;;;:18;;15060:1;;15043:13;:18;;15060:1;;15043:18;:::i;:::-;;;;-1:-1:-1;;15072:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;15072:21:0;-1:-1:-1;;;;;15072:21:0;;;;;;;;;15111:27;;15072:16;;15111:27;;;;;;;14620:526;;;:::o;3803:173::-;3878:6;;;-1:-1:-1;;;;;3895:17:0;;;-1:-1:-1;;;;;;3895:17:0;;;;;;;3928:40;;3878:6;;;3895:17;3878:6;;3928:40;;3859:16;;3928:40;3848:128;3803:173;:::o;35337:701::-;35439:9;;17463:10;:17;35423:25;35415:65;;;;-1:-1:-1;;;35415:65:0;;23048:2:1;35415:65:0;;;23030:21:1;23087:2;23067:18;;;23060:30;23126:29;23106:18;;;23099:57;23173:18;;35415:65:0;22846:351:1;35415:65:0;35533:9;;35515:14;35499:13;17463:10;:17;;17375:113;35499:13;:30;;;;:::i;:::-;:43;;35491:87;;;;-1:-1:-1;;;35491:87:0;;18783:2:1;35491:87:0;;;18765:21:1;18822:2;18802:18;;;18795:30;18861:33;18841:18;;;18834:61;18912:18;;35491:87:0;18581:355:1;35491:87:0;35615:7;;35597:14;:25;;35589:87;;;;-1:-1:-1;;;35589:87:0;;19143:2:1;35589:87:0;;;19125:21:1;19182:2;19162:18;;;19155:30;19221:34;19201:18;;;19194:62;-1:-1:-1;;;19272:18:1;;;19265:47;19329:19;;35589:87:0;18941:413:1;35589:87:0;35712:1;35695:14;:18;35687:59;;;;-1:-1:-1;;;35687:59:0;;21458:2:1;35687:59:0;;;21440:21:1;21497:2;21477:18;;;21470:30;21536;21516:18;;;21509:58;21584:18;;35687:59:0;21256:352:1;35687:59:0;35791:9;35773:14;35765:5;;:22;;;;:::i;:::-;:35;35757:71;;;;-1:-1:-1;;;35757:71:0;;19922:2:1;35757:71:0;;;19904:21:1;19961:2;19941:18;;;19934:30;20000:25;19980:18;;;19973:53;20043:18;;35757:71:0;19720:347:1;35757:71:0;35846:9;35841:190;35865:14;35861:1;:18;35841:190;;;35901:15;35919;;35937:1;35919:19;;;;:::i;:::-;35901:37;;35953:31;35963:11;35976:7;35953:9;:31::i;:::-;36018:1;35999:15;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;35881:3:0;;-1:-1:-1;35881:3:0;;-1:-1:-1;35881:3:0;;:::i;:::-;;;;35841:190;;12601:315;12758:28;12768:4;12774:2;12778:7;12758:9;:28::i;:::-;12805:48;12828:4;12834:2;12838:7;12847:5;12805:22;:48::i;:::-;12797:111;;;;-1:-1:-1;;;12797:111:0;;;;;;;:::i;27905:435::-;27969:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27969:18:0;28010:27;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28010:27:0;28071:21;28084:7;28071:12;:21::i;:::-;28050:42;;28125:22;28139:7;28125:13;:22::i;:::-;28103:19;;;:44;28179:21;28192:7;28179:12;:21::i;:::-;28158:18;;;:42;28232:21;28245:7;28232:12;:21::i;:::-;28211:18;;;:42;28284:20;28296:7;28284:11;:20::i;:::-;28264:17;;;:40;:8;27905:435;-1:-1:-1;;27905:435:0:o;36661:534::-;36717:13;36749:10;36745:53;;-1:-1:-1;;36776:10:0;;;;;;;;;;;;-1:-1:-1;;;36776:10:0;;;;;36661:534::o;36745:53::-;36823:5;36808:12;36864:78;36871:9;;36864:78;;36897:8;;;;:::i;:::-;;-1:-1:-1;36920:10:0;;-1:-1:-1;36928:2:0;36920:10;;:::i;:::-;;;36864:78;;;36952:19;36984:6;36974:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36974:17:0;;36952:39;;37002:154;37009:10;;37002:154;;37036:11;37046:1;37036:11;;:::i;:::-;;-1:-1:-1;37105:10:0;37113:2;37105:5;:10;:::i;:::-;37092:24;;:2;:24;:::i;:::-;37079:39;;37062:6;37069;37062:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;37062:56:0;;;;;;;;-1:-1:-1;37133:11:0;37142:2;37133:11;;:::i;:::-;;;37002:154;;28352:1529;28423:13;28459:23;;:::i;:::-;28503:62;;;;;;;;;;;;;;;;;;;:8;28580:19;;;28603:1;28580:24;28576:123;;;28621:65;;;;;;;;;;;;;;;;;:8;;;:65;28576:123;28713:8;:19;;;28736:1;28713:24;28709:121;;;28754:63;;;;;;;;;;;;;;;;;:8;;;:63;28709:121;28844:8;:19;;;28867:1;28844:24;28840:117;;;28885:59;;;;;;;;;;;;;;;;;:8;;;:59;28840:117;28993:1;28971:8;:19;;;:23;:50;;;;29020:1;28998:8;:19;;;:23;28971:50;28967:227;;;29038:56;;;;;;;;;;;;;;;;;:8;;;:56;:8;29131:19;;;29120:10;;:31;;;;;;;:::i;:::-;;29109:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;29115:1;29109:8;;;;;;;:::i;:::-;;;;:42;;;;29166:16;;;;;;;;;;;;;-1:-1:-1;;;29166:16:0;;;:5;29172:1;29166:8;;;;;;;:::i;:::-;;;;:16;28967:227;29204:49;;;;;;;;;;;;;;;;;:8;;;:49;29287:18;;;;29275:11;;:31;;;;;;;:::i;:::-;;29264:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;29270:1;29264:8;;;;;;;:::i;:::-;;;;:42;;;;29317:53;;;;;;;;;;;;;;;;;:8;;;:53;29404:18;;;;29393:10;;:30;;;;;;;:::i;:::-;;29381:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;29387:2;29381:9;;;;;;;:::i;:::-;;;;:42;;;;29434:55;;;;;;;;;;;;;;;;;:9;;;:55;29523:17;;;;29512:10;;:29;;;;;;;:::i;:::-;;29500:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;29506:2;29500:9;;;;;;;:::i;:::-;;;;:41;;;;29552:19;;;;;;;;;;;;;-1:-1:-1;;;29552:19:0;;;:5;29558:2;29552:9;;;;;;;:::i;:::-;;;;;;;;;:19;;;;29639:8;;29649;;;;29659;;;;;29669;;;;29679;;;;29689;;;;29699;;;;29709;;;;29622:96;;29592:20;;29622:96;;29639:8;29649;29709;29622:96;;:::i;:::-;;;;;;;-1:-1:-1;;29622:96:0;;;;;;;29785:8;;;;29795;;;;29805:9;;;;29816;;;;29827;;;;29838;;;;29622:96;;-1:-1:-1;29760:88:0;;29622:96;;29838:9;29785:8;29760:88;;:::i;33112:1548::-;33180:13;33206:22;;:::i;:::-;33241:156;;;;;;;;;;;;;;;;;;;33408:25;;;;;;;;;;;;-1:-1:-1;;;33241:8:0;33408:25;;;33241:5;33414:1;33408:8;;;:25;33466:18;;33455:10;;:30;;;;;;;:::i;:::-;;33444:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;33450:1;33444:8;;;;;;;:::i;:::-;;;;:41;;;;33496:690;;;;;;;;;;;;;;;;;:8;;;:690;:8;34220:19;;;34208:11;;:32;;;;;;;:::i;:::-;;34197:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;34203:1;34197:8;;;;;;;:::i;:::-;;;;:43;34275:18;;;;34262:12;;:32;;;;;;;:::i;:::-;;34251:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;34257:1;34251:8;;;;;;;:::i;:::-;;;;:43;34328:18;;;;34316:11;;:31;;;;;;;:::i;:::-;;34305:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;34311:1;34305:8;;;;;;;:::i;:::-;;;;:42;34381:17;;;;34369:11;;:30;;;;;;;:::i;:::-;;34358:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;34364:1;34358:8;;;;;;;:::i;:::-;;;;:41;;;;34410:66;;;;;;;;;;;;;;;;;:8;;;:66;;;34536:8;;34410;34546;;;;34556;;;;;34566;;;;34576;;;;34586;;;;34596;;;;34606;;;;34519:106;;34489:20;;34519:106;;34536:8;34556;;34566;;34576;;34586;;34596;;34606;34410:66;;34519:106;;:::i;37399:1523::-;37497:11;;37457:13;;37523:8;37519:23;;-1:-1:-1;;37533:9:0;;;;;;;;;-1:-1:-1;37533:9:0;;;37399:1523;-1:-1:-1;37399:1523:0:o;37519:23::-;37555:18;37593:1;37582:7;:3;37588:1;37582:7;:::i;:::-;37581:13;;;;:::i;:::-;37576:19;;:1;:19;:::i;:::-;37555:40;-1:-1:-1;37608:19:0;37640:15;37555:40;37653:2;37640:15;:::i;:::-;37630:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37630:26:0;;37608:48;;37669:18;37690:5;;;;;;;;;;;;;;;;;37669:26;;37759:1;37752:5;37748:13;37804:2;37796:6;37792:15;37855:1;37823:777;37878:3;37875:1;37872:10;37823:777;;;37933:1;37976:12;;;;;37970:19;38071:4;38059:2;38055:14;;;;;38037:40;;38031:47;38180:2;38176:14;;;38172:25;;38158:40;;38152:47;38309:1;38305:13;;;38301:24;;38287:39;;38281:46;38429:16;;;;38415:31;;38409:38;38107:1;38103:11;;;38201:4;38148:58;;;38139:68;38232:11;;38277:57;;;38268:67;;;;38360:11;;38405:49;;38396:59;38484:3;38480:13;38513:22;;38583:1;38568:17;;;;37926:9;37823:777;;;37827:44;38632:1;38627:3;38623:11;38653:1;38648:84;;;;38751:1;38746:82;;;;38616:212;;38648:84;-1:-1:-1;;;;;38681:17:0;;38674:43;38648:84;;38746:82;-1:-1:-1;;;;;38779:17:0;;38772:41;38616:212;-1:-1:-1;;;38844:26:0;;;38851:6;37399:1523;-1:-1:-1;;;;37399:1523:0:o;17737:589::-;-1:-1:-1;;;;;17943:18:0;;17939:187;;17978:40;18010:7;18667:10;:17;;18640:24;;;;:15;:24;;;;;:44;;;18695:24;;;;;;;;;;;;18563:164;17978:40;17939:187;;;18048:2;-1:-1:-1;;;;;18040:10:0;:4;-1:-1:-1;;;;;18040:10:0;;18036:90;;18067:47;18100:4;18106:7;18067:32;:47::i;:::-;-1:-1:-1;;;;;18140:16:0;;18136:183;;18173:45;18210:7;18173:36;:45::i;18136:183::-;18246:4;-1:-1:-1;;;;;18240:10:0;:2;-1:-1:-1;;;;;18240:10:0;;18236:83;;18267:40;18295:2;18299:7;18267:27;:40::i;13415:110::-;13491:26;13501:2;13505:7;13491:26;;;;;;;;;;;;:9;:26::i;15336:803::-;15491:4;-1:-1:-1;;;;;15512:13:0;;5008:20;5056:8;15508:624;;15548:72;;-1:-1:-1;;;15548:72:0;;-1:-1:-1;;;;;15548:36:0;;;;;:72;;2909:10;;15599:4;;15605:7;;15614:5;;15548:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15548:72:0;;;;;;;;-1:-1:-1;;15548:72:0;;;;;;;;;;;;:::i;:::-;;;15544:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15794:13:0;;15790:272;;15837:60;;-1:-1:-1;;;15837:60:0;;;;;;;:::i;15790:272::-;16012:6;16006:13;15997:6;15993:2;15989:15;15982:38;15544:533;-1:-1:-1;;;;;;15671:55:0;-1:-1:-1;;;15671:55:0;;-1:-1:-1;15664:62:0;;15508:624;-1:-1:-1;16116:4:0;15336:803;;;;;;:::o;30035:579::-;30097:7;30117:12;30132:65;30177:17;30186:7;30177:8;:17::i;:::-;30146:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;30132:6;:65::i;:::-;30117:80;-1:-1:-1;30210:11:0;30224:9;30231:2;30117:80;30224:9;:::i;:::-;30210:23;;30244:10;30282:2;30275:3;:9;;:21;;;;;30294:2;30288:3;:8;30275:21;30271:38;;;-1:-1:-1;30305:1:0;30271:38;30330:2;30323:3;:9;;:21;;;;;30342:2;30336:3;:8;30323:21;30319:38;;;-1:-1:-1;30353:1:0;30319:38;30378:2;30371:3;:9;;:21;;;;;30390:2;30384:3;:8;30371:21;30367:38;;;-1:-1:-1;30401:1:0;30367:38;30426:2;30419:3;:9;;:21;;;;;30438:2;30432:3;:8;30419:21;30415:38;;;-1:-1:-1;30449:1:0;30415:38;30474:2;30467:3;:9;;:21;;;;;30486:2;30480:3;:8;30467:21;30463:38;;;-1:-1:-1;30497:1:0;30463:38;30522:2;30515:3;:9;;:21;;;;;30534:2;30528:3;:8;30515:21;30511:38;;;-1:-1:-1;30545:1:0;30511:38;30570:2;30563:3;:9;30559:26;;-1:-1:-1;30581:1:0;30604:2;30035:579;-1:-1:-1;;;;30035:579:0:o;30622:530::-;30685:7;30705:12;30720:66;30766:17;30775:7;30766:8;:17::i;:::-;30734:50;;;;;;;;:::i;30720:66::-;30705:81;-1:-1:-1;30799:11:0;30813:10;30820:3;30705:81;30813:10;:::i;:::-;30799:24;;30834:10;30872:2;30865:3;:9;;:21;;;;;30884:2;30878:3;:8;30865:21;30861:38;;;-1:-1:-1;30895:1:0;30861:38;30920:2;30913:3;:9;;:21;;;;;30932:2;30926:3;:8;30913:21;30909:38;;;-1:-1:-1;30943:1:0;30909:38;30968:2;30961:3;:9;;:21;;;;;30980:2;30974:3;:8;30961:21;30957:38;;;-1:-1:-1;30991:1:0;30957:38;31009:3;31016:2;31009:9;31005:26;;;-1:-1:-1;31027:1:0;31005:26;31052:2;31045:3;:9;;:21;;;;;31064:2;31058:3;:8;31045:21;31041:38;;;-1:-1:-1;31075:1:0;31041:38;31100:2;31093:3;:9;31089:26;;-1:-1:-1;31111:1:0;31142:2;30622:530;-1:-1:-1;;;;30622:530:0:o;31160:598::-;31222:7;31242:12;31257:65;31302:17;31311:7;31302:8;:17::i;:::-;31271:49;;;;;;;;:::i;31257:65::-;31242:80;-1:-1:-1;31335:11:0;31349:10;31356:3;31242:80;31349:10;:::i;:::-;31335:24;;31370:10;31408:2;31401:3;:9;;:21;;;;;31420:2;31414:3;:8;31401:21;31397:38;;;-1:-1:-1;31431:1:0;31397:38;31456:2;31449:3;:9;;:22;;;;;31468:3;31462;:9;31449:22;31445:39;;;-1:-1:-1;31480:1:0;31445:39;31505:3;31498;:10;;:23;;;;;31518:3;31512;:9;31498:23;31494:40;;;-1:-1:-1;31530:1:0;31494:40;31555:3;31548;:10;;:23;;;;;31568:3;31562;:9;31548:23;31544:40;;;-1:-1:-1;31580:1:0;31544:40;31605:3;31598;:10;;:23;;;;;31618:3;31612;:9;31598:23;31594:40;;;-1:-1:-1;31630:1:0;31594:40;31655:3;31648;:10;;:23;;;;;31668:3;31662;:9;31648:23;31644:40;;;-1:-1:-1;31680:1:0;31644:40;31705:3;31698;:10;31694:27;;-1:-1:-1;31717:1:0;31748:2;31160:598;-1:-1:-1;;;;31160:598:0:o;31766:888::-;31828:7;31848:12;31863:65;31908:17;31917:7;31908:8;:17::i;:::-;31877:49;;;;;;;;:::i;31863:65::-;31848:80;-1:-1:-1;31941:11:0;31955:10;31962:3;31848:80;31955:10;:::i;:::-;31941:24;;31976:10;32014:2;32007:3;:9;;:21;;;;;32026:2;32020:3;:8;32007:21;32003:38;;;-1:-1:-1;32037:1:0;32003:38;32062:2;32055:3;:9;;:21;;;;;32074:2;32068:3;:8;32055:21;32051:38;;;-1:-1:-1;32085:1:0;32051:38;32110:2;32103:3;:9;;:21;;;;;32122:2;32116:3;:8;32103:21;32099:38;;;-1:-1:-1;32133:1:0;32099:38;32158:2;32151:3;:9;;:21;;;;;32170:2;32164:3;:8;32151:21;32147:38;;;-1:-1:-1;32181:1:0;32147:38;32206:2;32199:3;:9;;:21;;;;;32218:2;32212:3;:8;32199:21;32195:38;;;-1:-1:-1;32229:1:0;32195:38;32254:2;32247:3;:9;;:21;;;;;32266:2;32260:3;:8;32247:21;32243:38;;;-1:-1:-1;32277:1:0;32243:38;32302:2;32295:3;:9;;:21;;;;;32314:2;32308:3;:8;32295:21;32291:38;;;-1:-1:-1;32325:1:0;32291:38;32350:2;32343:3;:9;;:21;;;;;32362:2;32356:3;:8;32343:21;32339:38;;;-1:-1:-1;32373:1:0;32339:38;32398:2;32391:3;:9;;:22;;;;;32410:3;32404;:9;32391:22;32387:39;;;-1:-1:-1;32422:1:0;32387:39;32447:3;32440;:10;;:23;;;;;32460:3;32454;:9;32440:23;32436:41;;;-1:-1:-1;32472:2:0;32436:41;32498:3;32491;:10;;:23;;;;;32511:3;32505;:9;32491:23;32487:41;;;-1:-1:-1;32523:2:0;32487:41;32549:3;32542;:10;;:23;;;;;32562:3;32556;:9;32542:23;32538:41;;;-1:-1:-1;32574:2:0;32538:41;32600:3;32593;:10;32589:28;;-1:-1:-1;32612:2:0;32644;31766:888;-1:-1:-1;;;;31766:888:0:o;32662:442::-;32723:7;32743:12;32758:64;32802:17;32811:7;32802:8;:17::i;:::-;32772:48;;;;;;;;:::i;32758:64::-;32743:79;-1:-1:-1;32835:11:0;32849:10;32856:3;32743:79;32849:10;:::i;:::-;32835:24;;32870:10;32908:2;32901:3;:9;;:21;;;;;32920:2;32914:3;:8;32901:21;32897:38;;;-1:-1:-1;32931:1:0;32897:38;32956:2;32949:3;:9;;:21;;;;;32968:2;32962:3;:8;32949:21;32945:38;;;-1:-1:-1;32979:1:0;32945:38;33004:2;32997:3;:9;;:21;;;;;33016:2;33010:3;:8;32997:21;32993:38;;;-1:-1:-1;33027:1:0;32993:38;33052:2;33045:3;:9;33041:26;;-1:-1:-1;33063:1:0;33094:2;32662:442;-1:-1:-1;;;;32662:442:0:o;18735:557::-;18829:22;18879:1;18854:22;18871:4;18854:16;:22::i;:::-;:26;;;;:::i;:::-;18891:18;18912:26;;;:17;:26;;;;;;18829:51;;-1:-1:-1;18955:28:0;;;18951:236;;-1:-1:-1;;;;;19022:18:0;;19000:19;19022:18;;;:12;:18;;;;;;;;:34;;;;;;;;;19073:30;;;;;;:44;;;19132:30;;:17;:30;;;;;:43;;;18951:236;-1:-1:-1;19206:26:0;;;;:17;:26;;;;;;;;19199:33;;;-1:-1:-1;;;;;19250:18:0;;;;;:12;:18;;;;;:34;;;;;;;19243:41;18735:557::o;19300:425::-;19409:10;:17;19384:22;;19409:21;;19429:1;;19409:21;:::i;:::-;19441:18;19462:24;;;:15;:24;;;;;;19519:10;:26;;19384:46;;-1:-1:-1;19462:24:0;;19384:46;;19519:26;;;;;;:::i;:::-;;;;;;;;;19497:48;;19583:11;19558:10;19569;19558:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;19605:28;;;:15;:28;;;;;;;:41;;;19666:24;;;;;19659:31;19701:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19371:354;;;19300:425;:::o;18334:221::-;18419:14;18436:20;18453:2;18436:16;:20::i;:::-;-1:-1:-1;;;;;18467:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;18512:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;18334:221:0:o;13533:321::-;13663:18;13669:2;13673:7;13663:5;:18::i;:::-;13714:54;13745:1;13749:2;13753:7;13762:5;13714:22;:54::i;:::-;13692:154;;;;-1:-1:-1;;;13692:154:0;;;;;;;:::i;29889:138::-;29949:7;30011:5;29994:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;29994:23:0;;;;;;;;;29984:34;;29994:23;29984:34;;;;;29889:138;-1:-1:-1;;29889:138:0:o;13862:382::-;-1:-1:-1;;;;;13942:16:0;;13934:61;;;;-1:-1:-1;;;13934:61:0;;19561:2:1;13934:61:0;;;19543:21:1;;;19580:18;;;19573:30;19639:34;19619:18;;;19612:62;19691:18;;13934:61:0;19359:356:1;13934:61:0;12989:4;13013:16;;;:7;:16;;;;;;-1:-1:-1;;;;;13013:16:0;:30;14006:58;;;;-1:-1:-1;;;14006:58:0;;16008:2:1;14006:58:0;;;15990:21:1;16047:2;16027:18;;;16020:30;16086;16066:18;;;16059:58;16134:18;;14006:58:0;15806:352:1;14006:58:0;14077:45;14106:1;14110:2;14114:7;14077:20;:45::i;:::-;-1:-1:-1;;;;;14135:13:0;;;;;;:9;:13;;;;;:18;;14152:1;;14135:13;:18;;14152:1;;14135:18;:::i;:::-;;;;-1:-1:-1;;14164:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;14164:21:0;-1:-1:-1;;;;;14164:21:0;;;;;;;;14203:33;;14164:16;;;14203:33;;14164:16;;14203:33;13862:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:52;;;3123:1;3120;3113:12;3075:52;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:180::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;-1:-1:-1;3390:23:1;;3239:180;-1:-1:-1;3239:180:1:o;3424:257::-;3465:3;3503:5;3497:12;3530:6;3525:3;3518:19;3546:63;3602:6;3595:4;3590:3;3586:14;3579:4;3572:5;3568:16;3546:63;:::i;:::-;3663:2;3642:15;-1:-1:-1;;3638:29:1;3629:39;;;;3670:4;3625:50;;3424:257;-1:-1:-1;;3424:257:1:o;3686:185::-;3728:3;3766:5;3760:12;3781:52;3826:6;3821:3;3814:4;3807:5;3803:16;3781:52;:::i;:::-;3849:16;;;;;3686:185;-1:-1:-1;;3686:185:1:o;4006:276::-;4137:3;4175:6;4169:13;4191:53;4237:6;4232:3;4225:4;4217:6;4213:17;4191:53;:::i;:::-;4260:16;;;;;4006:276;-1:-1:-1;;4006:276:1:o;4287:1449::-;4706:3;4744:6;4738:13;4770:4;4783:51;4827:6;4822:3;4817:2;4809:6;4805:15;4783:51;:::i;:::-;4897:13;;4856:16;;;;4919:55;4897:13;4856:16;4941:15;;;4919:55;:::i;:::-;5041:13;;4996:20;;;5063:55;5041:13;4996:20;5085:15;;;5063:55;:::i;:::-;5185:13;;5140:20;;;5207:55;5185:13;5140:20;5229:15;;;5207:55;:::i;:::-;5329:13;;5284:20;;;5351:55;5329:13;5284:20;5373:15;;;5351:55;:::i;:::-;5473:13;;5428:20;;;5495:55;5473:13;5428:20;5517:15;;;5495:55;:::i;:::-;5617:13;;5572:20;;;5639:55;5617:13;5572:20;5661:15;;;5639:55;:::i;:::-;5710:20;;;;;4287:1449;-1:-1:-1;;;;;;;;;;4287:1449:1:o;5741:1641::-;6208:3;6246:6;6240:13;6272:4;6285:51;6329:6;6324:3;6319:2;6311:6;6307:15;6285:51;:::i;:::-;6399:13;;6358:16;;;;6421:55;6399:13;6358:16;6443:15;;;6421:55;:::i;:::-;6543:13;;6498:20;;;6565:55;6543:13;6498:20;6587:15;;;6565:55;:::i;:::-;6687:13;;6642:20;;;6709:55;6687:13;6642:20;6731:15;;;6709:55;:::i;:::-;6831:13;;6786:20;;;6853:55;6831:13;6786:20;6875:15;;;6853:55;:::i;:::-;6975:13;;6930:20;;;6997:55;6975:13;6930:20;7019:15;;;6997:55;:::i;:::-;7119:13;;7074:20;;;7141:55;7119:13;7074:20;7163:15;;;7141:55;:::i;:::-;7263:13;;7218:20;;;7285:55;7263:13;7218:20;7307:15;;;7285:55;:::i;:::-;7356:20;;;;;5741:1641;-1:-1:-1;;;;;;;;;;;5741:1641:1:o;7387:1780::-;7902:3;7940:6;7934:13;7956:53;8002:6;7997:3;7990:4;7982:6;7978:17;7956:53;:::i;:::-;8072:13;;8031:16;;;;8094:57;8072:13;8031:16;8128:4;8116:17;;8094:57;:::i;:::-;8182:6;8176:13;8198:72;8261:8;8250;8243:5;8239:20;8232:4;8224:6;8220:17;8198:72;:::i;:::-;8352:13;;8296:20;;;;8292:35;;8374:57;8352:13;8292:35;8408:4;8396:17;;8374:57;:::i;:::-;8462:6;8456:13;8478:72;8541:8;8530;8523:5;8519:20;8512:4;8504:6;8500:17;8478:72;:::i;:::-;8632:13;;8576:20;;;;8572:35;;8654:57;8632:13;8572:35;8688:4;8676:17;;8654:57;:::i;:::-;8742:6;8736:13;8758:72;8821:8;8810;8803:5;8799:20;8792:4;8784:6;8780:17;8758:72;:::i;:::-;8912:13;;8856:20;;;;8852:35;;8934:57;8912:13;8852:35;8968:4;8956:17;;8934:57;:::i;:::-;9022:6;9016:13;9038:72;9101:8;9090;9083:5;9079:20;9072:4;9064:6;9060:17;9038:72;:::i;:::-;9130:20;;9126:35;;7387:1780;-1:-1:-1;;;;;;;;;;;7387:1780:1:o;9172:1653::-;-1:-1:-1;;;9821:66:1;;9910:13;;9803:3;;9932:62;9910:13;9982:2;9973:12;;9966:4;9954:17;;9932:62;:::i;:::-;10058:66;10053:2;10013:16;;;10045:11;;;10038:87;10154:34;10149:2;10141:11;;10134:55;10218:34;10213:2;10205:11;;10198:55;10283:34;10277:3;10269:12;;10262:56;10348:34;10342:3;10334:12;;10327:56;-1:-1:-1;;;10407:3:1;10399:12;;10392:60;10477:13;;10499:64;10477:13;10548:3;10540:12;;10533:4;10521:17;;10499:64;:::i;:::-;10629:66;10623:3;10582:17;;;;10615:12;;;10608:88;-1:-1:-1;;;10720:3:1;10712:12;;10705:28;10749:70;10779:39;10813:3;10805:12;;10797:6;10779:39;:::i;:::-;-1:-1:-1;;;3941:27:1;;3993:1;3984:11;;3876:125;10749:70;10742:77;9172:1653;-1:-1:-1;;;;;;9172:1653:1:o;10830:430::-;-1:-1:-1;;;11087:3:1;11080:26;11062:3;11135:6;11129:13;11151:62;11206:6;11201:2;11196:3;11192:12;11185:4;11177:6;11173:17;11151:62;:::i;:::-;11233:16;;;;11251:2;11229:25;;10830:430;-1:-1:-1;;10830:430:1:o;11265:429::-;-1:-1:-1;;;11522:3:1;11515:25;11497:3;11569:6;11563:13;11585:62;11640:6;11635:2;11630:3;11626:12;11619:4;11611:6;11607:17;11585:62;:::i;:::-;11667:16;;;;11685:2;11663:25;;11265:429;-1:-1:-1;;11265:429:1:o;11699:426::-;-1:-1:-1;;;11956:3:1;11949:24;11931:3;12002:6;11996:13;12018:61;12072:6;12068:1;12063:3;12059:11;12052:4;12044:6;12040:17;12018:61;:::i;:::-;12099:16;;;;12117:1;12095:24;;11699:426;-1:-1:-1;;11699:426:1:o;12130:429::-;-1:-1:-1;;;12387:3:1;12380:25;12362:3;12434:6;12428:13;12450:62;12505:6;12500:2;12495:3;12491:12;12484:4;12476:6;12472:17;12450:62;:::i;12564:448::-;12826:31;12821:3;12814:44;12796:3;12887:6;12881:13;12903:62;12958:6;12953:2;12948:3;12944:12;12937:4;12929:6;12925:17;12903:62;:::i;:::-;12985:16;;;;13003:2;12981:25;;12564:448;-1:-1:-1;;12564:448:1:o;13017:429::-;-1:-1:-1;;;13274:3:1;13267:25;13249:3;13321:6;13315:13;13337:62;13392:6;13387:2;13382:3;13378:12;13371:4;13363:6;13359:17;13337:62;:::i;13659:488::-;-1:-1:-1;;;;;13928:15:1;;;13910:34;;13980:15;;13975:2;13960:18;;13953:43;14027:2;14012:18;;14005:34;;;14075:3;14070:2;14055:18;;14048:31;;;13853:4;;14096:45;;14121:19;;14113:6;14096:45;:::i;14344:219::-;14493:2;14482:9;14475:21;14456:4;14513:44;14553:2;14542:9;14538:18;14530:6;14513:44;:::i;14980:414::-;15182:2;15164:21;;;15221:2;15201:18;;;15194:30;15260:34;15255:2;15240:18;;15233:62;-1:-1:-1;;;15326:2:1;15311:18;;15304:48;15384:3;15369:19;;14980:414::o;20485:356::-;20687:2;20669:21;;;20706:18;;;20699:30;20765:34;20760:2;20745:18;;20738:62;20832:2;20817:18;;20485:356::o;22015:413::-;22217:2;22199:21;;;22256:2;22236:18;;;22229:30;22295:34;22290:2;22275:18;;22268:62;-1:-1:-1;;;22361:2:1;22346:18;;22339:47;22418:3;22403:19;;22015:413::o;23384:128::-;23424:3;23455:1;23451:6;23448:1;23445:13;23442:39;;;23461:18;;:::i;:::-;-1:-1:-1;23497:9:1;;23384:128::o;23517:120::-;23557:1;23583;23573:35;;23588:18;;:::i;:::-;-1:-1:-1;23622:9:1;;23517:120::o;23642:168::-;23682:7;23748:1;23744;23740:6;23736:14;23733:1;23730:21;23725:1;23718:9;23711:17;23707:45;23704:71;;;23755:18;;:::i;:::-;-1:-1:-1;23795:9:1;;23642:168::o;23815:125::-;23855:4;23883:1;23880;23877:8;23874:34;;;23888:18;;:::i;:::-;-1:-1:-1;23925:9:1;;23815:125::o;23945:258::-;24017:1;24027:113;24041:6;24038:1;24035:13;24027:113;;;24117:11;;;24111:18;24098:11;;;24091:39;24063:2;24056:10;24027:113;;;24158:6;24155:1;24152:13;24149:48;;;-1:-1:-1;;24193:1:1;24175:16;;24168:27;23945:258::o;24208:380::-;24287:1;24283:12;;;;24330;;;24351:61;;24405:4;24397:6;24393:17;24383:27;;24351:61;24458:2;24450:6;24447:14;24427:18;24424:38;24421:161;;;24504:10;24499:3;24495:20;24492:1;24485:31;24539:4;24536:1;24529:15;24567:4;24564:1;24557:15;24421:161;;24208:380;;;:::o;24593:135::-;24632:3;-1:-1:-1;;24653:17:1;;24650:43;;;24673:18;;:::i;:::-;-1:-1:-1;24720:1:1;24709:13;;24593:135::o;24733:112::-;24765:1;24791;24781:35;;24796:18;;:::i;:::-;-1:-1:-1;24830:9:1;;24733:112::o;24850:127::-;24911:10;24906:3;24902:20;24899:1;24892:31;24942:4;24939:1;24932:15;24966:4;24963:1;24956:15;24982:127;25043:10;25038:3;25034:20;25031:1;25024:31;25074:4;25071:1;25064:15;25098:4;25095:1;25088:15;25114:127;25175:10;25170:3;25166:20;25163:1;25156:31;25206:4;25203:1;25196:15;25230:4;25227:1;25220:15;25246:127;25307:10;25302:3;25298:20;25295:1;25288:31;25338:4;25335:1;25328:15;25362:4;25359:1;25352:15;25378:127;25439:10;25434:3;25430:20;25427:1;25420:31;25470:4;25467:1;25460:15;25494:4;25491:1;25484:15;25510:131;-1:-1:-1;;;;;;25584:32:1;;25574:43;;25564:71;;25631:1;25628;25621:12

Swarm Source

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

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