ETH Price: $2,525.84 (+0.33%)

Contract

0x64fA880B224b112d371948914e9e667e22bddC46
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Subdomain188771872023-12-27 13:06:35247 days ago1703682395IN
0x64fA880B...e22bddC46
0 ETH0.0066152229.57634816
Claim Subdomain188744392023-12-27 3:51:11248 days ago1703649071IN
0x64fA880B...e22bddC46
0 ETH0.0028422612.70832808
Claim Subdomain186018702023-11-18 23:04:35286 days ago1700348675IN
0x64fA880B...e22bddC46
0 ETH0.0048361921.64241483
Claim Subdomain180228412023-08-29 21:05:47367 days ago1693343147IN
0x64fA880B...e22bddC46
0 ETH0.0084631837.32831135
Claim Subdomain177445212023-07-21 22:32:35406 days ago1689978755IN
0x64fA880B...e22bddC46
0 ETH0.0049417622.08184063
Add Ens Contract...175399402023-06-23 4:35:35435 days ago1687494935IN
0x64fA880B...e22bddC46
0 ETH0.0029653113.33307559
Claim Subdomain175324282023-06-22 3:15:11436 days ago1687403711IN
0x64fA880B...e22bddC46
0 ETH0.0036738716.60267607
Claim Subdomain175026342023-06-17 22:54:11440 days ago1687042451IN
0x64fA880B...e22bddC46
0 ETH0.0029948713.38160649
Claim Subdomain174998332023-06-17 13:29:47440 days ago1687008587IN
0x64fA880B...e22bddC46
0 ETH0.003366815.39442357
Update Settings ...174998302023-06-17 13:29:11440 days ago1687008551IN
0x64fA880B...e22bddC46
0 ETH0.0007060913.68833958
Add Ens Contract...174992652023-06-17 11:35:35440 days ago1687001735IN
0x64fA880B...e22bddC46
0 ETH0.0026610513.84733664
Claim Subdomain174889382023-06-16 0:48:23442 days ago1686876503IN
0x64fA880B...e22bddC46
0 ETH0.0031981814.29083813
Claim Subdomain174753982023-06-14 3:03:23444 days ago1686711803IN
0x64fA880B...e22bddC46
0 ETH0.0035850916.02054824
Claim Subdomain174443502023-06-09 18:09:11448 days ago1686334151IN
0x64fA880B...e22bddC46
0 ETH0.0040424818.25461251
Claim Subdomain174196552023-06-06 6:32:23452 days ago1686033143IN
0x64fA880B...e22bddC46
0 ETH0.0045059220.27350212
Claim Subdomain174036512023-06-04 0:19:23454 days ago1685837963IN
0x64fA880B...e22bddC46
0 ETH0.0040157617.9584064
Claim Subdomain173717492023-05-30 12:29:47458 days ago1685449787IN
0x64fA880B...e22bddC46
0 ETH0.0083539636.85698913
Claim Subdomain173717352023-05-30 12:26:59458 days ago1685449619IN
0x64fA880B...e22bddC46
0 ETH0.0086426238.12649446
Claim Subdomain172738862023-05-16 17:57:59472 days ago1684259879IN
0x64fA880B...e22bddC46
0 ETH0.0161929472.41827781
Remove Subdomain172738832023-05-16 17:57:23472 days ago1684259843IN
0x64fA880B...e22bddC46
0 ETH0.0037222866.31424997
Claim Subdomain171696652023-05-02 0:54:11487 days ago1682988851IN
0x64fA880B...e22bddC46
0 ETH0.0173632877.70233205
Claim Subdomain170309732023-04-12 9:15:11507 days ago1681290911IN
0x64fA880B...e22bddC46
0 ETH0.0041165418.12911782
Add Ens Contract...170186412023-04-10 15:21:35508 days ago1681140095IN
0x64fA880B...e22bddC46
0 ETH0.0068218535.52735537
Claim Subdomain169913592023-04-06 18:35:59512 days ago1680806159IN
0x64fA880B...e22bddC46
0 ETH0.0009993329.57828369
Claim Subdomain169913582023-04-06 18:35:47512 days ago1680806147IN
0x64fA880B...e22bddC46
0 ETH0.0065595129.62474703
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GenericEnsMapper

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion
File 1 of 20 : GenericEnsMapper.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;

import "forge-std/console.sol";
import "./structs/Config.sol";
import "./structs/NftDetails.sol";
import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol";
import "openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol";
import "openzeppelin-contracts/contracts/utils/Strings.sol";
import "ens-contracts/registry/ENS.sol";
import "ens-contracts/resolvers/profiles/IAddressResolver.sol";
import "ens-contracts/resolvers/profiles/IAddrResolver.sol";
import "ens-contracts/resolvers/profiles/ITextResolver.sol";
import "ens-contracts/resolvers/profiles/INameResolver.sol";
import "ens-contracts/wrapper/INameWrapper.sol";
import "openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol";
import "EnsPrimaryContractNamer/PrimaryEns.sol";
import "forge-std/console.sol";

contract GenericEnsMapper is
    IAddressResolver,
    IAddrResolver,
    ITextResolver,
    INameResolver,
    IERC1155Receiver,
    PrimaryEns
{
    using Strings for *;

    uint256 private constant COIN_TYPE_ETH = 60;
    address private immutable deployer;

    event addNftContractToEns(
        uint256 indexed _ensId,
        IERC721 indexed _nftContract
    );
    event updateEnsClaimConfig(
        uint256 indexed _ensId,
        bool _numericOnly,
        bool _canOverwriteSubdomains
    );

    INameWrapper public EnsNameWrapper;

    ENS public EnsContract = ENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e);
    IERC721 public EnsToken =
        IERC721(0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85);

    mapping(bytes32 => Config) public EnsToConfig;
    mapping(bytes32 => NftDetails) public SubnodeToNftDetails;
    mapping(uint256 => Config) public ParentNodeToConfig;
    mapping(uint256 => IERC721[]) public ParentNodeToNftContracts;

    mapping(bytes32 => mapping(address => mapping(uint256 => bytes))) OtherAddresses;
    mapping(bytes32 => mapping(bytes32 => string)) TextMappings;

    mapping(bytes32 => bytes32) public SubdomainClaimMap;

    event SubdomainClaimed(
        bytes32 indexed _nodeHash,
        IERC721 indexed _nftContract,
        uint96 indexed _tokenId,
        string _name
    );

    event SubdomainRemoved(
        bytes32 indexed _nodeHash,
        IERC721 indexed _nftContract,
        uint96 indexed _tokenId,
        string _name
    );

    constructor() {
        deployer = msg.sender;
    }

    function addEnsContractMapping(
        string[] calldata _domainArray,
        uint256 _ensId,
        IERC721[] calldata _nftContracts,
        bool _numericOnly,
        bool _overWriteUnusedSubdomains
    ) external payable isEnsApprovedOrOwner(_ensId) {
        bytes32 domainHash = namehashFromId(_ensId);
        address owner = EnsContract.owner(domainHash);
        require(
            owner == address(this) ||
                (owner == address(EnsNameWrapper) && owner != address(0)),
            "controller of Ens not set to contract"
        );
        require(
            getDomainHash(_domainArray) == domainHash,
            "incorrect namehash"
        );
        require(_nftContracts.length < 6, "maximum 5 contracts per ENS");
        require(_nftContracts.length > 0, "need at least 1 NFT contract");
        require(
            !(_nftContracts.length > 1 && _numericOnly),
            "Numeric only not compatible with multiple contracts"
        );

        require(
            !ParentNodeToConfig[_ensId].Initialised,
            "already been configured"
        );
        checkNftContracts(_nftContracts);
        ParentNodeToConfig[_ensId] = Config(
            true,
            _numericOnly,
            _overWriteUnusedSubdomains,
            _domainArray
        );
        ParentNodeToNftContracts[_ensId] = _nftContracts;

        //output events
        emit updateEnsClaimConfig(
            _ensId,
            _numericOnly,
            _overWriteUnusedSubdomains
        );

        for (uint256 i; i < _nftContracts.length; ) {
            emit addNftContractToEns(_ensId, _nftContracts[i]);

            unchecked {
                ++i;
            }
        }
    }

    function addContractToExistingEns(uint256 _ensId, IERC721 _nftContract)
        external
        payable
        isEnsApprovedOrOwner(_ensId)
    {
        uint256 numberOfContracts = ParentNodeToNftContracts[_ensId].length;

        require(numberOfContracts < 5, "maximum 5 contracts per ENS");
        require(numberOfContracts > 0, "ens not configured");
        require(
            !isValidNftContract(_ensId, _nftContract),
            "duplicate NFT contract"
        );
        require(
            !ParentNodeToConfig[_ensId].NumericOnly,
            "Numeric only not compatible with multiple contracts"
        );

        ParentNodeToNftContracts[_ensId].push(_nftContract);
        emit addNftContractToEns(_ensId, _nftContract);
    }

    function updateSettingsToExistingEns(
        uint256 _ensId,
        bool _numericOnly,
        bool _overwriteUnusedSubdomains
    ) external payable isEnsApprovedOrOwner(_ensId) {
        require(
            !(ParentNodeToNftContracts[_ensId].length > 1 && _numericOnly),
            "Numeric only not compatible with multiple contracts"
        );
        Config memory config = ParentNodeToConfig[_ensId];
        require(config.Initialised, "ENS not configured");

        config.NumericOnly = _numericOnly;
        config.CanOverwriteSubdomains = _overwriteUnusedSubdomains;

        ParentNodeToConfig[_ensId] = config;

        emit updateEnsClaimConfig(
            _ensId,
            _numericOnly,
            _overwriteUnusedSubdomains
        );
    }

    /**
     * @notice Claim subdomain
     * @param _ensId parent token id of the subdomain
     * @param _nftId ID of ERC-721 NFT
     * @param _nftContract address of the ERC-721 NFT contract
     * @param _label label for the subdomain
     */
    function claimSubdomain(
        uint256 _ensId,
        uint96 _nftId,
        IERC721 _nftContract,
        string memory _label
    ) external payable isNftOwner(_nftContract, _nftId) {
        bytes32 claimHash = keccak256(
            abi.encodePacked(_ensId, address(_nftContract), _nftId)
        );
        require(
            SubdomainClaimMap[claimHash] == 0x0,
            "subdomain claimed for this token"
        );
        require(isValidNftContract(_ensId, _nftContract), "Not valid contract");
        Config memory config = ParentNodeToConfig[_ensId];
        require(config.Initialised, "configuration for ENS not enabled");
        bytes32 domainHash = namehashFromId(_ensId);
        string memory label = config.NumericOnly ? _nftId.toString() : _label;
        bytes32 subnodeHash = keccak256(
            abi.encodePacked(domainHash, keccak256(abi.encodePacked(label)))
        );
        require(
            SubnodeToNftDetails[subnodeHash].ParentTokenId == 0,
            "Subdomain has already been claimed"
        );
        require(
            !EnsContract.recordExists(subnodeHash) ||
                config.CanOverwriteSubdomains,
            "not allowed previously used subdomain"
        );

        NftDetails memory details = NftDetails(
            _ensId,
            label,
            _nftContract,
            _nftId
        );

        SubnodeToNftDetails[subnodeHash] = details;

        if (EnsToken.ownerOf(_ensId) == address(EnsNameWrapper)) {
            EnsNameWrapper.setSubnodeRecord(
                domainHash,
                label,
                address(this),
                address(this),
                0, //ttl
                0, //fuses
                type(uint64).max
            );
        } else {
            EnsContract.setSubnodeRecord(
                domainHash,
                keccak256(abi.encodePacked(label)),
                address(this),
                address(this),
                0
            );
        }

        SubdomainClaimMap[claimHash] = subnodeHash;

        emit AddrChanged(subnodeHash, _nftContract.ownerOf(_nftId));
        emit AddressChanged(
            subnodeHash,
            60,
            abi.encodePacked(_nftContract.ownerOf(_nftId))
        );
        emit SubdomainClaimed(
            subnodeHash,
            _nftContract,
            _nftId,
            name(subnodeHash)
        );
    }

    /**
     * Returns the text data associated with an ENS node and key.
     * @param node The ENS node to query.
     * @param key The text data key to query.
     * @return The associated text data.
     */
    function text(bytes32 node, string calldata key)
        external
        view
        returns (string memory)
    {
        NftDetails memory details = SubnodeToNftDetails[node];
        require(details.ParentTokenId != 0, "subdomain not configured");

        if (keccak256(abi.encodePacked(key)) == keccak256("avatar")) {
            string memory str = string(
                abi.encodePacked(
                    "eip155:1/erc721:",
                    address(details.NftAddress).toHexString(),
                    "/",
                    details.NftId.toString()
                )
            );
            return str;
        } else {
            return TextMappings[node][keccak256(abi.encodePacked(key))];
        }
    }


    /**
     * @notice removes the subdomain mapping from this resolver contract
     * @param _subdomainHash namehash of the subdomain
     */
    function removeSubdomain(bytes32 _subdomainHash)
        external
        payable
        authorised(_subdomainHash)
    {
        NftDetails memory details = SubnodeToNftDetails[_subdomainHash];
        require(details.ParentTokenId != 0, "subdomain not configured");

        string memory subdomainName = name(_subdomainHash);

        delete SubdomainClaimMap[
            keccak256(
                abi.encodePacked(
                    details.ParentTokenId,
                    address(details.NftAddress),
                    details.NftId
                )
            )
        ];
        delete SubnodeToNftDetails[_subdomainHash];

        emit AddrChanged(_subdomainHash, address(0));
        emit AddressChanged(_subdomainHash, 60, abi.encodePacked(address(0)));
        emit SubdomainRemoved(
            _subdomainHash,
            details.NftAddress,
            details.NftId,
            subdomainName
        );
    }

    //this doesn't need gating as it just outputs events
    //it's here because etherscan and ens.app both use events
    //for primary naming
    function outputEvents(bytes32 _subnodeHash) external payable {
        address owner = getOwnerFromDetails(_subnodeHash);

        emit AddrChanged(_subnodeHash, owner);
        emit AddressChanged(_subnodeHash, 60, abi.encodePacked(owner));
    }

    /**
     * Sets the text data associated with an ENS node and key.
     * May only be called by the owner of the linked NFT
     * @param node The node to update.
     * @param key The key to set.
     * @param value The text data value to set.
     */
    function setText(
        bytes32 node,
        string calldata key,
        string calldata value
    ) external payable authorised(node) {
        TextMappings[node][keccak256(abi.encodePacked(key))] = value;
        emit TextChanged(node, key, value);
    }

    function addr(bytes32 node, uint256 coinType)
        external
        view
        returns (bytes memory)
    {
        address owner = getOwnerFromDetails(node);
        if (coinType == COIN_TYPE_ETH) {
            return abi.encodePacked(owner);
        } else {
            return OtherAddresses[node][owner][coinType];
        }
    }

    /**
     * Returns the address associated with an ENS node. Legacy method
     * @param node The ENS node to query.
     * @return The associated address.
     */
    function addr(bytes32 node) external view returns (address payable) {
        return payable(getOwnerFromDetails(node));
    }

    function setAddr(
        bytes32 node,
        uint256 coinType,
        bytes memory a
    ) external authorised(node) {
        emit AddressChanged(node, coinType, a);
        require(coinType != COIN_TYPE_ETH, "cannot set eth address");
        address nftOwner = getOwnerFromDetails(node);
        OtherAddresses[node][nftOwner][coinType] = a;
    }

    //ERC1155 receiver

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] calldata,
        uint256[] calldata,
        bytes calldata
    ) external pure returns (bytes4) {
        require(false, "cannot do batch transfer");
        return this.onERC1155BatchReceived.selector;
    }

    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes calldata
    ) external pure returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function supportsInterface(bytes4 interfaceId)
        external
        pure
        returns (bool)
    {
        return
            interfaceId == this.onERC1155Received.selector ||
            interfaceId == this.onERC1155BatchReceived.selector ||
            interfaceId == 0x3b3b57de || //addr
            interfaceId == 0x59d1d43c || //text
            interfaceId == 0x691f3431 || //name
            interfaceId == 0x01ffc9a7;
    }

    /**
     * Returns the name associated with an ENS node, for reverse records.
     * Defined in EIP181.
     * @param node The ENS node to query.
     * @return The associated name.
     */
    function name(bytes32 node) public view returns (string memory) {
        NftDetails memory details = SubnodeToNftDetails[node];
        string memory label = details.Label;
        string[] memory domainArray = ParentNodeToConfig[details.ParentTokenId]
            .DomainArray;

        require(
            address(details.NftAddress) != address(0),
            "subdomain not configured"
        );
        for (uint256 i; i < domainArray.length; ) {
            label = string(abi.encodePacked(label, ".", domainArray[i]));

            unchecked {
                ++i;
            }
        }

        return label;
    }

    ///['hodl', 'pcc', 'eth']
    function getDomainHash(string[] calldata _domainArray)
        public
        pure
        returns (bytes32 namehash)
    {
        namehash = 0x0;

        for (uint256 i = _domainArray.length; i > 0; ) {
            unchecked {
                --i;
            }
            namehash = keccak256(
                abi.encodePacked(
                    namehash,
                    keccak256(abi.encodePacked(_domainArray[i]))
                )
            );
        }
    }

    function checkNftContracts(IERC721[] calldata _nftContracts) private view {
        for (uint256 i; i < _nftContracts.length; ) {
            require(
                ERC165Checker.supportsInterface(
                    address(_nftContracts[i]),
                    type(IERC721).interfaceId
                ),
                "need to be IERC721 contracts"
            );

            unchecked {
                ++i;
            }
        }
    }

    function isValidNftContract(uint256 _ensId, IERC721 _nftContract)
        private
        view
        returns (bool)
    {
        IERC721[] memory contracts = ParentNodeToNftContracts[_ensId];
        uint256 total = contracts.length;
        for (uint256 i; i < total; ) {
            if (contracts[i] == _nftContract) {
                return true;
            }

            unchecked {
                ++i;
            }
        }
    }

    // ENS resolver interface methods
    //
    // ------------------------



    function getOwnerFromDetails(bytes32 _subnodeHash)
        private
        view
        returns (address)
    {
        NftDetails memory details = SubnodeToNftDetails[_subnodeHash];
        require(details.ParentTokenId != 0, "subdomain not configured");
        address owner = details.NftAddress.ownerOf(details.NftId);
        return owner;
    }

    modifier isNftOwner(IERC721 _nftContract, uint96 _id) {
        require(_nftContract.ownerOf(_id) == msg.sender, "not owner of NFT");
        _;
    }

    modifier isEnsApprovedOrOwner(uint256 _ensId) {
        try EnsToken.ownerOf(_ensId) returns (address owner) {
            require(
                owner == msg.sender ||
                    (EnsToken.isApprovedForAll(owner, msg.sender) &&
                        owner != address(EnsNameWrapper)) ||
                    (owner == address(EnsNameWrapper) &&
                        owner != address(0) &&
                        EnsNameWrapper.isTokenOwnerOrApproved(
                            bytes32(_ensId),
                            msg.sender
                        )),
                "not owner or approved"
            );
        } catch {
            require(false, "not owner or approved");
        }
        _;
    }

    function namehashFromId(uint256 _id)
        public
        view
        returns (bytes32 _namehash)
    {
        _namehash = bytes32(_id);
        if (
            !(address(EnsNameWrapper) != address(0) &&
                EnsNameWrapper.ownerOf(_id) != address(0))
        ) {
            _namehash = keccak256(
                abi.encodePacked(
                    bytes32(
                        0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae
                    ),
                    _namehash
                )
            );
        }
    }

    function setNameWrapper(address _addr) external payable {
        require(msg.sender == deployer, "only deployer");
        EnsNameWrapper = INameWrapper(_addr);
    }

    //just in case we have any funds being accidently sent to the contract
    //payable functions are cheaper than none-payable.
    function withdraw() external payable {
        payable(deployer).transfer(address(this).balance);
    }

    modifier authorised(bytes32 _subnodeHash) {
        address owner = getOwnerFromDetails(_subnodeHash);
        require(owner == msg.sender, "not owner of subdomain");
        _;
    }
}

