ETH Price: $3,391.10 (+1.37%)
Gas: 6.67 Gwei

Token

Lootlang (LANG)
 

Overview

Max Total Supply

1,348 LANG

Holders

526

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
karki.eth
Balance
3 LANG
0xc3b49b03a6d9d71f8d3fa6582437374e650f3c46
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Lootlang

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-22
*/

// SPDX-License-Identifier: MIT
 
 
// File: contracts/Gen.sol



pragma solidity ^0.8.7;

 
 
contract Gen {

    

    // MAPPINGS //    
    mapping(string => uint) internal charsMap; // maps characters to numbers for easier access in 'generateWord()' function
    mapping(uint => uint) internal tokenIdToSeed; // initial seed for each tokenId minted
    mapping(uint => uint[8]) internal tokenIdToShuffleShift; // tokenId => array of inexes for words to be shifted as a result of shuffling
    mapping(uint => uint) internal shuffleCount; // tokenId => number of shuffles tokenId has had
    mapping(address => bool) internal hasClaimed; // keeps track of addresses that have claimed a mint
    

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
    
    
    // VARIABLES //
    
    
    uint16[297] ps = [
        1000, 1889, 2889, 3556, 5223, 6223, 7334, 8778, 9334, 9556, 10000,
        381, 952, 1428, 1809, 2761, 4856, 6094, 7523, 9523, 9809, 10000,
        198, 792, 1584, 2079, 2574, 3267, 3366, 5643, 7029, 9900, 10000,
        714, 1071, 1607, 2232, 2945, 4285, 5178, 6516, 7856, 9195, 10000,
        385, 1348, 3467, 5201, 6163, 7127, 9824, 9920, 9939, 9958, 10000,
        135, 405, 1081, 1216, 1892, 2703, 4325, 5541, 7568, 9730, 10000,
        2443, 2932, 3421, 3910, 4561, 5212, 6677, 8470, 9936, 9985, 10000,
        1239, 1770, 2655, 4071, 5310, 6726, 7257, 9912, 9947, 9982, 10000,
        268, 281, 294, 328, 1668, 4751, 7432, 9979, 9986, 9993, 10000,
        291, 679, 1164, 1649, 2329, 3106, 3689, 4951, 6504, 9708, 10000,
        353, 706, 1923, 3510, 5097, 7672, 8818, 9964, 9982, 9991, 10000, 
        755, 1227, 1416, 1605, 1888, 2077, 2171, 3114, 9246, 9812, 10000,
        695, 721, 747, 834, 851, 3023, 5195, 6846, 9974, 9991, 10000,
        103, 308, 513, 821, 1437, 2566, 3901, 7289, 9958, 9979, 10000,
        294, 588, 735, 750, 1337, 2071, 2805, 4127, 6183, 8239, 10000,
        88, 1148, 2561, 2738, 3975, 4682, 4859, 5389, 7156, 9983, 10000,
        325, 760, 1303, 1629, 1955, 3367, 4670, 6624, 8253, 9990, 10000,
        4955, 9910, 9920, 9930, 9940, 9950, 9960, 9970, 9980, 9990, 10000,
        214, 428, 641, 663, 1197, 1411, 1454, 2522, 3590, 4658, 10000,
        196, 784, 2548, 3332, 4312, 5488, 7644, 9800, 9996, 9998, 10000,
        475, 1424, 1661, 2848, 4272, 5933, 8544, 9256, 9968, 9992, 10000,
        515, 618, 1133, 1442, 2267, 3298, 4947, 6493, 7730, 9483, 10000,
        202, 1412, 3025, 5444, 7662, 9880, 9920, 9940, 9960, 9980, 10000,
        23, 252, 480, 2657, 2886, 4719, 7354, 9645, 9874, 9885, 10000,
        433, 866, 1732, 3464, 5195, 8659, 9525, 9698, 9871, 9958, 10000,
        601, 901, 1502, 2103, 3605, 4806, 6007, 9010, 9310, 9400, 10000,
        204, 511, 613, 714, 1737, 3782, 9917, 9968, 9978, 9988, 10000];
    


    string[] nextChars = [
        "fbrwsaltpzj",
        "gmldslrtnkb",
        "blriiluoaey",
        "rliktauhooe",
        "ruaoiiegfws",
        "mfteladsnrg",
        "luaarreioyw",
        "luiraohezgy",
        "urryoiaejlw",
        "gredlocstnb",
        "iieaaouuytf",
        "aollarsieut",
        "ussdyoaielf",
        "smmupioaeyn",
        "aauyiosetgd",
        "zolwtmfurny",
        "tupiilaores",
        "uuaeiosrfyw",
        "nudytslaioe",
        "puhaoietwyq",
        "usraieohhty",
        "ebgzplsntrm",
        "uoaieeyvxrl",
        "snnoheaiuyr",
        "oaueeityxth",
        "lmaiseeouvx",
        "uyooiaelzrl"];

    

    
    /**
     * @dev Maps characters in 'chars' to numbers for easier comparison in 'generateWord()' function
     */
    function mapChars() internal {
        string[27] memory chars = [" ", "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
        for (uint i=0; i<27; i++) {
            charsMap[chars[i]] = i;
        }
    }

    
    /**
     * @dev Returns length of a string '_string'.
     */
    function stringLength(string memory _string) internal pure returns(uint) {
        return bytes(_string).length;
    }

    
    /**
     * @dev Gets character from 'nextChars'.
     */
    function getChar(uint row, uint col) internal view returns(string memory) {
        bytes memory line = bytes(nextChars[row]);
        string memory temp = new string(1);
        bytes memory output = bytes(temp);
        output[0] = line[col];
        return string(output); 
    }
    
    
    
    /**
     * @dev Generates word length (1-16) using a distribution
     */
    function determineWordLength(uint rand) internal pure returns(uint) {
        
        uint16[16] memory cumulativeDistribution = [2,99,761,1929,3175,4694,6291,7654,8744,9328,9678,9872,9938,9976,9991,10000];
        
        uint i = 0;
        while (i <= 15) { 
            if (rand <= cumulativeDistribution[i]) {
                break;
            }
            i++;
        }
        return i+1;  // returns word length
    }
    
    
    
    /**
     * @dev Generates a random word of length 1-16, given a '_tokenId' and '_totalSeed' as a seed of randomness
     */
    function generateWord(uint256 _tokenId, uint _totalSeed) internal view returns(string memory) { // change visibility

        require(_tokenId >= 1 && _tokenId <= 10000, "Invalid tokenId.");

        string memory word;
        string memory char;
        
        uint lengthRand = (uint(keccak256(abi.encodePacked(_tokenId, _totalSeed)))% 10000); // gets random number between 0 and 10,000
        uint rand = (uint(keccak256(abi.encodePacked(_tokenId, lengthRand, _totalSeed)))% 10000) + 1; // gets random number between 1 and 10,000

        // generates word
        for (uint n=1; n <= determineWordLength(lengthRand); n++) {
            
            // generates letter
            uint i = 0;
            while (i < 11) { // indexStart of ps[] to indexEnd
                if (rand <= ps[(charsMap[char]*11)+i]) {
                    break;
                }
                i++;
            }
            char = getChar(charsMap[char], i);
            
            word = string(abi.encodePacked(word, char)); // appends letter to word
            rand = (uint(keccak256(abi.encodePacked(_tokenId, rand, word, n, _totalSeed)))% 10000) + 1; // gets new random number between 1 and 10,000
        }
        return word;
    }
    
    
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol



pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}


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



pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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



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



pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


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



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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



pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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


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



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    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");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    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");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}





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



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    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;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public 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);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    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);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    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");
    }

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    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));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    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"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    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);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    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);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) 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);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    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.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;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/Lootlang.sol



pragma solidity ^0.8.7;



// IMPORTS //

/**
 * @dev ERC721 token standard
 */


/**
 * @dev Modifier 'onlyOwner' becomes available where owner is the contract deployer
 */


/**
 * @dev Verification of Merkle trees
 */


/**
 * @dev Generates words etc
 */



// LIBRARIES //

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        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 //  

