{
  "address": "0xC1416882ae95533dD5d62c6e35A2284486a30A2E",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "previousAdmin",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "AdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "beacon",
          "type": "address"
        }
      ],
      "name": "BeaconUpgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "artistId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "symbol",
          "type": "string"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "artistAddress",
          "type": "address"
        }
      ],
      "name": "CreatedArtist",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DOMAIN_SEPARATOR",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MINTER_TYPEHASH",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "admin",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "artistContracts",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "beaconAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "signature",
          "type": "bytes"
        },
        {
          "internalType": "string",
          "name": "_name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "_symbol",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "_baseURI",
          "type": "string"
        }
      ],
      "name": "createArtist",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "signature",
          "type": "bytes"
        }
      ],
      "name": "getSigner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_newAdmin",
          "type": "address"
        }
      ],
      "name": "setAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        }
      ],
      "name": "upgradeTo",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    }
  ],
  "transactionHash": "0x1f803ae9b26ab35c7a5815fb28dd2c4cf6cf3b4f4606573d005c73649716e3e6",
  "receipt": {
    "to": null,
    "from": "0xB0A36b3CeDf210f37a5E7BC28d4b8E91D4E3C412",
    "contractAddress": "0xC1416882ae95533dD5d62c6e35A2284486a30A2E",
    "transactionIndex": 0,
    "gasUsed": "4589223",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xa757e1b2d64ef48f3c1d0c9772ae268fdfe4efb5744e0f781fb71d19a6ba3567",
    "transactionHash": "0x1f803ae9b26ab35c7a5815fb28dd2c4cf6cf3b4f4606573d005c73649716e3e6",
    "logs": [],
    "blockNumber": 1,
    "cumulativeGasUsed": "4589223",
    "status": 1,
    "byzantium": true
  },
  "args": [],
  "numDeployments": 1,
  "solcInputHash": "9dcbfbadb82049dbb6b9a6e6302f54b4",
  "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"artistId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"artistAddress\",\"type\":\"address\"}],\"name\":\"CreatedArtist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINTER_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"artistContracts\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"beaconAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_baseURI\",\"type\":\"string\"}],\"name\":\"createArtist\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"getSigner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"createArtist(bytes,string,string,string)\":{\"params\":{\"_name\":\"Name of the artist\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setAdmin(address)\":{\"params\":{\"_newAdmin\":\"address of new admin\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"version\":1},\"userdoc\":{\"events\":{\"CreatedArtist(uint256,string,string,address)\":{\"notice\":\"Emitted when an Artist is created\"}},\"kind\":\"user\",\"methods\":{\"createArtist(bytes,string,string,string)\":{\"notice\":\"Creates a new artist contract as a factory with a deterministic address Important: None of these fields (except the Url fields with the same hash) can be changed after calling\"},\"getSigner(bytes)\":{\"notice\":\"Get signer address of signature\"},\"initialize()\":{\"notice\":\"Initializes factory\"},\"setAdmin(address)\":{\"notice\":\"Sets the admin for authorizing artist deployment\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ArtistCreator.sol\":\"ArtistCreator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal onlyInitializing {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal onlyInitializing {\\n        _transferOwnership(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x9ffedb33e192f8821cbaead72596c79ea87fb28a73f8d3a9f5004449799f8e1b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165Upgradeable.sol\\\";\\n\",\"keccak256\":\"0x121966b3220d263a6669dcf59c1254bd48ed237adf4d8a595add70a7927eada1\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard\\n */\\ninterface IERC2981Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Called with the sale price to determine how much royalty is owed and to whom.\\n     * @param tokenId - the NFT asset queried for royalty information\\n     * @param salePrice - the sale price of the NFT asset specified by `tokenId`\\n     * @return receiver - address of who should be sent the royalty payment\\n     * @return royaltyAmount - the royalty payment amount for `salePrice`\\n     */\\n    function royaltyInfo(uint256 tokenId, uint256 salePrice)\\n        external\\n        view\\n        returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x34a68a6915f19a764a8ce8e6fdc6bf259744a6142afe478072ada07d65cf65d6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable {\\n    function __ERC1967Upgrade_init() internal onlyInitializing {\\n        __ERC1967Upgrade_init_unchained();\\n    }\\n\\n    function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n    }\\n    // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n    /**\\n     * @dev Storage slot with the address of the current implementation.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n     * validated in the constructor.\\n     */\\n    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n    /**\\n     * @dev Emitted when the implementation is upgraded.\\n     */\\n    event Upgraded(address indexed implementation);\\n\\n    /**\\n     * @dev Returns the current implementation address.\\n     */\\n    function _getImplementation() internal view returns (address) {\\n        return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the EIP1967 implementation slot.\\n     */\\n    function _setImplementation(address newImplementation) private {\\n        require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n        StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeTo(address newImplementation) internal {\\n        _setImplementation(newImplementation);\\n        emit Upgraded(newImplementation);\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade with additional setup call.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeToAndCall(\\n        address newImplementation,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        _upgradeTo(newImplementation);\\n        if (data.length > 0 || forceCall) {\\n            _functionDelegateCall(newImplementation, data);\\n        }\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeToAndCallSecure(\\n        address newImplementation,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        address oldImplementation = _getImplementation();\\n\\n        // Initial upgrade and setup call\\n        _setImplementation(newImplementation);\\n        if (data.length > 0 || forceCall) {\\n            _functionDelegateCall(newImplementation, data);\\n        }\\n\\n        // Perform rollback test if not already in progress\\n        StorageSlotUpgradeable.BooleanSlot storage rollbackTesting = StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT);\\n        if (!rollbackTesting.value) {\\n            // Trigger rollback using upgradeTo from the new implementation\\n            rollbackTesting.value = true;\\n            _functionDelegateCall(\\n                newImplementation,\\n                abi.encodeWithSignature(\\\"upgradeTo(address)\\\", oldImplementation)\\n            );\\n            rollbackTesting.value = false;\\n            // Check rollback was effective\\n            require(oldImplementation == _getImplementation(), \\\"ERC1967Upgrade: upgrade breaks further upgrades\\\");\\n            // Finally reset to the new implementation and log the upgrade\\n            _upgradeTo(newImplementation);\\n        }\\n    }\\n\\n    /**\\n     * @dev Storage slot with the admin of the contract.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n     * validated in the constructor.\\n     */\\n    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n    /**\\n     * @dev Emitted when the admin account has changed.\\n     */\\n    event AdminChanged(address previousAdmin, address newAdmin);\\n\\n    /**\\n     * @dev Returns the current admin.\\n     */\\n    function _getAdmin() internal view returns (address) {\\n        return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the EIP1967 admin slot.\\n     */\\n    function _setAdmin(address newAdmin) private {\\n        require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n        StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n    }\\n\\n    /**\\n     * @dev Changes the admin of the proxy.\\n     *\\n     * Emits an {AdminChanged} event.\\n     */\\n    function _changeAdmin(address newAdmin) internal {\\n        emit AdminChanged(_getAdmin(), newAdmin);\\n        _setAdmin(newAdmin);\\n    }\\n\\n    /**\\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n     */\\n    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n    /**\\n     * @dev Emitted when the beacon is upgraded.\\n     */\\n    event BeaconUpgraded(address indexed beacon);\\n\\n    /**\\n     * @dev Returns the current beacon.\\n     */\\n    function _getBeacon() internal view returns (address) {\\n        return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new beacon in the EIP1967 beacon slot.\\n     */\\n    function _setBeacon(address newBeacon) private {\\n        require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n        require(\\n            AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n            \\\"ERC1967: beacon implementation is not a contract\\\"\\n        );\\n        StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n    }\\n\\n    /**\\n     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n     *\\n     * Emits a {BeaconUpgraded} event.\\n     */\\n    function _upgradeBeaconToAndCall(\\n        address newBeacon,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        _setBeacon(newBeacon);\\n        emit BeaconUpgraded(newBeacon);\\n        if (data.length > 0 || forceCall) {\\n            _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n        }\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) {\\n        require(AddressUpgradeable.isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return AddressUpgradeable.verifyCallResult(success, returndata, \\\"Address: low-level delegate call failed\\\");\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xba3e051005a0b7f77c465dbcfe6366ce6a72e3845028277e1f794e5e8864e017\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n    /**\\n     * @dev Must return an address that can be used as a delegate call target.\\n     *\\n     * {BeaconProxy} will check that this address is a contract.\\n     */\\n    function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the\\n * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() initializer {}\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n        // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the\\n        // contract may have been reentered.\\n        require(_initializing ? _isConstructor() : !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n     * {initializer} modifier, directly or indirectly.\\n     */\\n    modifier onlyInitializing() {\\n        require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n        _;\\n    }\\n\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0x68861bcc80cacbd498efde75aab6c74a486cc48262660d326c8d7530d9752097\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, ERC1967UpgradeUpgradeable {\\n    function __UUPSUpgradeable_init() internal onlyInitializing {\\n        __ERC1967Upgrade_init_unchained();\\n        __UUPSUpgradeable_init_unchained();\\n    }\\n\\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n    }\\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n    address private immutable __self = address(this);\\n\\n    /**\\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n     * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n     * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n     * fail.\\n     */\\n    modifier onlyProxy() {\\n        require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n        require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n     *\\n     * Calls {_authorizeUpgrade}.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function upgradeTo(address newImplementation) external virtual onlyProxy {\\n        _authorizeUpgrade(newImplementation);\\n        _upgradeToAndCallSecure(newImplementation, new bytes(0), false);\\n    }\\n\\n    /**\\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n     * encoded in `data`.\\n     *\\n     * Calls {_authorizeUpgrade}.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n        _authorizeUpgrade(newImplementation);\\n        _upgradeToAndCallSecure(newImplementation, data, true);\\n    }\\n\\n    /**\\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n     * {upgradeTo} and {upgradeToAndCall}.\\n     *\\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n     *\\n     * ```solidity\\n     * function _authorizeUpgrade(address) internal override onlyOwner {}\\n     * ```\\n     */\\n    function _authorizeUpgrade(address newImplementation) internal virtual;\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xed65883d4af8d00c76ff9f1b7758c5d8ac4ab82da60f9743c74d31b754b06bc0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721Upgradeable.sol\\\";\\nimport \\\"./IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"./extensions/IERC721MetadataUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../../utils/StringsUpgradeable.sol\\\";\\nimport \\\"../../utils/introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\ncontract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {\\n    using AddressUpgradeable for address;\\n    using StringsUpgradeable for uint256;\\n\\n    // Token name\\n    string private _name;\\n\\n    // Token symbol\\n    string private _symbol;\\n\\n    // Mapping from token ID to owner address\\n    mapping(uint256 => address) private _owners;\\n\\n    // Mapping owner address to token count\\n    mapping(address => uint256) private _balances;\\n\\n    // Mapping from token ID to approved address\\n    mapping(uint256 => address) private _tokenApprovals;\\n\\n    // Mapping from owner to operator approvals\\n    mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n    /**\\n     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n     */\\n    function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing {\\n        __Context_init_unchained();\\n        __ERC165_init_unchained();\\n        __ERC721_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\\n        _name = name_;\\n        _symbol = symbol_;\\n    }\\n\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {\\n        return\\n            interfaceId == type(IERC721Upgradeable).interfaceId ||\\n            interfaceId == type(IERC721MetadataUpgradeable).interfaceId ||\\n            super.supportsInterface(interfaceId);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-balanceOf}.\\n     */\\n    function balanceOf(address owner) public view virtual override returns (uint256) {\\n        require(owner != address(0), \\\"ERC721: balance query for the zero address\\\");\\n        return _balances[owner];\\n    }\\n\\n    /**\\n     * @dev See {IERC721-ownerOf}.\\n     */\\n    function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n        address owner = _owners[tokenId];\\n        require(owner != address(0), \\\"ERC721: owner query for nonexistent token\\\");\\n        return owner;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-name}.\\n     */\\n    function name() public view virtual override returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-symbol}.\\n     */\\n    function symbol() public view virtual override returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-tokenURI}.\\n     */\\n    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n        require(_exists(tokenId), \\\"ERC721Metadata: URI query for nonexistent token\\\");\\n\\n        string memory baseURI = _baseURI();\\n        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\"\\\";\\n    }\\n\\n    /**\\n     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n     * by default, can be overriden in child contracts.\\n     */\\n    function _baseURI() internal view virtual returns (string memory) {\\n        return \\\"\\\";\\n    }\\n\\n    /**\\n     * @dev See {IERC721-approve}.\\n     */\\n    function approve(address to, uint256 tokenId) public virtual override {\\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\\n        require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n        require(\\n            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\n            \\\"ERC721: approve caller is not owner nor approved for all\\\"\\n        );\\n\\n        _approve(to, tokenId);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-getApproved}.\\n     */\\n    function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n        require(_exists(tokenId), \\\"ERC721: approved query for nonexistent token\\\");\\n\\n        return _tokenApprovals[tokenId];\\n    }\\n\\n    /**\\n     * @dev See {IERC721-setApprovalForAll}.\\n     */\\n    function setApprovalForAll(address operator, bool approved) public virtual override {\\n        _setApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-isApprovedForAll}.\\n     */\\n    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n        return _operatorApprovals[owner][operator];\\n    }\\n\\n    /**\\n     * @dev See {IERC721-transferFrom}.\\n     */\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId\\n    ) public virtual override {\\n        //solhint-disable-next-line max-line-length\\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: transfer caller is not owner nor approved\\\");\\n\\n        _transfer(from, to, tokenId);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-safeTransferFrom}.\\n     */\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId\\n    ) public virtual override {\\n        safeTransferFrom(from, to, tokenId, \\\"\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC721-safeTransferFrom}.\\n     */\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId,\\n        bytes memory _data\\n    ) public virtual override {\\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: transfer caller is not owner nor approved\\\");\\n        _safeTransfer(from, to, tokenId, _data);\\n    }\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * `_data` is additional data, it has no specified format and it is sent in call to `to`.\\n     *\\n     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n     * implement alternative mechanisms to perform token transfer, such as signature-based.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _safeTransfer(\\n        address from,\\n        address to,\\n        uint256 tokenId,\\n        bytes memory _data\\n    ) internal virtual {\\n        _transfer(from, to, tokenId);\\n        require(_checkOnERC721Received(from, to, tokenId, _data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n    }\\n\\n    /**\\n     * @dev Returns whether `tokenId` exists.\\n     *\\n     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n     *\\n     * Tokens start existing when they are minted (`_mint`),\\n     * and stop existing when they are burned (`_burn`).\\n     */\\n    function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n        return _owners[tokenId] != address(0);\\n    }\\n\\n    /**\\n     * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n        require(_exists(tokenId), \\\"ERC721: operator query for nonexistent token\\\");\\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\\n        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));\\n    }\\n\\n    /**\\n     * @dev Safely mints `tokenId` and transfers it to `to`.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must not exist.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _safeMint(address to, uint256 tokenId) internal virtual {\\n        _safeMint(to, tokenId, \\\"\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n     */\\n    function _safeMint(\\n        address to,\\n        uint256 tokenId,\\n        bytes memory _data\\n    ) internal virtual {\\n        _mint(to, tokenId);\\n        require(\\n            _checkOnERC721Received(address(0), to, tokenId, _data),\\n            \\\"ERC721: transfer to non ERC721Receiver implementer\\\"\\n        );\\n    }\\n\\n    /**\\n     * @dev Mints `tokenId` and transfers it to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must not exist.\\n     * - `to` cannot be the zero address.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _mint(address to, uint256 tokenId) internal virtual {\\n        require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n        require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n        _beforeTokenTransfer(address(0), to, tokenId);\\n\\n        _balances[to] += 1;\\n        _owners[tokenId] = to;\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /**\\n     * @dev Destroys `tokenId`.\\n     * The approval is cleared when the token is burned.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _burn(uint256 tokenId) internal virtual {\\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\\n\\n        _beforeTokenTransfer(owner, address(0), tokenId);\\n\\n        // Clear approvals\\n        _approve(address(0), tokenId);\\n\\n        _balances[owner] -= 1;\\n        delete _owners[tokenId];\\n\\n        emit Transfer(owner, address(0), tokenId);\\n    }\\n\\n    /**\\n     * @dev Transfers `tokenId` from `from` to `to`.\\n     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _transfer(\\n        address from,\\n        address to,\\n        uint256 tokenId\\n    ) internal virtual {\\n        require(ERC721Upgradeable.ownerOf(tokenId) == from, \\\"ERC721: transfer of token that is not own\\\");\\n        require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(from, to, tokenId);\\n\\n        // Clear approvals from the previous owner\\n        _approve(address(0), tokenId);\\n\\n        _balances[from] -= 1;\\n        _balances[to] += 1;\\n        _owners[tokenId] = to;\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /**\\n     * @dev Approve `to` to operate on `tokenId`\\n     *\\n     * Emits a {Approval} event.\\n     */\\n    function _approve(address to, uint256 tokenId) internal virtual {\\n        _tokenApprovals[tokenId] = to;\\n        emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId);\\n    }\\n\\n    /**\\n     * @dev Approve `operator` to operate on all of `owner` tokens\\n     *\\n     * Emits a {ApprovalForAll} event.\\n     */\\n    function _setApprovalForAll(\\n        address owner,\\n        address operator,\\n        bool approved\\n    ) internal virtual {\\n        require(owner != operator, \\\"ERC721: approve to caller\\\");\\n        _operatorApprovals[owner][operator] = approved;\\n        emit ApprovalForAll(owner, operator, approved);\\n    }\\n\\n    /**\\n     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n     * The call is not executed if the target address is not a contract.\\n     *\\n     * @param from address representing the previous owner of the given token ID\\n     * @param to target address that will receive the tokens\\n     * @param tokenId uint256 ID of the token to be transferred\\n     * @param _data bytes optional data to send along with the call\\n     * @return bool whether the call correctly returned the expected magic value\\n     */\\n    function _checkOnERC721Received(\\n        address from,\\n        address to,\\n        uint256 tokenId,\\n        bytes memory _data\\n    ) private returns (bool) {\\n        if (to.isContract()) {\\n            try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {\\n                return retval == IERC721ReceiverUpgradeable.onERC721Received.selector;\\n            } catch (bytes memory reason) {\\n                if (reason.length == 0) {\\n                    revert(\\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n                } else {\\n                    assembly {\\n                        revert(add(32, reason), mload(reason))\\n                    }\\n                }\\n            }\\n        } else {\\n            return true;\\n        }\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any token transfer. This includes minting\\n     * and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be\\n     * transferred to `to`.\\n     * - When `from` is zero, `tokenId` will be minted for `to`.\\n     * - When `to` is zero, ``from``'s `tokenId` will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(\\n        address from,\\n        address to,\\n        uint256 tokenId\\n    ) internal virtual {}\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x6c25d4211724a6f4cdc8d25397edc780f48d951fc81c1d507f59b3edb22afaf7\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(\\n        address operator,\\n        address from,\\n        uint256 tokenId,\\n        bytes calldata data\\n    ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x2f359f9d5c56394e60d74401487ab55d8ef0012907b07c9abbb8f998bf5ddfec\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId\\n    ) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId\\n    ) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId,\\n        bytes calldata data\\n    ) external;\\n}\\n\",\"keccak256\":\"0x714a33fd66816f608f6eda908da24eb6009eee50adf4062c86639d4fe508a7b6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721Upgradeable.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\\n    /**\\n     * @dev Returns the token collection name.\\n     */\\n    function name() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the token collection symbol.\\n     */\\n    function symbol() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n     */\\n    function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(account)\\n        }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x3f0f878c796dfc7feba6d3c4e3e526c14c7deae8b7bfc71088e3f38fab0d77b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal onlyInitializing {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal onlyInitializing {\\n    }\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x0b0d548f6381370d394f7a434f994dc678b3ef3e755de106109d61343a685ea7\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary CountersUpgradeable {\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        unchecked {\\n            counter._value += 1;\\n        }\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        uint256 value = counter._value;\\n        require(value > 0, \\\"Counter: decrement overflow\\\");\\n        unchecked {\\n            counter._value = value - 1;\\n        }\\n    }\\n\\n    function reset(Counter storage counter) internal {\\n        counter._value = 0;\\n    }\\n}\\n\",\"keccak256\":\"0x798741e231b22b81e2dd2eddaaf8832dee4baf5cd8e2dbaa5c1dd12a1c053c4d\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n *     function _getImplementation() internal view returns (address) {\\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n *     }\\n *\\n *     function _setImplementation(address newImplementation) internal {\\n *         require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlotUpgradeable {\\n    struct AddressSlot {\\n        address value;\\n    }\\n\\n    struct BooleanSlot {\\n        bool value;\\n    }\\n\\n    struct Bytes32Slot {\\n        bytes32 value;\\n    }\\n\\n    struct Uint256Slot {\\n        uint256 value;\\n    }\\n\\n    /**\\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n     */\\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x422c3d27d0d5681cea93acbb0dcb175fa5b461b5b7731da7ff77e51f0f0174c7\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n    bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        // Inspired by OraclizeAPI's implementation - MIT licence\\n        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n        if (value == 0) {\\n            return \\\"0\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 digits;\\n        while (temp != 0) {\\n            digits++;\\n            temp /= 10;\\n        }\\n        bytes memory buffer = new bytes(digits);\\n        while (value != 0) {\\n            digits -= 1;\\n            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n            value /= 10;\\n        }\\n        return string(buffer);\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(uint256 value) internal pure returns (string memory) {\\n        if (value == 0) {\\n            return \\\"0x00\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 length = 0;\\n        while (temp != 0) {\\n            length++;\\n            temp >>= 8;\\n        }\\n        return toHexString(value, length);\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n     */\\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n        bytes memory buffer = new bytes(2 * length + 2);\\n        buffer[0] = \\\"0\\\";\\n        buffer[1] = \\\"x\\\";\\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\\n            buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n            value >>= 4;\\n        }\\n        require(value == 0, \\\"Strings: hex length insufficient\\\");\\n        return string(buffer);\\n    }\\n}\\n\",\"keccak256\":\"0x398d3323c1932a5986bf36be7c57593e121e69d5db5b6574b4ee0d031443de37\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../StringsUpgradeable.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    enum RecoverError {\\n        NoError,\\n        InvalidSignature,\\n        InvalidSignatureLength,\\n        InvalidSignatureS,\\n        InvalidSignatureV\\n    }\\n\\n    function _throwError(RecoverError error) private pure {\\n        if (error == RecoverError.NoError) {\\n            return; // no error: do nothing\\n        } else if (error == RecoverError.InvalidSignature) {\\n            revert(\\\"ECDSA: invalid signature\\\");\\n        } else if (error == RecoverError.InvalidSignatureLength) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        } else if (error == RecoverError.InvalidSignatureS) {\\n            revert(\\\"ECDSA: invalid signature 's' value\\\");\\n        } else if (error == RecoverError.InvalidSignatureV) {\\n            revert(\\\"ECDSA: invalid signature 'v' value\\\");\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature` or error string. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     *\\n     * Documentation for signature generation:\\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n        // Check the signature length\\n        // - case 65: r,s,v signature (standard)\\n        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\\n        if (signature.length == 65) {\\n            bytes32 r;\\n            bytes32 s;\\n            uint8 v;\\n            // ecrecover takes the signature parameters, and the only way to get them\\n            // currently is to use assembly.\\n            assembly {\\n                r := mload(add(signature, 0x20))\\n                s := mload(add(signature, 0x40))\\n                v := byte(0, mload(add(signature, 0x60)))\\n            }\\n            return tryRecover(hash, v, r, s);\\n        } else if (signature.length == 64) {\\n            bytes32 r;\\n            bytes32 vs;\\n            // ecrecover takes the signature parameters, and the only way to get them\\n            // currently is to use assembly.\\n            assembly {\\n                r := mload(add(signature, 0x20))\\n                vs := mload(add(signature, 0x40))\\n            }\\n            return tryRecover(hash, r, vs);\\n        } else {\\n            return (address(0), RecoverError.InvalidSignatureLength);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, signature);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n     *\\n     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        bytes32 r,\\n        bytes32 vs\\n    ) internal pure returns (address, RecoverError) {\\n        bytes32 s;\\n        uint8 v;\\n        assembly {\\n            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)\\n            v := add(shr(255, vs), 27)\\n        }\\n        return tryRecover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n     *\\n     * _Available since v4.2._\\n     */\\n    function recover(\\n        bytes32 hash,\\n        bytes32 r,\\n        bytes32 vs\\n    ) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function tryRecover(\\n        bytes32 hash,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal pure returns (address, RecoverError) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n            return (address(0), RecoverError.InvalidSignatureS);\\n        }\\n        if (v != 27 && v != 28) {\\n            return (address(0), RecoverError.InvalidSignatureV);\\n        }\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        if (signer == address(0)) {\\n            return (address(0), RecoverError.InvalidSignature);\\n        }\\n\\n        return (signer, RecoverError.NoError);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(\\n        bytes32 hash,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal pure returns (address) {\\n        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n        _throwError(error);\\n        return recovered;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * produces hash corresponding to the one signed with the\\n     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n     * JSON-RPC method as part of EIP-191.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from `s`. This\\n     * produces hash corresponding to the one signed with the\\n     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n     * JSON-RPC method as part of EIP-191.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", StringsUpgradeable.toString(s.length), s));\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Typed Data, created from a\\n     * `domainSeparator` and a `structHash`. This produces hash corresponding\\n     * to the one signed with the\\n     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n     * JSON-RPC method as part of EIP-712.\\n     *\\n     * See {recover}.\\n     */\\n    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n    }\\n}\\n\",\"keccak256\":\"0x1762ac67d230279d7fb183567ce22bbe202054ce08f94224d8794f9d19546d51\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\\n    function __ERC165_init() internal onlyInitializing {\\n        __ERC165_init_unchained();\\n    }\\n\\n    function __ERC165_init_unchained() internal onlyInitializing {\\n    }\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return interfaceId == type(IERC165Upgradeable).interfaceId;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xcd98895383d51dc86669a76ae3ad4419fc5dc079d01faea23498e80c1cf9f78a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    constructor() {\\n        _transferOwnership(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0x24e0364e503a9bbde94c715d26573a76f14cd2a202d45f96f52134ab806b67b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n    // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n    /**\\n     * @dev Storage slot with the address of the current implementation.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n     * validated in the constructor.\\n     */\\n    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n    /**\\n     * @dev Emitted when the implementation is upgraded.\\n     */\\n    event Upgraded(address indexed implementation);\\n\\n    /**\\n     * @dev Returns the current implementation address.\\n     */\\n    function _getImplementation() internal view returns (address) {\\n        return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the EIP1967 implementation slot.\\n     */\\n    function _setImplementation(address newImplementation) private {\\n        require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n        StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeTo(address newImplementation) internal {\\n        _setImplementation(newImplementation);\\n        emit Upgraded(newImplementation);\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade with additional setup call.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeToAndCall(\\n        address newImplementation,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        _upgradeTo(newImplementation);\\n        if (data.length > 0 || forceCall) {\\n            Address.functionDelegateCall(newImplementation, data);\\n        }\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeToAndCallSecure(\\n        address newImplementation,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        address oldImplementation = _getImplementation();\\n\\n        // Initial upgrade and setup call\\n        _setImplementation(newImplementation);\\n        if (data.length > 0 || forceCall) {\\n            Address.functionDelegateCall(newImplementation, data);\\n        }\\n\\n        // Perform rollback test if not already in progress\\n        StorageSlot.BooleanSlot storage rollbackTesting = StorageSlot.getBooleanSlot(_ROLLBACK_SLOT);\\n        if (!rollbackTesting.value) {\\n            // Trigger rollback using upgradeTo from the new implementation\\n            rollbackTesting.value = true;\\n            Address.functionDelegateCall(\\n                newImplementation,\\n                abi.encodeWithSignature(\\\"upgradeTo(address)\\\", oldImplementation)\\n            );\\n            rollbackTesting.value = false;\\n            // Check rollback was effective\\n            require(oldImplementation == _getImplementation(), \\\"ERC1967Upgrade: upgrade breaks further upgrades\\\");\\n            // Finally reset to the new implementation and log the upgrade\\n            _upgradeTo(newImplementation);\\n        }\\n    }\\n\\n    /**\\n     * @dev Storage slot with the admin of the contract.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n     * validated in the constructor.\\n     */\\n    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n    /**\\n     * @dev Emitted when the admin account has changed.\\n     */\\n    event AdminChanged(address previousAdmin, address newAdmin);\\n\\n    /**\\n     * @dev Returns the current admin.\\n     */\\n    function _getAdmin() internal view returns (address) {\\n        return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the EIP1967 admin slot.\\n     */\\n    function _setAdmin(address newAdmin) private {\\n        require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n        StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n    }\\n\\n    /**\\n     * @dev Changes the admin of the proxy.\\n     *\\n     * Emits an {AdminChanged} event.\\n     */\\n    function _changeAdmin(address newAdmin) internal {\\n        emit AdminChanged(_getAdmin(), newAdmin);\\n        _setAdmin(newAdmin);\\n    }\\n\\n    /**\\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n     */\\n    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n    /**\\n     * @dev Emitted when the beacon is upgraded.\\n     */\\n    event BeaconUpgraded(address indexed beacon);\\n\\n    /**\\n     * @dev Returns the current beacon.\\n     */\\n    function _getBeacon() internal view returns (address) {\\n        return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new beacon in the EIP1967 beacon slot.\\n     */\\n    function _setBeacon(address newBeacon) private {\\n        require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n        require(\\n            Address.isContract(IBeacon(newBeacon).implementation()),\\n            \\\"ERC1967: beacon implementation is not a contract\\\"\\n        );\\n        StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n    }\\n\\n    /**\\n     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n     *\\n     * Emits a {BeaconUpgraded} event.\\n     */\\n    function _upgradeBeaconToAndCall(\\n        address newBeacon,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        _setBeacon(newBeacon);\\n        emit BeaconUpgraded(newBeacon);\\n        if (data.length > 0 || forceCall) {\\n            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x5f4c3eed093dfb0e4e20c1c102d2f2c6894a972f454adb308511a0afb37e6f79\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n    /**\\n     * @dev Delegates the current call to `implementation`.\\n     *\\n     * This function does not return to its internall call site, it will return directly to the external caller.\\n     */\\n    function _delegate(address implementation) internal virtual {\\n        assembly {\\n            // Copy msg.data. We take full control of memory in this inline assembly\\n            // block because it will not return to Solidity code. We overwrite the\\n            // Solidity scratch pad at memory position 0.\\n            calldatacopy(0, 0, calldatasize())\\n\\n            // Call the implementation.\\n            // out and outsize are 0 because we don't know the size yet.\\n            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n            // Copy the returned data.\\n            returndatacopy(0, 0, returndatasize())\\n\\n            switch result\\n            // delegatecall returns 0 on error.\\n            case 0 {\\n                revert(0, returndatasize())\\n            }\\n            default {\\n                return(0, returndatasize())\\n            }\\n        }\\n    }\\n\\n    /**\\n     * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n     * and {_fallback} should delegate.\\n     */\\n    function _implementation() internal view virtual returns (address);\\n\\n    /**\\n     * @dev Delegates the current call to the address returned by `_implementation()`.\\n     *\\n     * This function does not return to its internall call site, it will return directly to the external caller.\\n     */\\n    function _fallback() internal virtual {\\n        _beforeFallback();\\n        _delegate(_implementation());\\n    }\\n\\n    /**\\n     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n     * function in the contract matches the call data.\\n     */\\n    fallback() external payable virtual {\\n        _fallback();\\n    }\\n\\n    /**\\n     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n     * is empty.\\n     */\\n    receive() external payable virtual {\\n        _fallback();\\n    }\\n\\n    /**\\n     * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n     * call, or as part of the Solidity `fallback` or `receive` functions.\\n     *\\n     * If overriden should call `super._beforeFallback()`.\\n     */\\n    function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xab2556b154ceb1a11e456f2827ca8f6f65242b1b2fcc00268ab6d38fc6e64bbd\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/BeaconProxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IBeacon.sol\\\";\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"../ERC1967/ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that gets the implementation address for each call from a {UpgradeableBeacon}.\\n *\\n * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't\\n * conflict with the storage layout of the implementation behind the proxy.\\n *\\n * _Available since v3.4._\\n */\\ncontract BeaconProxy is Proxy, ERC1967Upgrade {\\n    /**\\n     * @dev Initializes the proxy with `beacon`.\\n     *\\n     * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This\\n     * will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity\\n     * constructor.\\n     *\\n     * Requirements:\\n     *\\n     * - `beacon` must be a contract with the interface {IBeacon}.\\n     */\\n    constructor(address beacon, bytes memory data) payable {\\n        assert(_BEACON_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.beacon\\\")) - 1));\\n        _upgradeBeaconToAndCall(beacon, data, false);\\n    }\\n\\n    /**\\n     * @dev Returns the current beacon address.\\n     */\\n    function _beacon() internal view virtual returns (address) {\\n        return _getBeacon();\\n    }\\n\\n    /**\\n     * @dev Returns the current implementation address of the associated beacon.\\n     */\\n    function _implementation() internal view virtual override returns (address) {\\n        return IBeacon(_getBeacon()).implementation();\\n    }\\n\\n    /**\\n     * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}.\\n     *\\n     * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon.\\n     *\\n     * Requirements:\\n     *\\n     * - `beacon` must be a contract.\\n     * - The implementation returned by `beacon` must be a contract.\\n     */\\n    function _setBeacon(address beacon, bytes memory data) internal virtual {\\n        _upgradeBeaconToAndCall(beacon, data, false);\\n    }\\n}\\n\",\"keccak256\":\"0x54878f0d2f40b5e13f84977bcd3c71d4c38581414e7efb4909cb16dd3ace392f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n    /**\\n     * @dev Must return an address that can be used as a delegate call target.\\n     *\\n     * {BeaconProxy} will check that this address is a contract.\\n     */\\n    function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/UpgradeableBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IBeacon.sol\\\";\\nimport \\\"../../access/Ownable.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their\\n * implementation contract, which is where they will delegate all function calls.\\n *\\n * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon.\\n */\\ncontract UpgradeableBeacon is IBeacon, Ownable {\\n    address private _implementation;\\n\\n    /**\\n     * @dev Emitted when the implementation returned by the beacon is changed.\\n     */\\n    event Upgraded(address indexed implementation);\\n\\n    /**\\n     * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the\\n     * beacon.\\n     */\\n    constructor(address implementation_) {\\n        _setImplementation(implementation_);\\n    }\\n\\n    /**\\n     * @dev Returns the current implementation address.\\n     */\\n    function implementation() public view virtual override returns (address) {\\n        return _implementation;\\n    }\\n\\n    /**\\n     * @dev Upgrades the beacon to a new implementation.\\n     *\\n     * Emits an {Upgraded} event.\\n     *\\n     * Requirements:\\n     *\\n     * - msg.sender must be the owner of the contract.\\n     * - `newImplementation` must be a contract.\\n     */\\n    function upgradeTo(address newImplementation) public virtual onlyOwner {\\n        _setImplementation(newImplementation);\\n        emit Upgraded(newImplementation);\\n    }\\n\\n    /**\\n     * @dev Sets the implementation contract address for this beacon\\n     *\\n     * Requirements:\\n     *\\n     * - `newImplementation` must be a contract.\\n     */\\n    function _setImplementation(address newImplementation) private {\\n        require(Address.isContract(newImplementation), \\\"UpgradeableBeacon: implementation is not a contract\\\");\\n        _implementation = newImplementation;\\n    }\\n}\\n\",\"keccak256\":\"0x6ec71aef5659f3f74011169948d2fcda8c6599be5bb38f986380a8737f96cc0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(account)\\n        }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x51b758a8815ecc9596c66c37d56b1d33883a444631a3f916b9fe65cb863ef7c4\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n *     function _getImplementation() internal view returns (address) {\\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n *     }\\n *\\n *     function _setImplementation(address newImplementation) internal {\\n *         require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n    struct AddressSlot {\\n        address value;\\n    }\\n\\n    struct BooleanSlot {\\n        bool value;\\n    }\\n\\n    struct Bytes32Slot {\\n        bytes32 value;\\n    }\\n\\n    struct Uint256Slot {\\n        uint256 value;\\n    }\\n\\n    /**\\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n     */\\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n    bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        // Inspired by OraclizeAPI's implementation - MIT licence\\n        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n        if (value == 0) {\\n            return \\\"0\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 digits;\\n        while (temp != 0) {\\n            digits++;\\n            temp /= 10;\\n        }\\n        bytes memory buffer = new bytes(digits);\\n        while (value != 0) {\\n            digits -= 1;\\n            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n            value /= 10;\\n        }\\n        return string(buffer);\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(uint256 value) internal pure returns (string memory) {\\n        if (value == 0) {\\n            return \\\"0x00\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 length = 0;\\n        while (temp != 0) {\\n            length++;\\n            temp >>= 8;\\n        }\\n        return toHexString(value, length);\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n     */\\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n        bytes memory buffer = new bytes(2 * length + 2);\\n        buffer[0] = \\\"0\\\";\\n        buffer[1] = \\\"x\\\";\\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\\n            buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n            value >>= 4;\\n        }\\n        require(value == 0, \\\"Strings: hex length insufficient\\\");\\n        return string(buffer);\\n    }\\n}\\n\",\"keccak256\":\"0x32c202bd28995dd20c4347b7c6467a6d3241c74c8ad3edcbb610cd9205916c45\",\"license\":\"MIT\"},\"contracts/Artist.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\npragma solidity 0.8.7;\\n\\n/*\\n \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588  \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588  \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588  \\n\\u2588\\u2588      \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588\\u2588\\u2588   \\u2588\\u2588 \\u2588\\u2588   \\u2588\\u2588 \\n\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588 \\u2588\\u2588  \\u2588\\u2588 \\u2588\\u2588   \\u2588\\u2588 \\n     \\u2588\\u2588 \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588  \\u2588\\u2588 \\u2588\\u2588 \\u2588\\u2588   \\u2588\\u2588 \\n\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588  \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588   \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588  \\u2588\\u2588   \\u2588\\u2588\\u2588\\u2588 \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\n*/\\n\\nimport {IERC2981Upgradeable, IERC165Upgradeable} from '@openzeppelin/contracts-upgradeable/interfaces/IERC2981Upgradeable.sol';\\nimport {ERC721Upgradeable} from '@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol';\\nimport {OwnableUpgradeable} from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\\nimport {Strings} from '@openzeppelin/contracts/utils/Strings.sol';\\nimport {CountersUpgradeable} from '@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol';\\n\\n// This contract is a combination of Mirror.xyz's Editions.sol and Zora's SingleEditionMintable.sol\\n\\n/**\\n * @title Artist\\n * @author SoundXYZ\\n */\\ncontract Artist is ERC721Upgradeable, IERC2981Upgradeable, OwnableUpgradeable {\\n    // todo (optimization): link Strings as a deployed library\\n    using Strings for uint256;\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    // ============ Structs ============\\n\\n    struct Edition {\\n        // The account that will receive sales revenue.\\n        address payable fundingRecipient;\\n        // The price at which each token will be sold, in ETH.\\n        uint256 price;\\n        // The number of tokens sold so far.\\n        uint32 numSold;\\n        // The maximum number of tokens that can be sold.\\n        uint32 quantity;\\n        // Royalty amount in bps\\n        uint32 royaltyBPS;\\n        // start timestamp of auction (in seconds since unix epoch)\\n        uint32 startTime;\\n        // end timestamp of auction (in seconds since unix epoch)\\n        uint32 endTime;\\n    }\\n\\n    // ============ Storage ============\\n\\n    string internal baseURI;\\n\\n    CountersUpgradeable.Counter private atTokenId;\\n    CountersUpgradeable.Counter private atEditionId;\\n\\n    // Mapping of edition id to descriptive data.\\n    mapping(uint256 => Edition) public editions;\\n    // Mapping of token id to edition id.\\n    mapping(uint256 => uint256) public tokenToEdition;\\n    // The amount of funds that have been deposited for a given edition.\\n    mapping(uint256 => uint256) public depositedForEdition;\\n    // The amount of funds that have already been withdrawn for a given edition.\\n    mapping(uint256 => uint256) public withdrawnForEdition;\\n\\n    // ============ Events ============\\n\\n    event EditionCreated(\\n        uint256 indexed editionId,\\n        address fundingRecipient,\\n        uint256 price,\\n        uint32 quantity,\\n        uint32 royaltyBPS,\\n        uint32 startTime,\\n        uint32 endTime\\n    );\\n\\n    event EditionPurchased(\\n        uint256 indexed editionId,\\n        uint256 indexed tokenId,\\n        // `numSold` at time of purchase represents the \\\"serial number\\\" of the NFT.\\n        uint32 numSold,\\n        // The account that paid for and received the NFT.\\n        address indexed buyer\\n    );\\n\\n    // ============ Methods ============\\n\\n    /**\\n      @param _owner Owner of edition\\n      @param _name Name of artist\\n    */\\n    function initialize(\\n        address _owner,\\n        uint256 _artistId,\\n        string memory _name,\\n        string memory _symbol,\\n        string memory _baseURI\\n    ) public initializer {\\n        __ERC721_init(_name, _symbol);\\n        __Ownable_init();\\n\\n        // Set ownership to original sender of contract call\\n        transferOwnership(_owner);\\n\\n        // E.g. https://sound.xyz/api/metadata/[artistId]/\\n        baseURI = string(abi.encodePacked(_baseURI, _artistId.toString(), '/'));\\n\\n        // Set token id start to be 1 not 0\\n        atTokenId.increment();\\n        // Set edition id start to be 1 not 0\\n        atEditionId.increment();\\n    }\\n\\n    function createEdition(\\n        address payable _fundingRecipient,\\n        uint256 _price,\\n        uint32 _quantity,\\n        uint32 _royaltyBPS,\\n        uint32 _startTime,\\n        uint32 _endTime\\n    ) external onlyOwner {\\n        editions[atEditionId.current()] = Edition({\\n            fundingRecipient: _fundingRecipient,\\n            price: _price,\\n            numSold: 0,\\n            quantity: _quantity,\\n            royaltyBPS: _royaltyBPS,\\n            startTime: _startTime,\\n            endTime: _endTime\\n        });\\n\\n        emit EditionCreated(\\n            atEditionId.current(),\\n            _fundingRecipient,\\n            _price,\\n            _quantity,\\n            _royaltyBPS,\\n            _startTime,\\n            _endTime\\n        );\\n\\n        atEditionId.increment();\\n    }\\n\\n    function buyEdition(uint256 _editionId) external payable {\\n        // Check that the edition exists. Note: this is redundant\\n        // with the next check, but it is useful for clearer error messaging.\\n        require(editions[_editionId].quantity > 0, 'Edition does not exist');\\n        // Check that there are still tokens available to purchase.\\n        require(editions[_editionId].numSold < editions[_editionId].quantity, 'This edition is already sold out.');\\n        // Check that the sender is paying the correct amount.\\n        require(msg.value >= editions[_editionId].price, 'Must send enough to purchase the edition.');\\n        // Don't allow purchases before the start time\\n        require(editions[_editionId].startTime < block.timestamp, \\\"Auction hasn't started\\\");\\n        // Don't allow purchases after the end time\\n        require(editions[_editionId].endTime > block.timestamp, 'Auction has ended');\\n\\n        // Mint a new token for the sender, using the `tokenId`.\\n        _mint(msg.sender, atTokenId.current());\\n        // Update the deposited total for the edition\\n        depositedForEdition[_editionId] += msg.value;\\n        // Increment the number of tokens sold for this edition.\\n        editions[_editionId].numSold++;\\n        // Store the mapping of token id to the edition being purchased.\\n        tokenToEdition[atTokenId.current()] = _editionId;\\n\\n        emit EditionPurchased(_editionId, atTokenId.current(), editions[_editionId].numSold, msg.sender);\\n\\n        atTokenId.increment();\\n    }\\n\\n    // ============ Operational Methods ============\\n\\n    function withdrawFunds(uint256 _editionId) external {\\n        // Compute the amount available for withdrawing from this edition.\\n        uint256 remainingForEdition = depositedForEdition[_editionId] - withdrawnForEdition[_editionId];\\n\\n        // Set the amount withdrawn to the amount deposited.\\n        withdrawnForEdition[_editionId] = depositedForEdition[_editionId];\\n        // Send the amount that was remaining for the edition, to the funding recipient.\\n        _sendFunds(editions[_editionId].fundingRecipient, remainingForEdition);\\n    }\\n\\n    function setStartTime(uint256 _editionId, uint32 _startTime) external onlyOwner {\\n        editions[_editionId].startTime = _startTime;\\n    }\\n\\n    function setEndTime(uint256 _editionId, uint32 _endTime) external onlyOwner {\\n        editions[_editionId].endTime = _endTime;\\n    }\\n\\n    // ============ NFT Methods ============\\n\\n    // Returns e.g. https://sound.xyz/api/metadata/[artistId]/[editionId]/[tokenId]\\n    function tokenURI(uint256 _tokenId) public view override returns (string memory) {\\n        require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');\\n\\n        // Concatenate the components, baseURI, editionId and tokenId, to create URI.\\n        return string(abi.encodePacked(baseURI, tokenToEdition[_tokenId].toString(), '/', _tokenId.toString()));\\n    }\\n\\n    // Returns e.g. https://sound.xyz/api/metadata/[artistId]/storefront\\n    function contractURI() public view returns (string memory) {\\n        // Concatenate the components, baseURI, editionId and tokenId, to create URI.\\n        return string(abi.encodePacked(baseURI, 'storefront'));\\n    }\\n\\n    // ============ Extensions =================\\n\\n    /**\\n        @dev Get token ids for a given edition id\\n        @param _editionId edition id\\n     */\\n    function getTokenIdsOfEdition(uint256 _editionId) public view returns (uint256[] memory) {\\n        uint256[] memory tokenIdsOfEdition = new uint256[](editions[_editionId].numSold);\\n        uint256 index = 0;\\n\\n        for (uint256 id = 1; id < atTokenId.current(); id++) {\\n            if (tokenToEdition[id] == _editionId) {\\n                tokenIdsOfEdition[index] = id;\\n                index++;\\n            }\\n        }\\n        return tokenIdsOfEdition;\\n    }\\n\\n    /**\\n        @dev Get owners of a given edition id\\n        @param _editionId edition id\\n     */\\n    function getOwnersOfEdition(uint256 _editionId) public view returns (address[] memory) {\\n        address[] memory ownersOfEdition = new address[](editions[_editionId].numSold);\\n        uint256 index = 0;\\n\\n        for (uint256 id = 1; id < atTokenId.current(); id++) {\\n            if (tokenToEdition[id] == _editionId) {\\n                ownersOfEdition[index] = ERC721Upgradeable.ownerOf(id);\\n                index++;\\n            }\\n        }\\n        return ownersOfEdition;\\n    }\\n\\n    /**\\n        @dev Get royalty information for token\\n        @param _editionId edition id\\n        @param _salePrice Sale price for the token\\n     */\\n    function royaltyInfo(uint256 _editionId, uint256 _salePrice)\\n        external\\n        view\\n        override\\n        returns (address fundingRecipient, uint256 royaltyAmount)\\n    {\\n        Edition memory edition = editions[_editionId];\\n\\n        if (edition.fundingRecipient == address(0x0)) {\\n            return (edition.fundingRecipient, 0);\\n        }\\n\\n        uint256 royaltyBPS = uint256(edition.royaltyBPS);\\n\\n        return (edition.fundingRecipient, (_salePrice * royaltyBPS) / 10_000);\\n    }\\n\\n    function totalSupply() external view returns (uint256) {\\n        return atTokenId.current() - 1; // because atTokenId is 1-indexed\\n    }\\n\\n    function supportsInterface(bytes4 _interfaceId)\\n        public\\n        view\\n        override(ERC721Upgradeable, IERC165Upgradeable)\\n        returns (bool)\\n    {\\n        return\\n            type(IERC2981Upgradeable).interfaceId == _interfaceId || ERC721Upgradeable.supportsInterface(_interfaceId);\\n    }\\n\\n    // ============ Private Methods ============\\n\\n    function _sendFunds(address payable _recipient, uint256 _amount) private {\\n        require(address(this).balance >= _amount, 'Insufficient balance for send');\\n\\n        (bool success, ) = _recipient.call{value: _amount}('');\\n        require(success, 'Unable to send value: recipient may have reverted');\\n    }\\n}\\n\",\"keccak256\":\"0x3155d09e7cfe4e1af63f932d73ea255aa70bcdd72e8048ca3d2d351a78f81cbc\",\"license\":\"GPL-3.0-or-later\"},\"contracts/ArtistCreator.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-or-later\\npragma solidity 0.8.7;\\n\\n/*\\n \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588  \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588  \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588  \\n\\u2588\\u2588      \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588\\u2588\\u2588   \\u2588\\u2588 \\u2588\\u2588   \\u2588\\u2588 \\n\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588 \\u2588\\u2588  \\u2588\\u2588 \\u2588\\u2588   \\u2588\\u2588 \\n     \\u2588\\u2588 \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588    \\u2588\\u2588 \\u2588\\u2588  \\u2588\\u2588 \\u2588\\u2588 \\u2588\\u2588   \\u2588\\u2588 \\n\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588  \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588   \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588  \\u2588\\u2588   \\u2588\\u2588\\u2588\\u2588 \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\n*/\\n\\nimport '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol';\\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol';\\nimport '@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol';\\nimport '@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol';\\nimport '@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol';\\nimport '@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol';\\nimport '@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol';\\nimport './Artist.sol';\\n\\ncontract ArtistCreator is Initializable, UUPSUpgradeable, OwnableUpgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n    using ECDSAUpgradeable for bytes32;\\n\\n    // ============ Storage ============\\n\\n    bytes32 public constant MINTER_TYPEHASH = keccak256('Deployer(address artistWallet)');\\n    CountersUpgradeable.Counter private atArtistId;\\n    // address used for signature verification, changeable by owner\\n    address public admin;\\n    bytes32 public DOMAIN_SEPARATOR;\\n    address public beaconAddress;\\n    // registry of created contracts\\n    address[] public artistContracts;\\n\\n    // ============ Events ============\\n\\n    /// Emitted when an Artist is created\\n    event CreatedArtist(uint256 artistId, string name, string symbol, address indexed artistAddress);\\n\\n    // ============ Functions ============\\n\\n    /// Initializes factory\\n    function initialize() public initializer {\\n        __Ownable_init_unchained();\\n\\n        // set admin for artist deployment authorization\\n        admin = msg.sender;\\n        DOMAIN_SEPARATOR = keccak256(abi.encode(keccak256('EIP712Domain(uint256 chainId)'), block.chainid));\\n\\n        // set up beacon with msg.sender as the owner\\n        UpgradeableBeacon _beacon = new UpgradeableBeacon(address(new Artist()));\\n        _beacon.transferOwnership(msg.sender);\\n        beaconAddress = address(_beacon);\\n\\n        // Set artist id start to be 1 not 0\\n        atArtistId.increment();\\n    }\\n\\n    /// Creates a new artist contract as a factory with a deterministic address\\n    /// Important: None of these fields (except the Url fields with the same hash) can be changed after calling\\n    /// @param _name Name of the artist\\n    function createArtist(\\n        bytes calldata signature,\\n        string memory _name,\\n        string memory _symbol,\\n        string memory _baseURI\\n    ) public returns (address) {\\n        require((getSigner(signature) == admin), 'invalid authorization signature');\\n\\n        BeaconProxy proxy = new BeaconProxy(\\n            beaconAddress,\\n            abi.encodeWithSelector(\\n                Artist(address(0)).initialize.selector,\\n                msg.sender,\\n                atArtistId.current(),\\n                _name,\\n                _symbol,\\n                _baseURI\\n            )\\n        );\\n\\n        // add to registry\\n        artistContracts.push(address(proxy));\\n\\n        emit CreatedArtist(atArtistId.current(), _name, _symbol, address(proxy));\\n\\n        atArtistId.increment();\\n\\n        return address(proxy);\\n    }\\n\\n    /// Get signer address of signature\\n    function getSigner(bytes calldata signature) public view returns (address) {\\n        require(admin != address(0), 'whitelist not enabled');\\n        // Verify EIP-712 signature by recreating the data structure\\n        // that we signed on the client side, and then using that to recover\\n        // the address that signed the signature for this data.\\n        bytes32 digest = keccak256(\\n            abi.encodePacked('\\\\x19\\\\x01', DOMAIN_SEPARATOR, keccak256(abi.encode(MINTER_TYPEHASH, msg.sender)))\\n        );\\n        // Use the recover method to see what address was used to create\\n        // the signature on this data.\\n        // Note that if the digest doesn't exactly match what was signed we'll\\n        // get a random recovered address.\\n        address recoveredAddress = digest.recover(signature);\\n        return recoveredAddress;\\n    }\\n\\n    /// Sets the admin for authorizing artist deployment\\n    /// @param _newAdmin address of new admin\\n    function setAdmin(address _newAdmin) external {\\n        require(owner() == _msgSender() || admin == _msgSender(), 'invalid authorization');\\n        admin = _newAdmin;\\n    }\\n\\n    function _authorizeUpgrade(address) internal override onlyOwner {}\\n}\\n\",\"keccak256\":\"0xa298ba911ef6486237bf48b7bf868e2985fb06cb8b6f8d8e1e8b06f490a9b334\",\"license\":\"GPL-3.0-or-later\"}},\"version\":1}",
  "bytecode": "0x60a06040523060601b60805234801561001757600080fd5b5060805160601c61522461004b600039600081816104d101528181610514015281816105a601526105e901526152246000f3fe608060405260043610620000ef5760003560e01c80638129fc1c1162000089578063e6adabfd1162000060578063e6adabfd1462000257578063f2fde38b146200027c578063f851a44014620002a1578063fa4d280c14620002c357600080fd5b80638129fc1c14620001fa5780638da5cb5b1462000212578063b16a43f0146200023257600080fd5b80634f1ef28611620000ca5780634f1ef2861462000184578063704b6c02146200019b578063715018a614620001c05780637e2ec6d014620001d857600080fd5b8063233654eb14620000f45780633644e51514620001365780633659cfe6146200015d575b600080fd5b3480156200010157600080fd5b50620001196200011336600462001572565b620002f9565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200014357600080fd5b506200014e60cb5481565b6040519081526020016200012d565b3480156200016a57600080fd5b50620001826200017c366004620014a5565b620004c6565b005b6200018262000195366004620014c3565b6200059b565b348015620001a857600080fd5b5062000182620001ba366004620014a5565b62000661565b348015620001cd57600080fd5b5062000182620006ed565b348015620001e557600080fd5b5060cc5462000119906001600160a01b031681565b3480156200020757600080fd5b506200018262000728565b3480156200021f57600080fd5b506097546001600160a01b031662000119565b3480156200023f57600080fd5b50620001196200025136600462001632565b62000946565b3480156200026457600080fd5b5062000119620002763660046200152c565b62000971565b3480156200028957600080fd5b50620001826200029b366004620014a5565b62000aa7565b348015620002ae57600080fd5b5060ca5462000119906001600160a01b031681565b348015620002d057600080fd5b506200014e7f5925e35aebbeb7738ae3e97ad24e3b4cc09001c8668d81f3365213a0ec1e85b281565b60ca546000906001600160a01b031662000314878762000971565b6001600160a01b031614620003705760405162461bcd60e51b815260206004820152601f60248201527f696e76616c696420617574686f72697a6174696f6e207369676e61747572650060448201526064015b60405180910390fd5b60cc546000906001600160a01b031663055fe41d60e51b336200039260c95490565b888888604051602401620003ab959493929190620016c6565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051620003ea9062001379565b620003f792919062001698565b604051809103906000f08015801562000414573d6000803e3d6000fd5b5060cd80546001810182556000919091527f83978b4c69c48dd978ab43fe30f077615294f938fb7f936d9eb340e51ea7db2e0180546001600160a01b0383166001600160a01b031990911681179091559091507f23748b43b77f98380e738976c6324996908ffc1989994dd3c68631c87a65a7c06200049260c95490565b8787604051620004a59392919062001807565b60405180910390a2620004bc60c980546001019055565b9695505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415620005125760405162461bcd60e51b815260040162000367906200173a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200054662000b46565b6001600160a01b0316146200056f5760405162461bcd60e51b8152600401620003679062001786565b6200057a8162000b74565b60408051600080825260208201909252620005989183919062000ba1565b50565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415620005e75760405162461bcd60e51b815260040162000367906200173a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200061b62000b46565b6001600160a01b031614620006445760405162461bcd60e51b8152600401620003679062001786565b6200064f8262000b74565b6200065d8282600162000ba1565b5050565b6097546001600160a01b031633148062000685575060ca546001600160a01b031633145b620006cb5760405162461bcd60e51b815260206004820152601560248201527434b73b30b634b21030baba3437b934bd30ba34b7b760591b604482015260640162000367565b60ca80546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031633146200071a5760405162461bcd60e51b81526004016200036790620017d2565b62000726600062000cfd565b565b600054610100900460ff16620007455760005460ff161562000749565b303b155b620007ae5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000367565b600054610100900460ff16158015620007d1576000805461ffff19166101011790555b620007db62000d4f565b60ca80546001600160a01b031916331790556040516200082a907fc49a8e302e3e5d6753b2bb3dbc3c28deba5e16e2572a92aef568063c963e3465904690602001918252602082015260400190565b60408051601f1981840301815290829052805160209091012060cb55600090620008549062001387565b604051809103906000f08015801562000871573d6000803e3d6000fd5b50604051620008809062001395565b6001600160a01b039091168152602001604051809103906000f080158015620008ad573d6000803e3d6000fd5b5060405163f2fde38b60e01b81523360048201529091506001600160a01b0382169063f2fde38b90602401600060405180830381600087803b158015620008f357600080fd5b505af115801562000908573d6000803e3d6000fd5b505060cc80546001600160a01b0319166001600160a01b038516179055505060c98054600101905550801562000598576000805461ff001916905550565b60cd81815481106200095757600080fd5b6000918252602090912001546001600160a01b0316905081565b60ca546000906001600160a01b0316620009c65760405162461bcd60e51b81526020600482015260156024820152741dda1a5d195b1a5cdd081b9bdd08195b98589b1959605a1b604482015260640162000367565b60cb54604080517f5925e35aebbeb7738ae3e97ad24e3b4cc09001c8668d81f3365213a0ec1e85b260208201523391810191909152600091906060016040516020818303038152906040528051906020012060405160200162000a4092919061190160f01b81526002810192909252602282015260420190565b604051602081830303815290604052805190602001209050600062000a9e85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869392505062000dc79050565b95945050505050565b6097546001600160a01b0316331462000ad45760405162461bcd60e51b81526004016200036790620017d2565b6001600160a01b03811662000b3b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000367565b620005988162000cfd565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6097546001600160a01b03163314620005985760405162461bcd60e51b81526004016200036790620017d2565b600062000bad62000b46565b905062000bba8462000def565b60008351118062000bc85750815b1562000bdc5762000bda848462000e96565b505b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143805460ff1662000cf657805460ff191660011781556040516001600160a01b038316602482015262000c5e90869060440160408051601f198184030181529190526020810180516001600160e01b0316631b2ce7f360e11b17905262000e96565b50805460ff1916815562000c7162000b46565b6001600160a01b0316826001600160a01b03161462000ceb5760405162461bcd60e51b815260206004820152602f60248201527f45524331393637557067726164653a207570677261646520627265616b73206660448201526e75727468657220757067726164657360881b606482015260840162000367565b62000cf68562000f81565b5050505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1662000dbc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000367565b620007263362000cfd565b600080600062000dd8858562000fc3565b9150915062000de7816200103b565b509392505050565b803b62000e555760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000367565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060823b62000ef75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840162000367565b600080846001600160a01b03168460405162000f1491906200167a565b600060405180830381855af49150503d806000811462000f51576040519150601f19603f3d011682016040523d82523d6000602084013e62000f56565b606091505b509150915062000a9e8282604051806060016040528060278152602001620051c8602791396200120e565b62000f8c8162000def565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60008082516041141562000ffe5760208301516040840151606085015160001a62000ff18782858562001253565b9450945050505062001034565b8251604014156200102c57602083015160408401516200102086838362001348565b93509350505062001034565b506000905060025b9250929050565b600081600481111562001052576200105262001869565b14156200105c5750565b600181600481111562001073576200107362001869565b1415620010c35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640162000367565b6002816004811115620010da57620010da62001869565b14156200112a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640162000367565b600381600481111562001141576200114162001869565b14156200119c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840162000367565b6004816004811115620011b357620011b362001869565b1415620005985760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840162000367565b606083156200121f5750816200124c565b825115620012305782518084602001fd5b8160405162461bcd60e51b815260040162000367919062001725565b9392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156200128c57506000905060036200133f565b8460ff16601b14158015620012a557508460ff16601c14155b15620012b857506000905060046200133f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156200130d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811662001338576000600192509250506200133f565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016200136b8782888562001253565b935093505050935093915050565b610993806200189683390190565b612a91806200222983390190565b61050e8062004cba83390190565b600067ffffffffffffffff80841115620013c157620013c16200187f565b604051601f8501601f19908116603f01168101908282118183101715620013ec57620013ec6200187f565b816040528093508581528686860111156200140657600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146200143857600080fd5b919050565b60008083601f8401126200145057600080fd5b50813567ffffffffffffffff8111156200146957600080fd5b6020830191508360208285010111156200103457600080fd5b600082601f8301126200149457600080fd5b6200124c83833560208501620013a3565b600060208284031215620014b857600080fd5b6200124c8262001420565b60008060408385031215620014d757600080fd5b620014e28362001420565b9150602083013567ffffffffffffffff811115620014ff57600080fd5b8301601f810185136200151157600080fd5b6200152285823560208401620013a3565b9150509250929050565b600080602083850312156200154057600080fd5b823567ffffffffffffffff8111156200155857600080fd5b62001566858286016200143d565b90969095509350505050565b6000806000806000608086880312156200158b57600080fd5b853567ffffffffffffffff80821115620015a457600080fd5b620015b289838a016200143d565b90975095506020880135915080821115620015cc57600080fd5b620015da89838a0162001482565b94506040880135915080821115620015f157600080fd5b620015ff89838a0162001482565b935060608801359150808211156200161657600080fd5b50620016258882890162001482565b9150509295509295909350565b6000602082840312156200164557600080fd5b5035919050565b600081518084526200166681602086016020860162001836565b601f01601f19169290920160200192915050565b600082516200168e81846020870162001836565b9190910192915050565b6001600160a01b0383168152604060208201819052600090620016be908301846200164c565b949350505050565b60018060a01b038616815284602082015260a060408201526000620016ef60a08301866200164c565b82810360608401526200170381866200164c565b905082810360808401526200171981856200164c565b98975050505050505050565b6020815260006200124c60208301846200164c565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8381526060602082015260006200182260608301856200164c565b8281036040840152620004bc81856200164c565b60005b838110156200185357818101518382015260200162001839565b8381111562001863576000848401525b50505050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe608060405260405161099338038061099383398101604081905261002291610470565b61004d60017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5161057f565b60008051602061094c83398151915214610069576100696105d0565b6100758282600061007c565b50506105fc565b61008583610156565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100c65750805b156101515761014f836001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561010757600080fd5b505afa15801561011b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061013f9190610455565b836102f660201b6100291760201c565b505b505050565b6101698161032260201b6100551760201c565b6101c85760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b61024b816001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561020457600080fd5b505afa158015610218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023c9190610455565b61032260201b6100551760201c565b6102b05760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b60648201526084016101bf565b806102d560008051602061094c83398151915260001b61032860201b61005b1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b606061031b838360405180606001604052806027815260200161096c6027913961032b565b9392505050565b3b151590565b90565b6060833b61038a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101bf565b600080856001600160a01b0316856040516103a59190610530565b600060405180830381855af49150503d80600081146103e0576040519150601f19603f3d011682016040523d82523d6000602084013e6103e5565b606091505b5090925090506103f6828286610400565b9695505050505050565b6060831561040f57508161031b565b82511561041f5782518084602001fd5b8160405162461bcd60e51b81526004016101bf919061054c565b80516001600160a01b038116811461045057600080fd5b919050565b60006020828403121561046757600080fd5b61031b82610439565b6000806040838503121561048357600080fd5b61048c83610439565b60208401519092506001600160401b03808211156104a957600080fd5b818501915085601f8301126104bd57600080fd5b8151818111156104cf576104cf6105e6565b604051601f8201601f19908116603f011681019083821181831017156104f7576104f76105e6565b8160405282815288602084870101111561051057600080fd5b6105218360208301602088016105a4565b80955050505050509250929050565b600082516105428184602087016105a4565b9190910192915050565b602081526000825180602084015261056b8160408501602087016105a4565b601f01601f19169190910160400192915050565b60008282101561059f57634e487b7160e01b600052601160045260246000fd5b500390565b60005b838110156105bf5781810151838201526020016105a7565b8381111561014f5750506000910152565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6103418061060b6000396000f3fe60806040523661001357610011610017565b005b6100115b61002761002261005e565b610106565b565b606061004e83836040518060600160405280602781526020016102e56027913961012a565b9392505050565b3b151590565b90565b60006100917fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100c957600080fd5b505afa1580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061023c565b905090565b3660008037600080366000845af43d6000803e808015610125573d6000f35b3d6000fd5b6060833b61018e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a99190610265565b600060405180830381855af49150503d80600081146101e4576040519150601f19603f3d011682016040523d82523d6000602084013e6101e9565b606091505b50915091506101f9828286610203565b9695505050505050565b6060831561021257508161004e565b8251156102225782518084602001fd5b8160405162461bcd60e51b81526004016101859190610281565b60006020828403121561024e57600080fd5b81516001600160a01b038116811461004e57600080fd5b600082516102778184602087016102b4565b9190910192915050565b60208152600082518060208401526102a08160408501602087016102b4565b601f01601f19169190910160400192915050565b60005b838110156102cf5781810151838201526020016102b7565b838111156102de576000848401525b5050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122081b7b94d38e2d760ee5a082c4fb8d9b73ee0e1b3037eb8379ad4a6143c47071a64736f6c63430008070033a3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564608060405234801561001057600080fd5b50612a71806100206000396000f3fe6080604052600436106101d85760003560e01c8063715018a611610102578063bd8616ec11610095578063e8a3d48511610064578063e8a3d4851461064f578063e985e9c514610664578063f2fde38b146106ad578063fbab9e04146106cd57600080fd5b8063bd8616ec146105c2578063c87b56dd146105d5578063d3bb0528146105f5578063e1a3d5731461062257600080fd5b8063a22cb465116100d1578063a22cb46514610542578063abfc83a014610562578063b88d4fde14610582578063bb314ca1146105a257600080fd5b8063715018a6146104cd57806374e79189146104e25780638da5cb5b1461050f57806395d89b411461052d57600080fd5b806323b872dd1161017a57806342842e0e1161014957806342842e0e14610440578063602787ed146104605780636352211e1461048d57806370a08231146104ad57600080fd5b806323b872dd146102fe578063279c806e1461031e5780632a55205a146103e15780633fafef291461042057600080fd5b8063095ea7b3116101b6578063095ea7b31461026c57806313dd29601461028e578063155dd5ee146102bb57806318160ddd146102db57600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063081812fc14610234575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612496565b6106ed565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50610227610718565b6040516102099190612766565b34801561024057600080fd5b5061025461024f3660046124d0565b6107aa565b6040516001600160a01b039091168152602001610209565b34801561027857600080fd5b5061028c6102873660046123c5565b610844565b005b34801561029a57600080fd5b506102ae6102a93660046124d0565b61095a565b60405161020991906126e1565b3480156102c757600080fd5b5061028c6102d63660046124d0565b610a3b565b3480156102e757600080fd5b506102f0610a9b565b604051908152602001610209565b34801561030a57600080fd5b5061028c6103193660046122d1565b610ab7565b34801561032a57600080fd5b506103956103393660046124d0565b60cc602052600090815260409020805460018201546002909201546001600160a01b03909116919063ffffffff808216916401000000008104821691600160401b8204811691600160601b8104821691600160801b9091041687565b604080516001600160a01b039098168852602088019690965263ffffffff94851695870195909552918316606086015282166080850152811660a08401521660c082015260e001610209565b3480156103ed57600080fd5b506104016103fc3660046124e9565b610ae8565b604080516001600160a01b039093168352602083019190915201610209565b34801561042c57600080fd5b5061028c61043b366004612229565b610bb1565b34801561044c57600080fd5b5061028c61045b3660046122d1565b610d9f565b34801561046c57600080fd5b506102f061047b3660046124d0565b60cd6020526000908152604090205481565b34801561049957600080fd5b506102546104a83660046124d0565b610dba565b3480156104b957600080fd5b506102f06104c836600461220c565b610e31565b3480156104d957600080fd5b5061028c610eb8565b3480156104ee57600080fd5b506105026104fd3660046124d0565b610eee565b604051610209919061272e565b34801561051b57600080fd5b506097546001600160a01b0316610254565b34801561053957600080fd5b50610227610fb1565b34801561054e57600080fd5b5061028c61055d366004612392565b610fc0565b34801561056e57600080fd5b5061028c61057d3660046123f1565b610fcb565b34801561058e57600080fd5b5061028c61059d366004612312565b6110ff565b3480156105ae57600080fd5b5061028c6105bd36600461250b565b611137565b61028c6105d03660046124d0565b611197565b3480156105e157600080fd5b506102276105f03660046124d0565b6114b2565b34801561060157600080fd5b506102f06106103660046124d0565b60cf6020526000908152604090205481565b34801561062e57600080fd5b506102f061063d3660046124d0565b60ce6020526000908152604090205481565b34801561065b57600080fd5b5061022761157d565b34801561067057600080fd5b506101fd61067f366004612298565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b3480156106b957600080fd5b5061028c6106c836600461220c565b6115a5565b3480156106d957600080fd5b5061028c6106e836600461250b565b61163d565b600063152a902d60e11b6001600160e01b03198316148061071257506107128261169d565b92915050565b6060606580546107279061292a565b80601f01602080910402602001604051908101604052809291908181526020018280546107539061292a565b80156107a05780601f10610775576101008083540402835291602001916107a0565b820191906000526020600020905b81548152906001019060200180831161078357829003601f168201915b5050505050905090565b6000818152606760205260408120546001600160a01b03166108285760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b600061084f82610dba565b9050806001600160a01b0316836001600160a01b031614156108bd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161081f565b336001600160a01b03821614806108d957506108d9813361067f565b61094b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161081f565b61095583836116ed565b505050565b600081815260cc60205260408120600201546060919063ffffffff1667ffffffffffffffff81111561098e5761098e6129fa565b6040519080825280602002602001820160405280156109b7578160200160208202803683370190505b509050600060015b60ca54811015610a3257600081815260cd6020526040902054851415610a20576109e881610dba565b8383815181106109fa576109fa6129e4565b6001600160a01b039092166020928302919091019091015281610a1c81612965565b9250505b80610a2a81612965565b9150506109bf565b50909392505050565b600081815260cf602090815260408083205460ce909252822054610a5f91906128e7565b600083815260ce602090815260408083205460cf83528184205560cc909152902054909150610a97906001600160a01b03168261175b565b5050565b60006001610aa860ca5490565b610ab291906128e7565b905090565b610ac13382611868565b610add5760405162461bcd60e51b815260040161081f90612800565b61095583838361195f565b600082815260cc60209081526040808320815160e08101835281546001600160a01b031680825260018301549482019490945260029091015463ffffffff80821693830193909352640100000000810483166060830152600160401b810483166080830152600160601b8104831660a0830152600160801b900490911660c08201528291610b7c5751915060009050610baa565b6080810151815163ffffffff90911690612710610b9983886128c8565b610ba391906128b4565b9350935050505b9250929050565b6097546001600160a01b03163314610bdb5760405162461bcd60e51b815260040161081f906127cb565b6040518060e00160405280876001600160a01b03168152602001868152602001600063ffffffff1681526020018563ffffffff1681526020018463ffffffff1681526020018363ffffffff1681526020018263ffffffff1681525060cc6000610c4360cb5490565b81526020808201929092526040908101600020835181546001600160a01b039091166001600160a01b0319909116178155918301516001830155820151600290910180546060840151608085015160a086015160c09096015163ffffffff908116600160801b0263ffffffff60801b19978216600160601b0263ffffffff60601b19938316600160401b02939093166fffffffffffffffff0000000000000000199483166401000000000267ffffffffffffffff1990961692909716919091179390931791909116939093179290921792909216179055610d2360cb5490565b604080516001600160a01b03891681526020810188905263ffffffff8781168284015286811660608301528581166080830152841660a082015290517fb3131d7d301f8caeb40981cffc627b1fdf324b5e4a23845b61c1a6ad2a25f3859181900360c00190a2610d9760cb80546001019055565b505050505050565b610955838383604051806020016040528060008152506110ff565b6000818152606760205260408120546001600160a01b0316806107125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161081f565b60006001600160a01b038216610e9c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161081f565b506001600160a01b031660009081526068602052604090205490565b6097546001600160a01b03163314610ee25760405162461bcd60e51b815260040161081f906127cb565b610eec6000611aff565b565b600081815260cc60205260408120600201546060919063ffffffff1667ffffffffffffffff811115610f2257610f226129fa565b604051908082528060200260200182016040528015610f4b578160200160208202803683370190505b509050600060015b60ca54811015610a3257600081815260cd6020526040902054851415610f9f5780838381518110610f8657610f866129e4565b602090810291909101015281610f9b81612965565b9250505b80610fa981612965565b915050610f53565b6060606680546107279061292a565b610a97338383611b51565b600054610100900460ff16610fe65760005460ff1615610fea565b303b155b61104d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161081f565b600054610100900460ff1615801561106f576000805461ffff19166101011790555b6110798484611c20565b611081611c61565b61108a866115a5565b8161109486611c98565b6040516020016110a59291906125fd565b60405160208183030381529060405260c990805190602001906110c99291906120bd565b506110d860ca80546001019055565b6110e660cb80546001019055565b8015610d97576000805461ff0019169055505050505050565b6111093383611868565b6111255760405162461bcd60e51b815260040161081f90612800565b61113184848484611d96565b50505050565b6097546001600160a01b031633146111615760405162461bcd60e51b815260040161081f906127cb565b600091825260cc6020526040909120600201805463ffffffff909216600160801b0263ffffffff60801b19909216919091179055565b600081815260cc6020526040902060020154640100000000900463ffffffff166111fc5760405162461bcd60e51b815260206004820152601660248201527511591a5d1a5bdb88191bd95cc81b9bdd08195e1a5cdd60521b604482015260640161081f565b600081815260cc602052604090206002015463ffffffff640100000000820481169116106112765760405162461bcd60e51b815260206004820152602160248201527f546869732065646974696f6e20697320616c726561647920736f6c64206f75746044820152601760f91b606482015260840161081f565b600081815260cc60205260409020600101543410156112e95760405162461bcd60e51b815260206004820152602960248201527f4d7573742073656e6420656e6f75676820746f207075726368617365207468656044820152681032b234ba34b7b71760b91b606482015260840161081f565b600081815260cc602052604090206002015442600160601b90910463ffffffff16106113505760405162461bcd60e51b8152602060048201526016602482015275105d58dd1a5bdb881a185cdb89dd081cdd185c9d195960521b604482015260640161081f565b600081815260cc602052604090206002015442600160801b90910463ffffffff16116113b25760405162461bcd60e51b8152602060048201526011602482015270105d58dd1a5bdb881a185cc8195b991959607a1b604482015260640161081f565b6113c4336113bf60ca5490565b611dc9565b600081815260ce6020526040812080543492906113e290849061289c565b9091555050600081815260cc60205260408120600201805463ffffffff169161140a83612980565b91906101000a81548163ffffffff021916908363ffffffff160217905550508060cd600061143760ca5490565b81526020810191909152604001600020553361145260ca5490565b600083815260cc602090815260409182902060020154915163ffffffff909216825284917fe38cb07a52e5d88a83de7c9d29c2841118103e462d20f8c526b35872f9977785910160405180910390a46114af60ca80546001019055565b50565b6000818152606760205260409020546060906001600160a01b03166115315760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161081f565b600082815260cd602052604090205460c99061154c90611c98565b61155584611c98565b60405160200161156793929190612638565b6040516020818303038152906040529050919050565b606060c9604051602001611591919061267e565b604051602081830303815290604052905090565b6097546001600160a01b031633146115cf5760405162461bcd60e51b815260040161081f906127cb565b6001600160a01b0381166116345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081f565b6114af81611aff565b6097546001600160a01b031633146116675760405162461bcd60e51b815260040161081f906127cb565b600091825260cc6020526040909120600201805463ffffffff909216600160601b0263ffffffff60601b19909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806116ce57506001600160e01b03198216635b5e139f60e01b145b8061071257506301ffc9a760e01b6001600160e01b0319831614610712565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061172282610dba565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156117ab5760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e742062616c616e636520666f722073656e64000000604482015260640161081f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146117f8576040519150601f19603f3d011682016040523d82523d6000602084013e6117fd565b606091505b50509050806109555760405162461bcd60e51b815260206004820152603160248201527f556e61626c6520746f2073656e642076616c75653a20726563697069656e74206044820152701b585e481a185d99481c995d995c9d1959607a1b606482015260840161081f565b6000818152606760205260408120546001600160a01b03166118e15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161081f565b60006118ec83610dba565b9050806001600160a01b0316846001600160a01b031614806119275750836001600160a01b031661191c846107aa565b6001600160a01b0316145b8061195757506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661197282610dba565b6001600160a01b0316146119da5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161081f565b6001600160a01b038216611a3c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161081f565b611a476000826116ed565b6001600160a01b0383166000908152606860205260408120805460019290611a709084906128e7565b90915550506001600160a01b0382166000908152606860205260408120805460019290611a9e90849061289c565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611bb35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161081f565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600054610100900460ff16611c475760405162461bcd60e51b815260040161081f90612851565b611c4f611f0b565b611c57611f0b565b610a978282611f32565b600054610100900460ff16611c885760405162461bcd60e51b815260040161081f90612851565b611c90611f0b565b610eec611f80565b606081611cbc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ce65780611cd081612965565b9150611cdf9050600a836128b4565b9150611cc0565b60008167ffffffffffffffff811115611d0157611d016129fa565b6040519080825280601f01601f191660200182016040528015611d2b576020820181803683370190505b5090505b841561195757611d406001836128e7565b9150611d4d600a866129a4565b611d5890603061289c565b60f81b818381518110611d6d57611d6d6129e4565b60200101906001600160f81b031916908160001a905350611d8f600a866128b4565b9450611d2f565b611da184848461195f565b611dad84848484611fb0565b6111315760405162461bcd60e51b815260040161081f90612779565b6001600160a01b038216611e1f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161081f565b6000818152606760205260409020546001600160a01b031615611e845760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161081f565b6001600160a01b0382166000908152606860205260408120805460019290611ead90849061289c565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600054610100900460ff16610eec5760405162461bcd60e51b815260040161081f90612851565b600054610100900460ff16611f595760405162461bcd60e51b815260040161081f90612851565b8151611f6c9060659060208501906120bd565b5080516109559060669060208401906120bd565b600054610100900460ff16611fa75760405162461bcd60e51b815260040161081f90612851565b610eec33611aff565b60006001600160a01b0384163b156120b257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ff49033908990889088906004016126a4565b602060405180830381600087803b15801561200e57600080fd5b505af192505050801561203e575060408051601f3d908101601f1916820190925261203b918101906124b3565b60015b612098573d80801561206c576040519150601f19603f3d011682016040523d82523d6000602084013e612071565b606091505b5080516120905760405162461bcd60e51b815260040161081f90612779565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611957565b506001949350505050565b8280546120c99061292a565b90600052602060002090601f0160209004810192826120eb5760008555612131565b82601f1061210457805160ff1916838001178555612131565b82800160010185558215612131579182015b82811115612131578251825591602001919060010190612116565b5061213d929150612141565b5090565b5b8082111561213d5760008155600101612142565b600067ffffffffffffffff80841115612171576121716129fa565b604051601f8501601f19908116603f01168101908282118183101715612199576121996129fa565b816040528093508581528686860111156121b257600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126121dd57600080fd5b6121ec83833560208501612156565b9392505050565b803563ffffffff8116811461220757600080fd5b919050565b60006020828403121561221e57600080fd5b81356121ec81612a10565b60008060008060008060c0878903121561224257600080fd5b863561224d81612a10565b955060208701359450612262604088016121f3565b9350612270606088016121f3565b925061227e608088016121f3565b915061228c60a088016121f3565b90509295509295509295565b600080604083850312156122ab57600080fd5b82356122b681612a10565b915060208301356122c681612a10565b809150509250929050565b6000806000606084860312156122e657600080fd5b83356122f181612a10565b9250602084013561230181612a10565b929592945050506040919091013590565b6000806000806080858703121561232857600080fd5b843561233381612a10565b9350602085013561234381612a10565b925060408501359150606085013567ffffffffffffffff81111561236657600080fd5b8501601f8101871361237757600080fd5b61238687823560208401612156565b91505092959194509250565b600080604083850312156123a557600080fd5b82356123b081612a10565b9150602083013580151581146122c657600080fd5b600080604083850312156123d857600080fd5b82356123e381612a10565b946020939093013593505050565b600080600080600060a0868803121561240957600080fd5b853561241481612a10565b945060208601359350604086013567ffffffffffffffff8082111561243857600080fd5b61244489838a016121cc565b9450606088013591508082111561245a57600080fd5b61246689838a016121cc565b9350608088013591508082111561247c57600080fd5b50612489888289016121cc565b9150509295509295909350565b6000602082840312156124a857600080fd5b81356121ec81612a25565b6000602082840312156124c557600080fd5b81516121ec81612a25565b6000602082840312156124e257600080fd5b5035919050565b600080604083850312156124fc57600080fd5b50508035926020909101359150565b6000806040838503121561251e57600080fd5b8235915061252e602084016121f3565b90509250929050565b6000815180845261254f8160208601602086016128fe565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061257d57607f831692505b602080841082141561259f57634e487b7160e01b600052602260045260246000fd5b8180156125b357600181146125c4576125f1565b60ff198616895284890196506125f1565b60008881526020902060005b868110156125e95781548b8201529085019083016125d0565b505084890196505b50505050505092915050565b6000835161260f8184602088016128fe565b8351908301906126238183602088016128fe565b602f60f81b9101908152600101949350505050565b60006126448286612563565b84516126548183602089016128fe565b602f60f81b910190815283516126718160018401602088016128fe565b0160010195945050505050565b600061268a8284612563565b691cdd1bdc99599c9bdb9d60b21b8152600a019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126d790830184612537565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156127225783516001600160a01b0316835292840192918401916001016126fd565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156127225783518352928401929184019160010161274a565b6020815260006121ec6020830184612537565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082198211156128af576128af6129b8565b500190565b6000826128c3576128c36129ce565b500490565b60008160001904831182151516156128e2576128e26129b8565b500290565b6000828210156128f9576128f96129b8565b500390565b60005b83811015612919578181015183820152602001612901565b838111156111315750506000910152565b600181811c9082168061293e57607f821691505b6020821081141561295f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612979576129796129b8565b5060010190565b600063ffffffff8083168181141561299a5761299a6129b8565b6001019392505050565b6000826129b3576129b36129ce565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146114af57600080fd5b6001600160e01b0319811681146114af57600080fdfea26469706673582212206e9a24a06d93a2bae6055597f9c920aa6485479a54e78d5ae543c783793b3d2264736f6c63430008070033608060405234801561001057600080fd5b5060405161050e38038061050e83398101604081905261002f91610148565b61003833610047565b61004181610097565b50610178565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6100aa8161014260201b61020a1760201c565b6101205760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60448201527f6e206973206e6f74206120636f6e747261637400000000000000000000000000606482015260840160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3b151590565b60006020828403121561015a57600080fd5b81516001600160a01b038116811461017157600080fd5b9392505050565b610387806101876000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ec565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f610139565b6000546001600160a01b031661007e565b61006f6100c13660046102ec565b61016f565b6000546001600160a01b031633146100f95760405162461bcd60e51b81526004016100f09061031c565b60405180910390fd5b61010281610210565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6000546001600160a01b031633146101635760405162461bcd60e51b81526004016100f09061031c565b61016d600061029c565b565b6000546001600160a01b031633146101995760405162461bcd60e51b81526004016100f09061031c565b6001600160a01b0381166101fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100f0565b6102078161029c565b50565b3b151590565b803b61027a5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b60648201526084016100f0565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156102fe57600080fd5b81356001600160a01b038116811461031557600080fd5b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260408201526060019056fea2646970667358221220f118eb414a6e2818df67771501def6895f30169ec351de47781ca190a332f3c164736f6c63430008070033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220234d62ec919c17b5ffe1a576abb5c4b7f5cf732fa2c586ad5b4ab804c05b58e364736f6c63430008070033",
  "deployedBytecode": "0x608060405260043610620000ef5760003560e01c80638129fc1c1162000089578063e6adabfd1162000060578063e6adabfd1462000257578063f2fde38b146200027c578063f851a44014620002a1578063fa4d280c14620002c357600080fd5b80638129fc1c14620001fa5780638da5cb5b1462000212578063b16a43f0146200023257600080fd5b80634f1ef28611620000ca5780634f1ef2861462000184578063704b6c02146200019b578063715018a614620001c05780637e2ec6d014620001d857600080fd5b8063233654eb14620000f45780633644e51514620001365780633659cfe6146200015d575b600080fd5b3480156200010157600080fd5b50620001196200011336600462001572565b620002f9565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156200014357600080fd5b506200014e60cb5481565b6040519081526020016200012d565b3480156200016a57600080fd5b50620001826200017c366004620014a5565b620004c6565b005b6200018262000195366004620014c3565b6200059b565b348015620001a857600080fd5b5062000182620001ba366004620014a5565b62000661565b348015620001cd57600080fd5b5062000182620006ed565b348015620001e557600080fd5b5060cc5462000119906001600160a01b031681565b3480156200020757600080fd5b506200018262000728565b3480156200021f57600080fd5b506097546001600160a01b031662000119565b3480156200023f57600080fd5b50620001196200025136600462001632565b62000946565b3480156200026457600080fd5b5062000119620002763660046200152c565b62000971565b3480156200028957600080fd5b50620001826200029b366004620014a5565b62000aa7565b348015620002ae57600080fd5b5060ca5462000119906001600160a01b031681565b348015620002d057600080fd5b506200014e7f5925e35aebbeb7738ae3e97ad24e3b4cc09001c8668d81f3365213a0ec1e85b281565b60ca546000906001600160a01b031662000314878762000971565b6001600160a01b031614620003705760405162461bcd60e51b815260206004820152601f60248201527f696e76616c696420617574686f72697a6174696f6e207369676e61747572650060448201526064015b60405180910390fd5b60cc546000906001600160a01b031663055fe41d60e51b336200039260c95490565b888888604051602401620003ab959493929190620016c6565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051620003ea9062001379565b620003f792919062001698565b604051809103906000f08015801562000414573d6000803e3d6000fd5b5060cd80546001810182556000919091527f83978b4c69c48dd978ab43fe30f077615294f938fb7f936d9eb340e51ea7db2e0180546001600160a01b0383166001600160a01b031990911681179091559091507f23748b43b77f98380e738976c6324996908ffc1989994dd3c68631c87a65a7c06200049260c95490565b8787604051620004a59392919062001807565b60405180910390a2620004bc60c980546001019055565b9695505050505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415620005125760405162461bcd60e51b815260040162000367906200173a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200054662000b46565b6001600160a01b0316146200056f5760405162461bcd60e51b8152600401620003679062001786565b6200057a8162000b74565b60408051600080825260208201909252620005989183919062000ba1565b50565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161415620005e75760405162461bcd60e51b815260040162000367906200173a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166200061b62000b46565b6001600160a01b031614620006445760405162461bcd60e51b8152600401620003679062001786565b6200064f8262000b74565b6200065d8282600162000ba1565b5050565b6097546001600160a01b031633148062000685575060ca546001600160a01b031633145b620006cb5760405162461bcd60e51b815260206004820152601560248201527434b73b30b634b21030baba3437b934bd30ba34b7b760591b604482015260640162000367565b60ca80546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031633146200071a5760405162461bcd60e51b81526004016200036790620017d2565b62000726600062000cfd565b565b600054610100900460ff16620007455760005460ff161562000749565b303b155b620007ae5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000367565b600054610100900460ff16158015620007d1576000805461ffff19166101011790555b620007db62000d4f565b60ca80546001600160a01b031916331790556040516200082a907fc49a8e302e3e5d6753b2bb3dbc3c28deba5e16e2572a92aef568063c963e3465904690602001918252602082015260400190565b60408051601f1981840301815290829052805160209091012060cb55600090620008549062001387565b604051809103906000f08015801562000871573d6000803e3d6000fd5b50604051620008809062001395565b6001600160a01b039091168152602001604051809103906000f080158015620008ad573d6000803e3d6000fd5b5060405163f2fde38b60e01b81523360048201529091506001600160a01b0382169063f2fde38b90602401600060405180830381600087803b158015620008f357600080fd5b505af115801562000908573d6000803e3d6000fd5b505060cc80546001600160a01b0319166001600160a01b038516179055505060c98054600101905550801562000598576000805461ff001916905550565b60cd81815481106200095757600080fd5b6000918252602090912001546001600160a01b0316905081565b60ca546000906001600160a01b0316620009c65760405162461bcd60e51b81526020600482015260156024820152741dda1a5d195b1a5cdd081b9bdd08195b98589b1959605a1b604482015260640162000367565b60cb54604080517f5925e35aebbeb7738ae3e97ad24e3b4cc09001c8668d81f3365213a0ec1e85b260208201523391810191909152600091906060016040516020818303038152906040528051906020012060405160200162000a4092919061190160f01b81526002810192909252602282015260420190565b604051602081830303815290604052805190602001209050600062000a9e85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869392505062000dc79050565b95945050505050565b6097546001600160a01b0316331462000ad45760405162461bcd60e51b81526004016200036790620017d2565b6001600160a01b03811662000b3b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000367565b620005988162000cfd565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6097546001600160a01b03163314620005985760405162461bcd60e51b81526004016200036790620017d2565b600062000bad62000b46565b905062000bba8462000def565b60008351118062000bc85750815b1562000bdc5762000bda848462000e96565b505b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143805460ff1662000cf657805460ff191660011781556040516001600160a01b038316602482015262000c5e90869060440160408051601f198184030181529190526020810180516001600160e01b0316631b2ce7f360e11b17905262000e96565b50805460ff1916815562000c7162000b46565b6001600160a01b0316826001600160a01b03161462000ceb5760405162461bcd60e51b815260206004820152602f60248201527f45524331393637557067726164653a207570677261646520627265616b73206660448201526e75727468657220757067726164657360881b606482015260840162000367565b62000cf68562000f81565b5050505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff1662000dbc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000367565b620007263362000cfd565b600080600062000dd8858562000fc3565b9150915062000de7816200103b565b509392505050565b803b62000e555760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000367565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060823b62000ef75760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840162000367565b600080846001600160a01b03168460405162000f1491906200167a565b600060405180830381855af49150503d806000811462000f51576040519150601f19603f3d011682016040523d82523d6000602084013e62000f56565b606091505b509150915062000a9e8282604051806060016040528060278152602001620051c8602791396200120e565b62000f8c8162000def565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60008082516041141562000ffe5760208301516040840151606085015160001a62000ff18782858562001253565b9450945050505062001034565b8251604014156200102c57602083015160408401516200102086838362001348565b93509350505062001034565b506000905060025b9250929050565b600081600481111562001052576200105262001869565b14156200105c5750565b600181600481111562001073576200107362001869565b1415620010c35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640162000367565b6002816004811115620010da57620010da62001869565b14156200112a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640162000367565b600381600481111562001141576200114162001869565b14156200119c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840162000367565b6004816004811115620011b357620011b362001869565b1415620005985760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840162000367565b606083156200121f5750816200124c565b825115620012305782518084602001fd5b8160405162461bcd60e51b815260040162000367919062001725565b9392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156200128c57506000905060036200133f565b8460ff16601b14158015620012a557508460ff16601c14155b15620012b857506000905060046200133f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156200130d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811662001338576000600192509250506200133f565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016200136b8782888562001253565b935093505050935093915050565b610993806200189683390190565b612a91806200222983390190565b61050e8062004cba83390190565b600067ffffffffffffffff80841115620013c157620013c16200187f565b604051601f8501601f19908116603f01168101908282118183101715620013ec57620013ec6200187f565b816040528093508581528686860111156200140657600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146200143857600080fd5b919050565b60008083601f8401126200145057600080fd5b50813567ffffffffffffffff8111156200146957600080fd5b6020830191508360208285010111156200103457600080fd5b600082601f8301126200149457600080fd5b6200124c83833560208501620013a3565b600060208284031215620014b857600080fd5b6200124c8262001420565b60008060408385031215620014d757600080fd5b620014e28362001420565b9150602083013567ffffffffffffffff811115620014ff57600080fd5b8301601f810185136200151157600080fd5b6200152285823560208401620013a3565b9150509250929050565b600080602083850312156200154057600080fd5b823567ffffffffffffffff8111156200155857600080fd5b62001566858286016200143d565b90969095509350505050565b6000806000806000608086880312156200158b57600080fd5b853567ffffffffffffffff80821115620015a457600080fd5b620015b289838a016200143d565b90975095506020880135915080821115620015cc57600080fd5b620015da89838a0162001482565b94506040880135915080821115620015f157600080fd5b620015ff89838a0162001482565b935060608801359150808211156200161657600080fd5b50620016258882890162001482565b9150509295509295909350565b6000602082840312156200164557600080fd5b5035919050565b600081518084526200166681602086016020860162001836565b601f01601f19169290920160200192915050565b600082516200168e81846020870162001836565b9190910192915050565b6001600160a01b0383168152604060208201819052600090620016be908301846200164c565b949350505050565b60018060a01b038616815284602082015260a060408201526000620016ef60a08301866200164c565b82810360608401526200170381866200164c565b905082810360808401526200171981856200164c565b98975050505050505050565b6020815260006200124c60208301846200164c565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8381526060602082015260006200182260608301856200164c565b8281036040840152620004bc81856200164c565b60005b838110156200185357818101518382015260200162001839565b8381111562001863576000848401525b50505050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fdfe608060405260405161099338038061099383398101604081905261002291610470565b61004d60017fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5161057f565b60008051602061094c83398151915214610069576100696105d0565b6100758282600061007c565b50506105fc565b61008583610156565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a26000825111806100c65750805b156101515761014f836001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561010757600080fd5b505afa15801561011b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061013f9190610455565b836102f660201b6100291760201c565b505b505050565b6101698161032260201b6100551760201c565b6101c85760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b61024b816001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561020457600080fd5b505afa158015610218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023c9190610455565b61032260201b6100551760201c565b6102b05760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b60648201526084016101bf565b806102d560008051602061094c83398151915260001b61032860201b61005b1760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b606061031b838360405180606001604052806027815260200161096c6027913961032b565b9392505050565b3b151590565b90565b6060833b61038a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016101bf565b600080856001600160a01b0316856040516103a59190610530565b600060405180830381855af49150503d80600081146103e0576040519150601f19603f3d011682016040523d82523d6000602084013e6103e5565b606091505b5090925090506103f6828286610400565b9695505050505050565b6060831561040f57508161031b565b82511561041f5782518084602001fd5b8160405162461bcd60e51b81526004016101bf919061054c565b80516001600160a01b038116811461045057600080fd5b919050565b60006020828403121561046757600080fd5b61031b82610439565b6000806040838503121561048357600080fd5b61048c83610439565b60208401519092506001600160401b03808211156104a957600080fd5b818501915085601f8301126104bd57600080fd5b8151818111156104cf576104cf6105e6565b604051601f8201601f19908116603f011681019083821181831017156104f7576104f76105e6565b8160405282815288602084870101111561051057600080fd5b6105218360208301602088016105a4565b80955050505050509250929050565b600082516105428184602087016105a4565b9190910192915050565b602081526000825180602084015261056b8160408501602087016105a4565b601f01601f19169190910160400192915050565b60008282101561059f57634e487b7160e01b600052601160045260246000fd5b500390565b60005b838110156105bf5781810151838201526020016105a7565b8381111561014f5750506000910152565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6103418061060b6000396000f3fe60806040523661001357610011610017565b005b6100115b61002761002261005e565b610106565b565b606061004e83836040518060600160405280602781526020016102e56027913961012a565b9392505050565b3b151590565b90565b60006100917fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156100c957600080fd5b505afa1580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061023c565b905090565b3660008037600080366000845af43d6000803e808015610125573d6000f35b3d6000fd5b6060833b61018e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516101a99190610265565b600060405180830381855af49150503d80600081146101e4576040519150601f19603f3d011682016040523d82523d6000602084013e6101e9565b606091505b50915091506101f9828286610203565b9695505050505050565b6060831561021257508161004e565b8251156102225782518084602001fd5b8160405162461bcd60e51b81526004016101859190610281565b60006020828403121561024e57600080fd5b81516001600160a01b038116811461004e57600080fd5b600082516102778184602087016102b4565b9190910192915050565b60208152600082518060208401526102a08160408501602087016102b4565b601f01601f19169190910160400192915050565b60005b838110156102cf5781810151838201526020016102b7565b838111156102de576000848401525b5050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122081b7b94d38e2d760ee5a082c4fb8d9b73ee0e1b3037eb8379ad4a6143c47071a64736f6c63430008070033a3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564608060405234801561001057600080fd5b50612a71806100206000396000f3fe6080604052600436106101d85760003560e01c8063715018a611610102578063bd8616ec11610095578063e8a3d48511610064578063e8a3d4851461064f578063e985e9c514610664578063f2fde38b146106ad578063fbab9e04146106cd57600080fd5b8063bd8616ec146105c2578063c87b56dd146105d5578063d3bb0528146105f5578063e1a3d5731461062257600080fd5b8063a22cb465116100d1578063a22cb46514610542578063abfc83a014610562578063b88d4fde14610582578063bb314ca1146105a257600080fd5b8063715018a6146104cd57806374e79189146104e25780638da5cb5b1461050f57806395d89b411461052d57600080fd5b806323b872dd1161017a57806342842e0e1161014957806342842e0e14610440578063602787ed146104605780636352211e1461048d57806370a08231146104ad57600080fd5b806323b872dd146102fe578063279c806e1461031e5780632a55205a146103e15780633fafef291461042057600080fd5b8063095ea7b3116101b6578063095ea7b31461026c57806313dd29601461028e578063155dd5ee146102bb57806318160ddd146102db57600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063081812fc14610234575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612496565b6106ed565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50610227610718565b6040516102099190612766565b34801561024057600080fd5b5061025461024f3660046124d0565b6107aa565b6040516001600160a01b039091168152602001610209565b34801561027857600080fd5b5061028c6102873660046123c5565b610844565b005b34801561029a57600080fd5b506102ae6102a93660046124d0565b61095a565b60405161020991906126e1565b3480156102c757600080fd5b5061028c6102d63660046124d0565b610a3b565b3480156102e757600080fd5b506102f0610a9b565b604051908152602001610209565b34801561030a57600080fd5b5061028c6103193660046122d1565b610ab7565b34801561032a57600080fd5b506103956103393660046124d0565b60cc602052600090815260409020805460018201546002909201546001600160a01b03909116919063ffffffff808216916401000000008104821691600160401b8204811691600160601b8104821691600160801b9091041687565b604080516001600160a01b039098168852602088019690965263ffffffff94851695870195909552918316606086015282166080850152811660a08401521660c082015260e001610209565b3480156103ed57600080fd5b506104016103fc3660046124e9565b610ae8565b604080516001600160a01b039093168352602083019190915201610209565b34801561042c57600080fd5b5061028c61043b366004612229565b610bb1565b34801561044c57600080fd5b5061028c61045b3660046122d1565b610d9f565b34801561046c57600080fd5b506102f061047b3660046124d0565b60cd6020526000908152604090205481565b34801561049957600080fd5b506102546104a83660046124d0565b610dba565b3480156104b957600080fd5b506102f06104c836600461220c565b610e31565b3480156104d957600080fd5b5061028c610eb8565b3480156104ee57600080fd5b506105026104fd3660046124d0565b610eee565b604051610209919061272e565b34801561051b57600080fd5b506097546001600160a01b0316610254565b34801561053957600080fd5b50610227610fb1565b34801561054e57600080fd5b5061028c61055d366004612392565b610fc0565b34801561056e57600080fd5b5061028c61057d3660046123f1565b610fcb565b34801561058e57600080fd5b5061028c61059d366004612312565b6110ff565b3480156105ae57600080fd5b5061028c6105bd36600461250b565b611137565b61028c6105d03660046124d0565b611197565b3480156105e157600080fd5b506102276105f03660046124d0565b6114b2565b34801561060157600080fd5b506102f06106103660046124d0565b60cf6020526000908152604090205481565b34801561062e57600080fd5b506102f061063d3660046124d0565b60ce6020526000908152604090205481565b34801561065b57600080fd5b5061022761157d565b34801561067057600080fd5b506101fd61067f366004612298565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b3480156106b957600080fd5b5061028c6106c836600461220c565b6115a5565b3480156106d957600080fd5b5061028c6106e836600461250b565b61163d565b600063152a902d60e11b6001600160e01b03198316148061071257506107128261169d565b92915050565b6060606580546107279061292a565b80601f01602080910402602001604051908101604052809291908181526020018280546107539061292a565b80156107a05780601f10610775576101008083540402835291602001916107a0565b820191906000526020600020905b81548152906001019060200180831161078357829003601f168201915b5050505050905090565b6000818152606760205260408120546001600160a01b03166108285760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b600061084f82610dba565b9050806001600160a01b0316836001600160a01b031614156108bd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161081f565b336001600160a01b03821614806108d957506108d9813361067f565b61094b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161081f565b61095583836116ed565b505050565b600081815260cc60205260408120600201546060919063ffffffff1667ffffffffffffffff81111561098e5761098e6129fa565b6040519080825280602002602001820160405280156109b7578160200160208202803683370190505b509050600060015b60ca54811015610a3257600081815260cd6020526040902054851415610a20576109e881610dba565b8383815181106109fa576109fa6129e4565b6001600160a01b039092166020928302919091019091015281610a1c81612965565b9250505b80610a2a81612965565b9150506109bf565b50909392505050565b600081815260cf602090815260408083205460ce909252822054610a5f91906128e7565b600083815260ce602090815260408083205460cf83528184205560cc909152902054909150610a97906001600160a01b03168261175b565b5050565b60006001610aa860ca5490565b610ab291906128e7565b905090565b610ac13382611868565b610add5760405162461bcd60e51b815260040161081f90612800565b61095583838361195f565b600082815260cc60209081526040808320815160e08101835281546001600160a01b031680825260018301549482019490945260029091015463ffffffff80821693830193909352640100000000810483166060830152600160401b810483166080830152600160601b8104831660a0830152600160801b900490911660c08201528291610b7c5751915060009050610baa565b6080810151815163ffffffff90911690612710610b9983886128c8565b610ba391906128b4565b9350935050505b9250929050565b6097546001600160a01b03163314610bdb5760405162461bcd60e51b815260040161081f906127cb565b6040518060e00160405280876001600160a01b03168152602001868152602001600063ffffffff1681526020018563ffffffff1681526020018463ffffffff1681526020018363ffffffff1681526020018263ffffffff1681525060cc6000610c4360cb5490565b81526020808201929092526040908101600020835181546001600160a01b039091166001600160a01b0319909116178155918301516001830155820151600290910180546060840151608085015160a086015160c09096015163ffffffff908116600160801b0263ffffffff60801b19978216600160601b0263ffffffff60601b19938316600160401b02939093166fffffffffffffffff0000000000000000199483166401000000000267ffffffffffffffff1990961692909716919091179390931791909116939093179290921792909216179055610d2360cb5490565b604080516001600160a01b03891681526020810188905263ffffffff8781168284015286811660608301528581166080830152841660a082015290517fb3131d7d301f8caeb40981cffc627b1fdf324b5e4a23845b61c1a6ad2a25f3859181900360c00190a2610d9760cb80546001019055565b505050505050565b610955838383604051806020016040528060008152506110ff565b6000818152606760205260408120546001600160a01b0316806107125760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161081f565b60006001600160a01b038216610e9c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161081f565b506001600160a01b031660009081526068602052604090205490565b6097546001600160a01b03163314610ee25760405162461bcd60e51b815260040161081f906127cb565b610eec6000611aff565b565b600081815260cc60205260408120600201546060919063ffffffff1667ffffffffffffffff811115610f2257610f226129fa565b604051908082528060200260200182016040528015610f4b578160200160208202803683370190505b509050600060015b60ca54811015610a3257600081815260cd6020526040902054851415610f9f5780838381518110610f8657610f866129e4565b602090810291909101015281610f9b81612965565b9250505b80610fa981612965565b915050610f53565b6060606680546107279061292a565b610a97338383611b51565b600054610100900460ff16610fe65760005460ff1615610fea565b303b155b61104d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161081f565b600054610100900460ff1615801561106f576000805461ffff19166101011790555b6110798484611c20565b611081611c61565b61108a866115a5565b8161109486611c98565b6040516020016110a59291906125fd565b60405160208183030381529060405260c990805190602001906110c99291906120bd565b506110d860ca80546001019055565b6110e660cb80546001019055565b8015610d97576000805461ff0019169055505050505050565b6111093383611868565b6111255760405162461bcd60e51b815260040161081f90612800565b61113184848484611d96565b50505050565b6097546001600160a01b031633146111615760405162461bcd60e51b815260040161081f906127cb565b600091825260cc6020526040909120600201805463ffffffff909216600160801b0263ffffffff60801b19909216919091179055565b600081815260cc6020526040902060020154640100000000900463ffffffff166111fc5760405162461bcd60e51b815260206004820152601660248201527511591a5d1a5bdb88191bd95cc81b9bdd08195e1a5cdd60521b604482015260640161081f565b600081815260cc602052604090206002015463ffffffff640100000000820481169116106112765760405162461bcd60e51b815260206004820152602160248201527f546869732065646974696f6e20697320616c726561647920736f6c64206f75746044820152601760f91b606482015260840161081f565b600081815260cc60205260409020600101543410156112e95760405162461bcd60e51b815260206004820152602960248201527f4d7573742073656e6420656e6f75676820746f207075726368617365207468656044820152681032b234ba34b7b71760b91b606482015260840161081f565b600081815260cc602052604090206002015442600160601b90910463ffffffff16106113505760405162461bcd60e51b8152602060048201526016602482015275105d58dd1a5bdb881a185cdb89dd081cdd185c9d195960521b604482015260640161081f565b600081815260cc602052604090206002015442600160801b90910463ffffffff16116113b25760405162461bcd60e51b8152602060048201526011602482015270105d58dd1a5bdb881a185cc8195b991959607a1b604482015260640161081f565b6113c4336113bf60ca5490565b611dc9565b600081815260ce6020526040812080543492906113e290849061289c565b9091555050600081815260cc60205260408120600201805463ffffffff169161140a83612980565b91906101000a81548163ffffffff021916908363ffffffff160217905550508060cd600061143760ca5490565b81526020810191909152604001600020553361145260ca5490565b600083815260cc602090815260409182902060020154915163ffffffff909216825284917fe38cb07a52e5d88a83de7c9d29c2841118103e462d20f8c526b35872f9977785910160405180910390a46114af60ca80546001019055565b50565b6000818152606760205260409020546060906001600160a01b03166115315760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161081f565b600082815260cd602052604090205460c99061154c90611c98565b61155584611c98565b60405160200161156793929190612638565b6040516020818303038152906040529050919050565b606060c9604051602001611591919061267e565b604051602081830303815290604052905090565b6097546001600160a01b031633146115cf5760405162461bcd60e51b815260040161081f906127cb565b6001600160a01b0381166116345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081f565b6114af81611aff565b6097546001600160a01b031633146116675760405162461bcd60e51b815260040161081f906127cb565b600091825260cc6020526040909120600201805463ffffffff909216600160601b0263ffffffff60601b19909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806116ce57506001600160e01b03198216635b5e139f60e01b145b8061071257506301ffc9a760e01b6001600160e01b0319831614610712565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061172282610dba565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156117ab5760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e742062616c616e636520666f722073656e64000000604482015260640161081f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146117f8576040519150601f19603f3d011682016040523d82523d6000602084013e6117fd565b606091505b50509050806109555760405162461bcd60e51b815260206004820152603160248201527f556e61626c6520746f2073656e642076616c75653a20726563697069656e74206044820152701b585e481a185d99481c995d995c9d1959607a1b606482015260840161081f565b6000818152606760205260408120546001600160a01b03166118e15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161081f565b60006118ec83610dba565b9050806001600160a01b0316846001600160a01b031614806119275750836001600160a01b031661191c846107aa565b6001600160a01b0316145b8061195757506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661197282610dba565b6001600160a01b0316146119da5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161081f565b6001600160a01b038216611a3c5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161081f565b611a476000826116ed565b6001600160a01b0383166000908152606860205260408120805460019290611a709084906128e7565b90915550506001600160a01b0382166000908152606860205260408120805460019290611a9e90849061289c565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b609780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611bb35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161081f565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b600054610100900460ff16611c475760405162461bcd60e51b815260040161081f90612851565b611c4f611f0b565b611c57611f0b565b610a978282611f32565b600054610100900460ff16611c885760405162461bcd60e51b815260040161081f90612851565b611c90611f0b565b610eec611f80565b606081611cbc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ce65780611cd081612965565b9150611cdf9050600a836128b4565b9150611cc0565b60008167ffffffffffffffff811115611d0157611d016129fa565b6040519080825280601f01601f191660200182016040528015611d2b576020820181803683370190505b5090505b841561195757611d406001836128e7565b9150611d4d600a866129a4565b611d5890603061289c565b60f81b818381518110611d6d57611d6d6129e4565b60200101906001600160f81b031916908160001a905350611d8f600a866128b4565b9450611d2f565b611da184848461195f565b611dad84848484611fb0565b6111315760405162461bcd60e51b815260040161081f90612779565b6001600160a01b038216611e1f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161081f565b6000818152606760205260409020546001600160a01b031615611e845760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161081f565b6001600160a01b0382166000908152606860205260408120805460019290611ead90849061289c565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600054610100900460ff16610eec5760405162461bcd60e51b815260040161081f90612851565b600054610100900460ff16611f595760405162461bcd60e51b815260040161081f90612851565b8151611f6c9060659060208501906120bd565b5080516109559060669060208401906120bd565b600054610100900460ff16611fa75760405162461bcd60e51b815260040161081f90612851565b610eec33611aff565b60006001600160a01b0384163b156120b257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ff49033908990889088906004016126a4565b602060405180830381600087803b15801561200e57600080fd5b505af192505050801561203e575060408051601f3d908101601f1916820190925261203b918101906124b3565b60015b612098573d80801561206c576040519150601f19603f3d011682016040523d82523d6000602084013e612071565b606091505b5080516120905760405162461bcd60e51b815260040161081f90612779565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611957565b506001949350505050565b8280546120c99061292a565b90600052602060002090601f0160209004810192826120eb5760008555612131565b82601f1061210457805160ff1916838001178555612131565b82800160010185558215612131579182015b82811115612131578251825591602001919060010190612116565b5061213d929150612141565b5090565b5b8082111561213d5760008155600101612142565b600067ffffffffffffffff80841115612171576121716129fa565b604051601f8501601f19908116603f01168101908282118183101715612199576121996129fa565b816040528093508581528686860111156121b257600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126121dd57600080fd5b6121ec83833560208501612156565b9392505050565b803563ffffffff8116811461220757600080fd5b919050565b60006020828403121561221e57600080fd5b81356121ec81612a10565b60008060008060008060c0878903121561224257600080fd5b863561224d81612a10565b955060208701359450612262604088016121f3565b9350612270606088016121f3565b925061227e608088016121f3565b915061228c60a088016121f3565b90509295509295509295565b600080604083850312156122ab57600080fd5b82356122b681612a10565b915060208301356122c681612a10565b809150509250929050565b6000806000606084860312156122e657600080fd5b83356122f181612a10565b9250602084013561230181612a10565b929592945050506040919091013590565b6000806000806080858703121561232857600080fd5b843561233381612a10565b9350602085013561234381612a10565b925060408501359150606085013567ffffffffffffffff81111561236657600080fd5b8501601f8101871361237757600080fd5b61238687823560208401612156565b91505092959194509250565b600080604083850312156123a557600080fd5b82356123b081612a10565b9150602083013580151581146122c657600080fd5b600080604083850312156123d857600080fd5b82356123e381612a10565b946020939093013593505050565b600080600080600060a0868803121561240957600080fd5b853561241481612a10565b945060208601359350604086013567ffffffffffffffff8082111561243857600080fd5b61244489838a016121cc565b9450606088013591508082111561245a57600080fd5b61246689838a016121cc565b9350608088013591508082111561247c57600080fd5b50612489888289016121cc565b9150509295509295909350565b6000602082840312156124a857600080fd5b81356121ec81612a25565b6000602082840312156124c557600080fd5b81516121ec81612a25565b6000602082840312156124e257600080fd5b5035919050565b600080604083850312156124fc57600080fd5b50508035926020909101359150565b6000806040838503121561251e57600080fd5b8235915061252e602084016121f3565b90509250929050565b6000815180845261254f8160208601602086016128fe565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061257d57607f831692505b602080841082141561259f57634e487b7160e01b600052602260045260246000fd5b8180156125b357600181146125c4576125f1565b60ff198616895284890196506125f1565b60008881526020902060005b868110156125e95781548b8201529085019083016125d0565b505084890196505b50505050505092915050565b6000835161260f8184602088016128fe565b8351908301906126238183602088016128fe565b602f60f81b9101908152600101949350505050565b60006126448286612563565b84516126548183602089016128fe565b602f60f81b910190815283516126718160018401602088016128fe565b0160010195945050505050565b600061268a8284612563565b691cdd1bdc99599c9bdb9d60b21b8152600a019392505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126d790830184612537565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156127225783516001600160a01b0316835292840192918401916001016126fd565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156127225783518352928401929184019160010161274a565b6020815260006121ec6020830184612537565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082198211156128af576128af6129b8565b500190565b6000826128c3576128c36129ce565b500490565b60008160001904831182151516156128e2576128e26129b8565b500290565b6000828210156128f9576128f96129b8565b500390565b60005b83811015612919578181015183820152602001612901565b838111156111315750506000910152565b600181811c9082168061293e57607f821691505b6020821081141561295f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612979576129796129b8565b5060010190565b600063ffffffff8083168181141561299a5761299a6129b8565b6001019392505050565b6000826129b3576129b36129ce565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146114af57600080fd5b6001600160e01b0319811681146114af57600080fdfea26469706673582212206e9a24a06d93a2bae6055597f9c920aa6485479a54e78d5ae543c783793b3d2264736f6c63430008070033608060405234801561001057600080fd5b5060405161050e38038061050e83398101604081905261002f91610148565b61003833610047565b61004181610097565b50610178565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6100aa8161014260201b61020a1760201c565b6101205760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60448201527f6e206973206e6f74206120636f6e747261637400000000000000000000000000606482015260840160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3b151590565b60006020828403121561015a57600080fd5b81516001600160a01b038116811461017157600080fd5b9392505050565b610387806101876000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ec565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f610139565b6000546001600160a01b031661007e565b61006f6100c13660046102ec565b61016f565b6000546001600160a01b031633146100f95760405162461bcd60e51b81526004016100f09061031c565b60405180910390fd5b61010281610210565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6000546001600160a01b031633146101635760405162461bcd60e51b81526004016100f09061031c565b61016d600061029c565b565b6000546001600160a01b031633146101995760405162461bcd60e51b81526004016100f09061031c565b6001600160a01b0381166101fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100f0565b6102078161029c565b50565b3b151590565b803b61027a5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b60648201526084016100f0565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156102fe57600080fd5b81356001600160a01b038116811461031557600080fd5b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260408201526060019056fea2646970667358221220f118eb414a6e2818df67771501def6895f30169ec351de47781ca190a332f3c164736f6c63430008070033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220234d62ec919c17b5ffe1a576abb5c4b7f5cf732fa2c586ad5b4ab804c05b58e364736f6c63430008070033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "createArtist(bytes,string,string,string)": {
        "params": {
          "_name": "Name of the artist"
        }
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "setAdmin(address)": {
        "params": {
          "_newAdmin": "address of new admin"
        }
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      },
      "upgradeTo(address)": {
        "details": "Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."
      },
      "upgradeToAndCall(address,bytes)": {
        "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."
      }
    },
    "version": 1
  },
  "userdoc": {
    "events": {
      "CreatedArtist(uint256,string,string,address)": {
        "notice": "Emitted when an Artist is created"
      }
    },
    "kind": "user",
    "methods": {
      "createArtist(bytes,string,string,string)": {
        "notice": "Creates a new artist contract as a factory with a deterministic address Important: None of these fields (except the Url fields with the same hash) can be changed after calling"
      },
      "getSigner(bytes)": {
        "notice": "Get signer address of signature"
      },
      "initialize()": {
        "notice": "Initializes factory"
      },
      "setAdmin(address)": {
        "notice": "Sets the admin for authorizing artist deployment"
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 562,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 565,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 544,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "__gap",
        "offset": 0,
        "slot": "1",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 739,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "__gap",
        "offset": 0,
        "slot": "51",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 2050,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "__gap",
        "offset": 0,
        "slot": "101",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 10,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "_owner",
        "offset": 0,
        "slot": "151",
        "type": "t_address"
      },
      {
        "astId": 124,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "__gap",
        "offset": 0,
        "slot": "152",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 5230,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "atArtistId",
        "offset": 0,
        "slot": "201",
        "type": "t_struct(Counter)2057_storage"
      },
      {
        "astId": 5232,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "admin",
        "offset": 0,
        "slot": "202",
        "type": "t_address"
      },
      {
        "astId": 5234,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "DOMAIN_SEPARATOR",
        "offset": 0,
        "slot": "203",
        "type": "t_bytes32"
      },
      {
        "astId": 5236,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "beaconAddress",
        "offset": 0,
        "slot": "204",
        "type": "t_address"
      },
      {
        "astId": 5239,
        "contract": "contracts/ArtistCreator.sol:ArtistCreator",
        "label": "artistContracts",
        "offset": 0,
        "slot": "205",
        "type": "t_array(t_address)dyn_storage"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_address)dyn_storage": {
        "base": "t_address",
        "encoding": "dynamic_array",
        "label": "address[]",
        "numberOfBytes": "32"
      },
      "t_array(t_uint256)49_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[49]",
        "numberOfBytes": "1568"
      },
      "t_array(t_uint256)50_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[50]",
        "numberOfBytes": "1600"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_struct(Counter)2057_storage": {
        "encoding": "inplace",
        "label": "struct CountersUpgradeable.Counter",
        "members": [
          {
            "astId": 2056,
            "contract": "contracts/ArtistCreator.sol:ArtistCreator",
            "label": "_value",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "32"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}