File 2 of 20 : console.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

library console {
    address constant CONSOLE_ADDRESS =
        address(0x000000000000000000636F6e736F6c652e6c6f67);

    function _sendLogPayload(bytes memory payload) private view {
        uint256 payloadLength = payload.length;
        address consoleAddress = CONSOLE_ADDRESS;
        /// @solidity memory-safe-assembly
        assembly {
            let payloadStart := add(payload, 32)
            let r := staticcall(
                gas(),
                consoleAddress,
                payloadStart,
                payloadLength,
                0,
                0
            )
        }
    }

    function log() internal view {
        _sendLogPayload(abi.encodeWithSignature("log()"));
    }

    function logInt(int256 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(int)", p0));
    }

    function logUint(uint256 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
    }

    function logString(string memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function logBool(bool p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function logAddress(address p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function logBytes(bytes memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
    }

    function logBytes1(bytes1 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
    }

    function logBytes2(bytes2 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
    }

    function logBytes3(bytes3 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
    }

    function logBytes4(bytes4 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
    }

    function logBytes5(bytes5 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
    }

    function logBytes6(bytes6 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
    }

    function logBytes7(bytes7 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
    }

    function logBytes8(bytes8 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
    }

    function logBytes9(bytes9 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
    }

    function logBytes10(bytes10 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
    }

    function logBytes11(bytes11 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
    }

    function logBytes12(bytes12 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
    }

    function logBytes13(bytes13 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
    }

    function logBytes14(bytes14 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
    }

    function logBytes15(bytes15 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
    }

    function logBytes16(bytes16 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
    }

    function logBytes17(bytes17 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
    }

    function logBytes18(bytes18 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
    }

    function logBytes19(bytes19 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
    }

    function logBytes20(bytes20 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
    }

    function logBytes21(bytes21 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
    }

    function logBytes22(bytes22 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
    }

    function logBytes23(bytes23 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
    }

    function logBytes24(bytes24 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
    }

    function logBytes25(bytes25 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
    }

    function logBytes26(bytes26 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
    }

    function logBytes27(bytes27 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
    }

    function logBytes28(bytes28 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
    }

    function logBytes29(bytes29 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
    }

    function logBytes30(bytes30 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
    }

    function logBytes31(bytes31 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
    }

    function logBytes32(bytes32 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
    }

    function log(uint256 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
    }

    function log(string memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function log(bool p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function log(address p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function log(uint256 p0, uint256 p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
    }

    function log(uint256 p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
    }

    function log(uint256 p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
    }

    function log(uint256 p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
    }

    function log(string memory p0, uint256 p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
    }

    function log(string memory p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
    }

    function log(string memory p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
    }

    function log(string memory p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
    }

    function log(bool p0, uint256 p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
    }

    function log(bool p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
    }

    function log(bool p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
    }

    function log(bool p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
    }

    function log(address p0, uint256 p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
    }

    function log(address p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
    }

    function log(address p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
    }

    function log(address p0, address p1) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,address)", p0, p1)
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        bool p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        bool p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        bool p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        bool p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        address p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        address p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        address p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        address p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        string memory p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        string memory p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        string memory p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        string memory p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        bool p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        bool p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        bool p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        bool p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        address p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        address p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        address p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)
        );
    }

    function log(
        string memory p0,
        address p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        uint256 p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        uint256 p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        uint256 p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        uint256 p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        string memory p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        string memory p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        string memory p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        string memory p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        bool p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        bool p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        bool p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        bool p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        address p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        address p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        address p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)
        );
    }

    function log(
        bool p0,
        address p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        uint256 p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        uint256 p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        uint256 p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        uint256 p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        string memory p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        string memory p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        string memory p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        string memory p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        bool p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        bool p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        bool p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        bool p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        address p1,
        uint256 p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        address p1,
        string memory p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        address p1,
        bool p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)
        );
    }

    function log(
        address p0,
        address p1,
        address p2
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        uint256 p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,uint,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        string memory p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,string,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)
        );
    }

    function log(
        uint256 p0,
        bool p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)
        );
    }

    function log(
        uint256 p0,
        bool p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)
        );
    }

    function log(
        uint256 p0,
        bool p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)
        );
    }

    function log(
        uint256 p0,
        bool p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        bool p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,bool,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        uint256 p0,
        address p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(uint,address,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        uint256 p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,uint,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        string memory p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,string,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        bool p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,bool,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        string memory p0,
        address p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(string,address,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)
        );
    }

    function log(
        bool p0,
        uint256 p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)
        );
    }

    function log(
        bool p0,
        uint256 p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)
        );
    }

    function log(
        bool p0,
        uint256 p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)
        );
    }

    function log(
        bool p0,
        uint256 p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        uint256 p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,uint,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        string memory p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,string,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)
        );
    }

    function log(
        bool p0,
        bool p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)
        );
    }

    function log(
        bool p0,
        bool p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)
        );
    }

    function log(
        bool p0,
        bool p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)
        );
    }

    function log(
        bool p0,
        bool p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        bool p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,bool,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        bool p0,
        address p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(bool,address,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        uint256 p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,uint,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        string memory p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,string,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        bool p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,bool,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        uint256 p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,uint,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        uint256 p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,uint,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        uint256 p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,uint,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        uint256 p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,uint,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        string memory p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,string,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        string memory p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,string,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        string memory p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,string,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        string memory p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,string,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        bool p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,bool,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        bool p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,bool,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        bool p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,bool,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        bool p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,bool,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        address p2,
        uint256 p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,address,uint)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        address p2,
        string memory p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,address,string)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        address p2,
        bool p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,address,bool)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }

    function log(
        address p0,
        address p1,
        address p2,
        address p3
    ) internal view {
        _sendLogPayload(
            abi.encodeWithSignature(
                "log(address,address,address,address)",
                p0,
                p1,
                p2,
                p3
            )
        );
    }
}