contract Lootlang is ERC721, Ownable, Gen {
    
    
    // VARIABLES //
    
    uint public enabled;
    uint internal mints; 
    uint internal claims; 
    uint internal nextTokenId;
    uint public contractBalance;
    string internal contractURIstring;
    uint public freezeBlock;
    uint internal freezeBlockChanges;
    bytes32 internal root;

    
    constructor() Ownable() ERC721('Lootlang', 'LANG') {

        nextTokenId = 1;
        
        freezeBlock = 13487654;
        
        contractURIstring = "https://lootlang.com/metadata.json";
        
        mapChars(); // maps characters to uints
        
    }


    // EVENTS //
    
    event Shuffled(uint tokenId);



    // ONLY OWNER FUNCTIONS //
    
    /**
     * @dev Set the root for Merkle Proof
     */
    function setRoot(bytes32 _newRoot) external onlyOwner {
        root = _newRoot;
    }
    
    
    /**
     * @dev Set the new block number to freeze shuffling. Can only be called once.
     */
    function setFreezeBlock(uint _newFreezeBlockNumber) external onlyOwner {
        require(freezeBlockChanges < 1, "Freeze block already changed");
        freezeBlock = _newFreezeBlockNumber;
        freezeBlockChanges++;
    }
    

    /**
     * @dev Withdraw '_amount' of Ether to address '_to'. Only contract owner can call.
     * @param _to - address Ether will be sent to
     * @param _amount - amount of Ether, in Wei, to be withdrawn
     */
    function withdrawFunds(address payable _to, uint _amount) external onlyOwner {
        require(_amount <= contractBalance, "Withdrawal amount greater than balance");
        contractBalance -= _amount;
        _to.transfer(_amount);
    }


    /**
     * @dev activates/deactivates the minting functionality - only the contract owner can call
     * @param _enabled where 1 = enabled and 0 = not
     */
    function setEnable(uint _enabled) external onlyOwner {
        enabled = _enabled;
    }
    
    
    /**
     * @dev Set the contract's URI
     * @param _contractURIstring - web address containing data read by OpenSea
     */
    function setContractURI(string memory _contractURIstring) external onlyOwner {
        contractURIstring = _contractURIstring;
    }
    

    // USER FUNCTIONS // 
    

    /**
     * @dev Mint an ERC721 token. 
     */
    function mint() external payable {
        require(enabled == 1, "Minting is yet to be enabled");
        require(nextTokenId <= 10000 && mints <= 9700, "All NFTs have been minted");
        require(msg.value >= (2*10**16), "Insufficient funds provided"); // 0.02 eth (cost of minting an NFT) // SET MINT PRICE

        mints++;
        contractBalance += msg.value;
        sharedMintCode();
    }
    
    /**
     * @dev Claim and mint an ERC721 token.
     */
    function claim(bytes32[] memory proof) external { 
        require(enabled == 1, "Minting is yet to be enabled");
        require(hasClaimed[msg.sender] == false, "Already claimed");
        require(nextTokenId <= 10000 && claims <= 300, "All NFTs have been minted");

        require(MerkleProof.verify(proof, root, keccak256(abi.encodePacked(msg.sender))) == true, "Not on pre-approved claim list");

        claims++;
        hasClaimed[msg.sender] = true;
        sharedMintCode();
    }
    
    /**
     * @dev Shared code used by both 'mint()' and 'claim()' functions.
     */
    function sharedMintCode() internal {
        uint tokenId = nextTokenId;
        nextTokenId++;
        tokenIdToSeed[tokenId] = uint(keccak256(abi.encodePacked(tokenId, msg.sender, block.timestamp)))%1000000;
        _safeMint(msg.sender, tokenId);
    }


    /**
     * @dev Shuffles up to 8 words. Set input params as 1 to shuffle word, and 0 to leave it. 
     *      E.g. shuffle(243,1,0,0,0,0,0,0,1) shuffles the 1st and 8th word of token 243.
     */
    function shuffle(uint _tokenId, uint one, uint two, uint three, uint four, uint five, uint six, uint seven, uint eight) external {
        require(ownerOf(_tokenId) == msg.sender, "Must be NFT owner");
        require(shuffleCount[_tokenId] < 5, "Shuffled max amount already");
        require(block.number < freezeBlock, "Shuffling has been frozen!");
        require((one+two+three+four+five+six+seven+eight) > 0, "No words selected to be shuffled"); 
       
        uint randomish = uint(keccak256(abi.encodePacked(block.number)))%1000000;
        uint[8] memory indexesToChange = [one, two, three, four, five, six, seven, eight];
        
        for (uint i=0; i<8; i++) {
            if (indexesToChange[i] > 0) {
                tokenIdToShuffleShift[_tokenId][i] += randomish;
            }
        }
        
        shuffleCount[_tokenId]++;
        emit Shuffled(_tokenId);
    }
    



    // VIEW FUNCTIONS //
    
    
    /**
     * @dev View total number of minted tokens
     */
    function totalSupply() external view returns(uint) {
        return mints+claims;
    }
    
    /**
     * @dev View the contract URI.
     */
    function contractURI() public view returns (string memory) {
        return contractURIstring;
    }

    /**
     * @dev Internal function used by function 'tokenURI()' to format word lengths for .json file output
     */
    function getMetaText(string memory word) internal pure returns(string memory) {
        string memory length = string(abi.encodePacked("\"", toString(stringLength(word)), " letters", "\""));
        return length;
    }
    
    /**
     * @dev Internal function used by function 'tokenURI()' to format words for .json file output
     */
    function getMetaWord(string memory word) internal pure returns(string memory) {
        string memory length = string(abi.encodePacked("\"", word, "\""));
        return length;
    }
    
    /**
     * @dev Creates seed passed in to 'generateWord()' function for seeding randomness
     */
    function totalSeedGen(uint tokenId, uint wordNum) internal view returns(uint) {
        return uint(keccak256(abi.encodePacked(uint(wordNum), tokenIdToSeed[tokenId], tokenIdToShuffleShift[tokenId][wordNum-1])));
    }
    
    /**
     * @dev View tokenURI of 'tokenId'. 
     */
    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        
        require(_exists(tokenId), "URI query for nonexistent token");

        string[17] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 20px; }</style><rect width="100%" height="100%" fill="black" /><text x="15" y="30" class="base">';
        parts[1] = generateWord(tokenId, totalSeedGen(tokenId, 1));
        parts[2] = '</text><text x="15" y="65" class="base">';
        parts[3] = generateWord(tokenId, totalSeedGen(tokenId, 2));
        parts[4] = '</text><text x="15" y="100" class="base">';
        parts[5] = generateWord(tokenId, totalSeedGen(tokenId, 3));
        parts[6] = '</text><text x="15" y="135" class="base">';
        parts[7] = generateWord(tokenId, totalSeedGen(tokenId, 4));
        parts[8] = '</text><text x="15" y="170" class="base">';
        parts[9] = generateWord(tokenId, totalSeedGen(tokenId, 5));
        parts[10] = '</text><text x="15" y="205" class="base">';
        parts[11] = generateWord(tokenId, totalSeedGen(tokenId, 6));
        parts[12] = '</text><text x="15" y="240" class="base">';
        parts[13] = generateWord(tokenId, totalSeedGen(tokenId, 7));
        parts[14] = '</text><text x="15" y="275" class="base">';
        parts[15] = generateWord(tokenId, totalSeedGen(tokenId, 8));
        parts[16] = '</text></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]));
        output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16]));
        
        string memory json = string(abi.encodePacked('{"name": "Pack #', toString(tokenId), '", "description": "Pack of 8 Lootlang words", "attributes": [{"trait_type": "Shuffles Used", "value":', getMetaWord(toString(shuffleCount[tokenId])), '}, {"trait_type": "Word Length", "value":', getMetaText(parts[1]), '}, {"trait_type": "Word Length", "value":', getMetaText(parts[3]), '}, {"trait_type": "Word Length", "value":', getMetaText(parts[5]), '}, {"trait_type": "Word Length", "value":', getMetaText(parts[7]), '}, {"trait_type": "Word Length", "value":', getMetaText(parts[9]), '}, {"trait_type": "Word Length", "value":', getMetaText(parts[11]), '}, {"trait_type": "Word Length", "value":', getMetaText(parts[13]), '}, {"trait_type": "Word Length", "value":', getMetaText(parts[15]), '}'));
        json = Base64.encode(bytes(string(abi.encodePacked(json, ', {"trait_type": "Word", "value":', getMetaWord(parts[1]), '}, {"trait_type": "Word", "value":', getMetaWord(parts[3]), '}, {"trait_type": "Word", "value":', getMetaWord(parts[5]), '}, {"trait_type": "Word", "value":', getMetaWord(parts[7]), '}, {"trait_type": "Word", "value":', getMetaWord(parts[9]), '}, {"trait_type": "Word", "value":', getMetaWord(parts[11]), '}, {"trait_type": "Word", "value":', getMetaWord(parts[13]), '}, {"trait_type": "Word", "value":', getMetaWord(parts[15]), '}], "image": "data:image/svg+xml;base64, ', Base64.encode(bytes(output)), '"}'))));
        
        output = string(abi.encodePacked('data:application/json;base64,', json));
        return output;
    }
    

}

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":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Shuffled","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":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeBlock","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":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"string","name":"_contractURIstring","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_enabled","type":"uint256"}],"name":"setEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFreezeBlockNumber","type":"uint256"}],"name":"setFreezeBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"one","type":"uint256"},{"internalType":"uint256","name":"two","type":"uint256"},{"internalType":"uint256","name":"three","type":"uint256"},{"internalType":"uint256","name":"four","type":"uint256"},{"internalType":"uint256","name":"five","type":"uint256"},{"internalType":"uint256","name":"six","type":"uint256"},{"internalType":"uint256","name":"seven","type":"uint256"},{"internalType":"uint256","name":"eight","type":"uint256"}],"name":"shuffle","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":"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":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518061252001604052806103e861ffff16815260200161076161ffff168152602001610b4961ffff168152602001610de461ffff16815260200161146761ffff16815260200161184f61ffff168152602001611ca661ffff16815260200161224a61ffff16815260200161247661ffff16815260200161255461ffff16815260200161271061ffff16815260200161017d61ffff1681526020016103b861ffff16815260200161059461ffff16815260200161071161ffff168152602001610ac961ffff1681526020016112f861ffff1681526020016117ce61ffff168152602001611d6361ffff16815260200161253361ffff16815260200161265161ffff16815260200161271061ffff16815260200160c661ffff16815260200161031861ffff16815260200161063061ffff16815260200161081f61ffff168152602001610a0e61ffff168152602001610cc361ffff168152602001610d2661ffff16815260200161160b61ffff168152602001611b7561ffff1681526020016126ac61ffff16815260200161271061ffff1681526020016102ca61ffff16815260200161042f61ffff16815260200161064761ffff1681526020016108b861ffff168152602001610b8161ffff1681526020016110bd61ffff16815260200161143a61ffff16815260200161197461ffff168152602001611eb061ffff1681526020016123eb61ffff16815260200161271061ffff16815260200161018161ffff16815260200161054461ffff168152602001610d8b61ffff16815260200161145161ffff16815260200161181361ffff168152602001611bd761ffff16815260200161266061ffff1681526020016126c061ffff1681526020016126d361ffff1681526020016126e661ffff16815260200161271061ffff168152602001608761ffff16815260200161019561ffff16815260200161043961ffff1681526020016104c061ffff16815260200161076461ffff168152602001610a8f61ffff1681526020016110e561ffff1681526020016115a561ffff168152602001611d9061ffff16815260200161260261ffff16815260200161271061ffff16815260200161098b61ffff168152602001610b7461ffff168152602001610d5d61ffff168152602001610f4661ffff1681526020016111d161ffff16815260200161145c61ffff168152602001611a1561ffff16815260200161211661ffff1681526020016126d061ffff16815260200161270161ffff16815260200161271061ffff1681526020016104d761ffff1681526020016106ea61ffff168152602001610a5f61ffff168152602001610fe761ffff1681526020016114be61ffff168152602001611a4661ffff168152602001611c5961ffff1681526020016126b861ffff1681526020016126db61ffff1681526020016126fe61ffff16815260200161271061ffff16815260200161010c61ffff16815260200161011961ffff16815260200161012661ffff16815260200161014861ffff16815260200161068461ffff16815260200161128f61ffff168152602001611d0861ffff1681526020016126fb61ffff16815260200161270261ffff16815260200161270961ffff16815260200161271061ffff16815260200161012361ffff1681526020016102a761ffff16815260200161048c61ffff16815260200161067161ffff16815260200161091961ffff168152602001610c2261ffff168152602001610e6961ffff16815260200161135761ffff16815260200161196861ffff1681526020016125ec61ffff16815260200161271061ffff16815260200161016161ffff1681526020016102c261ffff16815260200161078361ffff168152602001610db661ffff1681526020016113e961ffff168152602001611df861ffff16815260200161227261ffff1681526020016126ec61ffff1681526020016126fe61ffff16815260200161270761ffff16815260200161271061ffff1681526020016102f361ffff1681526020016104cb61ffff16815260200161058861ffff16815260200161064561ffff16815260200161076061ffff16815260200161081d61ffff16815260200161087b61ffff168152602001610c2a61ffff16815260200161241e61ffff16815260200161265461ffff16815260200161271061ffff1681526020016102b761ffff1681526020016102d161ffff1681526020016102eb61ffff16815260200161034261ffff16815260200161035361ffff168152602001610bcf61ffff16815260200161144b61ffff168152602001611abe61ffff1681526020016126f661ffff16815260200161270761ffff16815260200161271061ffff168152602001606761ffff16815260200161013461ffff16815260200161020161ffff16815260200161033561ffff16815260200161059d61ffff168152602001610a0661ffff168152602001610f3d61ffff168152602001611c7961ffff1681526020016126e661ffff1681526020016126fb61ffff16815260200161271061ffff16815260200161012661ffff16815260200161024c61ffff1681526020016102df61ffff1681526020016102ee61ffff16815260200161053961ffff16815260200161081761ffff168152602001610af561ffff16815260200161101f61ffff16815260200161182761ffff16815260200161202f61ffff16815260200161271061ffff168152602001605861ffff16815260200161047c61ffff168152602001610a0161ffff168152602001610ab261ffff168152602001610f8761ffff16815260200161124a61ffff1681526020016112fb61ffff16815260200161150d61ffff168152602001611bf461ffff1681526020016126ff61ffff16815260200161271061ffff16815260200161014561ffff1681526020016102f861ffff16815260200161051761ffff16815260200161065d61ffff1681526020016107a361ffff168152602001610d2761ffff16815260200161123e61ffff1681526020016119e061ffff16815260200161203d61ffff16815260200161270661ffff16815260200161271061ffff16815260200161135b61ffff1681526020016126b661ffff1681526020016126c061ffff1681526020016126ca61ffff1681526020016126d461ffff1681526020016126de61ffff1681526020016126e861ffff1681526020016126f261ffff1681526020016126fc61ffff16815260200161270661ffff16815260200161271061ffff16815260200160d661ffff1681526020016101ac61ffff16815260200161028161ffff16815260200161029761ffff1681526020016104ad61ffff16815260200161058361ffff1681526020016105ae61ffff1681526020016109da61ffff168152602001610e0661ffff16815260200161123261ffff16815260200161271061ffff16815260200160c461ffff16815260200161031061ffff1681526020016109f461ffff168152602001610d0461ffff1681526020016110d861ffff16815260200161157061ffff168152602001611ddc61ffff16815260200161264861ffff16815260200161270c61ffff16815260200161270e61ffff16815260200161271061ffff1681526020016101db61ffff16815260200161059061ffff16815260200161067d61ffff168152602001610b2061ffff1681526020016110b061ffff16815260200161172d61ffff16815260200161216061ffff16815260200161242861ffff1681526020016126f061ffff16815260200161270861ffff16815260200161271061ffff16815260200161020361ffff16815260200161026a61ffff16815260200161046d61ffff1681526020016105a261ffff1681526020016108db61ffff168152602001610ce261ffff16815260200161135361ffff16815260200161195d61ffff168152602001611e3261ffff16815260200161250b61ffff16815260200161271061ffff16815260200160ca61ffff16815260200161058461ffff168152602001610bd161ffff16815260200161154461ffff168152602001611dee61ffff16815260200161269861ffff1681526020016126c061ffff1681526020016126d461ffff1681526020016126e861ffff1681526020016126fc61ffff16815260200161271061ffff168152602001601761ffff16815260200160fc61ffff1681526020016101e061ffff168152602001610a6161ffff168152602001610b4661ffff16815260200161126f61ffff168152602001611cba61ffff1681526020016125ad61ffff16815260200161269261ffff16815260200161269d61ffff16815260200161271061ffff1681526020016101b161ffff16815260200161036261ffff1681526020016106c461ffff168152602001610d8861ffff16815260200161144b61ffff1681526020016121d361ffff16815260200161253561ffff1681526020016125e261ffff16815260200161268f61ffff1681526020016126e661ffff16815260200161271061ffff16815260200161025961ffff16815260200161038561ffff1681526020016105de61ffff16815260200161083761ffff168152602001610e1561ffff1681526020016112c661ffff16815260200161177761ffff16815260200161233261ffff16815260200161245e61ffff1681526020016124b861ffff16815260200161271061ffff16815260200160cc61ffff1681526020016101ff61ffff16815260200161026561ffff1681526020016102ca61ffff1681526020016106c961ffff168152602001610ec661ffff1681526020016126bd61ffff1681526020016126f061ffff1681526020016126fa61ffff16815260200161270461ffff16815260200161271061ffff16815250600c9061012962000e0392919062001cfd565b506040518061036001604052806040518060400160405280600b81526020017f6662727773616c74707a6a00000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f676d6c64736c72746e6b6200000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f626c7269696c756f61657900000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f726c696b746175686f6f6500000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f7275616f6969656766777300000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6d6674656c6164736e726700000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6c756161727265696f797700000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6c756972616f68657a677900000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f757272796f6961656a6c7700000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f677265646c6f6373746e6200000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f69696561616f757579746600000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f616f6c6c6172736965757400000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f75737364796f6169656c6600000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f736d6d7570696f6165796e00000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f61617579696f736574676400000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f7a6f6c77746d6675726e7900000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f74757069696c616f72657300000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f75756165696f737266797700000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6e75647974736c61696f6500000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f707568616f69657477797100000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f7573726169656f6868747900000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6562677a706c736e74726d00000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f756f61696565797678726c00000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f736e6e6f6865616975797200000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6f6175656569747978746800000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6c6d61697365656f75767800000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f75796f6f6961656c7a726c000000000000000000000000000000000000000000815250815250601f90601b6200145992919062001da2565b503480156200146757600080fd5b506040518060400160405280600881526020017f4c6f6f746c616e670000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4c414e47000000000000000000000000000000000000000000000000000000008152508160009080519060200190620014ec92919062001e09565b5080600190805190602001906200150592919062001e09565b505050620015286200151c6200158260201b60201c565b6200158a60201b60201c565b600160238190555062cdce266026819055506040518060600160405280602281526020016200800f60229139602590805190602001906200156b92919062001e09565b506200157c6200165060201b60201c565b620020de565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006040518061036001604052806040518060400160405280600181526020017f200000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f610000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f620000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f630000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f640000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f650000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f660000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f670000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f680000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f690000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6a0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6b0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6c0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6d0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6e0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6f0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f700000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f710000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f720000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f730000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f740000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f750000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f760000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f770000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f780000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f790000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f7a00000000000000000000000000000000000000000000000000000000000000815250815250905060005b601b81101562001cf9578060078383601b811062001cbd5762001cbc620020af565b5b602002015160405162001cd1919062001f5e565b908152602001604051809103902081905550808062001cf09062002003565b91505062001c9a565b5050565b82610129600f0160109004810192821562001d8f5791602002820160005b8382111562001d5d57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262001d1b565b801562001d8d5782816101000a81549061ffff021916905560020160208160010104928301926001030262001d5d565b505b50905062001d9e919062001e9a565b5090565b82805482825590600052602060002090810192821562001df6579160200282015b8281111562001df557825182908051906020019062001de492919062001e09565b509160200191906001019062001dc3565b5b50905062001e05919062001eb9565b5090565b82805462001e179062001fcd565b90600052602060002090601f01602090048101928262001e3b576000855562001e87565b82601f1062001e5657805160ff191683800117855562001e87565b8280016001018555821562001e87579182015b8281111562001e8657825182559160200191906001019062001e69565b5b50905062001e96919062001e9a565b5090565b5b8082111562001eb557600081600090555060010162001e9b565b5090565b5b8082111562001edd576000818162001ed3919062001ee1565b5060010162001eba565b5090565b50805462001eef9062001fcd565b6000825580601f1062001f03575062001f24565b601f01602090049060005260206000209081019062001f23919062001e9a565b5b50565b600062001f348262001f77565b62001f40818562001f82565b935062001f5281856020860162001f97565b80840191505092915050565b600062001f6c828462001f27565b915081905092915050565b600081519050919050565b600081905092915050565b6000819050919050565b60005b8381101562001fb757808201518184015260208101905062001f9a565b8381111562001fc7576000848401525b50505050565b6000600282049050600182168062001fe657607f821691505b6020821081141562001ffd5762001ffc62002080565b5b50919050565b6000620020108262001f8d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562002046576200204562002051565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b615f2180620020ee6000396000f3fe6080604052600436106101c25760003560e01c80638b7afe2e116100f7578063c107532911610095578063e985e9c511610064578063e985e9c51461060b578063ee34847214610648578063f2fc1cb614610671578063f2fde38b1461069a576101c2565b8063c107532914610551578063c87b56dd1461057a578063dab5f340146105b7578063e8a3d485146105e0576101c2565b806395d89b41116100d157806395d89b41146104ab578063a22cb465146104d6578063b391c508146104ff578063b88d4fde14610528576101c2565b80638b7afe2e1461042c5780638da5cb5b14610457578063938e3d7b14610482576101c2565b806323b872dd1161016457806342842e0e1161013e57806342842e0e146103725780636352211e1461039b57806370a08231146103d8578063715018a614610415576101c2565b806323b872dd146102f557806328e398e41461031e5780633a15786014610347576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780631249c58b1461029557806318160ddd1461029f578063238dafe0146102ca576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190613cfb565b6106c3565b6040516101fb9190614a09565b60405180910390f35b34801561021057600080fd5b506102196107a5565b6040516102269190614a24565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613d9e565b610837565b60405161026391906149a2565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190613c45565b6108bc565b005b61029d6109d4565b005b3480156102ab57600080fd5b506102b4610af5565b6040516102c19190614dc6565b60405180910390f35b3480156102d657600080fd5b506102df610b0c565b6040516102ec9190614dc6565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613b2f565b610b12565b005b34801561032a57600080fd5b5061034560048036038101906103409190613d9e565b610b72565b005b34801561035357600080fd5b5061035c610bf8565b6040516103699190614dc6565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613b2f565b610bfe565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190613d9e565b610c1e565b6040516103cf91906149a2565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613a82565b610cd0565b60405161040c9190614dc6565b60405180910390f35b34801561042157600080fd5b5061042a610d88565b005b34801561043857600080fd5b50610441610e10565b60405161044e9190614dc6565b60405180910390f35b34801561046357600080fd5b5061046c610e16565b60405161047991906149a2565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613d55565b610e40565b005b3480156104b757600080fd5b506104c0610ed6565b6040516104cd9190614a24565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190613c05565b610f68565b005b34801561050b57600080fd5b5061052660048036038101906105219190613c85565b6110e9565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613b82565b61130c565b005b34801561055d57600080fd5b5061057860048036038101906105739190613aaf565b61136e565b005b34801561058657600080fd5b506105a1600480360381019061059c9190613d9e565b611493565b6040516105ae9190614a24565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d99190613cce565b611d30565b005b3480156105ec57600080fd5b506105f5611db6565b6040516106029190614a24565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d9190613aef565b611e48565b60405161063f9190614a09565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190613d9e565b611edc565b005b34801561067d57600080fd5b5061069860048036038101906106939190613dcb565b611fbf565b005b3480156106a657600080fd5b506106c160048036038101906106bc9190613a82565b6122c4565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079e575061079d826123bc565b5b9050919050565b6060600080546107b4906150be565b80601f01602080910402602001604051908101604052809291908181526020018280546107e0906150be565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b600061084282612426565b610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890614c66565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c782610c1e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f90614ce6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610957612492565b73ffffffffffffffffffffffffffffffffffffffff161480610986575061098581610980612492565b611e48565b5b6109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90614b86565b60405180910390fd5b6109cf838361249a565b505050565b600160205414610a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1090614c46565b60405180910390fd5b61271060235411158015610a3157506125e460215411155b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6790614c06565b60405180910390fd5b66470de4df820000341015610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab190614d66565b60405180910390fd5b60216000815480929190610acd90615121565b91905055503460246000828254610ae49190614ed7565b92505081905550610af3612553565b565b6000602254602154610b079190614ed7565b905090565b60205481565b610b23610b1d612492565b826125d2565b610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990614d26565b60405180910390fd5b610b6d8383836126b0565b505050565b610b7a612492565b73ffffffffffffffffffffffffffffffffffffffff16610b98610e16565b73ffffffffffffffffffffffffffffffffffffffff1614610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be590614c86565b60405180910390fd5b8060208190555050565b60265481565b610c198383836040518060200160405280600081525061130c565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614bc6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890614ba6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d90612492565b73ffffffffffffffffffffffffffffffffffffffff16610dae610e16565b73ffffffffffffffffffffffffffffffffffffffff1614610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb90614c86565b60405180910390fd5b610e0e600061290c565b565b60245481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e48612492565b73ffffffffffffffffffffffffffffffffffffffff16610e66610e16565b73ffffffffffffffffffffffffffffffffffffffff1614610ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb390614c86565b60405180910390fd5b8060259080519060200190610ed29291906137a6565b5050565b606060018054610ee5906150be565b80601f0160208091040260200160405190810160405280929190818152602001828054610f11906150be565b8015610f5e5780601f10610f3357610100808354040283529160200191610f5e565b820191906000526020600020905b815481529060010190602001808311610f4157829003601f168201915b5050505050905090565b610f70612492565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590614b26565b60405180910390fd5b8060056000610feb612492565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611098612492565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110dd9190614a09565b60405180910390a35050565b60016020541461112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590614c46565b60405180910390fd5b60001515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890614c26565b60405180910390fd5b612710602354111580156111d9575061012c60225411155b611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90614c06565b60405180910390fd5b6001151561124f826028543360405160200161123491906144ff565b604051602081830303815290604052805190602001206129d2565b151514611291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128890614da6565b60405180910390fd5b602260008154809291906112a490615121565b91905055506001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611309612553565b50565b61131d611317612492565b836125d2565b61135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614d26565b60405180910390fd5b61136884848484612a88565b50505050565b611376612492565b73ffffffffffffffffffffffffffffffffffffffff16611394610e16565b73ffffffffffffffffffffffffffffffffffffffff16146113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e190614c86565b60405180910390fd5b60245481111561142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690614cc6565b60405180910390fd5b80602460008282546114419190614fb8565b925050819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561148e573d6000803e3d6000fd5b505050565b606061149e82612426565b6114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d490614a66565b60405180910390fd5b6114e561382c565b60405180610120016040528060fd8152602001615c9160fd91398160006011811061151357611512615260565b5b602002018190525061152f8361152a856001612ae4565b612b61565b8160016011811061154357611542615260565b5b6020020181905250604051806060016040528060288152602001615e32602891398160026011811061157857611577615260565b5b60200201819052506115948361158f856002612ae4565b612b61565b816003601181106115a8576115a7615260565b5b6020020181905250604051806060016040528060298152602001615e9a60299139816004601181106115dd576115dc615260565b5b60200201819052506115f9836115f4856003612ae4565b612b61565b8160056011811061160d5761160c615260565b5b6020020181905250604051806060016040528060298152602001615de0602991398160066011811061164257611641615260565b5b602002018190525061165e83611659856004612ae4565b612b61565b8160076011811061167257611671615260565b5b6020020181905250604051806060016040528060298152602001615ec360299139816008601181106116a7576116a6615260565b5b60200201819052506116c3836116be856005612ae4565b612b61565b816009601181106116d7576116d6615260565b5b6020020181905250604051806060016040528060298152602001615d8e6029913981600a6011811061170c5761170b615260565b5b602002018190525061172883611723856006612ae4565b612b61565b81600b6011811061173c5761173b615260565b5b6020020181905250604051806060016040528060298152602001615db76029913981600c6011811061177157611770615260565b5b602002018190525061178d83611788856007612ae4565b612b61565b81600d601181106117a1576117a0615260565b5b6020020181905250604051806060016040528060298152602001615e096029913981600e601181106117d6576117d5615260565b5b60200201819052506117f2836117ed856008612ae4565b612b61565b81600f6011811061180657611805615260565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e000000000000000000000000000000000000008152508160106011811061185857611857615260565b5b602002018190525060008160006011811061187657611875615260565b5b60200201518260016011811061188f5761188e615260565b5b6020020151836002601181106118a8576118a7615260565b5b6020020151846003601181106118c1576118c0615260565b5b6020020151856004601181106118da576118d9615260565b5b6020020151866005601181106118f3576118f2615260565b5b60200201518760066011811061190c5761190b615260565b5b60200201518860076011811061192557611924615260565b5b60200201518960086011811061193e5761193d615260565b5b602002015160405160200161195b99989796959493929190614581565b6040516020818303038152906040529050808260096011811061198157611980615260565b5b602002015183600a6011811061199a57611999615260565b5b602002015184600b601181106119b3576119b2615260565b5b602002015185600c601181106119cc576119cb615260565b5b602002015186600d601181106119e5576119e4615260565b5b602002015187600e601181106119fe576119fd615260565b5b602002015188600f60118110611a1757611a16615260565b5b602002015189601060118110611a3057611a2f615260565b5b6020020151604051602001611a4d99989796959493929190614581565b60405160208183030381529060405290506000611a6985612da5565b611a8d611a88600a600089815260200190815260200160002054612da5565b612f06565b611aae85600160118110611aa457611aa3615260565b5b6020020151612f35565b611acf86600360118110611ac557611ac4615260565b5b6020020151612f35565b611af087600560118110611ae657611ae5615260565b5b6020020151612f35565b611b1188600760118110611b0757611b06615260565b5b6020020151612f35565b611b3289600960118110611b2857611b27615260565b5b6020020151612f35565b611b538a600b60118110611b4957611b48615260565b5b6020020151612f35565b611b748b600d60118110611b6a57611b69615260565b5b6020020151612f35565b611b958c600f60118110611b8b57611b8a615260565b5b6020020151612f35565b604051602001611bae9a9998979695949392919061475f565b6040516020818303038152906040529050611d0181611be485600160118110611bda57611bd9615260565b5b6020020151612f06565b611c0586600360118110611bfb57611bfa615260565b5b6020020151612f06565b611c2687600560118110611c1c57611c1b615260565b5b6020020151612f06565b611c4788600760118110611c3d57611c3c615260565b5b6020020151612f06565b611c6889600960118110611c5e57611c5d615260565b5b6020020151612f06565b611c898a600b60118110611c7f57611c7e615260565b5b6020020151612f06565b611caa8b600d60118110611ca057611c9f615260565b5b6020020151612f06565b611ccb8c600f60118110611cc157611cc0615260565b5b6020020151612f06565b611cd48c612f74565b604051602001611ced9a99989796959493929190614600565b604051602081830303815290604052612f74565b905080604051602001611d149190614864565b6040516020818303038152906040529150819350505050919050565b611d38612492565b73ffffffffffffffffffffffffffffffffffffffff16611d56610e16565b73ffffffffffffffffffffffffffffffffffffffff1614611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da390614c86565b60405180910390fd5b8060288190555050565b606060258054611dc5906150be565b80601f0160208091040260200160405190810160405280929190818152602001828054611df1906150be565b8015611e3e5780601f10611e1357610100808354040283529160200191611e3e565b820191906000526020600020905b815481529060010190602001808311611e2157829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ee4612492565b73ffffffffffffffffffffffffffffffffffffffff16611f02610e16565b73ffffffffffffffffffffffffffffffffffffffff1614611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f90614c86565b60405180910390fd5b600160275410611f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9490614d06565b60405180910390fd5b8060268190555060276000815480929190611fb790615121565b919050555050565b3373ffffffffffffffffffffffffffffffffffffffff16611fdf8a610c1e565b73ffffffffffffffffffffffffffffffffffffffff1614612035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202c90614d86565b60405180910390fd5b6005600a60008b8152602001908152602001600020541061208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290614a46565b60405180910390fd5b60265443106120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c690614d46565b60405180910390fd5b600081838587898b8d8f6120e39190614ed7565b6120ed9190614ed7565b6120f79190614ed7565b6121019190614ed7565b61210b9190614ed7565b6121159190614ed7565b61211f9190614ed7565b1161215f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215690614b46565b60405180910390fd5b6000620f4240436040516020016121769190614886565b6040516020818303038152906040528051906020012060001c61219991906151a2565b905060006040518061010001604052808b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815250905060005b60088110156122565760008282600881106121fa576121f9615260565b5b602002015111156122435782600960008e8152602001908152602001600020826008811061222b5761222a615260565b5b01600082825461223b9190614ed7565b925050819055505b808061224e90615121565b9150506121dc565b50600a60008c8152602001908152602001600020600081548092919061227b90615121565b91905055507faea646e052f85d2e7b1b634b62c2d6d55d38a8901dc11a296ad7a40c2b5b5efb8b6040516122af9190614dc6565b60405180910390a15050505050505050505050565b6122cc612492565b73ffffffffffffffffffffffffffffffffffffffff166122ea610e16565b73ffffffffffffffffffffffffffffffffffffffff1614612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233790614c86565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a790614aa6565b60405180910390fd5b6123b98161290c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661250d83610c1e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600060235490506023600081548092919061256d90615121565b9190505550620f424081334260405160200161258b939291906148a1565b6040516020818303038152906040528051906020012060001c6125ae91906151a2565b60086000838152602001908152602001600020819055506125cf338261310c565b50565b60006125dd82612426565b61261c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261390614b66565b60405180910390fd5b600061262783610c1e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061269657508373ffffffffffffffffffffffffffffffffffffffff1661267e84610837565b73ffffffffffffffffffffffffffffffffffffffff16145b806126a757506126a68185611e48565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126d082610c1e565b73ffffffffffffffffffffffffffffffffffffffff1614612726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271d90614ca6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d90614b06565b60405180910390fd5b6127a183838361312a565b6127ac60008261249a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127fc9190614fb8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128539190614ed7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b8551811015612a7a5760008682815181106129f9576129f8615260565b5b60200260200101519050808311612a3a578281604051602001612a1d92919061451a565b604051602081830303815290604052805190602001209250612a66565b8083604051602001612a4d92919061451a565b6040516020818303038152906040528051906020012092505b508080612a7290615121565b9150506129db565b508381149150509392505050565b612a938484846126b0565b612a9f8484848461312f565b612ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad590614a86565b60405180910390fd5b50505050565b600081600860008581526020019081526020016000205460096000868152602001908152602001600020600185612b1b9190614fb8565b60088110612b2c57612b2b615260565b5b0154604051602001612b4093929190614965565b6040516020818303038152906040528051906020012060001c905092915050565b606060018310158015612b7657506127108311155b612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac90614ae6565b60405180910390fd5b60608060006127108686604051602001612bd09291906148de565b6040516020818303038152906040528051906020012060001c612bf391906151a2565b905060006001612710888489604051602001612c1193929190614965565b6040516020818303038152906040528051906020012060001c612c3491906151a2565b612c3e9190614ed7565b90506000600190505b612c50836132c6565b8111612d975760005b600b811015612ce857600c81600b600788604051612c779190614546565b908152602001604051809103902054612c909190614f5e565b612c9a9190614ed7565b6101298110612cac57612cab615260565b5b601091828204019190066002029054906101000a900461ffff1661ffff168311612cd557612ce8565b8080612ce090615121565b915050612c59565b612d10600786604051612cfb9190614546565b908152602001604051809103902054826133ee565b94508585604051602001612d2592919061455d565b604051602081830303815290604052955060016127108a8589868d604051602001612d5495949392919061490a565b6040516020818303038152906040528051906020012060001c612d7791906151a2565b612d819190614ed7565b9250508080612d8f90615121565b915050612c47565b508394505050505092915050565b60606000821415612ded576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f01565b600082905060005b60008214612e1f578080612e0890615121565b915050600a82612e189190614f2d565b9150612df5565b60008167ffffffffffffffff811115612e3b57612e3a61528f565b5b6040519080825280601f01601f191660200182016040528015612e6d5781602001600182028036833780820191505090505b5090505b60008514612efa57600182612e869190614fb8565b9150600a85612e9591906151a2565b6030612ea19190614ed7565b60f81b818381518110612eb757612eb6615260565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ef39190614f2d565b9450612e71565b8093505050505b919050565b6060600082604051602001612f1b9190614732565b604051602081830303815290604052905080915050919050565b60606000612f4a612f458461355f565b612da5565b604051602001612f5a91906146fa565b604051602081830303815290604052905080915050919050565b60606000825190506000811415612f9d5760405180602001604052806000815250915050613107565b60006003600283612fae9190614ed7565b612fb89190614f2d565b6004612fc49190614f5e565b90506000602082612fd59190614ed7565b67ffffffffffffffff811115612fee57612fed61528f565b5b6040519080825280601f01601f1916602001820160405280156130205781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615e5a604091399050600181016020830160005b868110156130c45760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061304b565b5060038606600181146130de57600281146130ee576130f9565b613d3d60f01b60028303526130f9565b603d60f81b60018303525b508484525050819450505050505b919050565b61312682826040518060200160405280600081525061356a565b5050565b505050565b60006131508473ffffffffffffffffffffffffffffffffffffffff166135c5565b156132b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613179612492565b8786866040518563ffffffff1660e01b815260040161319b94939291906149bd565b602060405180830381600087803b1580156131b557600080fd5b505af19250505080156131e657506040513d601f19601f820116820180604052508101906131e39190613d28565b60015b613269573d8060008114613216576040519150601f19603f3d011682016040523d82523d6000602084013e61321b565b606091505b50600081511415613261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325890614a86565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132be565b600190505b949350505050565b600080604051806102000160405280600261ffff168152602001606361ffff1681526020016102f961ffff16815260200161078961ffff168152602001610c6761ffff16815260200161125661ffff16815260200161189361ffff168152602001611de661ffff16815260200161222861ffff16815260200161247061ffff1681526020016125ce61ffff16815260200161269061ffff1681526020016126d261ffff1681526020016126f861ffff16815260200161270761ffff16815260200161271061ffff16815250905060005b600f81116133d8578181601081106133b1576133b0615260565b5b602002015161ffff1684116133c5576133d8565b80806133d090615121565b915050613396565b6001816133e59190614ed7565b92505050919050565b60606000601f848154811061340657613405615260565b5b90600052602060002001805461341b906150be565b80601f0160208091040260200160405190810160405280929190818152602001828054613447906150be565b80156134945780601f1061346957610100808354040283529160200191613494565b820191906000526020600020905b81548152906001019060200180831161347757829003601f168201915b505050505090506000600167ffffffffffffffff8111156134b8576134b761528f565b5b6040519080825280601f01601f1916602001820160405280156134ea5781602001600182028036833780820191505090505b509050600081905082858151811061350557613504615260565b5b602001015160f81c60f81b8160008151811061352457613523615260565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080935050505092915050565b600081519050919050565b61357483836135d8565b613581600084848461312f565b6135c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b790614a86565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363f90614be6565b60405180910390fd5b61365181612426565b15613691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368890614ac6565b60405180910390fd5b61369d6000838361312a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136ed9190614ed7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546137b2906150be565b90600052602060002090601f0160209004810192826137d4576000855561381b565b82601f106137ed57805160ff191683800117855561381b565b8280016001018555821561381b579182015b8281111561381a5782518255916020019190600101906137ff565b5b5090506138289190613854565b5090565b6040518061022001604052806011905b606081526020019060019003908161383c5790505090565b5b8082111561386d576000816000905550600101613855565b5090565b600061388461387f84614e06565b614de1565b905080838252602082019050828560208602820111156138a7576138a66152c3565b5b60005b858110156138d757816138bd88826139d2565b8452602084019350602083019250506001810190506138aa565b5050509392505050565b60006138f46138ef84614e32565b614de1565b9050828152602081018484840111156139105761390f6152c8565b5b61391b84828561507c565b509392505050565b600061393661393184614e63565b614de1565b905082815260208101848484011115613952576139516152c8565b5b61395d84828561507c565b509392505050565b60008135905061397481615c06565b92915050565b60008135905061398981615c1d565b92915050565b600082601f8301126139a4576139a36152be565b5b81356139b4848260208601613871565b91505092915050565b6000813590506139cc81615c34565b92915050565b6000813590506139e181615c4b565b92915050565b6000813590506139f681615c62565b92915050565b600081519050613a0b81615c62565b92915050565b600082601f830112613a2657613a256152be565b5b8135613a368482602086016138e1565b91505092915050565b600082601f830112613a5457613a536152be565b5b8135613a64848260208601613923565b91505092915050565b600081359050613a7c81615c79565b92915050565b600060208284031215613a9857613a976152d2565b5b6000613aa684828501613965565b91505092915050565b60008060408385031215613ac657613ac56152d2565b5b6000613ad48582860161397a565b9250506020613ae585828601613a6d565b9150509250929050565b60008060408385031215613b0657613b056152d2565b5b6000613b1485828601613965565b9250506020613b2585828601613965565b9150509250929050565b600080600060608486031215613b4857613b476152d2565b5b6000613b5686828701613965565b9350506020613b6786828701613965565b9250506040613b7886828701613a6d565b9150509250925092565b60008060008060808587031215613b9c57613b9b6152d2565b5b6000613baa87828801613965565b9450506020613bbb87828801613965565b9350506040613bcc87828801613a6d565b925050606085013567ffffffffffffffff811115613bed57613bec6152cd565b5b613bf987828801613a11565b91505092959194509250565b60008060408385031215613c1c57613c1b6152d2565b5b6000613c2a85828601613965565b9250506020613c3b858286016139bd565b9150509250929050565b60008060408385031215613c5c57613c5b6152d2565b5b6000613c6a85828601613965565b9250506020613c7b85828601613a6d565b9150509250929050565b600060208284031215613c9b57613c9a6152d2565b5b600082013567ffffffffffffffff811115613cb957613cb86152cd565b5b613cc58482850161398f565b91505092915050565b600060208284031215613ce457613ce36152d2565b5b6000613cf2848285016139d2565b91505092915050565b600060208284031215613d1157613d106152d2565b5b6000613d1f848285016139e7565b91505092915050565b600060208284031215613d3e57613d3d6152d2565b5b6000613d4c848285016139fc565b91505092915050565b600060208284031215613d6b57613d6a6152d2565b5b600082013567ffffffffffffffff811115613d8957613d886152cd565b5b613d9584828501613a3f565b91505092915050565b600060208284031215613db457613db36152d2565b5b6000613dc284828501613a6d565b91505092915050565b60008060008060008060008060006101208a8c031215613dee57613ded6152d2565b5b6000613dfc8c828d01613a6d565b9950506020613e0d8c828d01613a6d565b9850506040613e1e8c828d01613a6d565b9750506060613e2f8c828d01613a6d565b9650506080613e408c828d01613a6d565b95505060a0613e518c828d01613a6d565b94505060c0613e628c828d01613a6d565b93505060e0613e738c828d01613a6d565b925050610100613e858c828d01613a6d565b9150509295985092959850929598565b613e9e81614fec565b82525050565b613eb5613eb082614fec565b61516a565b82525050565b613ec481615010565b82525050565b613edb613ed68261501c565b61517c565b82525050565b6000613eec82614e94565b613ef68185614eaa565b9350613f0681856020860161508b565b613f0f816152d7565b840191505092915050565b6000613f2582614e9f565b613f2f8185614ebb565b9350613f3f81856020860161508b565b613f48816152d7565b840191505092915050565b6000613f5e82614e9f565b613f688185614ecc565b9350613f7881856020860161508b565b80840191505092915050565b6000613f91601b83614ebb565b9150613f9c826152f5565b602082019050919050565b6000613fb4601f83614ebb565b9150613fbf8261531e565b602082019050919050565b6000613fd7603283614ebb565b9150613fe282615347565b604082019050919050565b6000613ffa606583614ecc565b915061400582615396565b606582019050919050565b600061401d602683614ebb565b915061402882615431565b604082019050919050565b6000614040602983614ecc565b915061404b82615480565b602982019050919050565b6000614063601c83614ebb565b915061406e826154cf565b602082019050919050565b6000614086601083614ebb565b9150614091826154f8565b602082019050919050565b60006140a9600883614ecc565b91506140b482615521565b600882019050919050565b60006140cc602483614ebb565b91506140d78261554a565b604082019050919050565b60006140ef601983614ebb565b91506140fa82615599565b602082019050919050565b6000614112602283614ecc565b915061411d826155c2565b602282019050919050565b6000614135602083614ebb565b915061414082615611565b602082019050919050565b6000614158602c83614ebb565b91506141638261563a565b604082019050919050565b600061417b603883614ebb565b915061418682615689565b604082019050919050565b600061419e600183614ecc565b91506141a9826156d8565b600182019050919050565b60006141c1602183614ecc565b91506141cc82615701565b602182019050919050565b60006141e4602a83614ebb565b91506141ef82615750565b604082019050919050565b6000614207602983614ebb565b91506142128261579f565b604082019050919050565b600061422a600283614ecc565b9150614235826157ee565b600282019050919050565b600061424d602083614ebb565b915061425882615817565b602082019050919050565b6000614270601983614ebb565b915061427b82615840565b602082019050919050565b6000614293600f83614ebb565b915061429e82615869565b602082019050919050565b60006142b6600183614ecc565b91506142c182615892565b600182019050919050565b60006142d9601c83614ebb565b91506142e4826158bb565b602082019050919050565b60006142fc602c83614ebb565b9150614307826158e4565b604082019050919050565b600061431f602083614ebb565b915061432a82615933565b602082019050919050565b6000614342602983614ebb565b915061434d8261595c565b604082019050919050565b6000614365602683614ebb565b9150614370826159ab565b604082019050919050565b6000614388602183614ebb565b9150614393826159fa565b604082019050919050565b60006143ab601083614ecc565b91506143b682615a49565b601082019050919050565b60006143ce601d83614ecc565b91506143d982615a72565b601d82019050919050565b60006143f1601c83614ebb565b91506143fc82615a9b565b602082019050919050565b6000614414603183614ebb565b915061441f82615ac4565b604082019050919050565b6000614437601a83614ebb565b915061444282615b13565b602082019050919050565b600061445a601b83614ebb565b915061446582615b3c565b602082019050919050565b600061447d601183614ebb565b915061448882615b65565b602082019050919050565b60006144a0601e83614ebb565b91506144ab82615b8e565b602082019050919050565b60006144c3602983614ecc565b91506144ce82615bb7565b602982019050919050565b6144e281615072565b82525050565b6144f96144f482615072565b615198565b82525050565b600061450b8284613ea4565b60148201915081905092915050565b60006145268285613eca565b6020820191506145368284613eca565b6020820191508190509392505050565b60006145528284613f53565b915081905092915050565b60006145698285613f53565b91506145758284613f53565b91508190509392505050565b600061458d828c613f53565b9150614599828b613f53565b91506145a5828a613f53565b91506145b18289613f53565b91506145bd8288613f53565b91506145c98287613f53565b91506145d58286613f53565b91506145e18285613f53565b91506145ed8284613f53565b91508190509a9950505050505050505050565b600061460c828d613f53565b9150614617826141b4565b9150614623828c613f53565b915061462e82614105565b915061463a828b613f53565b915061464582614105565b9150614651828a613f53565b915061465c82614105565b91506146688289613f53565b915061467382614105565b915061467f8288613f53565b915061468a82614105565b91506146968287613f53565b91506146a182614105565b91506146ad8286613f53565b91506146b882614105565b91506146c48285613f53565b91506146cf826144b6565b91506146db8284613f53565b91506146e68261421d565b91508190509b9a5050505050505050505050565b600061470582614191565b91506147118284613f53565b915061471c8261409c565b915061472782614191565b915081905092915050565b600061473d82614191565b91506147498284613f53565b915061475482614191565b915081905092915050565b600061476a8261439e565b9150614776828d613f53565b915061478182613fed565b915061478d828c613f53565b915061479882614033565b91506147a4828b613f53565b91506147af82614033565b91506147bb828a613f53565b91506147c682614033565b91506147d28289613f53565b91506147dd82614033565b91506147e98288613f53565b91506147f482614033565b91506148008287613f53565b915061480b82614033565b91506148178286613f53565b915061482282614033565b915061482e8285613f53565b915061483982614033565b91506148458284613f53565b9150614850826142a9565b91508190509b9a5050505050505050505050565b600061486f826143c1565b915061487b8284613f53565b915081905092915050565b600061489282846144e8565b60208201915081905092915050565b60006148ad82866144e8565b6020820191506148bd8285613ea4565b6014820191506148cd82846144e8565b602082019150819050949350505050565b60006148ea82856144e8565b6020820191506148fa82846144e8565b6020820191508190509392505050565b600061491682886144e8565b60208201915061492682876144e8565b6020820191506149368286613f53565b915061494282856144e8565b60208201915061495282846144e8565b6020820191508190509695505050505050565b600061497182866144e8565b60208201915061498182856144e8565b60208201915061499182846144e8565b602082019150819050949350505050565b60006020820190506149b76000830184613e95565b92915050565b60006080820190506149d26000830187613e95565b6149df6020830186613e95565b6149ec60408301856144d9565b81810360608301526149fe8184613ee1565b905095945050505050565b6000602082019050614a1e6000830184613ebb565b92915050565b60006020820190508181036000830152614a3e8184613f1a565b905092915050565b60006020820190508181036000830152614a5f81613f84565b9050919050565b60006020820190508181036000830152614a7f81613fa7565b9050919050565b60006020820190508181036000830152614a9f81613fca565b9050919050565b60006020820190508181036000830152614abf81614010565b9050919050565b60006020820190508181036000830152614adf81614056565b9050919050565b60006020820190508181036000830152614aff81614079565b9050919050565b60006020820190508181036000830152614b1f816140bf565b9050919050565b60006020820190508181036000830152614b3f816140e2565b9050919050565b60006020820190508181036000830152614b5f81614128565b9050919050565b60006020820190508181036000830152614b7f8161414b565b9050919050565b60006020820190508181036000830152614b9f8161416e565b9050919050565b60006020820190508181036000830152614bbf816141d7565b9050919050565b60006020820190508181036000830152614bdf816141fa565b9050919050565b60006020820190508181036000830152614bff81614240565b9050919050565b60006020820190508181036000830152614c1f81614263565b9050919050565b60006020820190508181036000830152614c3f81614286565b9050919050565b60006020820190508181036000830152614c5f816142cc565b9050919050565b60006020820190508181036000830152614c7f816142ef565b9050919050565b60006020820190508181036000830152614c9f81614312565b9050919050565b60006020820190508181036000830152614cbf81614335565b9050919050565b60006020820190508181036000830152614cdf81614358565b9050919050565b60006020820190508181036000830152614cff8161437b565b9050919050565b60006020820190508181036000830152614d1f816143e4565b9050919050565b60006020820190508181036000830152614d3f81614407565b9050919050565b60006020820190508181036000830152614d5f8161442a565b9050919050565b60006020820190508181036000830152614d7f8161444d565b9050919050565b60006020820190508181036000830152614d9f81614470565b9050919050565b60006020820190508181036000830152614dbf81614493565b9050919050565b6000602082019050614ddb60008301846144d9565b92915050565b6000614deb614dfc565b9050614df782826150f0565b919050565b6000604051905090565b600067ffffffffffffffff821115614e2157614e2061528f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e4d57614e4c61528f565b5b614e56826152d7565b9050602081019050919050565b600067ffffffffffffffff821115614e7e57614e7d61528f565b5b614e87826152d7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ee282615072565b9150614eed83615072565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f2257614f216151d3565b5b828201905092915050565b6000614f3882615072565b9150614f4383615072565b925082614f5357614f52615202565b5b828204905092915050565b6000614f6982615072565b9150614f7483615072565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fad57614fac6151d3565b5b828202905092915050565b6000614fc382615072565b9150614fce83615072565b925082821015614fe157614fe06151d3565b5b828203905092915050565b6000614ff782615052565b9050919050565b600061500982615052565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156150a957808201518184015260208101905061508e565b838111156150b8576000848401525b50505050565b600060028204905060018216806150d657607f821691505b602082108114156150ea576150e9615231565b5b50919050565b6150f9826152d7565b810181811067ffffffffffffffff821117156151185761511761528f565b5b80604052505050565b600061512c82615072565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561515f5761515e6151d3565b5b600182019050919050565b600061517582615186565b9050919050565b6000819050919050565b6000615191826152e8565b9050919050565b6000819050919050565b60006151ad82615072565b91506151b883615072565b9250826151c8576151c7615202565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f53687566666c6564206d617820616d6f756e7420616c72656164790000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a20225061636b206f662038204c6f6f60008201527f746c616e6720776f726473222c202261747472696275746573223a205b7b227460208201527f726169745f74797065223a202253687566666c65732055736564222c2022766160408201527f6c7565223a000000000000000000000000000000000000000000000000000000606082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7d2c207b2274726169745f74797065223a2022576f7264204c656e677468222c60008201527f202276616c7565223a0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c696420746f6b656e49642e00000000000000000000000000000000600082015250565b7f206c657474657273000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7d2c207b2274726169745f74797065223a2022576f7264222c202276616c756560008201527f223a000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20776f7264732073656c656374656420746f2062652073687566666c6564600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b7f2c207b2274726169745f74797065223a2022576f7264222c202276616c75652260008201527f3a00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f416c6c204e4654732068617665206265656e206d696e74656400000000000000600082015250565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f4d696e74696e672069732079657420746f20626520656e61626c656400000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5769746864726177616c20616d6f756e742067726561746572207468616e206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a20225061636b202300000000000000000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f467265657a6520626c6f636b20616c7265616479206368616e67656400000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53687566666c696e6720686173206265656e2066726f7a656e21000000000000600082015250565b7f496e73756666696369656e742066756e64732070726f76696465640000000000600082015250565b7f4d757374206265204e4654206f776e6572000000000000000000000000000000600082015250565b7f4e6f74206f6e207072652d617070726f76656420636c61696d206c6973740000600082015250565b7f7d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60008201527f3b6261736536342c200000000000000000000000000000000000000000000000602082015250565b615c0f81614fec565b8114615c1a57600080fd5b50565b615c2681614ffe565b8114615c3157600080fd5b50565b615c3d81615010565b8114615c4857600080fd5b50565b615c548161501c565b8114615c5f57600080fd5b50565b615c6b81615026565b8114615c7657600080fd5b50565b615c8281615072565b8114615c8d57600080fd5b5056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20323070783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231352220793d2233302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d223230352220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d223234302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d223133352220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d223237352220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d2236352220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231352220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d223137302220636c6173733d2262617365223ea26469706673582212207d6cb6ce6aaeb75ee61501042eae9e513b8de2e71817ee4c5871889c78de89bf64736f6c6343000807003368747470733a2f2f6c6f6f746c616e672e636f6d2f6d657461646174612e6a736f6e

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80638b7afe2e116100f7578063c107532911610095578063e985e9c511610064578063e985e9c51461060b578063ee34847214610648578063f2fc1cb614610671578063f2fde38b1461069a576101c2565b8063c107532914610551578063c87b56dd1461057a578063dab5f340146105b7578063e8a3d485146105e0576101c2565b806395d89b41116100d157806395d89b41146104ab578063a22cb465146104d6578063b391c508146104ff578063b88d4fde14610528576101c2565b80638b7afe2e1461042c5780638da5cb5b14610457578063938e3d7b14610482576101c2565b806323b872dd1161016457806342842e0e1161013e57806342842e0e146103725780636352211e1461039b57806370a08231146103d8578063715018a614610415576101c2565b806323b872dd146102f557806328e398e41461031e5780633a15786014610347576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780631249c58b1461029557806318160ddd1461029f578063238dafe0146102ca576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190613cfb565b6106c3565b6040516101fb9190614a09565b60405180910390f35b34801561021057600080fd5b506102196107a5565b6040516102269190614a24565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613d9e565b610837565b60405161026391906149a2565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190613c45565b6108bc565b005b61029d6109d4565b005b3480156102ab57600080fd5b506102b4610af5565b6040516102c19190614dc6565b60405180910390f35b3480156102d657600080fd5b506102df610b0c565b6040516102ec9190614dc6565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613b2f565b610b12565b005b34801561032a57600080fd5b5061034560048036038101906103409190613d9e565b610b72565b005b34801561035357600080fd5b5061035c610bf8565b6040516103699190614dc6565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613b2f565b610bfe565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190613d9e565b610c1e565b6040516103cf91906149a2565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613a82565b610cd0565b60405161040c9190614dc6565b60405180910390f35b34801561042157600080fd5b5061042a610d88565b005b34801561043857600080fd5b50610441610e10565b60405161044e9190614dc6565b60405180910390f35b34801561046357600080fd5b5061046c610e16565b60405161047991906149a2565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613d55565b610e40565b005b3480156104b757600080fd5b506104c0610ed6565b6040516104cd9190614a24565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190613c05565b610f68565b005b34801561050b57600080fd5b5061052660048036038101906105219190613c85565b6110e9565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613b82565b61130c565b005b34801561055d57600080fd5b5061057860048036038101906105739190613aaf565b61136e565b005b34801561058657600080fd5b506105a1600480360381019061059c9190613d9e565b611493565b6040516105ae9190614a24565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d99190613cce565b611d30565b005b3480156105ec57600080fd5b506105f5611db6565b6040516106029190614a24565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d9190613aef565b611e48565b60405161063f9190614a09565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190613d9e565b611edc565b005b34801561067d57600080fd5b5061069860048036038101906106939190613dcb565b611fbf565b005b3480156106a657600080fd5b506106c160048036038101906106bc9190613a82565b6122c4565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079e575061079d826123bc565b5b9050919050565b6060600080546107b4906150be565b80601f01602080910402602001604051908101604052809291908181526020018280546107e0906150be565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b600061084282612426565b610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890614c66565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c782610c1e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f90614ce6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610957612492565b73ffffffffffffffffffffffffffffffffffffffff161480610986575061098581610980612492565b611e48565b5b6109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90614b86565b60405180910390fd5b6109cf838361249a565b505050565b600160205414610a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1090614c46565b60405180910390fd5b61271060235411158015610a3157506125e460215411155b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6790614c06565b60405180910390fd5b66470de4df820000341015610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab190614d66565b60405180910390fd5b60216000815480929190610acd90615121565b91905055503460246000828254610ae49190614ed7565b92505081905550610af3612553565b565b6000602254602154610b079190614ed7565b905090565b60205481565b610b23610b1d612492565b826125d2565b610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990614d26565b60405180910390fd5b610b6d8383836126b0565b505050565b610b7a612492565b73ffffffffffffffffffffffffffffffffffffffff16610b98610e16565b73ffffffffffffffffffffffffffffffffffffffff1614610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be590614c86565b60405180910390fd5b8060208190555050565b60265481565b610c198383836040518060200160405280600081525061130c565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614bc6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3890614ba6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d90612492565b73ffffffffffffffffffffffffffffffffffffffff16610dae610e16565b73ffffffffffffffffffffffffffffffffffffffff1614610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb90614c86565b60405180910390fd5b610e0e600061290c565b565b60245481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e48612492565b73ffffffffffffffffffffffffffffffffffffffff16610e66610e16565b73ffffffffffffffffffffffffffffffffffffffff1614610ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb390614c86565b60405180910390fd5b8060259080519060200190610ed29291906137a6565b5050565b606060018054610ee5906150be565b80601f0160208091040260200160405190810160405280929190818152602001828054610f11906150be565b8015610f5e5780601f10610f3357610100808354040283529160200191610f5e565b820191906000526020600020905b815481529060010190602001808311610f4157829003601f168201915b5050505050905090565b610f70612492565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590614b26565b60405180910390fd5b8060056000610feb612492565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611098612492565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110dd9190614a09565b60405180910390a35050565b60016020541461112e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112590614c46565b60405180910390fd5b60001515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b890614c26565b60405180910390fd5b612710602354111580156111d9575061012c60225411155b611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f90614c06565b60405180910390fd5b6001151561124f826028543360405160200161123491906144ff565b604051602081830303815290604052805190602001206129d2565b151514611291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128890614da6565b60405180910390fd5b602260008154809291906112a490615121565b91905055506001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611309612553565b50565b61131d611317612492565b836125d2565b61135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614d26565b60405180910390fd5b61136884848484612a88565b50505050565b611376612492565b73ffffffffffffffffffffffffffffffffffffffff16611394610e16565b73ffffffffffffffffffffffffffffffffffffffff16146113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e190614c86565b60405180910390fd5b60245481111561142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690614cc6565b60405180910390fd5b80602460008282546114419190614fb8565b925050819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561148e573d6000803e3d6000fd5b505050565b606061149e82612426565b6114dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d490614a66565b60405180910390fd5b6114e561382c565b60405180610120016040528060fd8152602001615c9160fd91398160006011811061151357611512615260565b5b602002018190525061152f8361152a856001612ae4565b612b61565b8160016011811061154357611542615260565b5b6020020181905250604051806060016040528060288152602001615e32602891398160026011811061157857611577615260565b5b60200201819052506115948361158f856002612ae4565b612b61565b816003601181106115a8576115a7615260565b5b6020020181905250604051806060016040528060298152602001615e9a60299139816004601181106115dd576115dc615260565b5b60200201819052506115f9836115f4856003612ae4565b612b61565b8160056011811061160d5761160c615260565b5b6020020181905250604051806060016040528060298152602001615de0602991398160066011811061164257611641615260565b5b602002018190525061165e83611659856004612ae4565b612b61565b8160076011811061167257611671615260565b5b6020020181905250604051806060016040528060298152602001615ec360299139816008601181106116a7576116a6615260565b5b60200201819052506116c3836116be856005612ae4565b612b61565b816009601181106116d7576116d6615260565b5b6020020181905250604051806060016040528060298152602001615d8e6029913981600a6011811061170c5761170b615260565b5b602002018190525061172883611723856006612ae4565b612b61565b81600b6011811061173c5761173b615260565b5b6020020181905250604051806060016040528060298152602001615db76029913981600c6011811061177157611770615260565b5b602002018190525061178d83611788856007612ae4565b612b61565b81600d601181106117a1576117a0615260565b5b6020020181905250604051806060016040528060298152602001615e096029913981600e601181106117d6576117d5615260565b5b60200201819052506117f2836117ed856008612ae4565b612b61565b81600f6011811061180657611805615260565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e000000000000000000000000000000000000008152508160106011811061185857611857615260565b5b602002018190525060008160006011811061187657611875615260565b5b60200201518260016011811061188f5761188e615260565b5b6020020151836002601181106118a8576118a7615260565b5b6020020151846003601181106118c1576118c0615260565b5b6020020151856004601181106118da576118d9615260565b5b6020020151866005601181106118f3576118f2615260565b5b60200201518760066011811061190c5761190b615260565b5b60200201518860076011811061192557611924615260565b5b60200201518960086011811061193e5761193d615260565b5b602002015160405160200161195b99989796959493929190614581565b6040516020818303038152906040529050808260096011811061198157611980615260565b5b602002015183600a6011811061199a57611999615260565b5b602002015184600b601181106119b3576119b2615260565b5b602002015185600c601181106119cc576119cb615260565b5b602002015186600d601181106119e5576119e4615260565b5b602002015187600e601181106119fe576119fd615260565b5b602002015188600f60118110611a1757611a16615260565b5b602002015189601060118110611a3057611a2f615260565b5b6020020151604051602001611a4d99989796959493929190614581565b60405160208183030381529060405290506000611a6985612da5565b611a8d611a88600a600089815260200190815260200160002054612da5565b612f06565b611aae85600160118110611aa457611aa3615260565b5b6020020151612f35565b611acf86600360118110611ac557611ac4615260565b5b6020020151612f35565b611af087600560118110611ae657611ae5615260565b5b6020020151612f35565b611b1188600760118110611b0757611b06615260565b5b6020020151612f35565b611b3289600960118110611b2857611b27615260565b5b6020020151612f35565b611b538a600b60118110611b4957611b48615260565b5b6020020151612f35565b611b748b600d60118110611b6a57611b69615260565b5b6020020151612f35565b611b958c600f60118110611b8b57611b8a615260565b5b6020020151612f35565b604051602001611bae9a9998979695949392919061475f565b6040516020818303038152906040529050611d0181611be485600160118110611bda57611bd9615260565b5b6020020151612f06565b611c0586600360118110611bfb57611bfa615260565b5b6020020151612f06565b611c2687600560118110611c1c57611c1b615260565b5b6020020151612f06565b611c4788600760118110611c3d57611c3c615260565b5b6020020151612f06565b611c6889600960118110611c5e57611c5d615260565b5b6020020151612f06565b611c898a600b60118110611c7f57611c7e615260565b5b6020020151612f06565b611caa8b600d60118110611ca057611c9f615260565b5b6020020151612f06565b611ccb8c600f60118110611cc157611cc0615260565b5b6020020151612f06565b611cd48c612f74565b604051602001611ced9a99989796959493929190614600565b604051602081830303815290604052612f74565b905080604051602001611d149190614864565b6040516020818303038152906040529150819350505050919050565b611d38612492565b73ffffffffffffffffffffffffffffffffffffffff16611d56610e16565b73ffffffffffffffffffffffffffffffffffffffff1614611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da390614c86565b60405180910390fd5b8060288190555050565b606060258054611dc5906150be565b80601f0160208091040260200160405190810160405280929190818152602001828054611df1906150be565b8015611e3e5780601f10611e1357610100808354040283529160200191611e3e565b820191906000526020600020905b815481529060010190602001808311611e2157829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ee4612492565b73ffffffffffffffffffffffffffffffffffffffff16611f02610e16565b73ffffffffffffffffffffffffffffffffffffffff1614611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f90614c86565b60405180910390fd5b600160275410611f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9490614d06565b60405180910390fd5b8060268190555060276000815480929190611fb790615121565b919050555050565b3373ffffffffffffffffffffffffffffffffffffffff16611fdf8a610c1e565b73ffffffffffffffffffffffffffffffffffffffff1614612035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202c90614d86565b60405180910390fd5b6005600a60008b8152602001908152602001600020541061208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290614a46565b60405180910390fd5b60265443106120cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c690614d46565b60405180910390fd5b600081838587898b8d8f6120e39190614ed7565b6120ed9190614ed7565b6120f79190614ed7565b6121019190614ed7565b61210b9190614ed7565b6121159190614ed7565b61211f9190614ed7565b1161215f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215690614b46565b60405180910390fd5b6000620f4240436040516020016121769190614886565b6040516020818303038152906040528051906020012060001c61219991906151a2565b905060006040518061010001604052808b81526020018a815260200189815260200188815260200187815260200186815260200185815260200184815250905060005b60088110156122565760008282600881106121fa576121f9615260565b5b602002015111156122435782600960008e8152602001908152602001600020826008811061222b5761222a615260565b5b01600082825461223b9190614ed7565b925050819055505b808061224e90615121565b9150506121dc565b50600a60008c8152602001908152602001600020600081548092919061227b90615121565b91905055507faea646e052f85d2e7b1b634b62c2d6d55d38a8901dc11a296ad7a40c2b5b5efb8b6040516122af9190614dc6565b60405180910390a15050505050505050505050565b6122cc612492565b73ffffffffffffffffffffffffffffffffffffffff166122ea610e16565b73ffffffffffffffffffffffffffffffffffffffff1614612340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233790614c86565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a790614aa6565b60405180910390fd5b6123b98161290c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661250d83610c1e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600060235490506023600081548092919061256d90615121565b9190505550620f424081334260405160200161258b939291906148a1565b6040516020818303038152906040528051906020012060001c6125ae91906151a2565b60086000838152602001908152602001600020819055506125cf338261310c565b50565b60006125dd82612426565b61261c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261390614b66565b60405180910390fd5b600061262783610c1e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061269657508373ffffffffffffffffffffffffffffffffffffffff1661267e84610837565b73ffffffffffffffffffffffffffffffffffffffff16145b806126a757506126a68185611e48565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126d082610c1e565b73ffffffffffffffffffffffffffffffffffffffff1614612726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271d90614ca6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d90614b06565b60405180910390fd5b6127a183838361312a565b6127ac60008261249a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127fc9190614fb8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128539190614ed7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b8551811015612a7a5760008682815181106129f9576129f8615260565b5b60200260200101519050808311612a3a578281604051602001612a1d92919061451a565b604051602081830303815290604052805190602001209250612a66565b8083604051602001612a4d92919061451a565b6040516020818303038152906040528051906020012092505b508080612a7290615121565b9150506129db565b508381149150509392505050565b612a938484846126b0565b612a9f8484848461312f565b612ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad590614a86565b60405180910390fd5b50505050565b600081600860008581526020019081526020016000205460096000868152602001908152602001600020600185612b1b9190614fb8565b60088110612b2c57612b2b615260565b5b0154604051602001612b4093929190614965565b6040516020818303038152906040528051906020012060001c905092915050565b606060018310158015612b7657506127108311155b612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac90614ae6565b60405180910390fd5b60608060006127108686604051602001612bd09291906148de565b6040516020818303038152906040528051906020012060001c612bf391906151a2565b905060006001612710888489604051602001612c1193929190614965565b6040516020818303038152906040528051906020012060001c612c3491906151a2565b612c3e9190614ed7565b90506000600190505b612c50836132c6565b8111612d975760005b600b811015612ce857600c81600b600788604051612c779190614546565b908152602001604051809103902054612c909190614f5e565b612c9a9190614ed7565b6101298110612cac57612cab615260565b5b601091828204019190066002029054906101000a900461ffff1661ffff168311612cd557612ce8565b8080612ce090615121565b915050612c59565b612d10600786604051612cfb9190614546565b908152602001604051809103902054826133ee565b94508585604051602001612d2592919061455d565b604051602081830303815290604052955060016127108a8589868d604051602001612d5495949392919061490a565b6040516020818303038152906040528051906020012060001c612d7791906151a2565b612d819190614ed7565b9250508080612d8f90615121565b915050612c47565b508394505050505092915050565b60606000821415612ded576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f01565b600082905060005b60008214612e1f578080612e0890615121565b915050600a82612e189190614f2d565b9150612df5565b60008167ffffffffffffffff811115612e3b57612e3a61528f565b5b6040519080825280601f01601f191660200182016040528015612e6d5781602001600182028036833780820191505090505b5090505b60008514612efa57600182612e869190614fb8565b9150600a85612e9591906151a2565b6030612ea19190614ed7565b60f81b818381518110612eb757612eb6615260565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ef39190614f2d565b9450612e71565b8093505050505b919050565b6060600082604051602001612f1b9190614732565b604051602081830303815290604052905080915050919050565b60606000612f4a612f458461355f565b612da5565b604051602001612f5a91906146fa565b604051602081830303815290604052905080915050919050565b60606000825190506000811415612f9d5760405180602001604052806000815250915050613107565b60006003600283612fae9190614ed7565b612fb89190614f2d565b6004612fc49190614f5e565b90506000602082612fd59190614ed7565b67ffffffffffffffff811115612fee57612fed61528f565b5b6040519080825280601f01601f1916602001820160405280156130205781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615e5a604091399050600181016020830160005b868110156130c45760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061304b565b5060038606600181146130de57600281146130ee576130f9565b613d3d60f01b60028303526130f9565b603d60f81b60018303525b508484525050819450505050505b919050565b61312682826040518060200160405280600081525061356a565b5050565b505050565b60006131508473ffffffffffffffffffffffffffffffffffffffff166135c5565b156132b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613179612492565b8786866040518563ffffffff1660e01b815260040161319b94939291906149bd565b602060405180830381600087803b1580156131b557600080fd5b505af19250505080156131e657506040513d601f19601f820116820180604052508101906131e39190613d28565b60015b613269573d8060008114613216576040519150601f19603f3d011682016040523d82523d6000602084013e61321b565b606091505b50600081511415613261576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325890614a86565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132be565b600190505b949350505050565b600080604051806102000160405280600261ffff168152602001606361ffff1681526020016102f961ffff16815260200161078961ffff168152602001610c6761ffff16815260200161125661ffff16815260200161189361ffff168152602001611de661ffff16815260200161222861ffff16815260200161247061ffff1681526020016125ce61ffff16815260200161269061ffff1681526020016126d261ffff1681526020016126f861ffff16815260200161270761ffff16815260200161271061ffff16815250905060005b600f81116133d8578181601081106133b1576133b0615260565b5b602002015161ffff1684116133c5576133d8565b80806133d090615121565b915050613396565b6001816133e59190614ed7565b92505050919050565b60606000601f848154811061340657613405615260565b5b90600052602060002001805461341b906150be565b80601f0160208091040260200160405190810160405280929190818152602001828054613447906150be565b80156134945780601f1061346957610100808354040283529160200191613494565b820191906000526020600020905b81548152906001019060200180831161347757829003601f168201915b505050505090506000600167ffffffffffffffff8111156134b8576134b761528f565b5b6040519080825280601f01601f1916602001820160405280156134ea5781602001600182028036833780820191505090505b509050600081905082858151811061350557613504615260565b5b602001015160f81c60f81b8160008151811061352457613523615260565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080935050505092915050565b600081519050919050565b61357483836135d8565b613581600084848461312f565b6135c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b790614a86565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363f90614be6565b60405180910390fd5b61365181612426565b15613691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368890614ac6565b60405180910390fd5b61369d6000838361312a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136ed9190614ed7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546137b2906150be565b90600052602060002090601f0160209004810192826137d4576000855561381b565b82601f106137ed57805160ff191683800117855561381b565b8280016001018555821561381b579182015b8281111561381a5782518255916020019190600101906137ff565b5b5090506138289190613854565b5090565b6040518061022001604052806011905b606081526020019060019003908161383c5790505090565b5b8082111561386d576000816000905550600101613855565b5090565b600061388461387f84614e06565b614de1565b905080838252602082019050828560208602820111156138a7576138a66152c3565b5b60005b858110156138d757816138bd88826139d2565b8452602084019350602083019250506001810190506138aa565b5050509392505050565b60006138f46138ef84614e32565b614de1565b9050828152602081018484840111156139105761390f6152c8565b5b61391b84828561507c565b509392505050565b600061393661393184614e63565b614de1565b905082815260208101848484011115613952576139516152c8565b5b61395d84828561507c565b509392505050565b60008135905061397481615c06565b92915050565b60008135905061398981615c1d565b92915050565b600082601f8301126139a4576139a36152be565b5b81356139b4848260208601613871565b91505092915050565b6000813590506139cc81615c34565b92915050565b6000813590506139e181615c4b565b92915050565b6000813590506139f681615c62565b92915050565b600081519050613a0b81615c62565b92915050565b600082601f830112613a2657613a256152be565b5b8135613a368482602086016138e1565b91505092915050565b600082601f830112613a5457613a536152be565b5b8135613a64848260208601613923565b91505092915050565b600081359050613a7c81615c79565b92915050565b600060208284031215613a9857613a976152d2565b5b6000613aa684828501613965565b91505092915050565b60008060408385031215613ac657613ac56152d2565b5b6000613ad48582860161397a565b9250506020613ae585828601613a6d565b9150509250929050565b60008060408385031215613b0657613b056152d2565b5b6000613b1485828601613965565b9250506020613b2585828601613965565b9150509250929050565b600080600060608486031215613b4857613b476152d2565b5b6000613b5686828701613965565b9350506020613b6786828701613965565b9250506040613b7886828701613a6d565b9150509250925092565b60008060008060808587031215613b9c57613b9b6152d2565b5b6000613baa87828801613965565b9450506020613bbb87828801613965565b9350506040613bcc87828801613a6d565b925050606085013567ffffffffffffffff811115613bed57613bec6152cd565b5b613bf987828801613a11565b91505092959194509250565b60008060408385031215613c1c57613c1b6152d2565b5b6000613c2a85828601613965565b9250506020613c3b858286016139bd565b9150509250929050565b60008060408385031215613c5c57613c5b6152d2565b5b6000613c6a85828601613965565b9250506020613c7b85828601613a6d565b9150509250929050565b600060208284031215613c9b57613c9a6152d2565b5b600082013567ffffffffffffffff811115613cb957613cb86152cd565b5b613cc58482850161398f565b91505092915050565b600060208284031215613ce457613ce36152d2565b5b6000613cf2848285016139d2565b91505092915050565b600060208284031215613d1157613d106152d2565b5b6000613d1f848285016139e7565b91505092915050565b600060208284031215613d3e57613d3d6152d2565b5b6000613d4c848285016139fc565b91505092915050565b600060208284031215613d6b57613d6a6152d2565b5b600082013567ffffffffffffffff811115613d8957613d886152cd565b5b613d9584828501613a3f565b91505092915050565b600060208284031215613db457613db36152d2565b5b6000613dc284828501613a6d565b91505092915050565b60008060008060008060008060006101208a8c031215613dee57613ded6152d2565b5b6000613dfc8c828d01613a6d565b9950506020613e0d8c828d01613a6d565b9850506040613e1e8c828d01613a6d565b9750506060613e2f8c828d01613a6d565b9650506080613e408c828d01613a6d565b95505060a0613e518c828d01613a6d565b94505060c0613e628c828d01613a6d565b93505060e0613e738c828d01613a6d565b925050610100613e858c828d01613a6d565b9150509295985092959850929598565b613e9e81614fec565b82525050565b613eb5613eb082614fec565b61516a565b82525050565b613ec481615010565b82525050565b613edb613ed68261501c565b61517c565b82525050565b6000613eec82614e94565b613ef68185614eaa565b9350613f0681856020860161508b565b613f0f816152d7565b840191505092915050565b6000613f2582614e9f565b613f2f8185614ebb565b9350613f3f81856020860161508b565b613f48816152d7565b840191505092915050565b6000613f5e82614e9f565b613f688185614ecc565b9350613f7881856020860161508b565b80840191505092915050565b6000613f91601b83614ebb565b9150613f9c826152f5565b602082019050919050565b6000613fb4601f83614ebb565b9150613fbf8261531e565b602082019050919050565b6000613fd7603283614ebb565b9150613fe282615347565b604082019050919050565b6000613ffa606583614ecc565b915061400582615396565b606582019050919050565b600061401d602683614ebb565b915061402882615431565b604082019050919050565b6000614040602983614ecc565b915061404b82615480565b602982019050919050565b6000614063601c83614ebb565b915061406e826154cf565b602082019050919050565b6000614086601083614ebb565b9150614091826154f8565b602082019050919050565b60006140a9600883614ecc565b91506140b482615521565b600882019050919050565b60006140cc602483614ebb565b91506140d78261554a565b604082019050919050565b60006140ef601983614ebb565b91506140fa82615599565b602082019050919050565b6000614112602283614ecc565b915061411d826155c2565b602282019050919050565b6000614135602083614ebb565b915061414082615611565b602082019050919050565b6000614158602c83614ebb565b91506141638261563a565b604082019050919050565b600061417b603883614ebb565b915061418682615689565b604082019050919050565b600061419e600183614ecc565b91506141a9826156d8565b600182019050919050565b60006141c1602183614ecc565b91506141cc82615701565b602182019050919050565b60006141e4602a83614ebb565b91506141ef82615750565b604082019050919050565b6000614207602983614ebb565b91506142128261579f565b604082019050919050565b600061422a600283614ecc565b9150614235826157ee565b600282019050919050565b600061424d602083614ebb565b915061425882615817565b602082019050919050565b6000614270601983614ebb565b915061427b82615840565b602082019050919050565b6000614293600f83614ebb565b915061429e82615869565b602082019050919050565b60006142b6600183614ecc565b91506142c182615892565b600182019050919050565b60006142d9601c83614ebb565b91506142e4826158bb565b602082019050919050565b60006142fc602c83614ebb565b9150614307826158e4565b604082019050919050565b600061431f602083614ebb565b915061432a82615933565b602082019050919050565b6000614342602983614ebb565b915061434d8261595c565b604082019050919050565b6000614365602683614ebb565b9150614370826159ab565b604082019050919050565b6000614388602183614ebb565b9150614393826159fa565b604082019050919050565b60006143ab601083614ecc565b91506143b682615a49565b601082019050919050565b60006143ce601d83614ecc565b91506143d982615a72565b601d82019050919050565b60006143f1601c83614ebb565b91506143fc82615a9b565b602082019050919050565b6000614414603183614ebb565b915061441f82615ac4565b604082019050919050565b6000614437601a83614ebb565b915061444282615b13565b602082019050919050565b600061445a601b83614ebb565b915061446582615b3c565b602082019050919050565b600061447d601183614ebb565b915061448882615b65565b602082019050919050565b60006144a0601e83614ebb565b91506144ab82615b8e565b602082019050919050565b60006144c3602983614ecc565b91506144ce82615bb7565b602982019050919050565b6144e281615072565b82525050565b6144f96144f482615072565b615198565b82525050565b600061450b8284613ea4565b60148201915081905092915050565b60006145268285613eca565b6020820191506145368284613eca565b6020820191508190509392505050565b60006145528284613f53565b915081905092915050565b60006145698285613f53565b91506145758284613f53565b91508190509392505050565b600061458d828c613f53565b9150614599828b613f53565b91506145a5828a613f53565b91506145b18289613f53565b91506145bd8288613f53565b91506145c98287613f53565b91506145d58286613f53565b91506145e18285613f53565b91506145ed8284613f53565b91508190509a9950505050505050505050565b600061460c828d613f53565b9150614617826141b4565b9150614623828c613f53565b915061462e82614105565b915061463a828b613f53565b915061464582614105565b9150614651828a613f53565b915061465c82614105565b91506146688289613f53565b915061467382614105565b915061467f8288613f53565b915061468a82614105565b91506146968287613f53565b91506146a182614105565b91506146ad8286613f53565b91506146b882614105565b91506146c48285613f53565b91506146cf826144b6565b91506146db8284613f53565b91506146e68261421d565b91508190509b9a5050505050505050505050565b600061470582614191565b91506147118284613f53565b915061471c8261409c565b915061472782614191565b915081905092915050565b600061473d82614191565b91506147498284613f53565b915061475482614191565b915081905092915050565b600061476a8261439e565b9150614776828d613f53565b915061478182613fed565b915061478d828c613f53565b915061479882614033565b91506147a4828b613f53565b91506147af82614033565b91506147bb828a613f53565b91506147c682614033565b91506147d28289613f53565b91506147dd82614033565b91506147e98288613f53565b91506147f482614033565b91506148008287613f53565b915061480b82614033565b91506148178286613f53565b915061482282614033565b915061482e8285613f53565b915061483982614033565b91506148458284613f53565b9150614850826142a9565b91508190509b9a5050505050505050505050565b600061486f826143c1565b915061487b8284613f53565b915081905092915050565b600061489282846144e8565b60208201915081905092915050565b60006148ad82866144e8565b6020820191506148bd8285613ea4565b6014820191506148cd82846144e8565b602082019150819050949350505050565b60006148ea82856144e8565b6020820191506148fa82846144e8565b6020820191508190509392505050565b600061491682886144e8565b60208201915061492682876144e8565b6020820191506149368286613f53565b915061494282856144e8565b60208201915061495282846144e8565b6020820191508190509695505050505050565b600061497182866144e8565b60208201915061498182856144e8565b60208201915061499182846144e8565b602082019150819050949350505050565b60006020820190506149b76000830184613e95565b92915050565b60006080820190506149d26000830187613e95565b6149df6020830186613e95565b6149ec60408301856144d9565b81810360608301526149fe8184613ee1565b905095945050505050565b6000602082019050614a1e6000830184613ebb565b92915050565b60006020820190508181036000830152614a3e8184613f1a565b905092915050565b60006020820190508181036000830152614a5f81613f84565b9050919050565b60006020820190508181036000830152614a7f81613fa7565b9050919050565b60006020820190508181036000830152614a9f81613fca565b9050919050565b60006020820190508181036000830152614abf81614010565b9050919050565b60006020820190508181036000830152614adf81614056565b9050919050565b60006020820190508181036000830152614aff81614079565b9050919050565b60006020820190508181036000830152614b1f816140bf565b9050919050565b60006020820190508181036000830152614b3f816140e2565b9050919050565b60006020820190508181036000830152614b5f81614128565b9050919050565b60006020820190508181036000830152614b7f8161414b565b9050919050565b60006020820190508181036000830152614b9f8161416e565b9050919050565b60006020820190508181036000830152614bbf816141d7565b9050919050565b60006020820190508181036000830152614bdf816141fa565b9050919050565b60006020820190508181036000830152614bff81614240565b9050919050565b60006020820190508181036000830152614c1f81614263565b9050919050565b60006020820190508181036000830152614c3f81614286565b9050919050565b60006020820190508181036000830152614c5f816142cc565b9050919050565b60006020820190508181036000830152614c7f816142ef565b9050919050565b60006020820190508181036000830152614c9f81614312565b9050919050565b60006020820190508181036000830152614cbf81614335565b9050919050565b60006020820190508181036000830152614cdf81614358565b9050919050565b60006020820190508181036000830152614cff8161437b565b9050919050565b60006020820190508181036000830152614d1f816143e4565b9050919050565b60006020820190508181036000830152614d3f81614407565b9050919050565b60006020820190508181036000830152614d5f8161442a565b9050919050565b60006020820190508181036000830152614d7f8161444d565b9050919050565b60006020820190508181036000830152614d9f81614470565b9050919050565b60006020820190508181036000830152614dbf81614493565b9050919050565b6000602082019050614ddb60008301846144d9565b92915050565b6000614deb614dfc565b9050614df782826150f0565b919050565b6000604051905090565b600067ffffffffffffffff821115614e2157614e2061528f565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e4d57614e4c61528f565b5b614e56826152d7565b9050602081019050919050565b600067ffffffffffffffff821115614e7e57614e7d61528f565b5b614e87826152d7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ee282615072565b9150614eed83615072565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f2257614f216151d3565b5b828201905092915050565b6000614f3882615072565b9150614f4383615072565b925082614f5357614f52615202565b5b828204905092915050565b6000614f6982615072565b9150614f7483615072565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fad57614fac6151d3565b5b828202905092915050565b6000614fc382615072565b9150614fce83615072565b925082821015614fe157614fe06151d3565b5b828203905092915050565b6000614ff782615052565b9050919050565b600061500982615052565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156150a957808201518184015260208101905061508e565b838111156150b8576000848401525b50505050565b600060028204905060018216806150d657607f821691505b602082108114156150ea576150e9615231565b5b50919050565b6150f9826152d7565b810181811067ffffffffffffffff821117156151185761511761528f565b5b80604052505050565b600061512c82615072565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561515f5761515e6151d3565b5b600182019050919050565b600061517582615186565b9050919050565b6000819050919050565b6000615191826152e8565b9050919050565b6000819050919050565b60006151ad82615072565b91506151b883615072565b9250826151c8576151c7615202565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f53687566666c6564206d617820616d6f756e7420616c72656164790000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a20225061636b206f662038204c6f6f60008201527f746c616e6720776f726473222c202261747472696275746573223a205b7b227460208201527f726169745f74797065223a202253687566666c65732055736564222c2022766160408201527f6c7565223a000000000000000000000000000000000000000000000000000000606082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7d2c207b2274726169745f74797065223a2022576f7264204c656e677468222c60008201527f202276616c7565223a0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c696420746f6b656e49642e00000000000000000000000000000000600082015250565b7f206c657474657273000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7d2c207b2274726169745f74797065223a2022576f7264222c202276616c756560008201527f223a000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20776f7264732073656c656374656420746f2062652073687566666c6564600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b7f2c207b2274726169745f74797065223a2022576f7264222c202276616c75652260008201527f3a00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f416c6c204e4654732068617665206265656e206d696e74656400000000000000600082015250565b7f416c726561647920636c61696d65640000000000000000000000000000000000600082015250565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b7f4d696e74696e672069732079657420746f20626520656e61626c656400000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5769746864726177616c20616d6f756e742067726561746572207468616e206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b226e616d65223a20225061636b202300000000000000000000000000000000600082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f467265657a6520626c6f636b20616c7265616479206368616e67656400000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f53687566666c696e6720686173206265656e2066726f7a656e21000000000000600082015250565b7f496e73756666696369656e742066756e64732070726f76696465640000000000600082015250565b7f4d757374206265204e4654206f776e6572000000000000000000000000000000600082015250565b7f4e6f74206f6e207072652d617070726f76656420636c61696d206c6973740000600082015250565b7f7d5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c60008201527f3b6261736536342c200000000000000000000000000000000000000000000000602082015250565b615c0f81614fec565b8114615c1a57600080fd5b50565b615c2681614ffe565b8114615c3157600080fd5b50565b615c3d81615010565b8114615c4857600080fd5b50565b615c548161501c565b8114615c5f57600080fd5b50565b615c6b81615026565b8114615c7657600080fd5b50565b615c8281615072565b8114615c8d57600080fd5b5056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20323070783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231352220793d2233302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d223230352220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d223234302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d223133352220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d223237352220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d2236352220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231352220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231352220793d223137302220636c6173733d2262617365223ea26469706673582212207d6cb6ce6aaeb75ee61501042eae9e513b8de2e71817ee4c5871889c78de89bf64736f6c63430008070033