File 3 of 20 : Config.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;

import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol";

struct Config {
    bool Initialised;
    bool NumericOnly;
    bool CanOverwriteSubdomains;
    string[] DomainArray;
}

File 4 of 20 : NftDetails.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;

import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol";

struct NftDetails {
    uint256 ParentTokenId;
    string Label;
    IERC721 NftAddress;
    uint96 NftId; //this actually saves about 20,000 gas in the claim subdomain method
}

File 5 of 20 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

File 6 of 20 : ERC165Checker.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Library used to query support of an interface declared via {IERC165}.
 *
 * Note that these functions return the actual result of the query: they do not
 * `revert` if an interface is not supported. It is up to the caller to decide
 * what to do in these cases.
 */
library ERC165Checker {
    // As per the EIP-165 spec, no interface should ever match 0xffffffff
    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;

    /**
     * @dev Returns true if `account` supports the {IERC165} interface,
     */
    function supportsERC165(address account) internal view returns (bool) {
        // Any contract that implements ERC165 must explicitly indicate support of
        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
        return
            supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&
            !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID);
    }

    /**
     * @dev Returns true if `account` supports the interface defined by
     * `interfaceId`. Support for {IERC165} itself is queried automatically.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
        // query support of both ERC165 as per the spec and support of _interfaceId
        return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);
    }

    /**
     * @dev Returns a boolean array where each value corresponds to the
     * interfaces passed in and whether they're supported or not. This allows
     * you to batch check interfaces for a contract where your expectation
     * is that some interfaces may not be supported.
     *
     * See {IERC165-supportsInterface}.
     *
     * _Available since v3.4._
     */
    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)
        internal
        view
        returns (bool[] memory)
    {
        // an array of booleans corresponding to interfaceIds and whether they're supported or not
        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);

        // query support of ERC165 itself
        if (supportsERC165(account)) {
            // query support of each interface in interfaceIds
            for (uint256 i = 0; i < interfaceIds.length; i++) {
                interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);
            }
        }

        return interfaceIdsSupported;
    }

    /**
     * @dev Returns true if `account` supports all the interfaces defined in
     * `interfaceIds`. Support for {IERC165} itself is queried automatically.
     *
     * Batch-querying can lead to gas savings by skipping repeated checks for
     * {IERC165} support.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
        // query support of ERC165 itself
        if (!supportsERC165(account)) {
            return false;
        }

        // query support of each interface in _interfaceIds
        for (uint256 i = 0; i < interfaceIds.length; i++) {
            if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {
                return false;
            }
        }

        // all interfaces supported
        return true;
    }

    /**
     * @notice Query if a contract implements an interface, does not check ERC165 support
     * @param account The address of the contract to query for support of an interface
     * @param interfaceId The interface identifier, as specified in ERC-165
     * @return true if the contract at account indicates support of the interface with
     * identifier interfaceId, false otherwise
     * @dev Assumes that account contains a contract that supports ERC165, otherwise
     * the behavior of this method is undefined. This precondition can be checked
     * with {supportsERC165}.
     * Interface identification is specified in ERC-165.
     */
    function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {
        // prepare call
        bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);

        // perform static call
        bool success;
        uint256 returnSize;
        uint256 returnValue;
        assembly {
            success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)
            returnSize := returndatasize()
            returnValue := mload(0x00)
        }

        return success && returnSize >= 0x20 && returnValue > 0;
    }
}

File 7 of 20 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 8 of 20 : ENS.sol
pragma solidity >=0.8.4;

interface ENS {
    // Logged when the owner of a node assigns a new owner to a subnode.
    event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);

    // Logged when the owner of a node transfers ownership to a new account.
    event Transfer(bytes32 indexed node, address owner);

    // Logged when the resolver for a node changes.
    event NewResolver(bytes32 indexed node, address resolver);

    // Logged when the TTL of a node changes
    event NewTTL(bytes32 indexed node, uint64 ttl);

    // Logged when an operator is added or removed.
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    function setRecord(
        bytes32 node,
        address owner,
        address resolver,
        uint64 ttl
    ) external;

    function setSubnodeRecord(
        bytes32 node,
        bytes32 label,
        address owner,
        address resolver,
        uint64 ttl
    ) external;

    function setSubnodeOwner(
        bytes32 node,
        bytes32 label,
        address owner
    ) external returns (bytes32);

    function setResolver(bytes32 node, address resolver) external;

    function setOwner(bytes32 node, address owner) external;

    function setTTL(bytes32 node, uint64 ttl) external;

    function setApprovalForAll(address operator, bool approved) external;

    function owner(bytes32 node) external view returns (address);

    function resolver(bytes32 node) external view returns (address);

    function ttl(bytes32 node) external view returns (uint64);

    function recordExists(bytes32 node) external view returns (bool);

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

File 9 of 20 : IAddressResolver.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;

/**
 * Interface for the new (multicoin) addr function.
 */
interface IAddressResolver {
    event AddressChanged(
        bytes32 indexed node,
        uint256 coinType,
        bytes newAddress
    );

    function addr(bytes32 node, uint256 coinType)
        external
        view
        returns (bytes memory);
}

File 10 of 20 : IAddrResolver.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;

/**
 * Interface for the legacy (ETH-only) addr function.
 */
interface IAddrResolver {
    event AddrChanged(bytes32 indexed node, address a);

    /**
     * Returns the address associated with an ENS node.
     * @param node The ENS node to query.
     * @return The associated address.
     */
    function addr(bytes32 node) external view returns (address payable);
}

File 11 of 20 : ITextResolver.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;

interface ITextResolver {
    event TextChanged(
        bytes32 indexed node,
        string indexed indexedKey,
        string key
    );

    /**
     * Returns the text data associated with an ENS node and key.
     * @param node The ENS node to query.
     * @param key The text data key to query.
     * @return The associated text data.
     */
    function text(bytes32 node, string calldata key)
        external
        view
        returns (string memory);
}

File 12 of 20 : INameResolver.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;

interface INameResolver {
    event NameChanged(bytes32 indexed node, string name);

    /**
     * Returns the name associated with an ENS node, for reverse records.
     * Defined in EIP181.
     * @param node The ENS node to query.
     * @return The associated name.
     */
    function name(bytes32 node) external view returns (string memory);
}

File 13 of 20 : INameWrapper.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "../registry/ENS.sol";
import "../ethregistrar/IBaseRegistrar.sol";
import "openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol";
import "./IMetadataService.sol";

uint32 constant CANNOT_UNWRAP = 1;
uint32 constant CANNOT_BURN_FUSES = 2;
uint32 constant CANNOT_TRANSFER = 4;
uint32 constant CANNOT_SET_RESOLVER = 8;
uint32 constant CANNOT_SET_TTL = 16;
uint32 constant CANNOT_CREATE_SUBDOMAIN = 32;
uint32 constant PARENT_CANNOT_CONTROL = 64;
uint32 constant CAN_DO_EVERYTHING = 0;

interface INameWrapper is IERC1155 {
    event NameWrapped(
        bytes32 indexed node,
        bytes name,
        address owner,
        uint32 fuses,
        uint64 expiry
    );

    event NameUnwrapped(bytes32 indexed node, address owner);

    event FusesSet(bytes32 indexed node, uint32 fuses, uint64 expiry);

    function ens() external view returns (ENS);

    function registrar() external view returns (IBaseRegistrar);

    function metadataService() external view returns (IMetadataService);

    function names(bytes32) external view returns (bytes memory);

    function wrap(
        bytes calldata name,
        address wrappedOwner,
        address resolver
    ) external;

    function wrapETH2LD(
        string calldata label,
        address wrappedOwner,
        uint32 fuses,
        uint64 _expiry,
        address resolver
    ) external returns (uint64 expiry);

    function registerAndWrapETH2LD(
        string calldata label,
        address wrappedOwner,
        uint256 duration,
        address resolver,
        uint32 fuses,
        uint64 expiry
    ) external returns (uint256 registrarExpiry);

    function renew(
        uint256 labelHash,
        uint256 duration,
        uint64 expiry
    ) external returns (uint256 expires);

    function unwrap(
        bytes32 node,
        bytes32 label,
        address owner
    ) external;

    function unwrapETH2LD(
        bytes32 label,
        address newRegistrant,
        address newController
    ) external;

    function setFuses(bytes32 node, uint32 fuses)
        external
        returns (uint32 newFuses);

    function setChildFuses(
        bytes32 parentNode,
        bytes32 labelhash,
        uint32 fuses,
        uint64 expiry
    ) external;

    function setSubnodeRecord(
        bytes32 node,
        string calldata label,
        address owner,
        address resolver,
        uint64 ttl,
        uint32 fuses,
        uint64 expiry
    ) external;

    function setRecord(
        bytes32 node,
        address owner,
        address resolver,
        uint64 ttl
    ) external;

    function setSubnodeOwner(
        bytes32 node,
        string calldata label,
        address newOwner,
        uint32 fuses,
        uint64 expiry
    ) external returns (bytes32);

    function isTokenOwnerOrApproved(bytes32 node, address addr)
        external
        view
        returns (bool);

    function setResolver(bytes32 node, address resolver) external;

    function setTTL(bytes32 node, uint64 ttl) external;

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

    function allFusesBurned(bytes32 node, uint32 fuseMask)
        external
        view
        returns (bool);
}

File 14 of 20 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 15 of 20 : PrimaryEns.sol
// SPDX-License-Identifier: MIT

import "@ens/registry/IReverseRegistrar.sol";

pragma solidity ^0.8.16;

abstract contract PrimaryEns {

    IReverseRegistrar immutable public REVERSE_REGISTRAR;

    address immutable private deployer;

    constructor(){
        deployer = msg.sender;
        REVERSE_REGISTRAR = IReverseRegistrar(0x084b1c3C81545d370f3634392De611CaaBFf8148);
    }

    /*
     * @description Set the primary name of the contract
     * @param _ens The ENS that is set to the contract address. Must be full name
     * including the .eth. Can also be a subdomain.
     */
    function setPrimaryName(string calldata _ens) public {
        require(msg.sender == deployer, "only deployer");
        REVERSE_REGISTRAR.setName(_ens);
    }
}

File 16 of 20 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @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 17 of 20 : IBaseRegistrar.sol
import "../registry/ENS.sol";
import "./IBaseRegistrar.sol";
import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol";

interface IBaseRegistrar is IERC721 {
    event ControllerAdded(address indexed controller);
    event ControllerRemoved(address indexed controller);
    event NameMigrated(
        uint256 indexed id,
        address indexed owner,
        uint256 expires
    );
    event NameRegistered(
        uint256 indexed id,
        address indexed owner,
        uint256 expires
    );
    event NameRenewed(uint256 indexed id, uint256 expires);

    // Authorises a controller, who can register and renew domains.
    function addController(address controller) external;

    // Revoke controller permission for an address.
    function removeController(address controller) external;

    // Set the resolver for the TLD this registrar manages.
    function setResolver(address resolver) external;

    // Returns the expiration timestamp of the specified label hash.
    function nameExpires(uint256 id) external view returns (uint256);

    // Returns true iff the specified name is available for registration.
    function available(uint256 id) external view returns (bool);

    /**
     * @dev Register a name.
     */
    function register(
        uint256 id,
        address owner,
        uint256 duration
    ) external returns (uint256);

    function renew(uint256 id, uint256 duration) external returns (uint256);

    /**
     * @dev Reclaim ownership of a name in ENS, if you own it in the registrar.
     */
    function reclaim(uint256 id, address owner) external;
}

File 18 of 20 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 19 of 20 : IMetadataService.sol
pragma solidity >=0.8.4;

interface IMetadataService {
    function uri(uint256) external view returns (string memory);
}

File 20 of 20 : IReverseRegistrar.sol
pragma solidity >=0.8.4;

interface IReverseRegistrar {
    function setDefaultResolver(address resolver) external;

    function claim(address owner) external returns (bytes32);

    function claimForAddr(
        address addr,
        address owner,
        address resolver
    ) external returns (bytes32);

    function claimWithResolver(address owner, address resolver)
        external
        returns (bytes32);

    function setName(string memory name) external returns (bytes32);

    function setNameForAddr(
        address addr,
        address owner,
        address resolver,
        string memory name
    ) external returns (bytes32);

    function node(address addr) external pure returns (bytes32);
}

Settings
{
  "remappings": [
    "@ens/=lib/EnsPrimaryContractNamer/lib/ens-contracts/contracts/",
    "EnsPrimaryContractNamer/=lib/EnsPrimaryContractNamer/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "ens-contracts/=lib/ens-contracts/contracts/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "script/=lib/EnsPrimaryContractNamer/script/",
    "src/=src/",
    "test/=test/",
    "src/=src/",
    "test/=test/",
    "script/=script/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 2000
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_nodeHash","type":"bytes32"},{"indexed":true,"internalType":"contract IERC721","name":"_nftContract","type":"address"},{"indexed":true,"internalType":"uint96","name":"_tokenId","type":"uint96"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"SubdomainClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_nodeHash","type":"bytes32"},{"indexed":true,"internalType":"contract IERC721","name":"_nftContract","type":"address"},{"indexed":true,"internalType":"uint96","name":"_tokenId","type":"uint96"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"SubdomainRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"TextChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_ensId","type":"uint256"},{"indexed":true,"internalType":"contract IERC721","name":"_nftContract","type":"address"}],"name":"addNftContractToEns","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_ensId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_numericOnly","type":"bool"},{"indexed":false,"internalType":"bool","name":"_canOverwriteSubdomains","type":"bool"}],"name":"updateEnsClaimConfig","type":"event"},{"inputs":[],"name":"EnsContract","outputs":[{"internalType":"contract ENS","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EnsNameWrapper","outputs":[{"internalType":"contract INameWrapper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"EnsToConfig","outputs":[{"internalType":"bool","name":"Initialised","type":"bool"},{"internalType":"bool","name":"NumericOnly","type":"bool"},{"internalType":"bool","name":"CanOverwriteSubdomains","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EnsToken","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ParentNodeToConfig","outputs":[{"internalType":"bool","name":"Initialised","type":"bool"},{"internalType":"bool","name":"NumericOnly","type":"bool"},{"internalType":"bool","name":"CanOverwriteSubdomains","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ParentNodeToNftContracts","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVERSE_REGISTRAR","outputs":[{"internalType":"contract IReverseRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"SubdomainClaimMap","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"SubnodeToNftDetails","outputs":[{"internalType":"uint256","name":"ParentTokenId","type":"uint256"},{"internalType":"string","name":"Label","type":"string"},{"internalType":"contract IERC721","name":"NftAddress","type":"address"},{"internalType":"uint96","name":"NftId","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ensId","type":"uint256"},{"internalType":"contract IERC721","name":"_nftContract","type":"address"}],"name":"addContractToExistingEns","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_domainArray","type":"string[]"},{"internalType":"uint256","name":"_ensId","type":"uint256"},{"internalType":"contract IERC721[]","name":"_nftContracts","type":"address[]"},{"internalType":"bool","name":"_numericOnly","type":"bool"},{"internalType":"bool","name":"_overWriteUnusedSubdomains","type":"bool"}],"name":"addEnsContractMapping","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ensId","type":"uint256"},{"internalType":"uint96","name":"_nftId","type":"uint96"},{"internalType":"contract IERC721","name":"_nftContract","type":"address"},{"internalType":"string","name":"_label","type":"string"}],"name":"claimSubdomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_domainArray","type":"string[]"}],"name":"getDomainHash","outputs":[{"internalType":"bytes32","name":"namehash","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"namehashFromId","outputs":[{"internalType":"bytes32","name":"_namehash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_subnodeHash","type":"bytes32"}],"name":"outputEvents","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_subdomainHash","type":"bytes32"}],"name":"removeSubdomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setNameWrapper","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_ens","type":"string"}],"name":"setPrimaryName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ensId","type":"uint256"},{"internalType":"bool","name":"_numericOnly","type":"bool"},{"internalType":"bool","name":"_overwriteUnusedSubdomains","type":"bool"}],"name":"updateSettingsToExistingEns","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60e0604052600180546001600160a01b03199081166e0c2e074ec69a0dfb2997ba6c7d2e1e17909155600280549091167357f1887a8bf19b14fc0df6fd9b2acc9af147ea8517905534801561005357600080fd5b503360a081905273084b1c3c81545d370f3634392de611caabff814860805260c05260805160a05160c05161493d6100b26000396000818161123d01526112f10152600061224801526000818161043a01526122e5015261493d6000f3fe6080604052600436106101c25760003560e01c806376356759116100f7578063bc197c8111610095578063dd6be29a11610064578063dd6be29a1461057a578063f1cb7e061461058d578063f23a6e61146105ad578063f5c9a797146105f357600080fd5b8063bc197c811461047c578063c0970267146104b5578063c431f31d14610517578063c54b55d71461053757600080fd5b80638b95dd71116100d15780638b95dd71146103f5578063903f2cbd14610415578063952899fc14610428578063ab66abd51461045c57600080fd5b806376356759146103a2578063795e3511146103b557806381755ed1146103d557600080fd5b80632f8a3fa1116101645780633ccfd60b1161013e5780633ccfd60b1461032d57806359d1d43c1461033557806368c8bbbe14610362578063691f34311461038257600080fd5b80632f8a3fa1146102e7578063371412f1146102fa5780633b3b57de1461030d57600080fd5b806310f13a8c116101a057806310f13a8c146102415780631c3eb8a9146102545780632034ab201461028c57806320d95c96146102ba57600080fd5b806301e4e1fa146101c757806301ffc9a7146101dc57806309536be414610211575b600080fd5b6101da6101d5366004613c2c565b610606565b005b3480156101e857600080fd5b506101fc6101f7366004613c45565b610960565b60405190151581526020015b60405180910390f35b34801561021d57600080fd5b5061023161022c366004613c2c565b610a80565b6040516102089493929190613cbf565b6101da61024f366004613d4f565b610b4c565b34801561026057600080fd5b5061027461026f366004613dc9565b610c69565b6040516001600160a01b039091168152602001610208565b34801561029857600080fd5b506102ac6102a7366004613e30565b610ca1565b604051908152602001610208565b3480156102c657600080fd5b506102ac6102d5366004613c2c565b60096020526000908152604090205481565b6101da6102f5366004613e80565b610d39565b6101da610308366004613ed7565b611232565b34801561031957600080fd5b50610274610328366004613c2c565b6112d9565b6101da6112e4565b34801561034157600080fd5b50610355610350366004613ef4565b61133c565b6040516102089190613f40565b34801561036e57600080fd5b506102ac61037d366004613c2c565b611604565b34801561038e57600080fd5b5061035561039d366004613c2c565b6116ea565b6101da6103b0366004613c2c565b611972565b3480156103c157600080fd5b50600254610274906001600160a01b031681565b3480156103e157600080fd5b50600154610274906001600160a01b031681565b34801561040157600080fd5b506101da610410366004613ff2565b611a2b565b6101da610423366004614056565b611b66565b34801561043457600080fd5b506102747f000000000000000000000000000000000000000000000000000000000000000081565b34801561046857600080fd5b506101da6104773660046140f6565b61223d565b34801561048857600080fd5b5061049c61049736600461412c565b612364565b6040516001600160e01b03199091168152602001610208565b3480156104c157600080fd5b506104f86104d0366004613c2c565b60056020526000908152604090205460ff808216916101008104821691620100009091041683565b6040805193151584529115156020840152151590820152606001610208565b34801561052357600080fd5b50600054610274906001600160a01b031681565b34801561054357600080fd5b506104f8610552366004613c2c565b60036020526000908152604090205460ff808216916101008104821691620100009091041683565b6101da61058836600461420b565b6123af565b34801561059957600080fd5b506103556105a8366004613dc9565b612e13565b3480156105b957600080fd5b5061049c6105c8366004614288565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b6101da610601366004614304565b612f1c565b8060006106128261336a565b90506001600160a01b03811633146106715760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e0000000000000000000060448201526064015b60405180910390fd5b600060046000858152602001908152602001600020604051806080016040529081600082015481526020016001820180546106ab90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790614334565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036107b15760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b60006107bc856116ea565b9050600960008360000151846040015185606001516040516020016108209392919092835260609190911b6bffffffffffffffffffffffff1916602083015260a01b73ffffffffffffffffffffffffffffffffffffffff1916603482015260400190565b60408051601f19818403018152918152815160209283012083528282019390935290820160009081208190558781526004909152908120818155906108686001830182613b02565b50600060029190910181905560405190815285907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd29060200160405180910390a26040516000602082015285907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c9060340160408051601f19818403018152908290526108f8929161436e565b60405180910390a281606001516bffffffffffffffffffffffff1682604001516001600160a01b0316867f02fcfbb0f83c2ddc0e1ba4d4d1a33ac37b67c33bb0e11cf9967a8027f1f0abf6846040516109519190613f40565b60405180910390a45050505050565b60006001600160e01b031982167ff23a6e610000000000000000000000000000000000000000000000000000000014806109c357506001600160e01b031982167fbc197c8100000000000000000000000000000000000000000000000000000000145b806109f757507f3b3b57de000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a2b57507f59d1d43c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a5f57507f691f3431000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a7a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60046020526000908152604090208054600182018054919291610aa290614334565b80601f0160208091040260200160405190810160405280929190818152602001828054610ace90614334565b8015610b1b5780601f10610af057610100808354040283529160200191610b1b565b820191906000526020600020905b815481529060010190602001808311610afe57829003601f168201915b505050600290930154919250506001600160a01b038116906bffffffffffffffffffffffff600160a01b9091041684565b846000610b588261336a565b90506001600160a01b0381163314610bb25760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e000000000000000000006044820152606401610668565b8383600860008a815260200190815260200160002060008989604051602001610bdc929190614387565b6040516020818303038152906040528051906020012081526020019081526020016000209182610c0d9291906143e5565b508585604051610c1e929190614387565b6040518091039020877fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a75508686604051610c589291906144a6565b60405180910390a350505050505050565b60066020528160005260406000208181548110610c8557600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000815b8015610d32576000190181848483818110610cc257610cc26144d5565b9050602002810190610cd491906144eb565b604051602001610ce5929190614387565b60405160208183030381529060405280519060200120604051602001610d15929190918252602082015260400190565b604051602081830303815290604052805190602001209150610ca5565b5092915050565b6002546040516331a9108f60e11b81526004810185905284916001600160a01b031690636352211e90602401602060405180830381865afa925050508015610d9e575060408051601f3d908101601f19168201909252610d9b91810190614550565b60015b610dea5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b038116331480610e8a575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa158015610e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e70919061456d565b8015610e8a57506000546001600160a01b03828116911614155b80610f2f57506000546001600160a01b038281169116148015610eb557506001600160a01b03811615155b8015610f2f575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa158015610f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2f919061456d565b610f7b5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b506000848152600660205260409020546001108015610f975750825b1561100a5760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008481526005602090815260408083208151608081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290879084015b8282101561111b57838290600052602060002001805461108e90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba90614334565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b50505050508152602001906001019061106f565b5050509152505080519091506111735760405162461bcd60e51b815260206004820152601260248201527f454e53206e6f7420636f6e6669677572656400000000000000000000000000006044820152606401610668565b831515602080830191825284151560408085019182526000898152600584522084518154945192511515620100000262ff0000199315156101000261ff00199215159290921661ffff19909616959095171791909116929092178255606083015180518493926111ea926001850192910190613b3c565b505060408051861515815285151560208201528792507f96b9f267bb478ccc44b985fdcd78589641ddd29e2368e46cac3fe84a41db5735910160405180910390a25050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112aa5760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c79206465706c6f796572000000000000000000000000000000000000006044820152606401610668565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610a7a8261336a565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016904780156108fc02916000818181858888f19350505050158015611339573d6000803e3d6000fd5b50565b600083815260046020908152604080832081516080810190925280548252600181018054606095948401919061137190614334565b80601f016020809104026020016040519081016040528092919081815260200182805461139d90614334565b80156113ea5780601f106113bf576101008083540402835291602001916113ea565b820191906000526020600020905b8154815290600101906020018083116113cd57829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036114775760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b7fd1f86c93d831119ad98fe983e643a7431e4ac992e3ead6e3007f4dd1adf6634384846040516020016114ab929190614387565b60405160208183030381529060405280519060200120036115245760006114de82604001516001600160a01b0316613530565b6114f983606001516bffffffffffffffffffffffff16613546565b60405160200161150a92919061458a565b60408051601f1981840301815291905292506115fd915050565b600860008681526020019081526020016000206000858560405160200161154c929190614387565b604051602081830303815290604052805190602001208152602001908152602001600020805461157b90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546115a790614334565b80156115f45780601f106115c9576101008083540402835291602001916115f4565b820191906000526020600020905b8154815290600101906020018083116115d757829003601f168201915b50505050509150505b9392505050565b60005481906001600160a01b0316158015906116955750600080546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e90602401602060405180830381865afa158015611665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116899190614550565b6001600160a01b031614155b6116e557604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae60208201529081018290526060016040516020818303038152906040528051906020012090505b919050565b600081815260046020908152604080832081516080810190925280548252600181018054606095948401919061171f90614334565b80601f016020809104026020016040519081016040528092919081815260200182805461174b90614334565b80156117985780601f1061176d57610100808354040283529160200191611798565b820191906000526020600020905b81548152906001019060200180831161177b57829003601f168201915b5050509183525050600291909101546001600160a01b038116602080840191909152600160a01b9091046bffffffffffffffffffffffff1660409283015282810151835160009081526005835283812060010180548551818602810186019096528086529596509194909392849084015b828210156118b557838290600052602060002001805461182890614334565b80601f016020809104026020016040519081016040528092919081815260200182805461185490614334565b80156118a15780601f10611876576101008083540402835291602001916118a1565b820191906000526020600020905b81548152906001019060200180831161188457829003601f168201915b505050505081526020019060010190611809565b5050506040850151919250506001600160a01b03166119165760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b60005b81518110156119685782828281518110611935576119356144d5565b602002602001015160405160200161194e92919061460b565b60408051601f198184030181529190529250600101611919565b5090949350505050565b600061197d8261336a565b6040516001600160a01b038216815290915082907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd29060200160405180910390a26040516bffffffffffffffffffffffff19606083901b16602082015282907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c9060340160408051601f1981840301815290829052611a1f929161436e565b60405180910390a25050565b826000611a378261336a565b90506001600160a01b0381163314611a915760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e000000000000000000006044820152606401610668565b847f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528585604051611ac392919061436e565b60405180910390a2603c8403611b1b5760405162461bcd60e51b815260206004820152601660248201527f63616e6e6f7420736574206574682061646472657373000000000000000000006044820152606401610668565b6000611b268661336a565b60008781526007602090815260408083206001600160a01b038516845282528083208984529091529020909150611b5d8582614663565b50505050505050565b6002546040516331a9108f60e11b81526004810187905286916001600160a01b031690636352211e90602401602060405180830381865afa925050508015611bcb575060408051601f3d908101601f19168201909252611bc891810190614550565b60015b611c175760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b038116331480611cb7575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa158015611c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9d919061456d565b8015611cb757506000546001600160a01b03828116911614155b80611d5c57506000546001600160a01b038281169116148015611ce257506001600160a01b03811615155b8015611d5c575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa158015611d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5c919061456d565b611da85760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b506000611db487611604565b6001546040517f02571be3000000000000000000000000000000000000000000000000000000008152600481018390529192506000916001600160a01b03909116906302571be390602401602060405180830381865afa158015611e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e409190614550565b90506001600160a01b038116301480611e7957506000546001600160a01b038281169116148015611e7957506001600160a01b03811615155b611eeb5760405162461bcd60e51b815260206004820152602560248201527f636f6e74726f6c6c6572206f6620456e73206e6f742073657420746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610668565b81611ef68b8b610ca1565b14611f435760405162461bcd60e51b815260206004820152601260248201527f696e636f7272656374206e616d656861736800000000000000000000000000006044820152606401610668565b60068610611f935760405162461bcd60e51b815260206004820152601b60248201527f6d6178696d756d203520636f6e7472616374732070657220454e5300000000006044820152606401610668565b85611fe05760405162461bcd60e51b815260206004820152601c60248201527f6e656564206174206c656173742031204e465420636f6e7472616374000000006044820152606401610668565b600186118015611fed5750845b156120605760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008881526005602052604090205460ff16156120bf5760405162461bcd60e51b815260206004820152601760248201527f616c7265616479206265656e20636f6e666967757265640000000000000000006044820152606401610668565b6120c9878761367b565b6040805160808101825260018152861515602082015285151591810191909152606081016120f78b8d614723565b90526000898152600560209081526040918290208351815485840151948601511515620100000262ff0000199515156101000261ff00199315159390931661ffff19909216919091179190911793909316929092178255606083015180516121659260018501920190613b3c565b5050506000888152600660205260409020612181908888613b92565b50604080518615158152851515602082015289917f96b9f267bb478ccc44b985fdcd78589641ddd29e2368e46cac3fe84a41db5735910160405180910390a260005b86811015612230578787828181106121dd576121dd6144d5565b90506020020160208101906121f29190613ed7565b6001600160a01b0316897f0f5dac387d69ef206cfbc11444ee653b27a6cbcf9c37b1897a34e4028e5b6ae460405160405180910390a36001016121c3565b5050505050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146122b55760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c79206465706c6f796572000000000000000000000000000000000000006044820152606401610668565b6040517fc47f00270000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c47f00279061231c90859085906004016144a6565b6020604051808303816000875af115801561233b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235f91906147a7565b505050565b60405162461bcd60e51b815260206004820152601860248201527f63616e6e6f7420646f206261746368207472616e7366657200000000000000006044820152600090606401610668565b6040516331a9108f60e11b81526bffffffffffffffffffffffff841660048201528290849033906001600160a01b03841690636352211e90602401602060405180830381865afa158015612407573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242b9190614550565b6001600160a01b0316146124815760405162461bcd60e51b815260206004820152601060248201527f6e6f74206f776e6572206f66204e4654000000000000000000000000000000006044820152606401610668565b60008685876040516020016124d59392919092835260609190911b6bffffffffffffffffffffffff1916602083015260a01b73ffffffffffffffffffffffffffffffffffffffff1916603482015260400190565b60408051601f198184030181529181528151602092830120600081815260099093529120549091501561254a5760405162461bcd60e51b815260206004820181905260248201527f737562646f6d61696e20636c61696d656420666f72207468697320746f6b656e6044820152606401610668565b612554878661372a565b6125a05760405162461bcd60e51b815260206004820152601260248201527f4e6f742076616c696420636f6e747261637400000000000000000000000000006044820152606401610668565b60008781526005602090815260408083208151608081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156126b157838290600052602060002001805461262490614334565b80601f016020809104026020016040519081016040528092919081815260200182805461265090614334565b801561269d5780601f106126725761010080835404028352916020019161269d565b820191906000526020600020905b81548152906001019060200180831161268057829003601f168201915b505050505081526020019060010190612605565b50505091525050805190915061272f5760405162461bcd60e51b815260206004820152602160248201527f636f6e66696775726174696f6e20666f7220454e53206e6f7420656e61626c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610668565b600061273a89611604565b90506000826020015161274d5786612764565b612764896bffffffffffffffffffffffff16613546565b90506000828260405160200161277a91906147c0565b604051602081830303815290604052805190602001206040516020016127aa929190918252602082015260400190565b60408051601f19818403018152918152815160209283012060008181526004909352912054909150156128455760405162461bcd60e51b815260206004820152602260248201527f537562646f6d61696e2068617320616c7265616479206265656e20636c61696d60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610668565b6001546040517ff79fe538000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f79fe53890602401602060405180830381865afa1580156128a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128cb919061456d565b15806128d8575083604001515b61294a5760405162461bcd60e51b815260206004820152602560248201527f6e6f7420616c6c6f7765642070726576696f75736c792075736564207375626460448201527f6f6d61696e0000000000000000000000000000000000000000000000000000006064820152608401610668565b604080516080810182528c815260208082018581526001600160a01b038d16838501526bffffffffffffffffffffffff8e166060840152600085815260049092529290208151815591519091829160018201906129a79082614663565b5060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555090505060008054906101000a90046001600160a01b03166001600160a01b0316600260009054906101000a90046001600160a01b03166001600160a01b0316636352211e8e6040518263ffffffff1660e01b8152600401612a6f91815260200190565b602060405180830381865afa158015612a8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab09190614550565b6001600160a01b031603612b5257600080546040517f24c1af440000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916324c1af4491612b1b91889188913091829190819067ffffffffffffffff906004016147dc565b600060405180830381600087803b158015612b3557600080fd5b505af1158015612b49573d6000803e3d6000fd5b50505050612bfe565b6001546040516001600160a01b0390911690635ef2c7f0908690612b7a9087906020016147c0565b60408051601f198184030181529082905280516020909101206001600160e01b031960e085901b16825260048201929092526024810191909152306044820181905260648201526000608482015260a401600060405180830381600087803b158015612be557600080fd5b505af1158015612bf9573d6000803e3d6000fd5b505050505b60008681526009602052604090819020839055516331a9108f60e11b81526bffffffffffffffffffffffff8c16600482015282907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2906001600160a01b038d1690636352211e90602401602060405180830381865afa158015612c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca99190614550565b6040516001600160a01b03909116815260200160405180910390a26040516331a9108f60e11b81526bffffffffffffffffffffffff8c16600482015282907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c906001600160a01b038e1690636352211e90602401602060405180830381865afa158015612d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d619190614550565b604051602001612d89919060609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052612da4929161436e565b60405180910390a28a6bffffffffffffffffffffffff168a6001600160a01b0316837fd272cd576ecd5a658f613a3d9f818449d49fceff169ccc9d9003fe5b36ca4772612df0866116ea565b604051612dfd9190613f40565b60405180910390a4505050505050505050505050565b60606000612e208461336a565b9050603c8303612e60576040516bffffffffffffffffffffffff19606083901b166020820152603401604051602081830303815290604052915050610a7a565b60008481526007602090815260408083206001600160a01b0385168452825280832086845290915290208054612e9590614334565b80601f0160208091040260200160405190810160405280929190818152602001828054612ec190614334565b8015612f0e5780601f10612ee357610100808354040283529160200191612f0e565b820191906000526020600020905b815481529060010190602001808311612ef157829003601f168201915b505050505091505092915050565b6002546040516331a9108f60e11b81526004810184905283916001600160a01b031690636352211e90602401602060405180830381865afa925050508015612f81575060408051601f3d908101601f19168201909252612f7e91810190614550565b60015b612fcd5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b03811633148061306d575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa15801561302f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613053919061456d565b801561306d57506000546001600160a01b03828116911614155b8061311257506000546001600160a01b03828116911614801561309857506001600160a01b03811615155b8015613112575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa1580156130ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613112919061456d565b61315e5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b50600083815260066020526040902054600581106131be5760405162461bcd60e51b815260206004820152601b60248201527f6d6178696d756d203520636f6e7472616374732070657220454e5300000000006044820152606401610668565b6000811161320e5760405162461bcd60e51b815260206004820152601260248201527f656e73206e6f7420636f6e6669677572656400000000000000000000000000006044820152606401610668565b613218848461372a565b156132655760405162461bcd60e51b815260206004820152601660248201527f6475706c6963617465204e465420636f6e7472616374000000000000000000006044820152606401610668565b600084815260056020526040902054610100900460ff16156132ef5760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008481526006602090815260408083208054600181018255908452918320909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387169081179091559051909186917f0f5dac387d69ef206cfbc11444ee653b27a6cbcf9c37b1897a34e4028e5b6ae49190a350505050565b60008181526004602090815260408083208151608081019092528054825260018101805485948401919061339d90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546133c990614334565b80156134165780601f106133eb57610100808354040283529160200191613416565b820191906000526020600020905b8154815290600101906020018083116133f957829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036134a35760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b604080820151606083015191516331a9108f60e11b81526bffffffffffffffffffffffff90921660048301526000916001600160a01b0390911690636352211e90602401602060405180830381865afa158015613504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135289190614550565b949350505050565b6060610a7a6001600160a01b03831660146137ec565b60608160000361358957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156135b3578061359d81614853565b91506135ac9050600a83614883565b915061358d565b60008167ffffffffffffffff8111156135ce576135ce613f53565b6040519080825280601f01601f1916602001820160405280156135f8576020820181803683370190505b5090505b84156135285761360d600183614897565b915061361a600a866148aa565b6136259060306148be565b60f81b81838151811061363a5761363a6144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613674600a86614883565b94506135fc565b60005b8181101561235f576136d683838381811061369b5761369b6144d5565b90506020020160208101906136b09190613ed7565b7f80ac58cd00000000000000000000000000000000000000000000000000000000613a15565b6137225760405162461bcd60e51b815260206004820152601c60248201527f6e65656420746f206265204945524337323120636f6e747261637473000000006044820152606401610668565b60010161367e565b60008281526006602090815260408083208054825181850281018501909352808352849383018282801561378757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613769575b505083519394506000925050505b818110156137e357846001600160a01b03168382815181106137b9576137b96144d5565b60200260200101516001600160a01b0316036137db5760019350505050610a7a565b600101613795565b50505092915050565b606060006137fb8360026148d1565b6138069060026148be565b67ffffffffffffffff81111561381e5761381e613f53565b6040519080825280601f01601f191660200182016040528015613848576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061387f5761387f6144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106138e2576138e26144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061391e8460026148d1565b6139299060016148be565b90505b60018111156139c6577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061396a5761396a6144d5565b1a60f81b828281518110613980576139806144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936139bf816148f0565b905061392c565b5083156115fd5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610668565b6000613a2083613a31565b80156115fd57506115fd8383613a64565b6000613a44826301ffc9a760e01b613a64565b8015610a7a5750613a5d826001600160e01b0319613a64565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015613aeb575060208210155b8015613af75750600081115b979650505050505050565b508054613b0e90614334565b6000825580601f10613b1e575050565b601f0160209004906000526020600020908101906113399190613bfa565b828054828255906000526020600020908101928215613b82579160200282015b82811115613b825782518290613b729082614663565b5091602001919060010190613b5c565b50613b8e929150613c0f565b5090565b828054828255906000526020600020908101928215613bf2579160200282015b82811115613bf257815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03843516178255602090920191600190910190613bb2565b50613b8e9291505b5b80821115613b8e5760008155600101613bfb565b80821115613b8e576000613c238282613b02565b50600101613c0f565b600060208284031215613c3e57600080fd5b5035919050565b600060208284031215613c5757600080fd5b81356001600160e01b0319811681146115fd57600080fd5b60005b83811015613c8a578181015183820152602001613c72565b50506000910152565b60008151808452613cab816020860160208601613c6f565b601f01601f19169290920160200192915050565b848152608060208201526000613cd86080830186613c93565b90506001600160a01b03841660408301526bffffffffffffffffffffffff8316606083015295945050505050565b60008083601f840112613d1857600080fd5b50813567ffffffffffffffff811115613d3057600080fd5b602083019150836020828501011115613d4857600080fd5b9250929050565b600080600080600060608688031215613d6757600080fd5b85359450602086013567ffffffffffffffff80821115613d8657600080fd5b613d9289838a01613d06565b90965094506040880135915080821115613dab57600080fd5b50613db888828901613d06565b969995985093965092949392505050565b60008060408385031215613ddc57600080fd5b50508035926020909101359150565b60008083601f840112613dfd57600080fd5b50813567ffffffffffffffff811115613e1557600080fd5b6020830191508360208260051b8501011115613d4857600080fd5b60008060208385031215613e4357600080fd5b823567ffffffffffffffff811115613e5a57600080fd5b613e6685828601613deb565b90969095509350505050565b801515811461133957600080fd5b600080600060608486031215613e9557600080fd5b833592506020840135613ea781613e72565b91506040840135613eb781613e72565b809150509250925092565b6001600160a01b038116811461133957600080fd5b600060208284031215613ee957600080fd5b81356115fd81613ec2565b600080600060408486031215613f0957600080fd5b83359250602084013567ffffffffffffffff811115613f2757600080fd5b613f3386828701613d06565b9497909650939450505050565b6020815260006115fd6020830184613c93565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613f9257613f92613f53565b604052919050565b600067ffffffffffffffff831115613fb457613fb4613f53565b613fc76020601f19601f86011601613f69565b9050828152838383011115613fdb57600080fd5b828260208301376000602084830101529392505050565b60008060006060848603121561400757600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561402c57600080fd5b8401601f8101861361403d57600080fd5b61404c86823560208401613f9a565b9150509250925092565b600080600080600080600060a0888a03121561407157600080fd5b873567ffffffffffffffff8082111561408957600080fd5b6140958b838c01613deb565b909950975060208a0135965060408a01359150808211156140b557600080fd5b506140c28a828b01613deb565b90955093505060608801356140d681613e72565b915060808801356140e681613e72565b8091505092959891949750929550565b6000806020838503121561410957600080fd5b823567ffffffffffffffff81111561412057600080fd5b613e6685828601613d06565b60008060008060008060008060a0898b03121561414857600080fd5b883561415381613ec2565b9750602089013561416381613ec2565b9650604089013567ffffffffffffffff8082111561418057600080fd5b61418c8c838d01613deb565b909850965060608b01359150808211156141a557600080fd5b6141b18c838d01613deb565b909650945060808b01359150808211156141ca57600080fd5b506141d78b828c01613d06565b999c989b5096995094979396929594505050565b600082601f8301126141fc57600080fd5b6115fd83833560208501613f9a565b6000806000806080858703121561422157600080fd5b8435935060208501356bffffffffffffffffffffffff8116811461424457600080fd5b9250604085013561425481613ec2565b9150606085013567ffffffffffffffff81111561427057600080fd5b61427c878288016141eb565b91505092959194509250565b60008060008060008060a087890312156142a157600080fd5b86356142ac81613ec2565b955060208701356142bc81613ec2565b94506040870135935060608701359250608087013567ffffffffffffffff8111156142e657600080fd5b6142f289828a01613d06565b979a9699509497509295939492505050565b6000806040838503121561431757600080fd5b82359150602083013561432981613ec2565b809150509250929050565b600181811c9082168061434857607f821691505b60208210810361436857634e487b7160e01b600052602260045260246000fd5b50919050565b8281526040602082015260006135286040830184613c93565b8183823760009101908152919050565b601f82111561235f57600081815260208120601f850160051c810160208610156143be5750805b601f850160051c820191505b818110156143dd578281556001016143ca565b505050505050565b67ffffffffffffffff8311156143fd576143fd613f53565b6144118361440b8354614334565b83614397565b6000601f841160018114614445576000851561442d5750838201355b600019600387901b1c1916600186901b17835561449f565b600083815260209020601f19861690835b828110156144765786850135825560209485019460019092019101614456565b50868210156144935760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261452057600080fd5b83018035915067ffffffffffffffff82111561453b57600080fd5b602001915036819003821315613d4857600080fd5b60006020828403121561456257600080fd5b81516115fd81613ec2565b60006020828403121561457f57600080fd5b81516115fd81613e72565b7f6569703135353a312f6572633732313a000000000000000000000000000000008152600083516145c2816010850160208801613c6f565b7f2f0000000000000000000000000000000000000000000000000000000000000060109184019182015283516145ff816011840160208801613c6f565b01601101949350505050565b6000835161461d818460208801613c6f565b7f2e000000000000000000000000000000000000000000000000000000000000009083019081528351614657816001840160208801613c6f565b01600101949350505050565b815167ffffffffffffffff81111561467d5761467d613f53565b6146918161468b8454614334565b84614397565b602080601f8311600181146146c657600084156146ae5750858301515b600019600386901b1c1916600185901b1785556143dd565b600085815260208120601f198616915b828110156146f5578886015182559484019460019091019084016146d6565b50858210156147135787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600067ffffffffffffffff8084111561473e5761473e613f53565b8360051b602061474f818301613f69565b86815291850191818101903684111561476757600080fd5b865b8481101561479b578035868111156147815760008081fd5b61478d36828b016141eb565b845250918301918301614769565b50979650505050505050565b6000602082840312156147b957600080fd5b5051919050565b600082516147d2818460208701613c6f565b9190910192915050565b87815260e0602082015260006147f560e0830189613c93565b6001600160a01b03978816604084015295909616606082015267ffffffffffffffff938416608082015263ffffffff9290921660a083015290911660c0909101529392505050565b634e487b7160e01b600052601160045260246000fd5b600060001982036148665761486661483d565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826148925761489261486d565b500490565b81810381811115610a7a57610a7a61483d565b6000826148b9576148b961486d565b500690565b80820180821115610a7a57610a7a61483d565b60008160001904831182151516156148eb576148eb61483d565b500290565b6000816148ff576148ff61483d565b50600019019056fea264697066735822122037579578826abdbb54585150f526ef108409f434a19709ee6e525f4001e4631064736f6c63430008100033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806376356759116100f7578063bc197c8111610095578063dd6be29a11610064578063dd6be29a1461057a578063f1cb7e061461058d578063f23a6e61146105ad578063f5c9a797146105f357600080fd5b8063bc197c811461047c578063c0970267146104b5578063c431f31d14610517578063c54b55d71461053757600080fd5b80638b95dd71116100d15780638b95dd71146103f5578063903f2cbd14610415578063952899fc14610428578063ab66abd51461045c57600080fd5b806376356759146103a2578063795e3511146103b557806381755ed1146103d557600080fd5b80632f8a3fa1116101645780633ccfd60b1161013e5780633ccfd60b1461032d57806359d1d43c1461033557806368c8bbbe14610362578063691f34311461038257600080fd5b80632f8a3fa1146102e7578063371412f1146102fa5780633b3b57de1461030d57600080fd5b806310f13a8c116101a057806310f13a8c146102415780631c3eb8a9146102545780632034ab201461028c57806320d95c96146102ba57600080fd5b806301e4e1fa146101c757806301ffc9a7146101dc57806309536be414610211575b600080fd5b6101da6101d5366004613c2c565b610606565b005b3480156101e857600080fd5b506101fc6101f7366004613c45565b610960565b60405190151581526020015b60405180910390f35b34801561021d57600080fd5b5061023161022c366004613c2c565b610a80565b6040516102089493929190613cbf565b6101da61024f366004613d4f565b610b4c565b34801561026057600080fd5b5061027461026f366004613dc9565b610c69565b6040516001600160a01b039091168152602001610208565b34801561029857600080fd5b506102ac6102a7366004613e30565b610ca1565b604051908152602001610208565b3480156102c657600080fd5b506102ac6102d5366004613c2c565b60096020526000908152604090205481565b6101da6102f5366004613e80565b610d39565b6101da610308366004613ed7565b611232565b34801561031957600080fd5b50610274610328366004613c2c565b6112d9565b6101da6112e4565b34801561034157600080fd5b50610355610350366004613ef4565b61133c565b6040516102089190613f40565b34801561036e57600080fd5b506102ac61037d366004613c2c565b611604565b34801561038e57600080fd5b5061035561039d366004613c2c565b6116ea565b6101da6103b0366004613c2c565b611972565b3480156103c157600080fd5b50600254610274906001600160a01b031681565b3480156103e157600080fd5b50600154610274906001600160a01b031681565b34801561040157600080fd5b506101da610410366004613ff2565b611a2b565b6101da610423366004614056565b611b66565b34801561043457600080fd5b506102747f000000000000000000000000084b1c3c81545d370f3634392de611caabff814881565b34801561046857600080fd5b506101da6104773660046140f6565b61223d565b34801561048857600080fd5b5061049c61049736600461412c565b612364565b6040516001600160e01b03199091168152602001610208565b3480156104c157600080fd5b506104f86104d0366004613c2c565b60056020526000908152604090205460ff808216916101008104821691620100009091041683565b6040805193151584529115156020840152151590820152606001610208565b34801561052357600080fd5b50600054610274906001600160a01b031681565b34801561054357600080fd5b506104f8610552366004613c2c565b60036020526000908152604090205460ff808216916101008104821691620100009091041683565b6101da61058836600461420b565b6123af565b34801561059957600080fd5b506103556105a8366004613dc9565b612e13565b3480156105b957600080fd5b5061049c6105c8366004614288565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b6101da610601366004614304565b612f1c565b8060006106128261336a565b90506001600160a01b03811633146106715760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e0000000000000000000060448201526064015b60405180910390fd5b600060046000858152602001908152602001600020604051806080016040529081600082015481526020016001820180546106ab90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546106d790614334565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036107b15760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b60006107bc856116ea565b9050600960008360000151846040015185606001516040516020016108209392919092835260609190911b6bffffffffffffffffffffffff1916602083015260a01b73ffffffffffffffffffffffffffffffffffffffff1916603482015260400190565b60408051601f19818403018152918152815160209283012083528282019390935290820160009081208190558781526004909152908120818155906108686001830182613b02565b50600060029190910181905560405190815285907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd29060200160405180910390a26040516000602082015285907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c9060340160408051601f19818403018152908290526108f8929161436e565b60405180910390a281606001516bffffffffffffffffffffffff1682604001516001600160a01b0316867f02fcfbb0f83c2ddc0e1ba4d4d1a33ac37b67c33bb0e11cf9967a8027f1f0abf6846040516109519190613f40565b60405180910390a45050505050565b60006001600160e01b031982167ff23a6e610000000000000000000000000000000000000000000000000000000014806109c357506001600160e01b031982167fbc197c8100000000000000000000000000000000000000000000000000000000145b806109f757507f3b3b57de000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a2b57507f59d1d43c000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a5f57507f691f3431000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610a7a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60046020526000908152604090208054600182018054919291610aa290614334565b80601f0160208091040260200160405190810160405280929190818152602001828054610ace90614334565b8015610b1b5780601f10610af057610100808354040283529160200191610b1b565b820191906000526020600020905b815481529060010190602001808311610afe57829003601f168201915b505050600290930154919250506001600160a01b038116906bffffffffffffffffffffffff600160a01b9091041684565b846000610b588261336a565b90506001600160a01b0381163314610bb25760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e000000000000000000006044820152606401610668565b8383600860008a815260200190815260200160002060008989604051602001610bdc929190614387565b6040516020818303038152906040528051906020012081526020019081526020016000209182610c0d9291906143e5565b508585604051610c1e929190614387565b6040518091039020877fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a75508686604051610c589291906144a6565b60405180910390a350505050505050565b60066020528160005260406000208181548110610c8557600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000815b8015610d32576000190181848483818110610cc257610cc26144d5565b9050602002810190610cd491906144eb565b604051602001610ce5929190614387565b60405160208183030381529060405280519060200120604051602001610d15929190918252602082015260400190565b604051602081830303815290604052805190602001209150610ca5565b5092915050565b6002546040516331a9108f60e11b81526004810185905284916001600160a01b031690636352211e90602401602060405180830381865afa925050508015610d9e575060408051601f3d908101601f19168201909252610d9b91810190614550565b60015b610dea5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b038116331480610e8a575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa158015610e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e70919061456d565b8015610e8a57506000546001600160a01b03828116911614155b80610f2f57506000546001600160a01b038281169116148015610eb557506001600160a01b03811615155b8015610f2f575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa158015610f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2f919061456d565b610f7b5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b506000848152600660205260409020546001108015610f975750825b1561100a5760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008481526005602090815260408083208151608081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290879084015b8282101561111b57838290600052602060002001805461108e90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba90614334565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b50505050508152602001906001019061106f565b5050509152505080519091506111735760405162461bcd60e51b815260206004820152601260248201527f454e53206e6f7420636f6e6669677572656400000000000000000000000000006044820152606401610668565b831515602080830191825284151560408085019182526000898152600584522084518154945192511515620100000262ff0000199315156101000261ff00199215159290921661ffff19909616959095171791909116929092178255606083015180518493926111ea926001850192910190613b3c565b505060408051861515815285151560208201528792507f96b9f267bb478ccc44b985fdcd78589641ddd29e2368e46cac3fe84a41db5735910160405180910390a25050505050565b336001600160a01b037f000000000000000000000000082fc1776d44f69988c475958a0505a5bc2cd77b16146112aa5760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c79206465706c6f796572000000000000000000000000000000000000006044820152606401610668565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610a7a8261336a565b6040516001600160a01b037f000000000000000000000000082fc1776d44f69988c475958a0505a5bc2cd77b16904780156108fc02916000818181858888f19350505050158015611339573d6000803e3d6000fd5b50565b600083815260046020908152604080832081516080810190925280548252600181018054606095948401919061137190614334565b80601f016020809104026020016040519081016040528092919081815260200182805461139d90614334565b80156113ea5780601f106113bf576101008083540402835291602001916113ea565b820191906000526020600020905b8154815290600101906020018083116113cd57829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036114775760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b7fd1f86c93d831119ad98fe983e643a7431e4ac992e3ead6e3007f4dd1adf6634384846040516020016114ab929190614387565b60405160208183030381529060405280519060200120036115245760006114de82604001516001600160a01b0316613530565b6114f983606001516bffffffffffffffffffffffff16613546565b60405160200161150a92919061458a565b60408051601f1981840301815291905292506115fd915050565b600860008681526020019081526020016000206000858560405160200161154c929190614387565b604051602081830303815290604052805190602001208152602001908152602001600020805461157b90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546115a790614334565b80156115f45780601f106115c9576101008083540402835291602001916115f4565b820191906000526020600020905b8154815290600101906020018083116115d757829003601f168201915b50505050509150505b9392505050565b60005481906001600160a01b0316158015906116955750600080546040516331a9108f60e11b8152600481018590526001600160a01b0390911690636352211e90602401602060405180830381865afa158015611665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116899190614550565b6001600160a01b031614155b6116e557604080517f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae60208201529081018290526060016040516020818303038152906040528051906020012090505b919050565b600081815260046020908152604080832081516080810190925280548252600181018054606095948401919061171f90614334565b80601f016020809104026020016040519081016040528092919081815260200182805461174b90614334565b80156117985780601f1061176d57610100808354040283529160200191611798565b820191906000526020600020905b81548152906001019060200180831161177b57829003601f168201915b5050509183525050600291909101546001600160a01b038116602080840191909152600160a01b9091046bffffffffffffffffffffffff1660409283015282810151835160009081526005835283812060010180548551818602810186019096528086529596509194909392849084015b828210156118b557838290600052602060002001805461182890614334565b80601f016020809104026020016040519081016040528092919081815260200182805461185490614334565b80156118a15780601f10611876576101008083540402835291602001916118a1565b820191906000526020600020905b81548152906001019060200180831161188457829003601f168201915b505050505081526020019060010190611809565b5050506040850151919250506001600160a01b03166119165760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b60005b81518110156119685782828281518110611935576119356144d5565b602002602001015160405160200161194e92919061460b565b60408051601f198184030181529190529250600101611919565b5090949350505050565b600061197d8261336a565b6040516001600160a01b038216815290915082907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd29060200160405180910390a26040516bffffffffffffffffffffffff19606083901b16602082015282907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c9060340160408051601f1981840301815290829052611a1f929161436e565b60405180910390a25050565b826000611a378261336a565b90506001600160a01b0381163314611a915760405162461bcd60e51b815260206004820152601660248201527f6e6f74206f776e6572206f6620737562646f6d61696e000000000000000000006044820152606401610668565b847f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528585604051611ac392919061436e565b60405180910390a2603c8403611b1b5760405162461bcd60e51b815260206004820152601660248201527f63616e6e6f7420736574206574682061646472657373000000000000000000006044820152606401610668565b6000611b268661336a565b60008781526007602090815260408083206001600160a01b038516845282528083208984529091529020909150611b5d8582614663565b50505050505050565b6002546040516331a9108f60e11b81526004810187905286916001600160a01b031690636352211e90602401602060405180830381865afa925050508015611bcb575060408051601f3d908101601f19168201909252611bc891810190614550565b60015b611c175760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b038116331480611cb7575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa158015611c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9d919061456d565b8015611cb757506000546001600160a01b03828116911614155b80611d5c57506000546001600160a01b038281169116148015611ce257506001600160a01b03811615155b8015611d5c575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa158015611d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5c919061456d565b611da85760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b506000611db487611604565b6001546040517f02571be3000000000000000000000000000000000000000000000000000000008152600481018390529192506000916001600160a01b03909116906302571be390602401602060405180830381865afa158015611e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e409190614550565b90506001600160a01b038116301480611e7957506000546001600160a01b038281169116148015611e7957506001600160a01b03811615155b611eeb5760405162461bcd60e51b815260206004820152602560248201527f636f6e74726f6c6c6572206f6620456e73206e6f742073657420746f20636f6e60448201527f74726163740000000000000000000000000000000000000000000000000000006064820152608401610668565b81611ef68b8b610ca1565b14611f435760405162461bcd60e51b815260206004820152601260248201527f696e636f7272656374206e616d656861736800000000000000000000000000006044820152606401610668565b60068610611f935760405162461bcd60e51b815260206004820152601b60248201527f6d6178696d756d203520636f6e7472616374732070657220454e5300000000006044820152606401610668565b85611fe05760405162461bcd60e51b815260206004820152601c60248201527f6e656564206174206c656173742031204e465420636f6e7472616374000000006044820152606401610668565b600186118015611fed5750845b156120605760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008881526005602052604090205460ff16156120bf5760405162461bcd60e51b815260206004820152601760248201527f616c7265616479206265656e20636f6e666967757265640000000000000000006044820152606401610668565b6120c9878761367b565b6040805160808101825260018152861515602082015285151591810191909152606081016120f78b8d614723565b90526000898152600560209081526040918290208351815485840151948601511515620100000262ff0000199515156101000261ff00199315159390931661ffff19909216919091179190911793909316929092178255606083015180516121659260018501920190613b3c565b5050506000888152600660205260409020612181908888613b92565b50604080518615158152851515602082015289917f96b9f267bb478ccc44b985fdcd78589641ddd29e2368e46cac3fe84a41db5735910160405180910390a260005b86811015612230578787828181106121dd576121dd6144d5565b90506020020160208101906121f29190613ed7565b6001600160a01b0316897f0f5dac387d69ef206cfbc11444ee653b27a6cbcf9c37b1897a34e4028e5b6ae460405160405180910390a36001016121c3565b5050505050505050505050565b336001600160a01b037f000000000000000000000000082fc1776d44f69988c475958a0505a5bc2cd77b16146122b55760405162461bcd60e51b815260206004820152600d60248201527f6f6e6c79206465706c6f796572000000000000000000000000000000000000006044820152606401610668565b6040517fc47f00270000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000084b1c3c81545d370f3634392de611caabff8148169063c47f00279061231c90859085906004016144a6565b6020604051808303816000875af115801561233b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235f91906147a7565b505050565b60405162461bcd60e51b815260206004820152601860248201527f63616e6e6f7420646f206261746368207472616e7366657200000000000000006044820152600090606401610668565b6040516331a9108f60e11b81526bffffffffffffffffffffffff841660048201528290849033906001600160a01b03841690636352211e90602401602060405180830381865afa158015612407573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061242b9190614550565b6001600160a01b0316146124815760405162461bcd60e51b815260206004820152601060248201527f6e6f74206f776e6572206f66204e4654000000000000000000000000000000006044820152606401610668565b60008685876040516020016124d59392919092835260609190911b6bffffffffffffffffffffffff1916602083015260a01b73ffffffffffffffffffffffffffffffffffffffff1916603482015260400190565b60408051601f198184030181529181528151602092830120600081815260099093529120549091501561254a5760405162461bcd60e51b815260206004820181905260248201527f737562646f6d61696e20636c61696d656420666f72207468697320746f6b656e6044820152606401610668565b612554878661372a565b6125a05760405162461bcd60e51b815260206004820152601260248201527f4e6f742076616c696420636f6e747261637400000000000000000000000000006044820152606401610668565b60008781526005602090815260408083208151608081018352815460ff80821615158352610100820481161515838701526201000090910416151581840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156126b157838290600052602060002001805461262490614334565b80601f016020809104026020016040519081016040528092919081815260200182805461265090614334565b801561269d5780601f106126725761010080835404028352916020019161269d565b820191906000526020600020905b81548152906001019060200180831161268057829003601f168201915b505050505081526020019060010190612605565b50505091525050805190915061272f5760405162461bcd60e51b815260206004820152602160248201527f636f6e66696775726174696f6e20666f7220454e53206e6f7420656e61626c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610668565b600061273a89611604565b90506000826020015161274d5786612764565b612764896bffffffffffffffffffffffff16613546565b90506000828260405160200161277a91906147c0565b604051602081830303815290604052805190602001206040516020016127aa929190918252602082015260400190565b60408051601f19818403018152918152815160209283012060008181526004909352912054909150156128455760405162461bcd60e51b815260206004820152602260248201527f537562646f6d61696e2068617320616c7265616479206265656e20636c61696d60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610668565b6001546040517ff79fe538000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f79fe53890602401602060405180830381865afa1580156128a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128cb919061456d565b15806128d8575083604001515b61294a5760405162461bcd60e51b815260206004820152602560248201527f6e6f7420616c6c6f7765642070726576696f75736c792075736564207375626460448201527f6f6d61696e0000000000000000000000000000000000000000000000000000006064820152608401610668565b604080516080810182528c815260208082018581526001600160a01b038d16838501526bffffffffffffffffffffffff8e166060840152600085815260049092529290208151815591519091829160018201906129a79082614663565b5060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160020160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555090505060008054906101000a90046001600160a01b03166001600160a01b0316600260009054906101000a90046001600160a01b03166001600160a01b0316636352211e8e6040518263ffffffff1660e01b8152600401612a6f91815260200190565b602060405180830381865afa158015612a8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab09190614550565b6001600160a01b031603612b5257600080546040517f24c1af440000000000000000000000000000000000000000000000000000000081526001600160a01b03909116916324c1af4491612b1b91889188913091829190819067ffffffffffffffff906004016147dc565b600060405180830381600087803b158015612b3557600080fd5b505af1158015612b49573d6000803e3d6000fd5b50505050612bfe565b6001546040516001600160a01b0390911690635ef2c7f0908690612b7a9087906020016147c0565b60408051601f198184030181529082905280516020909101206001600160e01b031960e085901b16825260048201929092526024810191909152306044820181905260648201526000608482015260a401600060405180830381600087803b158015612be557600080fd5b505af1158015612bf9573d6000803e3d6000fd5b505050505b60008681526009602052604090819020839055516331a9108f60e11b81526bffffffffffffffffffffffff8c16600482015282907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2906001600160a01b038d1690636352211e90602401602060405180830381865afa158015612c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca99190614550565b6040516001600160a01b03909116815260200160405180910390a26040516331a9108f60e11b81526bffffffffffffffffffffffff8c16600482015282907f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af75290603c906001600160a01b038e1690636352211e90602401602060405180830381865afa158015612d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d619190614550565b604051602001612d89919060609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815290829052612da4929161436e565b60405180910390a28a6bffffffffffffffffffffffff168a6001600160a01b0316837fd272cd576ecd5a658f613a3d9f818449d49fceff169ccc9d9003fe5b36ca4772612df0866116ea565b604051612dfd9190613f40565b60405180910390a4505050505050505050505050565b60606000612e208461336a565b9050603c8303612e60576040516bffffffffffffffffffffffff19606083901b166020820152603401604051602081830303815290604052915050610a7a565b60008481526007602090815260408083206001600160a01b0385168452825280832086845290915290208054612e9590614334565b80601f0160208091040260200160405190810160405280929190818152602001828054612ec190614334565b8015612f0e5780601f10612ee357610100808354040283529160200191612f0e565b820191906000526020600020905b815481529060010190602001808311612ef157829003601f168201915b505050505091505092915050565b6002546040516331a9108f60e11b81526004810184905283916001600160a01b031690636352211e90602401602060405180830381865afa925050508015612f81575060408051601f3d908101601f19168201909252612f7e91810190614550565b60015b612fcd5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b6001600160a01b03811633148061306d575060025460405163e985e9c560e01b81526001600160a01b0383811660048301523360248301529091169063e985e9c590604401602060405180830381865afa15801561302f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613053919061456d565b801561306d57506000546001600160a01b03828116911614155b8061311257506000546001600160a01b03828116911614801561309857506001600160a01b03811615155b8015613112575060005460405163f44779b960e01b8152600481018490523360248201526001600160a01b039091169063f44779b990604401602060405180830381865afa1580156130ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613112919061456d565b61315e5760405162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f7220617070726f76656400000000000000000000006044820152606401610668565b50600083815260066020526040902054600581106131be5760405162461bcd60e51b815260206004820152601b60248201527f6d6178696d756d203520636f6e7472616374732070657220454e5300000000006044820152606401610668565b6000811161320e5760405162461bcd60e51b815260206004820152601260248201527f656e73206e6f7420636f6e6669677572656400000000000000000000000000006044820152606401610668565b613218848461372a565b156132655760405162461bcd60e51b815260206004820152601660248201527f6475706c6963617465204e465420636f6e7472616374000000000000000000006044820152606401610668565b600084815260056020526040902054610100900460ff16156132ef5760405162461bcd60e51b815260206004820152603360248201527f4e756d65726963206f6e6c79206e6f7420636f6d70617469626c65207769746860448201527f206d756c7469706c6520636f6e747261637473000000000000000000000000006064820152608401610668565b60008481526006602090815260408083208054600181018255908452918320909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387169081179091559051909186917f0f5dac387d69ef206cfbc11444ee653b27a6cbcf9c37b1897a34e4028e5b6ae49190a350505050565b60008181526004602090815260408083208151608081019092528054825260018101805485948401919061339d90614334565b80601f01602080910402602001604051908101604052809291908181526020018280546133c990614334565b80156134165780601f106133eb57610100808354040283529160200191613416565b820191906000526020600020905b8154815290600101906020018083116133f957829003601f168201915b5050509183525050600291909101546001600160a01b0381166020830152600160a01b90046bffffffffffffffffffffffff1660409091015280519091506000036134a35760405162461bcd60e51b815260206004820152601860248201527f737562646f6d61696e206e6f7420636f6e6669677572656400000000000000006044820152606401610668565b604080820151606083015191516331a9108f60e11b81526bffffffffffffffffffffffff90921660048301526000916001600160a01b0390911690636352211e90602401602060405180830381865afa158015613504573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135289190614550565b949350505050565b6060610a7a6001600160a01b03831660146137ec565b60608160000361358957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156135b3578061359d81614853565b91506135ac9050600a83614883565b915061358d565b60008167ffffffffffffffff8111156135ce576135ce613f53565b6040519080825280601f01601f1916602001820160405280156135f8576020820181803683370190505b5090505b84156135285761360d600183614897565b915061361a600a866148aa565b6136259060306148be565b60f81b81838151811061363a5761363a6144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613674600a86614883565b94506135fc565b60005b8181101561235f576136d683838381811061369b5761369b6144d5565b90506020020160208101906136b09190613ed7565b7f80ac58cd00000000000000000000000000000000000000000000000000000000613a15565b6137225760405162461bcd60e51b815260206004820152601c60248201527f6e65656420746f206265204945524337323120636f6e747261637473000000006044820152606401610668565b60010161367e565b60008281526006602090815260408083208054825181850281018501909352808352849383018282801561378757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613769575b505083519394506000925050505b818110156137e357846001600160a01b03168382815181106137b9576137b96144d5565b60200260200101516001600160a01b0316036137db5760019350505050610a7a565b600101613795565b50505092915050565b606060006137fb8360026148d1565b6138069060026148be565b67ffffffffffffffff81111561381e5761381e613f53565b6040519080825280601f01601f191660200182016040528015613848576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061387f5761387f6144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106138e2576138e26144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600061391e8460026148d1565b6139299060016148be565b90505b60018111156139c6577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061396a5761396a6144d5565b1a60f81b828281518110613980576139806144d5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936139bf816148f0565b905061392c565b5083156115fd5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610668565b6000613a2083613a31565b80156115fd57506115fd8383613a64565b6000613a44826301ffc9a760e01b613a64565b8015610a7a5750613a5d826001600160e01b0319613a64565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015613aeb575060208210155b8015613af75750600081115b979650505050505050565b508054613b0e90614334565b6000825580601f10613b1e575050565b601f0160209004906000526020600020908101906113399190613bfa565b828054828255906000526020600020908101928215613b82579160200282015b82811115613b825782518290613b729082614663565b5091602001919060010190613b5c565b50613b8e929150613c0f565b5090565b828054828255906000526020600020908101928215613bf2579160200282015b82811115613bf257815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03843516178255602090920191600190910190613bb2565b50613b8e9291505b5b80821115613b8e5760008155600101613bfb565b80821115613b8e576000613c238282613b02565b50600101613c0f565b600060208284031215613c3e57600080fd5b5035919050565b600060208284031215613c5757600080fd5b81356001600160e01b0319811681146115fd57600080fd5b60005b83811015613c8a578181015183820152602001613c72565b50506000910152565b60008151808452613cab816020860160208601613c6f565b601f01601f19169290920160200192915050565b848152608060208201526000613cd86080830186613c93565b90506001600160a01b03841660408301526bffffffffffffffffffffffff8316606083015295945050505050565b60008083601f840112613d1857600080fd5b50813567ffffffffffffffff811115613d3057600080fd5b602083019150836020828501011115613d4857600080fd5b9250929050565b600080600080600060608688031215613d6757600080fd5b85359450602086013567ffffffffffffffff80821115613d8657600080fd5b613d9289838a01613d06565b90965094506040880135915080821115613dab57600080fd5b50613db888828901613d06565b969995985093965092949392505050565b60008060408385031215613ddc57600080fd5b50508035926020909101359150565b60008083601f840112613dfd57600080fd5b50813567ffffffffffffffff811115613e1557600080fd5b6020830191508360208260051b8501011115613d4857600080fd5b60008060208385031215613e4357600080fd5b823567ffffffffffffffff811115613e5a57600080fd5b613e6685828601613deb565b90969095509350505050565b801515811461133957600080fd5b600080600060608486031215613e9557600080fd5b833592506020840135613ea781613e72565b91506040840135613eb781613e72565b809150509250925092565b6001600160a01b038116811461133957600080fd5b600060208284031215613ee957600080fd5b81356115fd81613ec2565b600080600060408486031215613f0957600080fd5b83359250602084013567ffffffffffffffff811115613f2757600080fd5b613f3386828701613d06565b9497909650939450505050565b6020815260006115fd6020830184613c93565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613f9257613f92613f53565b604052919050565b600067ffffffffffffffff831115613fb457613fb4613f53565b613fc76020601f19601f86011601613f69565b9050828152838383011115613fdb57600080fd5b828260208301376000602084830101529392505050565b60008060006060848603121561400757600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561402c57600080fd5b8401601f8101861361403d57600080fd5b61404c86823560208401613f9a565b9150509250925092565b600080600080600080600060a0888a03121561407157600080fd5b873567ffffffffffffffff8082111561408957600080fd5b6140958b838c01613deb565b909950975060208a0135965060408a01359150808211156140b557600080fd5b506140c28a828b01613deb565b90955093505060608801356140d681613e72565b915060808801356140e681613e72565b8091505092959891949750929550565b6000806020838503121561410957600080fd5b823567ffffffffffffffff81111561412057600080fd5b613e6685828601613d06565b60008060008060008060008060a0898b03121561414857600080fd5b883561415381613ec2565b9750602089013561416381613ec2565b9650604089013567ffffffffffffffff8082111561418057600080fd5b61418c8c838d01613deb565b909850965060608b01359150808211156141a557600080fd5b6141b18c838d01613deb565b909650945060808b01359150808211156141ca57600080fd5b506141d78b828c01613d06565b999c989b5096995094979396929594505050565b600082601f8301126141fc57600080fd5b6115fd83833560208501613f9a565b6000806000806080858703121561422157600080fd5b8435935060208501356bffffffffffffffffffffffff8116811461424457600080fd5b9250604085013561425481613ec2565b9150606085013567ffffffffffffffff81111561427057600080fd5b61427c878288016141eb565b91505092959194509250565b60008060008060008060a087890312156142a157600080fd5b86356142ac81613ec2565b955060208701356142bc81613ec2565b94506040870135935060608701359250608087013567ffffffffffffffff8111156142e657600080fd5b6142f289828a01613d06565b979a9699509497509295939492505050565b6000806040838503121561431757600080fd5b82359150602083013561432981613ec2565b809150509250929050565b600181811c9082168061434857607f821691505b60208210810361436857634e487b7160e01b600052602260045260246000fd5b50919050565b8281526040602082015260006135286040830184613c93565b8183823760009101908152919050565b601f82111561235f57600081815260208120601f850160051c810160208610156143be5750805b601f850160051c820191505b818110156143dd578281556001016143ca565b505050505050565b67ffffffffffffffff8311156143fd576143fd613f53565b6144118361440b8354614334565b83614397565b6000601f841160018114614445576000851561442d5750838201355b600019600387901b1c1916600186901b17835561449f565b600083815260209020601f19861690835b828110156144765786850135825560209485019460019092019101614456565b50868210156144935760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261452057600080fd5b83018035915067ffffffffffffffff82111561453b57600080fd5b602001915036819003821315613d4857600080fd5b60006020828403121561456257600080fd5b81516115fd81613ec2565b60006020828403121561457f57600080fd5b81516115fd81613e72565b7f6569703135353a312f6572633732313a000000000000000000000000000000008152600083516145c2816010850160208801613c6f565b7f2f0000000000000000000000000000000000000000000000000000000000000060109184019182015283516145ff816011840160208801613c6f565b01601101949350505050565b6000835161461d818460208801613c6f565b7f2e000000000000000000000000000000000000000000000000000000000000009083019081528351614657816001840160208801613c6f565b01600101949350505050565b815167ffffffffffffffff81111561467d5761467d613f53565b6146918161468b8454614334565b84614397565b602080601f8311600181146146c657600084156146ae5750858301515b600019600386901b1c1916600185901b1785556143dd565b600085815260208120601f198616915b828110156146f5578886015182559484019460019091019084016146d6565b50858210156147135787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600067ffffffffffffffff8084111561473e5761473e613f53565b8360051b602061474f818301613f69565b86815291850191818101903684111561476757600080fd5b865b8481101561479b578035868111156147815760008081fd5b61478d36828b016141eb565b845250918301918301614769565b50979650505050505050565b6000602082840312156147b957600080fd5b5051919050565b600082516147d2818460208701613c6f565b9190910192915050565b87815260e0602082015260006147f560e0830189613c93565b6001600160a01b03978816604084015295909616606082015267ffffffffffffffff938416608082015263ffffffff9290921660a083015290911660c0909101529392505050565b634e487b7160e01b600052601160045260246000fd5b600060001982036148665761486661483d565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826148925761489261486d565b500490565b81810381811115610a7a57610a7a61483d565b6000826148b9576148b961486d565b500690565b80820180821115610a7a57610a7a61483d565b60008160001904831182151516156148eb576148eb61483d565b500290565b6000816148ff576148ff61483d565b50600019019056fea264697066735822122037579578826abdbb54585150f526ef108409f434a19709ee6e525f4001e4631064736f6c63430008100033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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