Deployed Bytecode Sourcemap

46345:9727:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31883:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32828:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34387:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33910:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48750:406;;;:::i;:::-;;51339:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46433:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35277:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48271:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46620:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35687:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32522:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32252:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11430:94;;;;;;;;;;;;;:::i;:::-;;46546:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10779:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48513:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32997:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34680:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49231:501;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35943:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47851:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52674:3387;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47175:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51494:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35046:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47383:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50309:908;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11679:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31883:305;31985:4;32037:25;32022:40;;;:11;:40;;;;:105;;;;32094:33;32079:48;;;:11;:48;;;;32022:105;:158;;;;32144:36;32168:11;32144:23;:36::i;:::-;32022:158;32002:178;;31883:305;;;:::o;32828:100::-;32882:13;32915:5;32908:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32828:100;:::o;34387:221::-;34463:7;34491:16;34499:7;34491;:16::i;:::-;34483:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34576:15;:24;34592:7;34576:24;;;;;;;;;;;;;;;;;;;;;34569:31;;34387:221;;;:::o;33910:411::-;33991:13;34007:23;34022:7;34007:14;:23::i;:::-;33991:39;;34055:5;34049:11;;:2;:11;;;;34041:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34149:5;34133:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34158:37;34175:5;34182:12;:10;:12::i;:::-;34158:16;:37::i;:::-;34133:62;34111:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;34292:21;34301:2;34305:7;34292:8;:21::i;:::-;33980:341;33910:411;;:::o;48750:406::-;48813:1;48802:7;;:12;48794:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48881:5;48866:11;;:20;;:37;;;;;48899:4;48890:5;;:13;;48866:37;48858:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;48966:8;48952:9;:23;;48944:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49075:5;;:7;;;;;;;;;:::i;:::-;;;;;;49112:9;49093:15;;:28;;;;;;;:::i;:::-;;;;;;;;49132:16;:14;:16::i;:::-;48750:406::o;51339:89::-;51384:4;51414:6;;51408:5;;:12;;;;:::i;:::-;51401:19;;51339:89;:::o;46433:19::-;;;;:::o;35277:339::-;35472:41;35491:12;:10;:12::i;:::-;35505:7;35472:18;:41::i;:::-;35464:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35580:28;35590:4;35596:2;35600:7;35580:9;:28::i;:::-;35277:339;;;:::o;48271:90::-;11010:12;:10;:12::i;:::-;10999:23;;:7;:5;:7::i;:::-;:23;;;10991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48345:8:::1;48335:7;:18;;;;48271:90:::0;:::o;46620:23::-;;;;:::o;35687:185::-;35825:39;35842:4;35848:2;35852:7;35825:39;;;;;;;;;;;;:16;:39::i;:::-;35687:185;;;:::o;32522:239::-;32594:7;32614:13;32630:7;:16;32638:7;32630:16;;;;;;;;;;;;;;;;;;;;;32614:32;;32682:1;32665:19;;:5;:19;;;;32657:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32748:5;32741:12;;;32522:239;;;:::o;32252:208::-;32324:7;32369:1;32352:19;;:5;:19;;;;32344:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32436:9;:16;32446:5;32436:16;;;;;;;;;;;;;;;;32429:23;;32252:208;;;:::o;11430:94::-;11010:12;:10;:12::i;:::-;10999:23;;:7;:5;:7::i;:::-;:23;;;10991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11495:21:::1;11513:1;11495:9;:21::i;:::-;11430:94::o:0;46546:27::-;;;;:::o;10779:87::-;10825:7;10852:6;;;;;;;;;;;10845:13;;10779:87;:::o;48513:134::-;11010:12;:10;:12::i;:::-;10999:23;;:7;:5;:7::i;:::-;:23;;;10991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48621:18:::1;48601:17;:38;;;;;;;;;;;;:::i;:::-;;48513:134:::0;:::o;32997:104::-;33053:13;33086:7;33079:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32997:104;:::o;34680:295::-;34795:12;:10;:12::i;:::-;34783:24;;:8;:24;;;;34775:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34895:8;34850:18;:32;34869:12;:10;:12::i;:::-;34850:32;;;;;;;;;;;;;;;:42;34883:8;34850:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34948:8;34919:48;;34934:12;:10;:12::i;:::-;34919:48;;;34958:8;34919:48;;;;;;:::i;:::-;;;;;;;;34680:295;;:::o;49231:501::-;49310:1;49299:7;;:12;49291:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49389:5;49363:31;;:10;:22;49374:10;49363:22;;;;;;;;;;;;;;;;;;;;;;;;;:31;;;49355:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;49448:5;49433:11;;:20;;:37;;;;;49467:3;49457:6;;:13;;49433:37;49425:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;49597:4;49521:80;;:72;49540:5;49547:4;;49580:10;49563:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;49553:39;;;;;;49521:18;:72::i;:::-;:80;;;49513:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;49649:6;;:8;;;;;;;;;:::i;:::-;;;;;;49693:4;49668:10;:22;49679:10;49668:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49708:16;:14;:16::i;:::-;49231:501;:::o;35943:328::-;36118:41;36137:12;:10;:12::i;:::-;36151:7;36118:18;:41::i;:::-;36110:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36224:39;36238:4;36244:2;36248:7;36257:5;36224:13;:39::i;:::-;35943:328;;;;:::o;47851:242::-;11010:12;:10;:12::i;:::-;10999:23;;:7;:5;:7::i;:::-;:23;;;10991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47958:15:::1;;47947:7;:26;;47939:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;48046:7;48027:15;;:26;;;;;;;:::i;:::-;;;;;;;;48064:3;:12;;:21;48077:7;48064:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47851:242:::0;;:::o;52674:3387::-;52739:13;52783:16;52791:7;52783;:16::i;:::-;52775:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52848:23;;:::i;:::-;52882:266;;;;;;;;;;;;;;;;;:5;52888:1;52882:8;;;;;;;:::i;:::-;;;;;:266;;;;53170:47;53183:7;53192:24;53205:7;53214:1;53192:12;:24::i;:::-;53170:12;:47::i;:::-;53159:5;53165:1;53159:8;;;;;;;:::i;:::-;;;;;:58;;;;53228:53;;;;;;;;;;;;;;;;;:5;53234:1;53228:8;;;;;;;:::i;:::-;;;;;:53;;;;53303:47;53316:7;53325:24;53338:7;53347:1;53325:12;:24::i;:::-;53303:12;:47::i;:::-;53292:5;53298:1;53292:8;;;;;;;:::i;:::-;;;;;:58;;;;53361:54;;;;;;;;;;;;;;;;;:5;53367:1;53361:8;;;;;;;:::i;:::-;;;;;:54;;;;53437:47;53450:7;53459:24;53472:7;53481:1;53459:12;:24::i;:::-;53437:12;:47::i;:::-;53426:5;53432:1;53426:8;;;;;;;:::i;:::-;;;;;:58;;;;53495:54;;;;;;;;;;;;;;;;;:5;53501:1;53495:8;;;;;;;:::i;:::-;;;;;:54;;;;53571:47;53584:7;53593:24;53606:7;53615:1;53593:12;:24::i;:::-;53571:12;:47::i;:::-;53560:5;53566:1;53560:8;;;;;;;:::i;:::-;;;;;:58;;;;53629:54;;;;;;;;;;;;;;;;;:5;53635:1;53629:8;;;;;;;:::i;:::-;;;;;:54;;;;53705:47;53718:7;53727:24;53740:7;53749:1;53727:12;:24::i;:::-;53705:12;:47::i;:::-;53694:5;53700:1;53694:8;;;;;;;:::i;:::-;;;;;:58;;;;53763:55;;;;;;;;;;;;;;;;;:5;53769:2;53763:9;;;;;;;:::i;:::-;;;;;:55;;;;53841:47;53854:7;53863:24;53876:7;53885:1;53863:12;:24::i;:::-;53841:12;:47::i;:::-;53829:5;53835:2;53829:9;;;;;;;:::i;:::-;;;;;:59;;;;53899:55;;;;;;;;;;;;;;;;;:5;53905:2;53899:9;;;;;;;:::i;:::-;;;;;:55;;;;53977:47;53990:7;53999:24;54012:7;54021:1;53999:12;:24::i;:::-;53977:12;:47::i;:::-;53965:5;53971:2;53965:9;;;;;;;:::i;:::-;;;;;:59;;;;54035:55;;;;;;;;;;;;;;;;;:5;54041:2;54035:9;;;;;;;:::i;:::-;;;;;:55;;;;54113:47;54126:7;54135:24;54148:7;54157:1;54135:12;:24::i;:::-;54113:12;:47::i;:::-;54101:5;54107:2;54101:9;;;;;;;:::i;:::-;;;;;:59;;;;54171:27;;;;;;;;;;;;;;;;;:5;54177:2;54171:9;;;;;;;:::i;:::-;;;;;:27;;;;54211:20;54258:5;54264:1;54258:8;;;;;;;:::i;:::-;;;;;;54268:5;54274:1;54268:8;;;;;;;:::i;:::-;;;;;;54278:5;54284:1;54278:8;;;;;;;:::i;:::-;;;;;;54288:5;54294:1;54288:8;;;;;;;:::i;:::-;;;;;;54298:5;54304:1;54298:8;;;;;;;:::i;:::-;;;;;;54308:5;54314:1;54308:8;;;;;;;:::i;:::-;;;;;;54318:5;54324:1;54318:8;;;;;;;:::i;:::-;;;;;;54328:5;54334:1;54328:8;;;;;;;:::i;:::-;;;;;;54338:5;54344:1;54338:8;;;;;;;:::i;:::-;;;;;;54241:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54211:137;;54392:6;54400:5;54406:1;54400:8;;;;;;;:::i;:::-;;;;;;54410:5;54416:2;54410:9;;;;;;;:::i;:::-;;;;;;54421:5;54427:2;54421:9;;;;;;;:::i;:::-;;;;;;54432:5;54438:2;54432:9;;;;;;;:::i;:::-;;;;;;54443:5;54449:2;54443:9;;;;;;;:::i;:::-;;;;;;54454:5;54460:2;54454:9;;;;;;;:::i;:::-;;;;;;54465:5;54471:2;54465:9;;;;;;;:::i;:::-;;;;;;54476:5;54482:2;54476:9;;;;;;;:::i;:::-;;;;;;54375:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54359:128;;54508:18;54573:17;54582:7;54573:8;:17::i;:::-;54697:44;54709:31;54718:12;:21;54731:7;54718:21;;;;;;;;;;;;54709:8;:31::i;:::-;54697:11;:44::i;:::-;54788:21;54800:5;54806:1;54800:8;;;;;;;:::i;:::-;;;;;;54788:11;:21::i;:::-;54856;54868:5;54874:1;54868:8;;;;;;;:::i;:::-;;;;;;54856:11;:21::i;:::-;54924;54936:5;54942:1;54936:8;;;;;;;:::i;:::-;;;;;;54924:11;:21::i;:::-;54992;55004:5;55010:1;55004:8;;;;;;;:::i;:::-;;;;;;54992:11;:21::i;:::-;55060;55072:5;55078:1;55072:8;;;;;;;:::i;:::-;;;;;;55060:11;:21::i;:::-;55128:22;55140:5;55146:2;55140:9;;;;;;;:::i;:::-;;;;;;55128:11;:22::i;:::-;55197;55209:5;55215:2;55209:9;;;;;;;:::i;:::-;;;;;;55197:11;:22::i;:::-;55266;55278:5;55284:2;55278:9;;;;;;;:::i;:::-;;;;;;55266:11;:22::i;:::-;54536:758;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54508:787;;55313:623;55357:4;55400:21;55412:5;55418:1;55412:8;;;;;;;:::i;:::-;;;;;;55400:11;:21::i;:::-;55461;55473:5;55479:1;55473:8;;;;;;;:::i;:::-;;;;;;55461:11;:21::i;:::-;55522;55534:5;55540:1;55534:8;;;;;;;:::i;:::-;;;;;;55522:11;:21::i;:::-;55583;55595:5;55601:1;55595:8;;;;;;;:::i;:::-;;;;;;55583:11;:21::i;:::-;55644;55656:5;55662:1;55656:8;;;;;;;:::i;:::-;;;;;;55644:11;:21::i;:::-;55705:22;55717:5;55723:2;55717:9;;;;;;;:::i;:::-;;;;;;55705:11;:22::i;:::-;55767;55779:5;55785:2;55779:9;;;;;;;:::i;:::-;;;;;;55767:11;:22::i;:::-;55829;55841:5;55847:2;55841:9;;;;;;;:::i;:::-;;;;;;55829:11;:22::i;:::-;55898:28;55918:6;55898:13;:28::i;:::-;55340:593;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55313:13;:623::i;:::-;55306:630;;56023:4;55973:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;55957:72;;56047:6;56040:13;;;;;52674:3387;;;:::o;47175:88::-;11010:12;:10;:12::i;:::-;10999:23;;:7;:5;:7::i;:::-;:23;;;10991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47247:8:::1;47240:4;:15;;;;47175:88:::0;:::o;51494:102::-;51538:13;51571:17;51564:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51494:102;:::o;35046:164::-;35143:4;35167:18;:25;35186:5;35167:25;;;;;;;;;;;;;;;:35;35193:8;35167:35;;;;;;;;;;;;;;;;;;;;;;;;;35160:42;;35046:164;;;;:::o;47383:230::-;11010:12;:10;:12::i;:::-;10999:23;;:7;:5;:7::i;:::-;:23;;;10991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47494:1:::1;47473:18;;:22;47465:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47553:21;47539:11;:35;;;;47585:18;;:20;;;;;;;;;:::i;:::-;;;;;;47383:230:::0;:::o;50309:908::-;50478:10;50457:31;;:17;50465:8;50457:7;:17::i;:::-;:31;;;50449:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;50554:1;50529:12;:22;50542:8;50529:22;;;;;;;;;;;;:26;50521:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50621:11;;50606:12;:26;50598:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50726:1;50717:5;50711;50707:3;50702:4;50697;50691:5;50687:3;50683;:7;;;;:::i;:::-;:13;;;;:::i;:::-;:18;;;;:::i;:::-;:23;;;;:::i;:::-;:27;;;;:::i;:::-;:33;;;;:::i;:::-;:39;;;;:::i;:::-;50682:45;50674:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;50785:14;50850:7;50834:12;50817:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;50807:41;;;;;;50802:47;;:55;;;;:::i;:::-;50785:72;;50868:30;:81;;;;;;;;50902:3;50868:81;;;;50907:3;50868:81;;;;50912:5;50868:81;;;;50919:4;50868:81;;;;50925:4;50868:81;;;;50931:3;50868:81;;;;50936:5;50868:81;;;;50943:5;50868:81;;;;;50975:6;50970:161;50987:1;50985;:3;50970:161;;;51035:1;51014:15;51030:1;51014:18;;;;;;;:::i;:::-;;;;;;:22;51010:110;;;51095:9;51057:21;:31;51079:8;51057:31;;;;;;;;;;;51089:1;51057:34;;;;;;;:::i;:::-;;;;:47;;;;;;;:::i;:::-;;;;;;;;51010:110;50990:3;;;;;:::i;:::-;;;;50970:161;;;;51151:12;:22;51164:8;51151:22;;;;;;;;;;;;:24;;;;;;;;;:::i;:::-;;;;;;51191:18;51200:8;51191:18;;;;;;:::i;:::-;;;;;;;;50438:779;;50309:908;;;;;;;;;:::o;11679:192::-;11010:12;:10;:12::i;:::-;10999:23;;:7;:5;:7::i;:::-;:23;;;10991:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11788:1:::1;11768:22;;:8;:22;;;;11760:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;11844:19;11854:8;11844:9;:19::i;:::-;11679:192:::0;:::o;13710:157::-;13795:4;13834:25;13819:40;;;:11;:40;;;;13812:47;;13710:157;;;:::o;37781:127::-;37846:4;37898:1;37870:30;;:7;:16;37878:7;37870:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37863:37;;37781:127;;;:::o;9563:98::-;9616:7;9643:10;9636:17;;9563:98;:::o;41763:174::-;41865:2;41838:15;:24;41854:7;41838:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41921:7;41917:2;41883:46;;41892:23;41907:7;41892:14;:23::i;:::-;41883:46;;;;;;;;;;;;41763:174;;:::o;49834:260::-;49880:12;49895:11;;49880:26;;49917:11;;:13;;;;;;;;;:::i;:::-;;;;;;50038:7;49998;50007:10;50019:15;49981:54;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49971:65;;;;;;49966:71;;:79;;;;:::i;:::-;49941:13;:22;49955:7;49941:22;;;;;;;;;;;:104;;;;50056:30;50066:10;50078:7;50056:9;:30::i;:::-;49869:225;49834:260::o;38075:348::-;38168:4;38193:16;38201:7;38193;:16::i;:::-;38185:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38269:13;38285:23;38300:7;38285:14;:23::i;:::-;38269:39;;38338:5;38327:16;;:7;:16;;;:51;;;;38371:7;38347:31;;:20;38359:7;38347:11;:20::i;:::-;:31;;;38327:51;:87;;;;38382:32;38399:5;38406:7;38382:16;:32::i;:::-;38327:87;38319:96;;;38075:348;;;;:::o;41067:578::-;41226:4;41199:31;;:23;41214:7;41199:14;:23::i;:::-;:31;;;41191:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41309:1;41295:16;;:2;:16;;;;41287:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41365:39;41386:4;41392:2;41396:7;41365:20;:39::i;:::-;41469:29;41486:1;41490:7;41469:8;:29::i;:::-;41530:1;41511:9;:15;41521:4;41511:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41559:1;41542:9;:13;41552:2;41542:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41590:2;41571:7;:16;41579:7;41571:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41629:7;41625:2;41610:27;;41619:4;41610:27;;;;;;;;;;;;41067:578;;;:::o;11879:173::-;11935:16;11954:6;;;;;;;;;;;11935:25;;11980:8;11971:6;;:17;;;;;;;;;;;;;;;;;;12035:8;12004:40;;12025:8;12004:40;;;;;;;;;;;;11924:128;11879:173;:::o;8099:830::-;8224:4;8241:20;8264:4;8241:27;;8286:9;8281:525;8305:5;:12;8301:1;:16;8281:525;;;8339:20;8362:5;8368:1;8362:8;;;;;;;;:::i;:::-;;;;;;;;8339:31;;8407:12;8391;:28;8387:408;;8561:12;8575;8544:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8534:55;;;;;;8519:70;;8387:408;;;8751:12;8765;8734:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8724:55;;;;;;8709:70;;8387:408;8324:482;8319:3;;;;;:::i;:::-;;;;8281:525;;;;8917:4;8901:12;:20;8894:27;;;8099:830;;;;;:::o;37153:315::-;37310:28;37320:4;37326:2;37330:7;37310:9;:28::i;:::-;37357:48;37380:4;37386:2;37390:7;37399:5;37357:22;:48::i;:::-;37349:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;37153:315;;;;:::o;52383:219::-;52455:4;52516:7;52526:13;:22;52540:7;52526:22;;;;;;;;;;;;52550:21;:30;52572:7;52550:30;;;;;;;;;;;52589:1;52581:7;:9;;;;:::i;:::-;52550:41;;;;;;;:::i;:::-;;;;52494:98;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52484:109;;;;;;52479:115;;52472:122;;52383:219;;;;:::o;5985:1258::-;6064:13;6133:1;6121:8;:13;;:34;;;;;6150:5;6138:8;:17;;6121:34;6113:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;6189:18;6218;6257:15;6333:5;6308:8;6318:10;6291:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6281:49;;;;;;6276:55;;:62;;;;:::i;:::-;6257:82;;6393:9;6484:1;6475:5;6438:8;6448:10;6460;6421:50;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6411:61;;;;;;6406:67;;:74;;;;:::i;:::-;6405:80;;;;:::i;:::-;6393:92;;6573:6;6580:1;6573:8;;6568:646;6588:31;6608:10;6588:19;:31::i;:::-;6583:1;:36;6568:646;;6688:6;6713:192;6724:2;6720:1;:6;6713:192;;;6793:2;6816:1;6812:2;6797:8;6806:4;6797:14;;;;;;:::i;:::-;;;;;;;;;;;;;;:17;;;;:::i;:::-;6796:21;;;;:::i;:::-;6793:25;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;6785:33;;:4;:33;6781:87;;6843:5;;6781:87;6886:3;;;;;:::i;:::-;;;;6713:192;;;6926:26;6934:8;6943:4;6934:14;;;;;;:::i;:::-;;;;;;;;;;;;;;6950:1;6926:7;:26::i;:::-;6919:33;;7012:4;7018;6995:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6981:43;;7154:1;7145:5;7105:8;7115:4;7121;7127:1;7130:10;7088:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7078:64;;;;;;7073:70;;:77;;;;:::i;:::-;7072:83;;;;:::i;:::-;7065:90;;6626:588;6621:3;;;;;:::i;:::-;;;;6568:646;;;;7231:4;7224:11;;;;;;5985:1258;;;;:::o;826:723::-;882:13;1112:1;1103:5;:10;1099:53;;;1130:10;;;;;;;;;;;;;;;;;;;;;1099:53;1162:12;1177:5;1162:20;;1193:14;1218:78;1233:1;1225:4;:9;1218:78;;1251:8;;;;;:::i;:::-;;;;1282:2;1274:10;;;;;:::i;:::-;;;1218:78;;;1306:19;1338:6;1328:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1306:39;;1356:154;1372:1;1363:5;:10;1356:154;;1400:1;1390:11;;;;;:::i;:::-;;;1467:2;1459:5;:10;;;;:::i;:::-;1446:2;:24;;;;:::i;:::-;1433:39;;1416:6;1423;1416:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1496:2;1487:11;;;;;:::i;:::-;;;1356:154;;;1534:6;1520:21;;;;;826:723;;;;:::o;52079:186::-;52142:13;52168:20;52221:4;52198:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;52168:65;;52251:6;52244:13;;;52079:186;;;:::o;51728:222::-;51791:13;51817:20;51870:28;51879:18;51892:4;51879:12;:18::i;:::-;51870:8;:28::i;:::-;51847:70;;;;;;;;:::i;:::-;;;;;;;;;;;;;51817:101;;51936:6;51929:13;;;51728:222;;;:::o;44700:1607::-;44758:13;44784:11;44798:4;:11;44784:25;;44831:1;44824:3;:8;44820:23;;;44834:9;;;;;;;;;;;;;;;;;44820:23;44895:18;44933:1;44928;44922:3;:7;;;;:::i;:::-;44921:13;;;;:::i;:::-;44916:1;:19;;;;:::i;:::-;44895:40;;44993:19;45038:2;45025:10;:15;;;;:::i;:::-;45015:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44993:48;;45054:18;45075:5;;;;;;;;;;;;;;;;;45054:26;;45144:1;45137:5;45133:13;45189:2;45181:6;45177:15;45240:1;45208:777;45263:3;45260:1;45257:10;45208:777;;;45318:1;45315;45311:9;45306:14;;45376:8;45371:1;45365:4;45361:12;45355:19;45351:34;45456:4;45448:5;45444:2;45440:14;45436:25;45426:8;45422:40;45416:47;45495:3;45492:1;45488:11;45481:18;;45586:4;45577;45569:5;45565:2;45561:14;45557:25;45547:8;45543:40;45537:47;45533:58;45528:3;45524:68;45517:75;;45624:3;45621:1;45617:11;45610:18;;45714:4;45705;45697:5;45694:1;45690:13;45686:24;45676:8;45672:39;45666:46;45662:57;45657:3;45653:67;45646:74;;45752:3;45749:1;45745:11;45738:18;;45834:4;45825;45818:5;45814:16;45804:8;45800:31;45794:38;45790:49;45785:3;45781:59;45774:66;;45874:3;45869;45865:13;45858:20;;45916:3;45905:9;45898:22;45968:1;45957:9;45953:17;45940:30;;45287:698;;45208:777;;;45212:44;46017:1;46012:3;46008:11;46038:1;46033:84;;;;46136:1;46131:82;;;;46001:212;;46033:84;46094:6;46089:3;46085:16;46081:1;46070:9;46066:17;46059:43;46033:84;;46131:82;46192:4;46187:3;46183:14;46179:1;46168:9;46164:17;46157:41;46001:212;;46244:10;46236:6;46229:26;45102:1164;;46292:6;46278:21;;;;;;44700:1607;;;;:::o;38765:110::-;38841:26;38851:2;38855:7;38841:26;;;;;;;;;;;;:9;:26::i;:::-;38765:110;;:::o;43873:126::-;;;;:::o;42502:799::-;42657:4;42678:15;:2;:13;;;:15::i;:::-;42674:620;;;42730:2;42714:36;;;42751:12;:10;:12::i;:::-;42765:4;42771:7;42780:5;42714:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42710:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42973:1;42956:6;:13;:18;42952:272;;;42999:60;;;;;;;;;;:::i;:::-;;;;;;;;42952:272;43174:6;43168:13;43159:6;43155:2;43151:15;43144:38;42710:529;42847:41;;;42837:51;;;:6;:51;;;;42830:58;;;;;42674:620;43278:4;43271:11;;42502:799;;;;;;;:::o;5388:442::-;5450:4;5477:40;:119;;;;;;;;5521:1;5477:119;;;;;;5523:2;5477:119;;;;;;5526:3;5477:119;;;;;;5530:4;5477:119;;;;;;5535:4;5477:119;;;;;;5540:4;5477:119;;;;;;5545:4;5477:119;;;;;;5550:4;5477:119;;;;;;5555:4;5477:119;;;;;;5560:4;5477:119;;;;;;5565:4;5477:119;;;;;;5570:4;5477:119;;;;;;5575:4;5477:119;;;;;;5580:4;5477:119;;;;;;5585:4;5477:119;;;;;;5590:5;5477:119;;;;;;;5617:6;5638:140;5650:2;5645:1;:7;5638:140;;5682:22;5705:1;5682:25;;;;;;;:::i;:::-;;;;;;5674:33;;:4;:33;5670:79;;5728:5;;5670:79;5763:3;;;;;:::i;:::-;;;;5638:140;;;5797:1;5795;:3;;;;:::i;:::-;5788:10;;;;5388:442;;;:::o;4995:288::-;5054:13;5080:17;5106:9;5116:3;5106:14;;;;;;;;:::i;:::-;;;;;;;;;5080:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5132:18;5164:1;5153:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5132:34;;5177:19;5205:4;5177:33;;5233:4;5238:3;5233:9;;;;;;;;:::i;:::-;;;;;;;;;;5221:6;5228:1;5221:9;;;;;;;;:::i;:::-;;;;;:21;;;;;;;;;;;5267:6;5253:21;;;;;4995:288;;;;:::o;4797:120::-;4864:4;4894:7;4888:21;4881:28;;4797:120;;;:::o;39102:321::-;39232:18;39238:2;39242:7;39232:5;:18::i;:::-;39283:54;39314:1;39318:2;39322:7;39331:5;39283:22;:54::i;:::-;39261:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;39102:321;;;:::o;16712:387::-;16772:4;16980:12;17047:7;17035:20;17027:28;;17090:1;17083:4;:8;17076:15;;;16712:387;;;:::o;39759:382::-;39853:1;39839:16;;:2;:16;;;;39831:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39912:16;39920:7;39912;:16::i;:::-;39911:17;39903:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39974:45;40003:1;40007:2;40011:7;39974:20;:45::i;:::-;40049:1;40032:9;:13;40042:2;40032:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40080:2;40061:7;:16;40069:7;40061:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40125:7;40121:2;40100:33;;40117:1;40100:33;;;;;;;;;;;;39759:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1731:155::-;1785:5;1823:6;1810:20;1801:29;;1839:41;1874:5;1839:41;:::i;:::-;1731:155;;;;:::o;1909:370::-;1980:5;2029:3;2022:4;2014:6;2010:17;2006:27;1996:122;;2037:79;;:::i;:::-;1996:122;2154:6;2141:20;2179:94;2269:3;2261:6;2254:4;2246:6;2242:17;2179:94;:::i;:::-;2170:103;;1986:293;1909:370;;;;:::o;2285:133::-;2328:5;2366:6;2353:20;2344:29;;2382:30;2406:5;2382:30;:::i;:::-;2285:133;;;;:::o;2424:139::-;2470:5;2508:6;2495:20;2486:29;;2524:33;2551:5;2524:33;:::i;:::-;2424:139;;;;:::o;2569:137::-;2614:5;2652:6;2639:20;2630:29;;2668:32;2694:5;2668:32;:::i;:::-;2569:137;;;;:::o;2712:141::-;2768:5;2799:6;2793:13;2784:22;;2815:32;2841:5;2815:32;:::i;:::-;2712:141;;;;:::o;2872:338::-;2927:5;2976:3;2969:4;2961:6;2957:17;2953:27;2943:122;;2984:79;;:::i;:::-;2943:122;3101:6;3088:20;3126:78;3200:3;3192:6;3185:4;3177:6;3173:17;3126:78;:::i;:::-;3117:87;;2933:277;2872:338;;;;:::o;3230:340::-;3286:5;3335:3;3328:4;3320:6;3316:17;3312:27;3302:122;;3343:79;;:::i;:::-;3302:122;3460:6;3447:20;3485:79;3560:3;3552:6;3545:4;3537:6;3533:17;3485:79;:::i;:::-;3476:88;;3292:278;3230:340;;;;:::o;3576:139::-;3622:5;3660:6;3647:20;3638:29;;3676:33;3703:5;3676:33;:::i;:::-;3576:139;;;;:::o;3721:329::-;3780:6;3829:2;3817:9;3808:7;3804:23;3800:32;3797:119;;;3835:79;;:::i;:::-;3797:119;3955:1;3980:53;4025:7;4016:6;4005:9;4001:22;3980:53;:::i;:::-;3970:63;;3926:117;3721:329;;;;:::o;4056:490::-;4132:6;4140;4189:2;4177:9;4168:7;4164:23;4160:32;4157:119;;;4195:79;;:::i;:::-;4157:119;4315:1;4340:61;4393:7;4384:6;4373:9;4369:22;4340:61;:::i;:::-;4330:71;;4286:125;4450:2;4476:53;4521:7;4512:6;4501:9;4497:22;4476:53;:::i;:::-;4466:63;;4421:118;4056:490;;;;;:::o;4552:474::-;4620:6;4628;4677:2;4665:9;4656:7;4652:23;4648:32;4645:119;;;4683:79;;:::i;:::-;4645:119;4803:1;4828:53;4873:7;4864:6;4853:9;4849:22;4828:53;:::i;:::-;4818:63;;4774:117;4930:2;4956:53;5001:7;4992:6;4981:9;4977:22;4956:53;:::i;:::-;4946:63;;4901:118;4552:474;;;;;:::o;5032:619::-;5109:6;5117;5125;5174:2;5162:9;5153:7;5149:23;5145:32;5142:119;;;5180:79;;:::i;:::-;5142:119;5300:1;5325:53;5370:7;5361:6;5350:9;5346:22;5325:53;:::i;:::-;5315:63;;5271:117;5427:2;5453:53;5498:7;5489:6;5478:9;5474:22;5453:53;:::i;:::-;5443:63;;5398:118;5555:2;5581:53;5626:7;5617:6;5606:9;5602:22;5581:53;:::i;:::-;5571:63;;5526:118;5032:619;;;;;:::o;5657:943::-;5752:6;5760;5768;5776;5825:3;5813:9;5804:7;5800:23;5796:33;5793:120;;;5832:79;;:::i;:::-;5793:120;5952:1;5977:53;6022:7;6013:6;6002:9;5998:22;5977:53;:::i;:::-;5967:63;;5923:117;6079:2;6105:53;6150:7;6141:6;6130:9;6126:22;6105:53;:::i;:::-;6095:63;;6050:118;6207:2;6233:53;6278:7;6269:6;6258:9;6254:22;6233:53;:::i;:::-;6223:63;;6178:118;6363:2;6352:9;6348:18;6335:32;6394:18;6386:6;6383:30;6380:117;;;6416:79;;:::i;:::-;6380:117;6521:62;6575:7;6566:6;6555:9;6551:22;6521:62;:::i;:::-;6511:72;;6306:287;5657:943;;;;;;;:::o;6606:468::-;6671:6;6679;6728:2;6716:9;6707:7;6703:23;6699:32;6696:119;;;6734:79;;:::i;:::-;6696:119;6854:1;6879:53;6924:7;6915:6;6904:9;6900:22;6879:53;:::i;:::-;6869:63;;6825:117;6981:2;7007:50;7049:7;7040:6;7029:9;7025:22;7007:50;:::i;:::-;6997:60;;6952:115;6606:468;;;;;:::o;7080:474::-;7148:6;7156;7205:2;7193:9;7184:7;7180:23;7176:32;7173:119;;;7211:79;;:::i;:::-;7173:119;7331:1;7356:53;7401:7;7392:6;7381:9;7377:22;7356:53;:::i;:::-;7346:63;;7302:117;7458:2;7484:53;7529:7;7520:6;7509:9;7505:22;7484:53;:::i;:::-;7474:63;;7429:118;7080:474;;;;;:::o;7560:539::-;7644:6;7693:2;7681:9;7672:7;7668:23;7664:32;7661:119;;;7699:79;;:::i;:::-;7661:119;7847:1;7836:9;7832:17;7819:31;7877:18;7869:6;7866:30;7863:117;;;7899:79;;:::i;:::-;7863:117;8004:78;8074:7;8065:6;8054:9;8050:22;8004:78;:::i;:::-;7994:88;;7790:302;7560:539;;;;:::o;8105:329::-;8164:6;8213:2;8201:9;8192:7;8188:23;8184:32;8181:119;;;8219:79;;:::i;:::-;8181:119;8339:1;8364:53;8409:7;8400:6;8389:9;8385:22;8364:53;:::i;:::-;8354:63;;8310:117;8105:329;;;;:::o;8440:327::-;8498:6;8547:2;8535:9;8526:7;8522:23;8518:32;8515:119;;;8553:79;;:::i;:::-;8515:119;8673:1;8698:52;8742:7;8733:6;8722:9;8718:22;8698:52;:::i;:::-;8688:62;;8644:116;8440:327;;;;:::o;8773:349::-;8842:6;8891:2;8879:9;8870:7;8866:23;8862:32;8859:119;;;8897:79;;:::i;:::-;8859:119;9017:1;9042:63;9097:7;9088:6;9077:9;9073:22;9042:63;:::i;:::-;9032:73;;8988:127;8773:349;;;;:::o;9128:509::-;9197:6;9246:2;9234:9;9225:7;9221:23;9217:32;9214:119;;;9252:79;;:::i;:::-;9214:119;9400:1;9389:9;9385:17;9372:31;9430:18;9422:6;9419:30;9416:117;;;9452:79;;:::i;:::-;9416:117;9557:63;9612:7;9603:6;9592:9;9588:22;9557:63;:::i;:::-;9547:73;;9343:287;9128:509;;;;:::o;9643:329::-;9702:6;9751:2;9739:9;9730:7;9726:23;9722:32;9719:119;;;9757:79;;:::i;:::-;9719:119;9877:1;9902:53;9947:7;9938:6;9927:9;9923:22;9902:53;:::i;:::-;9892:63;;9848:117;9643:329;;;;:::o;9978:1495::-;10109:6;10117;10125;10133;10141;10149;10157;10165;10173;10222:3;10210:9;10201:7;10197:23;10193:33;10190:120;;;10229:79;;:::i;:::-;10190:120;10349:1;10374:53;10419:7;10410:6;10399:9;10395:22;10374:53;:::i;:::-;10364:63;;10320:117;10476:2;10502:53;10547:7;10538:6;10527:9;10523:22;10502:53;:::i;:::-;10492:63;;10447:118;10604:2;10630:53;10675:7;10666:6;10655:9;10651:22;10630:53;:::i;:::-;10620:63;;10575:118;10732:2;10758:53;10803:7;10794:6;10783:9;10779:22;10758:53;:::i;:::-;10748:63;;10703:118;10860:3;10887:53;10932:7;10923:6;10912:9;10908:22;10887:53;:::i;:::-;10877:63;;10831:119;10989:3;11016:53;11061:7;11052:6;11041:9;11037:22;11016:53;:::i;:::-;11006:63;;10960:119;11118:3;11145:53;11190:7;11181:6;11170:9;11166:22;11145:53;:::i;:::-;11135:63;;11089:119;11247:3;11274:53;11319:7;11310:6;11299:9;11295:22;11274:53;:::i;:::-;11264:63;;11218:119;11376:3;11403:53;11448:7;11439:6;11428:9;11424:22;11403:53;:::i;:::-;11393:63;;11347:119;9978:1495;;;;;;;;;;;:::o;11479:118::-;11566:24;11584:5;11566:24;:::i;:::-;11561:3;11554:37;11479:118;;:::o;11603:157::-;11708:45;11728:24;11746:5;11728:24;:::i;:::-;11708:45;:::i;:::-;11703:3;11696:58;11603:157;;:::o;11766:109::-;11847:21;11862:5;11847:21;:::i;:::-;11842:3;11835:34;11766:109;;:::o;11881:157::-;11986:45;12006:24;12024:5;12006:24;:::i;:::-;11986:45;:::i;:::-;11981:3;11974:58;11881:157;;:::o;12044:360::-;12130:3;12158:38;12190:5;12158:38;:::i;:::-;12212:70;12275:6;12270:3;12212:70;:::i;:::-;12205:77;;12291:52;12336:6;12331:3;12324:4;12317:5;12313:16;12291:52;:::i;:::-;12368:29;12390:6;12368:29;:::i;:::-;12363:3;12359:39;12352:46;;12134:270;12044:360;;;;:::o;12410:364::-;12498:3;12526:39;12559:5;12526:39;:::i;:::-;12581:71;12645:6;12640:3;12581:71;:::i;:::-;12574:78;;12661:52;12706:6;12701:3;12694:4;12687:5;12683:16;12661:52;:::i;:::-;12738:29;12760:6;12738:29;:::i;:::-;12733:3;12729:39;12722:46;;12502:272;12410:364;;;;:::o;12780:377::-;12886:3;12914:39;12947:5;12914:39;:::i;:::-;12969:89;13051:6;13046:3;12969:89;:::i;:::-;12962:96;;13067:52;13112:6;13107:3;13100:4;13093:5;13089:16;13067:52;:::i;:::-;13144:6;13139:3;13135:16;13128:23;;12890:267;12780:377;;;;:::o;13163:366::-;13305:3;13326:67;13390:2;13385:3;13326:67;:::i;:::-;13319:74;;13402:93;13491:3;13402:93;:::i;:::-;13520:2;13515:3;13511:12;13504:19;;13163:366;;;:::o;13535:::-;13677:3;13698:67;13762:2;13757:3;13698:67;:::i;:::-;13691:74;;13774:93;13863:3;13774:93;:::i;:::-;13892:2;13887:3;13883:12;13876:19;;13535:366;;;:::o;13907:::-;14049:3;14070:67;14134:2;14129:3;14070:67;:::i;:::-;14063:74;;14146:93;14235:3;14146:93;:::i;:::-;14264:2;14259:3;14255:12;14248:19;;13907:366;;;:::o;14279:404::-;14439:3;14460:86;14542:3;14537;14460:86;:::i;:::-;14453:93;;14555;14644:3;14555:93;:::i;:::-;14673:3;14668;14664:13;14657:20;;14279:404;;;:::o;14689:366::-;14831:3;14852:67;14916:2;14911:3;14852:67;:::i;:::-;14845:74;;14928:93;15017:3;14928:93;:::i;:::-;15046:2;15041:3;15037:12;15030:19;;14689:366;;;:::o;15061:402::-;15221:3;15242:85;15324:2;15319:3;15242:85;:::i;:::-;15235:92;;15336:93;15425:3;15336:93;:::i;:::-;15454:2;15449:3;15445:12;15438:19;;15061:402;;;:::o;15469:366::-;15611:3;15632:67;15696:2;15691:3;15632:67;:::i;:::-;15625:74;;15708:93;15797:3;15708:93;:::i;:::-;15826:2;15821:3;15817:12;15810:19;;15469:366;;;:::o;15841:::-;15983:3;16004:67;16068:2;16063:3;16004:67;:::i;:::-;15997:74;;16080:93;16169:3;16080:93;:::i;:::-;16198:2;16193:3;16189:12;16182:19;;15841:366;;;:::o;16213:400::-;16373:3;16394:84;16476:1;16471:3;16394:84;:::i;:::-;16387:91;;16487:93;16576:3;16487:93;:::i;:::-;16605:1;16600:3;16596:11;16589:18;;16213:400;;;:::o;16619:366::-;16761:3;16782:67;16846:2;16841:3;16782:67;:::i;:::-;16775:74;;16858:93;16947:3;16858:93;:::i;:::-;16976:2;16971:3;16967:12;16960:19;;16619:366;;;:::o;16991:::-;17133:3;17154:67;17218:2;17213:3;17154:67;:::i;:::-;17147:74;;17230:93;17319:3;17230:93;:::i;:::-;17348:2;17343:3;17339:12;17332:19;;16991:366;;;:::o;17363:402::-;17523:3;17544:85;17626:2;17621:3;17544:85;:::i;:::-;17537:92;;17638:93;17727:3;17638:93;:::i;:::-;17756:2;17751:3;17747:12;17740:19;;17363:402;;;:::o;17771:366::-;17913:3;17934:67;17998:2;17993:3;17934:67;:::i;:::-;17927:74;;18010:93;18099:3;18010:93;:::i;:::-;18128:2;18123:3;18119:12;18112:19;;17771:366;;;:::o;18143:::-;18285:3;18306:67;18370:2;18365:3;18306:67;:::i;:::-;18299:74;;18382:93;18471:3;18382:93;:::i;:::-;18500:2;18495:3;18491:12;18484:19;;18143:366;;;:::o;18515:::-;18657:3;18678:67;18742:2;18737:3;18678:67;:::i;:::-;18671:74;;18754:93;18843:3;18754:93;:::i;:::-;18872:2;18867:3;18863:12;18856:19;;18515:366;;;:::o;18887:400::-;19047:3;19068:84;19150:1;19145:3;19068:84;:::i;:::-;19061:91;;19161:93;19250:3;19161:93;:::i;:::-;19279:1;19274:3;19270:11;19263:18;;18887:400;;;:::o;19293:402::-;19453:3;19474:85;19556:2;19551:3;19474:85;:::i;:::-;19467:92;;19568:93;19657:3;19568:93;:::i;:::-;19686:2;19681:3;19677:12;19670:19;;19293:402;;;:::o;19701:366::-;19843:3;19864:67;19928:2;19923:3;19864:67;:::i;:::-;19857:74;;19940:93;20029:3;19940:93;:::i;:::-;20058:2;20053:3;20049:12;20042:19;;19701:366;;;:::o;20073:::-;20215:3;20236:67;20300:2;20295:3;20236:67;:::i;:::-;20229:74;;20312:93;20401:3;20312:93;:::i;:::-;20430:2;20425:3;20421:12;20414:19;;20073:366;;;:::o;20445:400::-;20605:3;20626:84;20708:1;20703:3;20626:84;:::i;:::-;20619:91;;20719:93;20808:3;20719:93;:::i;:::-;20837:1;20832:3;20828:11;20821:18;;20445:400;;;:::o;20851:366::-;20993:3;21014:67;21078:2;21073:3;21014:67;:::i;:::-;21007:74;;21090:93;21179:3;21090:93;:::i;:::-;21208:2;21203:3;21199:12;21192:19;;20851:366;;;:::o;21223:::-;21365:3;21386:67;21450:2;21445:3;21386:67;:::i;:::-;21379:74;;21462:93;21551:3;21462:93;:::i;:::-;21580:2;21575:3;21571:12;21564:19;;21223:366;;;:::o;21595:::-;21737:3;21758:67;21822:2;21817:3;21758:67;:::i;:::-;21751:74;;21834:93;21923:3;21834:93;:::i;:::-;21952:2;21947:3;21943:12;21936:19;;21595:366;;;:::o;21967:400::-;22127:3;22148:84;22230:1;22225:3;22148:84;:::i;:::-;22141:91;;22241:93;22330:3;22241:93;:::i;:::-;22359:1;22354:3;22350:11;22343:18;;21967:400;;;:::o;22373:366::-;22515:3;22536:67;22600:2;22595:3;22536:67;:::i;:::-;22529:74;;22612:93;22701:3;22612:93;:::i;:::-;22730:2;22725:3;22721:12;22714:19;;22373:366;;;:::o;22745:::-;22887:3;22908:67;22972:2;22967:3;22908:67;:::i;:::-;22901:74;;22984:93;23073:3;22984:93;:::i;:::-;23102:2;23097:3;23093:12;23086:19;;22745:366;;;:::o;23117:::-;23259:3;23280:67;23344:2;23339:3;23280:67;:::i;:::-;23273:74;;23356:93;23445:3;23356:93;:::i;:::-;23474:2;23469:3;23465:12;23458:19;;23117:366;;;:::o;23489:::-;23631:3;23652:67;23716:2;23711:3;23652:67;:::i;:::-;23645:74;;23728:93;23817:3;23728:93;:::i;:::-;23846:2;23841:3;23837:12;23830:19;;23489:366;;;:::o;23861:::-;24003:3;24024:67;24088:2;24083:3;24024:67;:::i;:::-;24017:74;;24100:93;24189:3;24100:93;:::i;:::-;24218:2;24213:3;24209:12;24202:19;;23861:366;;;:::o;24233:::-;24375:3;24396:67;24460:2;24455:3;24396:67;:::i;:::-;24389:74;;24472:93;24561:3;24472:93;:::i;:::-;24590:2;24585:3;24581:12;24574:19;;24233:366;;;:::o;24605:402::-;24765:3;24786:85;24868:2;24863:3;24786:85;:::i;:::-;24779:92;;24880:93;24969:3;24880:93;:::i;:::-;24998:2;24993:3;24989:12;24982:19;;24605:402;;;:::o;25013:::-;25173:3;25194:85;25276:2;25271:3;25194:85;:::i;:::-;25187:92;;25288:93;25377:3;25288:93;:::i;:::-;25406:2;25401:3;25397:12;25390:19;;25013:402;;;:::o;25421:366::-;25563:3;25584:67;25648:2;25643:3;25584:67;:::i;:::-;25577:74;;25660:93;25749:3;25660:93;:::i;:::-;25778:2;25773:3;25769:12;25762:19;;25421:366;;;:::o;25793:::-;25935:3;25956:67;26020:2;26015:3;25956:67;:::i;:::-;25949:74;;26032:93;26121:3;26032:93;:::i;:::-;26150:2;26145:3;26141:12;26134:19;;25793:366;;;:::o;26165:::-;26307:3;26328:67;26392:2;26387:3;26328:67;:::i;:::-;26321:74;;26404:93;26493:3;26404:93;:::i;:::-;26522:2;26517:3;26513:12;26506:19;;26165:366;;;:::o;26537:::-;26679:3;26700:67;26764:2;26759:3;26700:67;:::i;:::-;26693:74;;26776:93;26865:3;26776:93;:::i;:::-;26894:2;26889:3;26885:12;26878:19;;26537:366;;;:::o;26909:::-;27051:3;27072:67;27136:2;27131:3;27072:67;:::i;:::-;27065:74;;27148:93;27237:3;27148:93;:::i;:::-;27266:2;27261:3;27257:12;27250:19;;26909:366;;;:::o;27281:::-;27423:3;27444:67;27508:2;27503:3;27444:67;:::i;:::-;27437:74;;27520:93;27609:3;27520:93;:::i;:::-;27638:2;27633:3;27629:12;27622:19;;27281:366;;;:::o;27653:402::-;27813:3;27834:85;27916:2;27911:3;27834:85;:::i;:::-;27827:92;;27928:93;28017:3;27928:93;:::i;:::-;28046:2;28041:3;28037:12;28030:19;;27653:402;;;:::o;28061:118::-;28148:24;28166:5;28148:24;:::i;:::-;28143:3;28136:37;28061:118;;:::o;28185:157::-;28290:45;28310:24;28328:5;28310:24;:::i;:::-;28290:45;:::i;:::-;28285:3;28278:58;28185:157;;:::o;28348:256::-;28460:3;28475:75;28546:3;28537:6;28475:75;:::i;:::-;28575:2;28570:3;28566:12;28559:19;;28595:3;28588:10;;28348:256;;;;:::o;28610:397::-;28750:3;28765:75;28836:3;28827:6;28765:75;:::i;:::-;28865:2;28860:3;28856:12;28849:19;;28878:75;28949:3;28940:6;28878:75;:::i;:::-;28978:2;28973:3;28969:12;28962:19;;28998:3;28991:10;;28610:397;;;;;:::o;29013:275::-;29145:3;29167:95;29258:3;29249:6;29167:95;:::i;:::-;29160:102;;29279:3;29272:10;;29013:275;;;;:::o;29294:435::-;29474:3;29496:95;29587:3;29578:6;29496:95;:::i;:::-;29489:102;;29608:95;29699:3;29690:6;29608:95;:::i;:::-;29601:102;;29720:3;29713:10;;29294:435;;;;;:::o;29735:1555::-;30251:3;30273:95;30364:3;30355:6;30273:95;:::i;:::-;30266:102;;30385:95;30476:3;30467:6;30385:95;:::i;:::-;30378:102;;30497:95;30588:3;30579:6;30497:95;:::i;:::-;30490:102;;30609:95;30700:3;30691:6;30609:95;:::i;:::-;30602:102;;30721:95;30812:3;30803:6;30721:95;:::i;:::-;30714:102;;30833:95;30924:3;30915:6;30833:95;:::i;:::-;30826:102;;30945:95;31036:3;31027:6;30945:95;:::i;:::-;30938:102;;31057:95;31148:3;31139:6;31057:95;:::i;:::-;31050:102;;31169:95;31260:3;31251:6;31169:95;:::i;:::-;31162:102;;31281:3;31274:10;;29735:1555;;;;;;;;;;;;:::o;31296:4375::-;32870:3;32892:95;32983:3;32974:6;32892:95;:::i;:::-;32885:102;;33004:148;33148:3;33004:148;:::i;:::-;32997:155;;33169:95;33260:3;33251:6;33169:95;:::i;:::-;33162:102;;33281:148;33425:3;33281:148;:::i;:::-;33274:155;;33446:95;33537:3;33528:6;33446:95;:::i;:::-;33439:102;;33558:148;33702:3;33558:148;:::i;:::-;33551:155;;33723:95;33814:3;33805:6;33723:95;:::i;:::-;33716:102;;33835:148;33979:3;33835:148;:::i;:::-;33828:155;;34000:95;34091:3;34082:6;34000:95;:::i;:::-;33993:102;;34112:148;34256:3;34112:148;:::i;:::-;34105:155;;34277:95;34368:3;34359:6;34277:95;:::i;:::-;34270:102;;34389:148;34533:3;34389:148;:::i;:::-;34382:155;;34554:95;34645:3;34636:6;34554:95;:::i;:::-;34547:102;;34666:148;34810:3;34666:148;:::i;:::-;34659:155;;34831:95;34922:3;34913:6;34831:95;:::i;:::-;34824:102;;34943:148;35087:3;34943:148;:::i;:::-;34936:155;;35108:95;35199:3;35190:6;35108:95;:::i;:::-;35101:102;;35220:148;35364:3;35220:148;:::i;:::-;35213:155;;35385:95;35476:3;35467:6;35385:95;:::i;:::-;35378:102;;35497:148;35641:3;35497:148;:::i;:::-;35490:155;;35662:3;35655:10;;31296:4375;;;;;;;;;;;;;:::o;35677:1073::-;36112:3;36134:148;36278:3;36134:148;:::i;:::-;36127:155;;36299:95;36390:3;36381:6;36299:95;:::i;:::-;36292:102;;36411:148;36555:3;36411:148;:::i;:::-;36404:155;;36576:148;36720:3;36576:148;:::i;:::-;36569:155;;36741:3;36734:10;;35677:1073;;;;:::o;36756:807::-;37090:3;37112:148;37256:3;37112:148;:::i;:::-;37105:155;;37277:95;37368:3;37359:6;37277:95;:::i;:::-;37270:102;;37389:148;37533:3;37389:148;:::i;:::-;37382:155;;37554:3;37547:10;;36756:807;;;;:::o;37569:4641::-;39244:3;39266:148;39410:3;39266:148;:::i;:::-;39259:155;;39431:95;39522:3;39513:6;39431:95;:::i;:::-;39424:102;;39543:148;39687:3;39543:148;:::i;:::-;39536:155;;39708:95;39799:3;39790:6;39708:95;:::i;:::-;39701:102;;39820:148;39964:3;39820:148;:::i;:::-;39813:155;;39985:95;40076:3;40067:6;39985:95;:::i;:::-;39978:102;;40097:148;40241:3;40097:148;:::i;:::-;40090:155;;40262:95;40353:3;40344:6;40262:95;:::i;:::-;40255:102;;40374:148;40518:3;40374:148;:::i;:::-;40367:155;;40539:95;40630:3;40621:6;40539:95;:::i;:::-;40532:102;;40651:148;40795:3;40651:148;:::i;:::-;40644:155;;40816:95;40907:3;40898:6;40816:95;:::i;:::-;40809:102;;40928:148;41072:3;40928:148;:::i;:::-;40921:155;;41093:95;41184:3;41175:6;41093:95;:::i;:::-;41086:102;;41205:148;41349:3;41205:148;:::i;:::-;41198:155;;41370:95;41461:3;41452:6;41370:95;:::i;:::-;41363:102;;41482:148;41626:3;41482:148;:::i;:::-;41475:155;;41647:95;41738:3;41729:6;41647:95;:::i;:::-;41640:102;;41759:148;41903:3;41759:148;:::i;:::-;41752:155;;41924:95;42015:3;42006:6;41924:95;:::i;:::-;41917:102;;42036:148;42180:3;42036:148;:::i;:::-;42029:155;;42201:3;42194:10;;37569:4641;;;;;;;;;;;;;:::o;42216:541::-;42449:3;42471:148;42615:3;42471:148;:::i;:::-;42464:155;;42636:95;42727:3;42718:6;42636:95;:::i;:::-;42629:102;;42748:3;42741:10;;42216:541;;;;:::o;42763:256::-;42875:3;42890:75;42961:3;42952:6;42890:75;:::i;:::-;42990:2;42985:3;42981:12;42974:19;;43010:3;43003:10;;42763:256;;;;:::o;43025:538::-;43193:3;43208:75;43279:3;43270:6;43208:75;:::i;:::-;43308:2;43303:3;43299:12;43292:19;;43321:75;43392:3;43383:6;43321:75;:::i;:::-;43421:2;43416:3;43412:12;43405:19;;43434:75;43505:3;43496:6;43434:75;:::i;:::-;43534:2;43529:3;43525:12;43518:19;;43554:3;43547:10;;43025:538;;;;;;:::o;43569:397::-;43709:3;43724:75;43795:3;43786:6;43724:75;:::i;:::-;43824:2;43819:3;43815:12;43808:19;;43837:75;43908:3;43899:6;43837:75;:::i;:::-;43937:2;43932:3;43928:12;43921:19;;43957:3;43950:10;;43569:397;;;;;:::o;43972:839::-;44216:3;44231:75;44302:3;44293:6;44231:75;:::i;:::-;44331:2;44326:3;44322:12;44315:19;;44344:75;44415:3;44406:6;44344:75;:::i;:::-;44444:2;44439:3;44435:12;44428:19;;44464:95;44555:3;44546:6;44464:95;:::i;:::-;44457:102;;44569:75;44640:3;44631:6;44569:75;:::i;:::-;44669:2;44664:3;44660:12;44653:19;;44682:75;44753:3;44744:6;44682:75;:::i;:::-;44782:2;44777:3;44773:12;44766:19;;44802:3;44795:10;;43972:839;;;;;;;;:::o;44817:538::-;44985:3;45000:75;45071:3;45062:6;45000:75;:::i;:::-;45100:2;45095:3;45091:12;45084:19;;45113:75;45184:3;45175:6;45113:75;:::i;:::-;45213:2;45208:3;45204:12;45197:19;;45226:75;45297:3;45288:6;45226:75;:::i;:::-;45326:2;45321:3;45317:12;45310:19;;45346:3;45339:10;;44817:538;;;;;;:::o;45361:222::-;45454:4;45492:2;45481:9;45477:18;45469:26;;45505:71;45573:1;45562:9;45558:17;45549:6;45505:71;:::i;:::-;45361:222;;;;:::o;45589:640::-;45784:4;45822:3;45811:9;45807:19;45799:27;;45836:71;45904:1;45893:9;45889:17;45880:6;45836:71;:::i;:::-;45917:72;45985:2;45974:9;45970:18;45961:6;45917:72;:::i;:::-;45999;46067:2;46056:9;46052:18;46043:6;45999:72;:::i;:::-;46118:9;46112:4;46108:20;46103:2;46092:9;46088:18;46081:48;46146:76;46217:4;46208:6;46146:76;:::i;:::-;46138:84;;45589:640;;;;;;;:::o;46235:210::-;46322:4;46360:2;46349:9;46345:18;46337:26;;46373:65;46435:1;46424:9;46420:17;46411:6;46373:65;:::i;:::-;46235:210;;;;:::o;46451:313::-;46564:4;46602:2;46591:9;46587:18;46579:26;;46651:9;46645:4;46641:20;46637:1;46626:9;46622:17;46615:47;46679:78;46752:4;46743:6;46679:78;:::i;:::-;46671:86;;46451:313;;;;:::o;46770:419::-;46936:4;46974:2;46963:9;46959:18;46951:26;;47023:9;47017:4;47013:20;47009:1;46998:9;46994:17;46987:47;47051:131;47177:4;47051:131;:::i;:::-;47043:139;;46770:419;;;:::o;47195:::-;47361:4;47399:2;47388:9;47384:18;47376:26;;47448:9;47442:4;47438:20;47434:1;47423:9;47419:17;47412:47;47476:131;47602:4;47476:131;:::i;:::-;47468:139;;47195:419;;;:::o;47620:::-;47786:4;47824:2;47813:9;47809:18;47801:26;;47873:9;47867:4;47863:20;47859:1;47848:9;47844:17;47837:47;47901:131;48027:4;47901:131;:::i;:::-;47893:139;;47620:419;;;:::o;48045:::-;48211:4;48249:2;48238:9;48234:18;48226:26;;48298:9;48292:4;48288:20;48284:1;48273:9;48269:17;48262:47;48326:131;48452:4;48326:131;:::i;:::-;48318:139;;48045:419;;;:::o;48470:::-;48636:4;48674:2;48663:9;48659:18;48651:26;;48723:9;48717:4;48713:20;48709:1;48698:9;48694:17;48687:47;48751:131;48877:4;48751:131;:::i;:::-;48743:139;;48470:419;;;:::o;48895:::-;49061:4;49099:2;49088:9;49084:18;49076:26;;49148:9;49142:4;49138:20;49134:1;49123:9;49119:17;49112:47;49176:131;49302:4;49176:131;:::i;:::-;49168:139;;48895:419;;;:::o;49320:::-;49486:4;49524:2;49513:9;49509:18;49501:26;;49573:9;49567:4;49563:20;49559:1;49548:9;49544:17;49537:47;49601:131;49727:4;49601:131;:::i;:::-;49593:139;;49320:419;;;:::o;49745:::-;49911:4;49949:2;49938:9;49934:18;49926:26;;49998:9;49992:4;49988:20;49984:1;49973:9;49969:17;49962:47;50026:131;50152:4;50026:131;:::i;:::-;50018:139;;49745:419;;;:::o;50170:::-;50336:4;50374:2;50363:9;50359:18;50351:26;;50423:9;50417:4;50413:20;50409:1;50398:9;50394:17;50387:47;50451:131;50577:4;50451:131;:::i;:::-;50443:139;;50170:419;;;:::o;50595:::-;50761:4;50799:2;50788:9;50784:18;50776:26;;50848:9;50842:4;50838:20;50834:1;50823:9;50819:17;50812:47;50876:131;51002:4;50876:131;:::i;:::-;50868:139;;50595:419;;;:::o;51020:::-;51186:4;51224:2;51213:9;51209:18;51201:26;;51273:9;51267:4;51263:20;51259:1;51248:9;51244:17;51237:47;51301:131;51427:4;51301:131;:::i;:::-;51293:139;;51020:419;;;:::o;51445:::-;51611:4;51649:2;51638:9;51634:18;51626:26;;51698:9;51692:4;51688:20;51684:1;51673:9;51669:17;51662:47;51726:131;51852:4;51726:131;:::i;:::-;51718:139;;51445:419;;;:::o;51870:::-;52036:4;52074:2;52063:9;52059:18;52051:26;;52123:9;52117:4;52113:20;52109:1;52098:9;52094:17;52087:47;52151:131;52277:4;52151:131;:::i;:::-;52143:139;;51870:419;;;:::o;52295:::-;52461:4;52499:2;52488:9;52484:18;52476:26;;52548:9;52542:4;52538:20;52534:1;52523:9;52519:17;52512:47;52576:131;52702:4;52576:131;:::i;:::-;52568:139;;52295:419;;;:::o;52720:::-;52886:4;52924:2;52913:9;52909:18;52901:26;;52973:9;52967:4;52963:20;52959:1;52948:9;52944:17;52937:47;53001:131;53127:4;53001:131;:::i;:::-;52993:139;;52720:419;;;:::o;53145:::-;53311:4;53349:2;53338:9;53334:18;53326:26;;53398:9;53392:4;53388:20;53384:1;53373:9;53369:17;53362:47;53426:131;53552:4;53426:131;:::i;:::-;53418:139;;53145:419;;;:::o;53570:::-;53736:4;53774:2;53763:9;53759:18;53751:26;;53823:9;53817:4;53813:20;53809:1;53798:9;53794:17;53787:47;53851:131;53977:4;53851:131;:::i;:::-;53843:139;;53570:419;;;:::o;53995:::-;54161:4;54199:2;54188:9;54184:18;54176:26;;54248:9;54242:4;54238:20;54234:1;54223:9;54219:17;54212:47;54276:131;54402:4;54276:131;:::i;:::-;54268:139;;53995:419;;;:::o;54420:::-;54586:4;54624:2;54613:9;54609:18;54601:26;;54673:9;54667:4;54663:20;54659:1;54648:9;54644:17;54637:47;54701:131;54827:4;54701:131;:::i;:::-;54693:139;;54420:419;;;:::o;54845:::-;55011:4;55049:2;55038:9;55034:18;55026:26;;55098:9;55092:4;55088:20;55084:1;55073:9;55069:17;55062:47;55126:131;55252:4;55126:131;:::i;:::-;55118:139;;54845:419;;;:::o;55270:::-;55436:4;55474:2;55463:9;55459:18;55451:26;;55523:9;55517:4;55513:20;55509:1;55498:9;55494:17;55487:47;55551:131;55677:4;55551:131;:::i;:::-;55543:139;;55270:419;;;:::o;55695:::-;55861:4;55899:2;55888:9;55884:18;55876:26;;55948:9;55942:4;55938:20;55934:1;55923:9;55919:17;55912:47;55976:131;56102:4;55976:131;:::i;:::-;55968:139;;55695:419;;;:::o;56120:::-;56286:4;56324:2;56313:9;56309:18;56301:26;;56373:9;56367:4;56363:20;56359:1;56348:9;56344:17;56337:47;56401:131;56527:4;56401:131;:::i;:::-;56393:139;;56120:419;;;:::o;56545:::-;56711:4;56749:2;56738:9;56734:18;56726:26;;56798:9;56792:4;56788:20;56784:1;56773:9;56769:17;56762:47;56826:131;56952:4;56826:131;:::i;:::-;56818:139;;56545:419;;;:::o;56970:::-;57136:4;57174:2;57163:9;57159:18;57151:26;;57223:9;57217:4;57213:20;57209:1;57198:9;57194:17;57187:47;57251:131;57377:4;57251:131;:::i;:::-;57243:139;;56970:419;;;:::o;57395:::-;57561:4;57599:2;57588:9;57584:18;57576:26;;57648:9;57642:4;57638:20;57634:1;57623:9;57619:17;57612:47;57676:131;57802:4;57676:131;:::i;:::-;57668:139;;57395:419;;;:::o;57820:::-;57986:4;58024:2;58013:9;58009:18;58001:26;;58073:9;58067:4;58063:20;58059:1;58048:9;58044:17;58037:47;58101:131;58227:4;58101:131;:::i;:::-;58093:139;;57820:419;;;:::o;58245:::-;58411:4;58449:2;58438:9;58434:18;58426:26;;58498:9;58492:4;58488:20;58484:1;58473:9;58469:17;58462:47;58526:131;58652:4;58526:131;:::i;:::-;58518:139;;58245:419;;;:::o;58670:222::-;58763:4;58801:2;58790:9;58786:18;58778:26;;58814:71;58882:1;58871:9;58867:17;58858:6;58814:71;:::i;:::-;58670:222;;;;:::o;58898:129::-;58932:6;58959:20;;:::i;:::-;58949:30;;58988:33;59016:4;59008:6;58988:33;:::i;:::-;58898:129;;;:::o;59033:75::-;59066:6;59099:2;59093:9;59083:19;;59033:75;:::o;59114:311::-;59191:4;59281:18;59273:6;59270:30;59267:56;;;59303:18;;:::i;:::-;59267:56;59353:4;59345:6;59341:17;59333:25;;59413:4;59407;59403:15;59395:23;;59114:311;;;:::o;59431:307::-;59492:4;59582:18;59574:6;59571:30;59568:56;;;59604:18;;:::i;:::-;59568:56;59642:29;59664:6;59642:29;:::i;:::-;59634:37;;59726:4;59720;59716:15;59708:23;;59431:307;;;:::o;59744:308::-;59806:4;59896:18;59888:6;59885:30;59882:56;;;59918:18;;:::i;:::-;59882:56;59956:29;59978:6;59956:29;:::i;:::-;59948:37;;60040:4;60034;60030:15;60022:23;;59744:308;;;:::o;60058:98::-;60109:6;60143:5;60137:12;60127:22;;60058:98;;;:::o;60162:99::-;60214:6;60248:5;60242:12;60232:22;;60162:99;;;:::o;60267:168::-;60350:11;60384:6;60379:3;60372:19;60424:4;60419:3;60415:14;60400:29;;60267:168;;;;:::o;60441:169::-;60525:11;60559:6;60554:3;60547:19;60599:4;60594:3;60590:14;60575:29;;60441:169;;;;:::o;60616:148::-;60718:11;60755:3;60740:18;;60616:148;;;;:::o;60770:305::-;60810:3;60829:20;60847:1;60829:20;:::i;:::-;60824:25;;60863:20;60881:1;60863:20;:::i;:::-;60858:25;;61017:1;60949:66;60945:74;60942:1;60939:81;60936:107;;;61023:18;;:::i;:::-;60936:107;61067:1;61064;61060:9;61053:16;;60770:305;;;;:::o;61081:185::-;61121:1;61138:20;61156:1;61138:20;:::i;:::-;61133:25;;61172:20;61190:1;61172:20;:::i;:::-;61167:25;;61211:1;61201:35;;61216:18;;:::i;:::-;61201:35;61258:1;61255;61251:9;61246:14;;61081:185;;;;:::o;61272:348::-;61312:7;61335:20;61353:1;61335:20;:::i;:::-;61330:25;;61369:20;61387:1;61369:20;:::i;:::-;61364:25;;61557:1;61489:66;61485:74;61482:1;61479:81;61474:1;61467:9;61460:17;61456:105;61453:131;;;61564:18;;:::i;:::-;61453:131;61612:1;61609;61605:9;61594:20;;61272:348;;;;:::o;61626:191::-;61666:4;61686:20;61704:1;61686:20;:::i;:::-;61681:25;;61720:20;61738:1;61720:20;:::i;:::-;61715:25;;61759:1;61756;61753:8;61750:34;;;61764:18;;:::i;:::-;61750:34;61809:1;61806;61802:9;61794:17;;61626:191;;;;:::o;61823:96::-;61860:7;61889:24;61907:5;61889:24;:::i;:::-;61878:35;;61823:96;;;:::o;61925:104::-;61970:7;61999:24;62017:5;61999:24;:::i;:::-;61988:35;;61925:104;;;:::o;62035:90::-;62069:7;62112:5;62105:13;62098:21;62087:32;;62035:90;;;:::o;62131:77::-;62168:7;62197:5;62186:16;;62131:77;;;:::o;62214:149::-;62250:7;62290:66;62283:5;62279:78;62268:89;;62214:149;;;:::o;62369:126::-;62406:7;62446:42;62439:5;62435:54;62424:65;;62369:126;;;:::o;62501:77::-;62538:7;62567:5;62556:16;;62501:77;;;:::o;62584:154::-;62668:6;62663:3;62658;62645:30;62730:1;62721:6;62716:3;62712:16;62705:27;62584:154;;;:::o;62744:307::-;62812:1;62822:113;62836:6;62833:1;62830:13;62822:113;;;62921:1;62916:3;62912:11;62906:18;62902:1;62897:3;62893:11;62886:39;62858:2;62855:1;62851:10;62846:15;;62822:113;;;62953:6;62950:1;62947:13;62944:101;;;63033:1;63024:6;63019:3;63015:16;63008:27;62944:101;62793:258;62744:307;;;:::o;63057:320::-;63101:6;63138:1;63132:4;63128:12;63118:22;;63185:1;63179:4;63175:12;63206:18;63196:81;;63262:4;63254:6;63250:17;63240:27;;63196:81;63324:2;63316:6;63313:14;63293:18;63290:38;63287:84;;;63343:18;;:::i;:::-;63287:84;63108:269;63057:320;;;:::o;63383:281::-;63466:27;63488:4;63466:27;:::i;:::-;63458:6;63454:40;63596:6;63584:10;63581:22;63560:18;63548:10;63545:34;63542:62;63539:88;;;63607:18;;:::i;:::-;63539:88;63647:10;63643:2;63636:22;63426:238;63383:281;;:::o;63670:233::-;63709:3;63732:24;63750:5;63732:24;:::i;:::-;63723:33;;63778:66;63771:5;63768:77;63765:103;;;63848:18;;:::i;:::-;63765:103;63895:1;63888:5;63884:13;63877:20;;63670:233;;;:::o;63909:100::-;63948:7;63977:26;63997:5;63977:26;:::i;:::-;63966:37;;63909:100;;;:::o;64015:79::-;64054:7;64083:5;64072:16;;64015:79;;;:::o;64100:94::-;64139:7;64168:20;64182:5;64168:20;:::i;:::-;64157:31;;64100:94;;;:::o;64200:79::-;64239:7;64268:5;64257:16;;64200:79;;;:::o;64285:176::-;64317:1;64334:20;64352:1;64334:20;:::i;:::-;64329:25;;64368:20;64386:1;64368:20;:::i;:::-;64363:25;;64407:1;64397:35;;64412:18;;:::i;:::-;64397:35;64453:1;64450;64446:9;64441:14;;64285:176;;;;:::o;64467:180::-;64515:77;64512:1;64505:88;64612:4;64609:1;64602:15;64636:4;64633:1;64626:15;64653:180;64701:77;64698:1;64691:88;64798:4;64795:1;64788:15;64822:4;64819:1;64812:15;64839:180;64887:77;64884:1;64877:88;64984:4;64981:1;64974:15;65008:4;65005:1;64998:15;65025:180;65073:77;65070:1;65063:88;65170:4;65167:1;65160:15;65194:4;65191:1;65184:15;65211:180;65259:77;65256:1;65249:88;65356:4;65353:1;65346:15;65380:4;65377:1;65370:15;65397:117;65506:1;65503;65496:12;65520:117;65629:1;65626;65619:12;65643:117;65752:1;65749;65742:12;65766:117;65875:1;65872;65865:12;65889:117;65998:1;65995;65988:12;66012:102;66053:6;66104:2;66100:7;66095:2;66088:5;66084:14;66080:28;66070:38;;66012:102;;;:::o;66120:94::-;66153:8;66201:5;66197:2;66193:14;66172:35;;66120:94;;;:::o;66220:177::-;66360:29;66356:1;66348:6;66344:14;66337:53;66220:177;:::o;66403:181::-;66543:33;66539:1;66531:6;66527:14;66520:57;66403:181;:::o;66590:237::-;66730:34;66726:1;66718:6;66714:14;66707:58;66799:20;66794:2;66786:6;66782:15;66775:45;66590:237;:::o;66833:517::-;66973:66;66969:1;66961:6;66957:14;66950:90;67074:66;67069:2;67061:6;67057:15;67050:91;67175:66;67170:2;67162:6;67158:15;67151:91;67276:66;67271:2;67263:6;67259:15;67252:91;66833:517;:::o;67356:225::-;67496:34;67492:1;67484:6;67480:14;67473:58;67565:8;67560:2;67552:6;67548:15;67541:33;67356:225;:::o;67587:315::-;67727:66;67723:1;67715:6;67711:14;67704:90;67828:66;67823:2;67815:6;67811:15;67804:91;67587:315;:::o;67908:178::-;68048:30;68044:1;68036:6;68032:14;68025:54;67908:178;:::o;68092:166::-;68232:18;68228:1;68220:6;68216:14;68209:42;68092:166;:::o;68264:158::-;68404:10;68400:1;68392:6;68388:14;68381:34;68264:158;:::o;68428:223::-;68568:34;68564:1;68556:6;68552:14;68545:58;68637:6;68632:2;68624:6;68620:15;68613:31;68428:223;:::o;68657:175::-;68797:27;68793:1;68785:6;68781:14;68774:51;68657:175;:::o;68838:315::-;68978:66;68974:1;68966:6;68962:14;68955:90;69079:66;69074:2;69066:6;69062:15;69055:91;68838:315;:::o;69159:182::-;69299:34;69295:1;69287:6;69283:14;69276:58;69159:182;:::o;69347:231::-;69487:34;69483:1;69475:6;69471:14;69464:58;69556:14;69551:2;69543:6;69539:15;69532:39;69347:231;:::o;69584:243::-;69724:34;69720:1;69712:6;69708:14;69701:58;69793:26;69788:2;69780:6;69776:15;69769:51;69584:243;:::o;69833:214::-;69973:66;69969:1;69961:6;69957:14;69950:90;69833:214;:::o;70053:252::-;70193:66;70189:1;70181:6;70177:14;70170:90;70294:3;70289:2;70281:6;70277:15;70270:28;70053:252;:::o;70311:229::-;70451:34;70447:1;70439:6;70435:14;70428:58;70520:12;70515:2;70507:6;70503:15;70496:37;70311:229;:::o;70546:228::-;70686:34;70682:1;70674:6;70670:14;70663:58;70755:11;70750:2;70742:6;70738:15;70731:36;70546:228;:::o;70780:214::-;70920:66;70916:1;70908:6;70904:14;70897:90;70780:214;:::o;71000:182::-;71140:34;71136:1;71128:6;71124:14;71117:58;71000:182;:::o;71188:175::-;71328:27;71324:1;71316:6;71312:14;71305:51;71188:175;:::o;71369:165::-;71509:17;71505:1;71497:6;71493:14;71486:41;71369:165;:::o;71540:143::-;71676:3;71672:1;71664:6;71660:14;71653:27;71540:143;:::o;71685:170::-;71821:30;71817:1;71809:6;71805:14;71798:54;71685:170;:::o;71857:219::-;71993:34;71989:1;71981:6;71977:14;71970:58;72058:14;72053:2;72045:6;72041:15;72034:39;71857:219;:::o;72078:174::-;72214:34;72210:1;72202:6;72198:14;72191:58;72078:174;:::o;72254:216::-;72390:34;72386:1;72378:6;72374:14;72367:58;72455:11;72450:2;72442:6;72438:15;72431:36;72254:216;:::o;72472:213::-;72608:34;72604:1;72596:6;72592:14;72585:58;72673:8;72668:2;72660:6;72656:15;72649:33;72472:213;:::o;72687:208::-;72823:34;72819:1;72811:6;72807:14;72800:58;72888:3;72883:2;72875:6;72871:15;72864:28;72687:208;:::o;72897:206::-;73033:66;73029:1;73021:6;73017:14;73010:90;72897:206;:::o;73105:171::-;73241:31;73237:1;73229:6;73225:14;73218:55;73105:171;:::o;73278:170::-;73414:30;73410:1;73402:6;73398:14;73391:54;73278:170;:::o;73450:224::-;73586:34;73582:1;73574:6;73570:14;73563:58;73651:19;73646:2;73638:6;73634:15;73627:44;73450:224;:::o;73676:168::-;73812:28;73808:1;73800:6;73796:14;73789:52;73676:168;:::o;73846:169::-;73982:29;73978:1;73970:6;73966:14;73959:53;73846:169;:::o;74017:159::-;74153:19;74149:1;74141:6;74137:14;74130:43;74017:159;:::o;74178:172::-;74314:32;74310:1;74302:6;74298:14;74291:56;74178:172;:::o;74352:248::-;74488:66;74484:1;74476:6;74472:14;74465:90;74585:11;74580:2;74572:6;74568:15;74561:36;74352:248;:::o;74602:114::-;74671:24;74689:5;74671:24;:::i;:::-;74664:5;74661:35;74651:63;;74710:1;74707;74700:12;74651:63;74602:114;:::o;74718:130::-;74795:32;74821:5;74795:32;:::i;:::-;74788:5;74785:43;74775:71;;74842:1;74839;74832:12;74775:71;74718:130;:::o;74850:108::-;74916:21;74931:5;74916:21;:::i;:::-;74909:5;74906:32;74896:60;;74952:1;74949;74942:12;74896:60;74850:108;:::o;74960:114::-;75029:24;75047:5;75029:24;:::i;:::-;75022:5;75019:35;75009:63;;75068:1;75065;75058:12;75009:63;74960:114;:::o;75076:112::-;75144:23;75161:5;75144:23;:::i;:::-;75137:5;75134:34;75124:62;;75182:1;75179;75172:12;75124:62;75076:112;:::o;75190:114::-;75259:24;75277:5;75259:24;:::i;:::-;75252:5;75249:35;75239:63;;75298:1;75295;75288:12;75239:63;75190:114;:::o

Swarm Source

ipfs://7d6cb6ce6aaeb75ee61501042eae9e513b8de2e71817ee4c5871889c78de89bf
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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