Overview ERC721
Total Supply:
217 UV

Holders:
21
Profile Summary
Blockchain:
OP Mainnet (10)

Contract Source Code Verified (Partial Match)
Contract Name:
SoundEditionV2

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Created At:
Sun, 24 Sep 2023 02:29:23 GMT
SoundEditionV2.sol
contracts
core
SoundEditionV2.sol


Contract ABI
[
  {
    "inputs": [],
    "name": "ApprovalCallerNotOwnerNorApproved",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "ApprovalQueryForNonexistentToken",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "BalanceQueryForZeroAddress",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "CannotBurnImmediately",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "CreateTierIsFrozen",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "ExceedsAvailableSupply",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidFundingRecipient",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidMaxMintableRange",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidQueryRange",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidRoyaltyBPS",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidTokenTier",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MetadataIsFrozen",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MintERC2309QuantityExceedsLimit",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MintHasConcluded",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MintNotConcluded",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MintToZeroAddress",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MintZeroQuantity",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MintsAlreadyExist",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "NewOwnerIsZeroAddress",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "NoHandoverRequest",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "OwnerQueryForNonexistentToken",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "OwnershipNotInitializedForExtraData",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TierAlreadyExists",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TierDoesNotExist",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TierIsFrozen",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TierMintsAlreadyExist",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TierQueryForNonexistentToken",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TokenIdsNotStrictlyAscending",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferCallerNotOwnerNorApproved",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferFromIncorrectOwner",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferToNonERC721ReceiverImplementer",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TransferToZeroAddress",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "URIQueryForNonexistentToken",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "Unauthorized",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "ZeroTiersProvided",
    "type": "error"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      },
      {
        "indexed": false,
        "internalType": "address[]",
        "name": "to",
        "type": "address[]"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "quantity",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "fromTokenId",
        "type": "uint256"
      }
    ],
    "name": "Airdropped",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "approved",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "Approval",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "operator",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "bool",
        "name": "approved",
        "type": "bool"
      }
    ],
    "name": "ApprovalForAll",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "string",
        "name": "baseURI",
        "type": "string"
      }
    ],
    "name": "BaseURISet",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "fromTokenId",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "toTokenId",
        "type": "uint256"
      }
    ],
    "name": "BatchMetadataUpdate",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "fromTokenId",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "toTokenId",
        "type": "uint256"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "to",
        "type": "address"
      }
    ],
    "name": "ConsecutiveTransfer",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "string",
        "name": "contractURI",
        "type": "string"
      }
    ],
    "name": "ContractURISet",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [],
    "name": "CreateTierFrozen",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      },
      {
        "indexed": false,
        "internalType": "uint32",
        "name": "cutoff",
        "type": "uint32"
      }
    ],
    "name": "CutoffTimeSet",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "recipient",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "address[]",
        "name": "tokens",
        "type": "address[]"
      },
      {
        "indexed": false,
        "internalType": "uint256[]",
        "name": "amounts",
        "type": "uint256[]"
      },
      {
        "indexed": false,
        "internalType": "address",
        "name": "caller",
        "type": "address"
      }
    ],
    "name": "ERC20Withdrawn",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "recipient",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "address",
        "name": "caller",
        "type": "address"
      }
    ],
    "name": "ETHWithdrawn",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "recipient",
        "type": "address"
      }
    ],
    "name": "FundingRecipientSet",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      },
      {
        "indexed": false,
        "internalType": "uint32",
        "name": "lower",
        "type": "uint32"
      },
      {
        "indexed": false,
        "internalType": "uint32",
        "name": "upper",
        "type": "uint32"
      }
    ],
    "name": "MaxMintableRangeSet",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "metadataModule",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "string",
        "name": "baseURI",
        "type": "string"
      },
      {
        "indexed": false,
        "internalType": "string",
        "name": "contractURI",
        "type": "string"
      }
    ],
    "name": "MetadataFrozen",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "metadataModule",
        "type": "address"
      }
    ],
    "name": "MetadataModuleSet",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      },
      {
        "indexed": false,
        "internalType": "bool",
        "name": "enabled",
        "type": "bool"
      }
    ],
    "name": "MintRandomnessEnabledSet",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      },
      {
        "indexed": false,
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "quantity",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "fromTokenId",
        "type": "uint256"
      }
    ],
    "name": "Minted",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "pendingOwner",
        "type": "address"
      }
    ],
    "name": "OwnershipHandoverCanceled",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "pendingOwner",
        "type": "address"
      }
    ],
    "name": "OwnershipHandoverRequested",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "oldOwner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "OwnershipTransferred",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "user",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "roles",
        "type": "uint256"
      }
    ],
    "name": "RolesUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint16",
        "name": "bps",
        "type": "uint16"
      }
    ],
    "name": "RoyaltySet",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "components": [
          {
            "internalType": "string",
            "name": "name",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "symbol",
            "type": "string"
          },
          {
            "internalType": "address",
            "name": "metadataModule",
            "type": "address"
          },
          {
            "internalType": "string",
            "name": "baseURI",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "contractURI",
            "type": "string"
          },
          {
            "internalType": "address",
            "name": "fundingRecipient",
            "type": "address"
          },
          {
            "internalType": "uint16",
            "name": "royaltyBPS",
            "type": "uint16"
          },
          {
            "internalType": "bool",
            "name": "isMetadataFrozen",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "isCreateTierFrozen",
            "type": "bool"
          },
          {
            "components": [
              {
                "internalType": "uint8",
                "name": "tier",
                "type": "uint8"
              },
              {
                "internalType": "uint32",
                "name": "maxMintableLower",
                "type": "uint32"
              },
              {
                "internalType": "uint32",
                "name": "maxMintableUpper",
                "type": "uint32"
              },
              {
                "internalType": "uint32",
                "name": "cutoffTime",
                "type": "uint32"
              },
              {
                "internalType": "bool",
                "name": "mintRandomnessEnabled",
                "type": "bool"
              },
              {
                "internalType": "bool",
                "name": "isFrozen",
                "type": "bool"
              }
            ],
            "internalType": "struct ISoundEditionV2.TierCreation[]",
            "name": "tierCreations",
            "type": "tuple[]"
          }
        ],
        "indexed": false,
        "internalType": "struct ISoundEditionV2.EditionInitialization",
        "name": "init",
        "type": "tuple"
      }
    ],
    "name": "SoundEditionInitialized",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "components": [
          {
            "internalType": "uint8",
            "name": "tier",
            "type": "uint8"
          },
          {
            "internalType": "uint32",
            "name": "maxMintableLower",
            "type": "uint32"
          },
          {
            "internalType": "uint32",
            "name": "maxMintableUpper",
            "type": "uint32"
          },
          {
            "internalType": "uint32",
            "name": "cutoffTime",
            "type": "uint32"
          },
          {
            "internalType": "bool",
            "name": "mintRandomnessEnabled",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "isFrozen",
            "type": "bool"
          }
        ],
        "indexed": false,
        "internalType": "struct ISoundEditionV2.TierCreation",
        "name": "creation",
        "type": "tuple"
      }
    ],
    "name": "TierCreated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "TierFrozen",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "Transfer",
    "type": "event"
  },
  {
    "inputs": [],
    "name": "ADMIN_ROLE",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "BPS_DENOMINATOR",
    "outputs": [
      {
        "internalType": "uint16",
        "name": "",
        "type": "uint16"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "GA_TIER",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "MINTER_ROLE",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      },
      {
        "internalType": "address[]",
        "name": "to",
        "type": "address[]"
      },
      {
        "internalType": "uint256",
        "name": "quantity",
        "type": "uint256"
      }
    ],
    "name": "airdrop",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "fromTokenId",
        "type": "uint256"
      }
    ],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "approve",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      }
    ],
    "name": "balanceOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "baseURI",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "burn",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "cancelOwnershipHandover",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "pendingOwner",
        "type": "address"
      }
    ],
    "name": "completeOwnershipHandover",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "contractURI",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "splitMain",
        "type": "address"
      },
      {
        "internalType": "bytes",
        "name": "splitData",
        "type": "bytes"
      }
    ],
    "name": "createSplit",
    "outputs": [
      {
        "internalType": "address",
        "name": "split",
        "type": "address"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "components": [
          {
            "internalType": "uint8",
            "name": "tier",
            "type": "uint8"
          },
          {
            "internalType": "uint32",
            "name": "maxMintableLower",
            "type": "uint32"
          },
          {
            "internalType": "uint32",
            "name": "maxMintableUpper",
            "type": "uint32"
          },
          {
            "internalType": "uint32",
            "name": "cutoffTime",
            "type": "uint32"
          },
          {
            "internalType": "bool",
            "name": "mintRandomnessEnabled",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "isFrozen",
            "type": "bool"
          }
        ],
        "internalType": "struct ISoundEditionV2.TierCreation",
        "name": "creation",
        "type": "tuple"
      }
    ],
    "name": "createTier",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "cutoffTime",
    "outputs": [
      {
        "internalType": "uint32",
        "name": "",
        "type": "uint32"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "editionInfo",
    "outputs": [
      {
        "components": [
          {
            "internalType": "string",
            "name": "baseURI",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "contractURI",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "name",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "symbol",
            "type": "string"
          },
          {
            "internalType": "address",
            "name": "fundingRecipient",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "metadataModule",
            "type": "address"
          },
          {
            "internalType": "bool",
            "name": "isMetadataFrozen",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "isCreateTierFrozen",
            "type": "bool"
          },
          {
            "internalType": "uint16",
            "name": "royaltyBPS",
            "type": "uint16"
          },
          {
            "internalType": "uint256",
            "name": "nextTokenId",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "totalBurned",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "totalMinted",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "totalSupply",
            "type": "uint256"
          },
          {
            "components": [
              {
                "internalType": "uint8",
                "name": "tier",
                "type": "uint8"
              },
              {
                "internalType": "uint32",
                "name": "maxMintable",
                "type": "uint32"
              },
              {
                "internalType": "uint32",
                "name": "maxMintableLower",
                "type": "uint32"
              },
              {
                "internalType": "uint32",
                "name": "maxMintableUpper",
                "type": "uint32"
              },
              {
                "internalType": "uint32",
                "name": "cutoffTime",
                "type": "uint32"
              },
              {
                "internalType": "uint32",
                "name": "minted",
                "type": "uint32"
              },
              {
                "internalType": "uint256",
                "name": "mintRandomness",
                "type": "uint256"
              },
              {
                "internalType": "bool",
                "name": "mintConcluded",
                "type": "bool"
              },
              {
                "internalType": "bool",
                "name": "mintRandomnessEnabled",
                "type": "bool"
              },
              {
                "internalType": "bool",
                "name": "isFrozen",
                "type": "bool"
              }
            ],
            "internalType": "struct ISoundEditionV2.TierInfo[]",
            "name": "tierInfo",
            "type": "tuple[]"
          }
        ],
        "internalType": "struct ISoundEditionV2.EditionInfo",
        "name": "info",
        "type": "tuple"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "emitAllMetadataUpdate",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "explicitOwnershipOf",
    "outputs": [
      {
        "components": [
          {
            "internalType": "address",
            "name": "addr",
            "type": "address"
          },
          {
            "internalType": "uint64",
            "name": "startTimestamp",
            "type": "uint64"
          },
          {
            "internalType": "bool",
            "name": "burned",
            "type": "bool"
          },
          {
            "internalType": "uint24",
            "name": "extraData",
            "type": "uint24"
          }
        ],
        "internalType": "struct IERC721AUpgradeable.TokenOwnership",
        "name": "ownership",
        "type": "tuple"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256[]",
        "name": "tokenIds",
        "type": "uint256[]"
      }
    ],
    "name": "explicitOwnershipsOf",
    "outputs": [
      {
        "components": [
          {
            "internalType": "address",
            "name": "addr",
            "type": "address"
          },
          {
            "internalType": "uint64",
            "name": "startTimestamp",
            "type": "uint64"
          },
          {
            "internalType": "bool",
            "name": "burned",
            "type": "bool"
          },
          {
            "internalType": "uint24",
            "name": "extraData",
            "type": "uint24"
          }
        ],
        "internalType": "struct IERC721AUpgradeable.TokenOwnership[]",
        "name": "",
        "type": "tuple[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "explicitTokenTier",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "explicitTokenURI",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "freezeCreateTier",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "freezeMetadata",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "freezeTier",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "fundingRecipient",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "getApproved",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "user",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "roles",
        "type": "uint256"
      }
    ],
    "name": "grantRoles",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "user",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "roles",
        "type": "uint256"
      }
    ],
    "name": "hasAllRoles",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "user",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "roles",
        "type": "uint256"
      }
    ],
    "name": "hasAnyRole",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "components": [
          {
            "internalType": "string",
            "name": "name",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "symbol",
            "type": "string"
          },
          {
            "internalType": "address",
            "name": "metadataModule",
            "type": "address"
          },
          {
            "internalType": "string",
            "name": "baseURI",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "contractURI",
            "type": "string"
          },
          {
            "internalType": "address",
            "name": "fundingRecipient",
            "type": "address"
          },
          {
            "internalType": "uint16",
            "name": "royaltyBPS",
            "type": "uint16"
          },
          {
            "internalType": "bool",
            "name": "isMetadataFrozen",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "isCreateTierFrozen",
            "type": "bool"
          },
          {
            "components": [
              {
                "internalType": "uint8",
                "name": "tier",
                "type": "uint8"
              },
              {
                "internalType": "uint32",
                "name": "maxMintableLower",
                "type": "uint32"
              },
              {
                "internalType": "uint32",
                "name": "maxMintableUpper",
                "type": "uint32"
              },
              {
                "internalType": "uint32",
                "name": "cutoffTime",
                "type": "uint32"
              },
              {
                "internalType": "bool",
                "name": "mintRandomnessEnabled",
                "type": "bool"
              },
              {
                "internalType": "bool",
                "name": "isFrozen",
                "type": "bool"
              }
            ],
            "internalType": "struct ISoundEditionV2.TierCreation[]",
            "name": "tierCreations",
            "type": "tuple[]"
          }
        ],
        "internalType": "struct ISoundEditionV2.EditionInitialization",
        "name": "init",
        "type": "tuple"
      }
    ],
    "name": "initialize",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "operator",
        "type": "address"
      }
    ],
    "name": "isApprovedForAll",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "isCreateTierFrozen",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "isFrozen",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "isMetadataFrozen",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "maxMintable",
    "outputs": [
      {
        "internalType": "uint32",
        "name": "",
        "type": "uint32"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "maxMintableLower",
    "outputs": [
      {
        "internalType": "uint32",
        "name": "",
        "type": "uint32"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "maxMintableUpper",
    "outputs": [
      {
        "internalType": "uint32",
        "name": "",
        "type": "uint32"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "metadataModule",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      },
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "quantity",
        "type": "uint256"
      }
    ],
    "name": "mint",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "fromTokenId",
        "type": "uint256"
      }
    ],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "mintConcluded",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "mintRandomness",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "result",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "mintRandomnessEnabled",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "mintRandomnessOneOfOne",
    "outputs": [
      {
        "internalType": "uint32",
        "name": "",
        "type": "uint32"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "name",
    "outputs": [
      {
        "internalType": "string",
        "name": "name_",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "nextTokenId",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      }
    ],
    "name": "numberBurned",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      }
    ],
    "name": "numberMinted",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "owner",
    "outputs": [
      {
        "internalType": "address",
        "name": "result",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "ownerOf",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "pendingOwner",
        "type": "address"
      }
    ],
    "name": "ownershipHandoverExpiresAt",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "result",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "renounceOwnership",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "roles",
        "type": "uint256"
      }
    ],
    "name": "renounceRoles",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "requestOwnershipHandover",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "user",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "roles",
        "type": "uint256"
      }
    ],
    "name": "revokeRoles",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "user",
        "type": "address"
      }
    ],
    "name": "rolesOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "roles",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "royaltyBPS",
    "outputs": [
      {
        "internalType": "uint16",
        "name": "",
        "type": "uint16"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "salePrice",
        "type": "uint256"
      }
    ],
    "name": "royaltyInfo",
    "outputs": [
      {
        "internalType": "address",
        "name": "recipient",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "royaltyAmount",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "safeTransferFrom",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      },
      {
        "internalType": "bytes",
        "name": "_data",
        "type": "bytes"
      }
    ],
    "name": "safeTransferFrom",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "operator",
        "type": "address"
      },
      {
        "internalType": "bool",
        "name": "approved",
        "type": "bool"
      }
    ],
    "name": "setApprovalForAll",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "string",
        "name": "uri",
        "type": "string"
      }
    ],
    "name": "setBaseURI",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "string",
        "name": "uri",
        "type": "string"
      }
    ],
    "name": "setContractURI",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      },
      {
        "internalType": "uint32",
        "name": "cutoff",
        "type": "uint32"
      }
    ],
    "name": "setCutoffTime",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "recipient",
        "type": "address"
      }
    ],
    "name": "setFundingRecipient",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      },
      {
        "internalType": "uint32",
        "name": "lower",
        "type": "uint32"
      },
      {
        "internalType": "uint32",
        "name": "upper",
        "type": "uint32"
      }
    ],
    "name": "setMaxMintableRange",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "module",
        "type": "address"
      }
    ],
    "name": "setMetadataModule",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      },
      {
        "internalType": "bool",
        "name": "enabled",
        "type": "bool"
      }
    ],
    "name": "setMintRandomnessEnabled",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint16",
        "name": "bps",
        "type": "uint16"
      }
    ],
    "name": "setRoyalty",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes4",
        "name": "interfaceId",
        "type": "bytes4"
      }
    ],
    "name": "supportsInterface",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "symbol",
    "outputs": [
      {
        "internalType": "string",
        "name": "symbol_",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "tierInfo",
    "outputs": [
      {
        "components": [
          {
            "internalType": "uint8",
            "name": "tier",
            "type": "uint8"
          },
          {
            "internalType": "uint32",
            "name": "maxMintable",
            "type": "uint32"
          },
          {
            "internalType": "uint32",
            "name": "maxMintableLower",
            "type": "uint32"
          },
          {
            "internalType": "uint32",
            "name": "maxMintableUpper",
            "type": "uint32"
          },
          {
            "internalType": "uint32",
            "name": "cutoffTime",
            "type": "uint32"
          },
          {
            "internalType": "uint32",
            "name": "minted",
            "type": "uint32"
          },
          {
            "internalType": "uint256",
            "name": "mintRandomness",
            "type": "uint256"
          },
          {
            "internalType": "bool",
            "name": "mintConcluded",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "mintRandomnessEnabled",
            "type": "bool"
          },
          {
            "internalType": "bool",
            "name": "isFrozen",
            "type": "bool"
          }
        ],
        "internalType": "struct ISoundEditionV2.TierInfo",
        "name": "info",
        "type": "tuple"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "tierMinted",
    "outputs": [
      {
        "internalType": "uint32",
        "name": "",
        "type": "uint32"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "tierTokenIdIndex",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      }
    ],
    "name": "tierTokenIds",
    "outputs": [
      {
        "internalType": "uint256[]",
        "name": "tokenIds",
        "type": "uint256[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint8",
        "name": "tier",
        "type": "uint8"
      },
      {
        "internalType": "uint256",
        "name": "start",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "stop",
        "type": "uint256"
      }
    ],
    "name": "tierTokenIdsIn",
    "outputs": [
      {
        "internalType": "uint256[]",
        "name": "tokenIds",
        "type": "uint256[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "tokenTier",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256[]",
        "name": "tokenIds",
        "type": "uint256[]"
      }
    ],
    "name": "tokenTiers",
    "outputs": [
      {
        "internalType": "uint8[]",
        "name": "tiers",
        "type": "uint8[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "tokenURI",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      }
    ],
    "name": "tokensOfOwner",
    "outputs": [
      {
        "internalType": "uint256[]",
        "name": "",
        "type": "uint256[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "start",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "stop",
        "type": "uint256"
      }
    ],
    "name": "tokensOfOwnerIn",
    "outputs": [
      {
        "internalType": "uint256[]",
        "name": "",
        "type": "uint256[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "totalBurned",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "totalMinted",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "totalSupply",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      }
    ],
    "name": "transferFrom",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "transferOwnership",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address[]",
        "name": "tokens",
        "type": "address[]"
      }
    ],
    "name": "withdrawERC20",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "withdrawETH",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  }
]


Contract Creation Code
608060405234801561001057600080fd5b50615214806100206000396000f3fe6080604052600436106104bf5760003560e01c8063774de39611610276578063b88d4fde1161014f578063e086e5ec116100c1578063eb78a07611610085578063eb78a07614610eab578063eebab8ef14610ecb578063f04e283e14610ede578063f2fde38b14610ef1578063faf37bc414610f04578063fee81cf414610f2457600080fd5b8063e086e5ec14610e29578063e1a4521814610e3e578063e7a6020d14610e54578063e8a3d48514610e76578063e985e9c514610e8b57600080fd5b8063c87b56dd11610113578063c87b56dd14610d8a578063d111515d14610daa578063d539139314610dbf578063d89135cd14610dd4578063db0ea80514610de9578063dc33e68114610e0957600080fd5b8063b88d4fde14610cd5578063b9c9d93a14610ce8578063c0ede3cf14610d1d578063c23dc68f14610d3d578063c5bc5a4c14610d6a57600080fd5b8063998ad691116101e8578063a468f043116101ac578063a468f04314610c13578063a8f5473e14610c33578063aec9b83c14610c55578063b0fbdc8b14610c75578063b393cf7a14610c95578063b7c858fb14610cb557600080fd5b8063998ad69114610b7e57806399a2557a14610b9e578063a22cb46514610bbe578063a2309ff814610bde578063a4198fa214610bf357600080fd5b80638da5cb5b1161023a5780638da5cb5b14610adb57806390e89bb814610af457806390ecf29c14610b14578063938e3d7b14610b3457806393e8bcf914610b5457806395d89b4114610b6957600080fd5b8063774de39614610a3b5780637793818114610a5b5780637ab51f9e14610a7b5780637f84110f14610a9b5780638462151c14610abb57600080fd5b80632de94807116103a857806355f804b31161031a5780636a3d27c6116102de5780636a3d27c6146109b45780636c0360eb146109d457806370a08231146109e9578063715018a614610a0957806375794a3c14610a1157806375b238fc14610a2657600080fd5b806355f804b3146108f55780635bbb2177146109155780635f08f876146109425780636352211e14610962578063649e705f1461098257600080fd5b80633e1a5b851161036c5780633e1a5b851461085057806342842e0e1461087057806342966c68146108835780634a4ee7b1146108a3578063514e62fc146108b657806354d1f13d146108ed57600080fd5b80632de94807146107835780632f01b56e146107b657806335766f4b146107e35780633684d1001461081057806336e79a5a1461083057600080fd5b80631bb534ba1161044157806323b872dd1161040557806323b872dd146106c9578063241d9651146106dc5780632478d639146106fc578063256929621461071c5780632a036a4d146107245780632a55205a1461074457600080fd5b80631bb534ba1461061d5780631c10893f1461063d5780631c519ba4146106505780631cd64df4146106655780631cdb17651461069c57600080fd5b8063095ea7b311610488578063095ea7b3146105a95780630e24495e146105be578063110db80e146105e057806318160ddd146105f5578063183a4f6e1461060a57600080fd5b80624dad56146104c4578063010fe62c146104fe57806301ffc9a71461051f57806306fdde031461054f578063081812fc14610571575b600080fd5b3480156104d057600080fd5b506104e46104df366004614074565b610f57565b60405163ffffffff90911681526020015b60405180910390f35b61051161050c3660046140da565b610f76565b6040519081526020016104f5565b34801561052b57600080fd5b5061053f61053a366004614149565b61101c565b60405190151581526020016104f5565b34801561055b57600080fd5b5061056461105d565b6040516104f591906141b6565b34801561057d57600080fd5b5061059161058c3660046141c9565b61106d565b6040516001600160a01b0390911681526020016104f5565b6105bc6105b73660046141f9565b6110b1565b005b3480156105ca57600080fd5b5061053f600554600160b01b9004600116151590565b3480156105ec57600080fd5b506105bc6110c1565b34801561060157600080fd5b50610511611121565b6105bc6106183660046141c9565b611141565b34801561062957600080fd5b50600554610591906001600160a01b031681565b6105bc61064b3660046141f9565b61114e565b34801561065c57600080fd5b506105bc611160565b34801561067157600080fd5b5061053f6106803660046141f9565b638b78c6d8600c90815260009290925260209091205481161490565b3480156106a857600080fd5b506106bc6106b7366004614223565b6111b0565b6040516104f59190614264565b6105bc6106d736600461429f565b61125f565b3480156106e857600080fd5b506105bc6106f73660046142db565b611422565b34801561070857600080fd5b506105116107173660046142db565b611436565b6105bc611441565b34801561073057600080fd5b5061053f61073f366004614074565b611490565b34801561075057600080fd5b5061076461075f3660046142f6565b6114ae565b604080516001600160a01b0390931683526020830191909152016104f5565b34801561078f57600080fd5b5061051161079e3660046142db565b638b78c6d8600c908152600091909152602090205490565b3480156107c257600080fd5b506107d66107d1366004614074565b6114ee565b6040516104f59190614353565b3480156107ef57600080fd5b506108036107fe366004614074565b61150a565b6040516104f59190614423565b34801561081c57600080fd5b50600654610591906001600160a01b031681565b34801561083c57600080fd5b506105bc61084b366004614444565b6115d0565b34801561085c57600080fd5b5061056461086b3660046141c9565b61163c565b6105bc61087e36600461429f565b61171d565b34801561088f57600080fd5b506105bc61089e3660046141c9565b61173d565b6105bc6108b13660046141f9565b611748565b3480156108c257600080fd5b5061053f6108d13660046141f9565b638b78c6d8600c90815260009290925260209091205416151590565b6105bc61175a565b34801561090157600080fd5b506105bc610910366004614553565b611796565b34801561092157600080fd5b50610935610930366004614223565b6117f3565b6040516104f591906145c3565b34801561094e57600080fd5b5061059161095d366004614605565b61183f565b34801561096e57600080fd5b5061059161097d3660046141c9565b61187f565b34801561098e57600080fd5b506109a261099d3660046141c9565b61188a565b60405160ff90911681526020016104f5565b3480156109c057600080fd5b506105bc6109cf366004614074565b6118d1565b3480156109e057600080fd5b5061056461194d565b3480156109f557600080fd5b50610511610a043660046142db565b61195e565b6105bc6119bd565b348015610a1d57600080fd5b506105116119d1565b348015610a3257600080fd5b50610511600181565b348015610a4757600080fd5b506105bc610a5636600461474c565b6119db565b348015610a6757600080fd5b50610511610a763660046141c9565b611a26565b348015610a8757600080fd5b506105bc610a96366004614768565b611a92565b348015610aa757600080fd5b506105bc610ab636600461481b565b611b21565b348015610ac757600080fd5b506107d6610ad63660046142db565b611cb8565b348015610ae757600080fd5b50638b78c6d81954610591565b348015610b0057600080fd5b506105bc610b0f366004614223565b611cdc565b348015610b2057600080fd5b506105bc610b2f366004614972565b611dc6565b348015610b4057600080fd5b506105bc610b4f366004614553565b611f20565b348015610b6057600080fd5b506109a2600081565b348015610b7557600080fd5b50610564611f6d565b348015610b8a57600080fd5b506105bc610b993660046149b5565b611f77565b348015610baa57600080fd5b506107d6610bb93660046149df565b612014565b348015610bca57600080fd5b506105bc610bd9366004614a12565b612029565b348015610bea57600080fd5b506105116120a6565b348015610bff57600080fd5b506105bc610c0e3660046142db565b6120b0565b348015610c1f57600080fd5b506104e4610c2e366004614074565b612111565b348015610c3f57600080fd5b5061053f600554600160b01b9004600216151590565b348015610c6157600080fd5b5061053f610c70366004614074565b612187565b348015610c8157600080fd5b506104e4610c90366004614074565b6121a5565b348015610ca157600080fd5b50610511610cb0366004614074565b6121c4565b348015610cc157600080fd5b506104e4610cd0366004614074565b6121d7565b6105bc610ce3366004614a2e565b6121f6565b348015610cf457600080fd5b50600554610d0a90600160a01b900461ffff1681565b60405161ffff90911681526020016104f5565b348015610d2957600080fd5b506107d6610d38366004614aa9565b612237565b348015610d4957600080fd5b50610d5d610d583660046141c9565b61232b565b6040516104f59190614ac7565b348015610d7657600080fd5b506104e4610d85366004614074565b61238e565b348015610d9657600080fd5b50610564610da53660046141c9565b6123a1565b348015610db657600080fd5b506105bc6123d2565b348015610dcb57600080fd5b50610511600281565b348015610de057600080fd5b50610511612453565b348015610df557600080fd5b5061053f610e04366004614074565b61245d565b348015610e1557600080fd5b50610511610e243660046142db565b612470565b348015610e3557600080fd5b506105bc61247b565b348015610e4a57600080fd5b50610d0a61271081565b348015610e6057600080fd5b50610e696124dc565b6040516104f59190614b10565b348015610e8257600080fd5b506105646126e0565b348015610e9757600080fd5b5061053f610ea6366004614c4f565b6126ec565b348015610eb757600080fd5b506104e4610ec6366004614074565b612729565b610511610ed9366004614c79565b612748565b6105bc610eec3660046142db565b6127c6565b6105bc610eff3660046142db565b612803565b348015610f1057600080fd5b506109a2610f1f3660046141c9565b61282a565b348015610f3057600080fd5b50610511610f3f3660046142db565b63389a75e1600c908152600091909152602090205490565b6000610f6282612849565b54600160601b900463ffffffff1692915050565b60006001610f8381612889565b610f8f868585026128d7565b915060005b808514610fd357610fcb868683818110610fb057610fb0614c97565b9050602002016020810190610fc591906142db565b85612a56565b600101610f94565b507f0b411e173d03042c3eb682fe6cf8f1d64b549c283a9ed7e0f83a9711ee0841e8868686868660405161100b959493929190614ce9565b60405180910390a150949350505050565b60006110576001600160e01b03198316637888cfe160e01b1461103e84612a84565b6001600160e01b0319851663152a902d60e11b14612ad2565b92915050565b6060611067612ae6565b50919050565b600061107882612c6e565b61108c5761108c6333d1c03960e21b612ccc565b611094612cd6565b60009283526006016020525060409020546001600160a01b031690565b6110bd82826001612cfa565b5050565b60016110cc81612889565b6110d4612dab565b6005805460ff60b01b1981166002600160b01b9283900460ff16179091021790556040517f36c5c1f433b3c0800132549fa10c9deefbeafdd7b70aba4bbc6a987ca2fef54790600090a150565b6000600161112d612cd6565b60010154611139612cd6565b540303919050565b61114b3382612dde565b50565b611156612dea565b6110bd8282612e05565b7f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c60018061118c612e11565b6111969190614d30565b6040805192835260208301919091520160405180910390a1565b6060816001600160401b038111156111ca576111ca61445f565b6040519080825280602002602001820160405280156111f3578160200160208202803683370190505b50905060005b8083146112585761122c84848381811061121557611215614c97565b905060200201356008612e2190919063ffffffff16565b82828151811061123e5761123e614c97565b60ff909216602092830291909101909101526001016111f9565b5092915050565b600061126a82612e42565b6001600160a01b0394851694909150811684146112905761129062a1148160e81b612ccc565b60008061129c84612f04565b915091506112c181876112ac3390565b6001600160a01b039081169116811491141790565b6112e3576112cf86336126ec565b6112e3576112e3632ce44b5f60e11b612ccc565b80156112ee57600082555b6112f6612cd6565b6001600160a01b0387166000908152600591909101602052604090208054600019019055611322612cd6565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17611359612cd6565b60008681526004919091016020526040812091909155600160e11b841690036113cf5760018401611388612cd6565b6000828152600491909101602052604081205490036113cd576113a9612cd6565b5481146113cd57836113b9612cd6565b600083815260049190910160205260409020555b505b6001600160a01b0385168481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a48060000361141957611419633a954ecd60e21b612ccc565b50505050505050565b600161142d81612889565b6110bd82612f2c565b600061105782612f83565b60006202a3006001600160401b03164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b600061105761149e83612849565b54600160c81b9004600216151590565b6005546001600160a01b03166000600160f01b83106114cf576114cf612fc8565b600554612710600160a01b90910461ffff168402045b90509250929050565b60606110578260006114ff856121d7565b63ffffffff16612237565b61151261400f565b600061151d83612849565b60ff84168352905061152e81612fd6565b63ffffffff90811660208401528154600160401b810482166040850152600160601b810482166060850152600160801b810482166080850152600160a01b90041660a083015261157d81613029565b60c08301526115968154600160c81b9004600216151590565b15156101008301526115a781613072565b151560e08301526115c28154600160c81b9004600416151590565b151561012083015250919050565b60016115db81612889565b6115e48261309c565b6005805461ffff60a01b1916600160a01b61ffff8516908102919091179091556040519081527f092d0aa94dc2b378c7fd77faaaf4cb3fd8336ae247cd486fb593726705772ac0906020015b60405180910390a15050565b6006546060906001600160a01b0316156116c15760065460405163c87b56dd60e01b8152600481018490526001600160a01b039091169063c87b56dd90602401600060405180830381865afa158015611699573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110579190810190614d43565b60006116cb61194d565b905080516000036116eb5760405180602001604052806000815250611716565b806116f5846130c3565b604051602001611706929190614db0565b6040516020818303038152906040525b9392505050565b611738838383604051806020016040528060008152506121f6565b505050565b61114b816001613107565b611750612dea565b6110bd8282612dde565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b60016117a181612889565b6117a961327f565b6117b46001836132b2565b7ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f6826040516117e391906141b6565b60405180910390a16110bd611160565b60408051828152600583901b8082016020019092526060915b801561183757601f19808201918601013560006118288261232b565b848401602001525061180c9050565b509392505050565b6000600161184c81612889565b604051838582376000805260206000858360008a5af1611870573d6000803e3d6000fd5b50600051915061183782612f2c565b600061105782612e42565b600061189582612c6e565b6118b25760405163163ceb7760e11b815260040160405180910390fd5b6008602052600582901c60009081526040902054601f8319161a611057565b60016118dc81612889565b60006118e783612849565b90506118f2816132be565b805460ff600160c81b80830482166004170260ff60c81b1990921691909117825560405190841681527f5455468b416476a27220f0fc8daad92345a6c408a0356acd2560b63bf0e51d949060200160405180910390a1505050565b606061195960016132f0565b905090565b60006001600160a01b03821661197e5761197e6323d3ad8160e21b612ccc565b6001600160401b0361198e612cd6565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6119c5612dea565b6119cf60006133db565b565b6000611959612e11565b60016119e681612889565b6119ee612dab565b6119f782613419565b7fc14f5a12ed3f072ab9522493ce2b476e950ee5a3f3abf2324961c6ac66b00e94826040516116309190614e2e565b600080611a328361188a565b9050600080611a6a856000611a46866121d7565b60ff8716600090815260096020526040902092919063ffffffff908116906135c916565b9092509050811515640100000000861016611a8757600019611a89565b805b95945050505050565b6001611a9d81612889565b6000611aa884612849565b9050611ab3816132be565b611abc816135ed565b805463ffffffff60801b1916600160801b63ffffffff85169081029190911782556040805160ff8716815260208101929092527fbfb64051edb1b4f08e14520b9ed4d2609e52d66c0c83cfb1ac125ab41734fceb91015b60405180910390a150505050565b611b3381600001518260200151613614565b611b43611b3e613699565b6136d1565b611b508160c0015161309c565b611b5d8160a0015161370d565b6060810151611b6e90600190613734565b6080810151611b7f90600390613734565b60a0810151600580546001600160a01b0319166001600160a01b03909216919091179055610120810151516000819003611bcc576040516392ce813760e01b815260040160405180910390fd5b60005b818114611c0557611bfd8361012001518281518110611bf057611bf0614c97565b6020026020010151613419565b600101611bcf565b50506040810151600680546001600160a01b0319166001600160a01b0390921691909117905560c08101516005805461ffff60a01b1916600160a01b61ffff90931692909202919091179055610100810151151560020260e0820151151517600560166101000a81548160ff021916908360ff1602179055507f4f32c97826173bff1ee9613d86862d161dfbc943f1f5960528f88c42a79fb56881604051611cad9190614e76565b60405180910390a150565b606060016000611cc6612e11565b90506060818314611a8757611a8985848461374d565b6000816001600160401b03811115611cf657611cf661445f565b604051908082528060200260200182016040528015611d1f578160200160208202803683370190505b506005549091506001600160a01b031660005b808414611d8e57611d69858583818110611d4e57611d4e614c97565b9050602002016020810190611d6391906142db565b83613855565b838281518110611d7b57611d7b614c97565b6020908102919091010152600101611d32565b507fcadee7ff7164fffa7c9c81726bbc520c1fb0bc36d7ac763997ea74aee0e387e48185858533604051611b13959493929190614f7d565b6001611dd181612889565b6000611ddc85612849565b9050611de7816132be565b611df0816135ed565b8054600160a01b900463ffffffff168015611e6a578154600160601b810463ffffffff90811686821611600160401b9092048116908716111715611e4757604051633a964d4760e01b815260040160405180910390fd5b63ffffffff85168181108282180218945063ffffffff8416818110828218021893505b8363ffffffff168563ffffffff161115611e9757604051633a964d4760e01b815260040160405180910390fd5b815467ffffffffffffffff60401b1916600160401b63ffffffff87811691820263ffffffff60601b191692909217600160601b9287169283021784556040805160ff8a16815260208101929092528101919091527faabbe826f21f31d8508fe47762ab61162f999f0c296e1a88ce50d1ef0ea6da849060600160405180910390a1505050505050565b6001611f2b81612889565b611f3361327f565b611f3e6003836132b2565b7faf497693a87db12ca89131a31edbb3db4bb5702dfb284e8ae7427d185f09112d8260405161163091906141b6565b6060611057612ae6565b6001611f8281612889565b6000611f8d84612849565b9050611f98816132be565b611fa1816138cd565b8054611fc49060ff600160c81b9091041660028560ff8383161615901518021890565b815460ff60c81b1916600160c81b60ff9283160217825560408051918616825284151560208301527f9213f35ab455184cb0b8872ec8a16bd1fb69d2f0e909f4174a93470cd5e225009101611b13565b606061202184848461374d565b949350505050565b80612032612cd6565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006119596138fa565b60016120bb81612889565b6120c361327f565b600680546001600160a01b0319166001600160a01b0384169081179091556040519081527ff3fdd6d3ba37d1479142dbb6aef216c352108f558ce922646b4b0d86454d1138906020016117e3565b60008061211d83612849565b9050600061212a82613029565b9050600061213783612fd6565b63ffffffff169050801582151761217c5760ff85166000908152600960209081526040808320848606600381901c855292529091205460059190911b60e0161c611a89565b600095945050505050565b600061105761219583612849565b54600160c81b9004600416151590565b60006121b082612849565b54600160801b900463ffffffff1692915050565b60006110576121d283612849565b613029565b60006121e282612849565b54600160a01b900463ffffffff1692915050565b61220184848461125f565b6001600160a01b0383163b156122315761221d8484848461390d565b612231576122316368d2bf6b60e11b612ccc565b50505050565b60608282036000612247866121d7565b63ffffffff16905080841184861015171561227557604051631960ccad60e11b815260040160405180910390fd5b816001600160401b0381111561228d5761228d61445f565b6040519080825280602002602001820160405280156122b6578160200160208202803683370190505b5060ff871660009081526009602052604081209194505b83811461232057868101600381901c60009081526020849052604090205460059190911b60e0161c63ffffffff1685828151811061230d5761230d614c97565b60209081029190910101526001016122cd565b505050509392505050565b604080516080810182526000808252602082018190529181018290526060810191909152600182106123895761235f612e11565b821015612389575b612370826139ef565b6123805760001990910190612367565b61105782613a0f565b919050565b600061105761239c83612849565b612fd6565b60606123ac82612c6e565b6123c957604051630a14c4b560e41b815260040160405180910390fd5b6110578261163c565b60016123dd81612889565b6123e561327f565b6005805460ff60b01b1981166001600160b01b9283900460ff16179091021790556006547f7028d29d7b13876d9de031ac95eb6acef3e844e1d010820781406e6cd5fc70f9906001600160a01b031661243c61194d565b6124446126e0565b604051611cad93929190614fc8565b6000611959613a98565b600061105761246b83612849565b613072565b600061105782613aab565b60055447906001600160a01b03166124938183613abf565b604080516001600160a01b03831681526020810184905233918101919091527f134d6e96840903022b8e4b57aa0644e9eb6ca6fe65a25205b0857fe918c2bcc690606001611630565b612568604051806101c001604052806060815260200160608152602001606081526020016060815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600015158152602001600015158152602001600061ffff16815260200160008152602001600081526020016000815260200160008152602001606081525090565b61257061194d565b815261257a6126e0565b6020820152612587612ae6565b606083015260408201526005546001600160a01b0380821660808401526006541660a0830152600160b01b810460018116151560c0840152600216151560e0830152600160a01b900461ffff166101008201526125e26119d1565b6101208201526125f06120a6565b6101608201526125fe612453565b61014082015261260c611121565b610180820152600654600160a01b810461ffff1690600160b01b900460ff16816001600160401b038111156126435761264361445f565b60405190808252806020026020018201604052801561267c57816020015b61266961400f565b8152602001906001900390816126615790505b506101a08401525b81156126db57600061269582612849565b90506126a08261150a565b846101a001518460019003945084815181106126be576126be614c97565b602090810291909101015254600160c01b900460ff169050612684565b505090565b606061195960036132f0565b60006126f6612cd6565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b600061273482612849565b54600160401b900463ffffffff1692915050565b6000600361275581612889565b61275f85846128d7565b915061276b8484612a56565b6040805160ff871681526001600160a01b0386166020820152908101849052606081018390527f7ac572687bf4e66a8514fc2ec464fc2644c78bcb1d80a225fc51a33e0ee38bfa9060800160405180910390a1509392505050565b6127ce612dea565b63389a75e1600c52806000526020600c2080544211156127f657636f5e88186000526004601cfd5b6000905561114b816133db565b61280b612dea565b8060601b61282157637448fbae6000526004601cfd5b61114b816133db565b6008602052600581901c60009081526040812054601f8319161a611057565b60ff8116600090815260076020526040812080549091600160c81b909104600116900361238957604051630bec67bf60e31b815260040160405180910390fd5b6000612893613699565b638b78c6d8600c9081526000829052602090205490915082166110bd57638b78c6d819546001600160a01b0316816001600160a01b0316146110bd576110bd613b09565b6000816000036128fa5760405163b562e8dd60e01b815260040160405180910390fd5b612902612e11565b90506401000000006001838301031061291d5761291d612fc8565b600061292884612849565b8054909150600160a01b900463ffffffff16600061294583612fd6565b63ffffffff16905081850181811115612971576040516316b9b18560e01b815260040160405180910390fd5b835463ffffffff60a01b1916600160a01b63ffffffff831602178085556002600160c81b90910416156129d25783546129b5906001600160401b0316848885613b17565b845467ffffffffffffffff19166001600160401b03919091161784555b60ff87166000908152600960205260408120905b878114612a4a57612a2b82868301898401826020528160031c60005260406000206007831660051b815463ffffffff8482841c188116831b8218845550505050505050565b60ff891615612a4257612a4260088883018b613b8c565b6001016129e6565b50505050505092915050565b601f81168015612a6a57612a6a8382613bb2565b81811461173857612a7c836020613bb2565b602001612a6a565b60006301ffc9a760e01b6001600160e01b031983161480612ab557506380ac58cd60e01b6001600160e01b03198316145b806110575750506001600160e01b031916635b5e139f60e01b1490565b600083151583151583151517151517612021565b60005460609081908015612b3e57612b3481604080516080810182526000808252918101828152601f820193909352805181016020018051605f830152829052825181016060019190915291565b9093509150509091565b6000612b48612cd6565b9050806002018054612b5990614ffe565b80601f0160208091040260200160405190810160405280929190818152602001828054612b8590614ffe565b8015612bd25780601f10612ba757610100808354040283529160200191612bd2565b820191906000526020600020905b815481529060010190602001808311612bb557829003601f168201915b50505050509350806003018054612be890614ffe565b80601f0160208091040260200160405190810160405280929190818152602001828054612c1490614ffe565b8015612c615780601f10612c3657610100808354040283529160200191612c61565b820191906000526020600020905b815481529060010190602001808311612c4457829003601f168201915b5050505050925050509091565b60008160011161238957612c80612cd6565b548210156123895760005b612c93612cd6565b600084815260049190910160205260408120549150819003612cbf57612cb883615032565b9250612c8b565b600160e01b161592915050565b8060005260046000fd5b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4090565b6000612d058361187f565b9050818015612d1d5750336001600160a01b03821614155b15612d4057612d2c81336126ec565b612d4057612d406367d9dca160e11b612ccc565b83612d49612cd6565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b612dc0600554600160b01b9004600216151590565b156119cf57604051635dc9af4560e11b815260040160405180910390fd5b6110bd82826000613ca6565b638b78c6d8195433146119cf576382b429006000526004601cfd5b6110bd82826001613ca6565b6000612e1b612cd6565b54919050565b6000826020528160051c6000526040600020548219601f161a905092915050565b600081600111612ef457612e54612cd6565b600083815260049190910160205260408120549150819003612ee157612e78612cd6565b548210612e8f57612e8f636f96cda160e11b612ccc565b612e97612cd6565b600019909201600081815260049390930160205260409092205490508015612e8f57600160e01b8116600003612ecc57919050565b612edc636f96cda160e11b612ccc565b612e8f565b600160e01b8116600003612ef457919050565b612389636f96cda160e11b612ccc565b6000806000612f11612cd6565b60009485526006016020525050604090912080549092909150565b612f358161370d565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527f94c4ad53e91574d56aff9aef0726376e9154e071a602000edf9208f28d649be190602001611cad565b60006001600160401b036080612f97612cd6565b6005016000856001600160a01b03166001600160a01b0316815260200190815260200160002054901c169050919050565b6335278d126000526004601cfd5b8054600090600160801b900463ffffffff16421015613001575054600160601b900463ffffffff1690565b81546110579063ffffffff600160401b8204811691600160a01b900416808218908210021890565b600061303f8254600160c81b9004600216151590565b801561304f575061304f82613072565b156123895750546001600160401b03166000908152306020526040902080150190565b600061307d82612fd6565b915463ffffffff928316600160a01b9091049092169190911015919050565b61271061ffff8216111561114b576040516319510c8760e31b815260040160405180910390fd5b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806130dd5750819003601f19909101908152919050565b600061311283612e42565b90508060008061312186612f04565b915091508415613158576131368184336112ac565b6131585761314483336126ec565b61315857613158632ce44b5f60e11b612ccc565b801561316357600082555b6fffffffffffffffffffffffffffffffff61317c612cd6565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b17600360e01b176131b5612cd6565b60008881526004919091016020526040812091909155600160e11b8516900361322b57600186016131e4612cd6565b60008281526004919091016020526040812054900361322957613205612cd6565b5481146132295784613215612cd6565b600083815260049190910160205260409020555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a461326b612cd6565b600190810180549091019055505050505050565b613294600554600160b01b9004600116151590565b156119cf5760405163b087bbf360e01b815260040160405180910390fd5b6110bd82826001613cff565b6132d28154600160c81b9004600416151590565b1561114b57604051633fa1be4f60e01b815260040160405180910390fd5b80546060908061338f5782600101805461330990614ffe565b80601f016020809104026020016040519081016040528092919081815260200182805461333590614ffe565b80156133825780601f1061335757610100808354040283529160200191613382565b820191906000526020600020905b81548152906001019060200180831161336557829003601f168201915b5050505050915050919050565b6060604051905060408101604052602081528160208201526133b381600180613d87565b6040516020016133c39190615049565b60405160208183030381529060405292505050919050565b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b805160ff811660009081526007602052604090208054600160c81b90046001161561345757604051632520e1bd60e11b815260040160405180910390fd5b60ff821661348a5763ffffffff6020840181905260408401819052606084015260006080840152600160a08401526134bf565b826040015163ffffffff16836020015163ffffffff1611156134bf57604051633a964d4760e01b815260040160405180910390fd5b602083015181546040850151606086015167ffffffffffffffff60401b19909216600160401b63ffffffff9485160263ffffffff60601b191617600160601b918416919091021763ffffffff60801b1916600160801b929091169190910217815560a0830151151560040260808401511515600202825460ff9290911760019081178316600160c81b0260ff60c81b1983168117855560068054600160c01b600160b01b80830488169190910260ff60c01b1990941661ffff60c01b19909616959095179290921790955584549590931690910260ff60b01b1961ffff600160a01b9485900481169093019092169092021662ffffff60a01b199093169290921791909117905550565b6000806135e08663ffffffff871686866020613e6e565b9150915094509492505050565b6135f681613072565b1561114b576040516337149c8160e21b815260040160405180910390fd5b600061361e612cd6565b80549091501561363057613630613b09565b600181556000613667848460008251601e600184518301031081601e850103518286015183601f0360031b1b170291505092915050565b905080613691576002820161367c85826150cf565b506003820161368b84826150cf565b50612231565b600055505050565b6000336000526e2fd5aeb385d324b580fca7c83823a08033036136c95760206000806000845afa6136c957600080fd5b505060005190565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b6001600160a01b03811661114b57604051630797cc5760e31b815260040160405180910390fd5b8051600003613741575050565b6110bd82826000613cff565b606081831061376657613766631960ccad60e11b612ccc565b600183101561377457600192505b600061377e612e11565b905080831061378b578092505b606060006137988761195e565b858710908102915081156138495781878703116137b55786860391505b60405192506001820160051b830160405260006137d18861232b565b9050600081604001516137e2575080515b60005b6137ee8a613a0f565b9250604083015160008114613806576000925061382b565b83511561381257835192505b8b831860601b61382b576001820191508a8260051b8801525b5060018a019950888a148061383f57508481145b156137e557855250505b50909695505050505050565b60006370a0823160005230602052602060346024601c865afa601f3d1116613885576390b8ec186000526004601cfd5b81601452603451905063a9059cbb60601b60005260206000604460106000875af13d1560016000511417166138c2576390b8ec186000526004601cfd5b600060345292915050565b8054600160a01b900463ffffffff161561114b576040516330b33cff60e01b815260040160405180910390fd5b60006001613906612cd6565b5403919050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061394290339089908890889060040161518e565b6020604051808303816000875af192505050801561397d575060408051601f3d908101601f1916820190925261397a918101906151c1565b60015b6139d2573d8080156139ab576040519150601f19603f3d011682016040523d82523d6000602084013e6139b0565b606091505b5080516000036139ca576139ca6368d2bf6b60e11b612ccc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60006139f9612cd6565b6000928352600401602052506040902054151590565b604080516080810182526000808252602082018190529181018290526060810191909152611057613a3e612cd6565b60008481526004919091016020526040902054604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6000613aa2612cd6565b60010154905090565b60006001600160401b036040612f97612cd6565b80471015613ad55763b12d13eb6000526004601cfd5b60005a60005a8486620186a0f16110bd57816000526073600b5360ff6020536016600b82f06110bd575a60141c3d5a3e5050565b6382b429006000526004601cfd5b8381830215612021578284015b8560ff16600101430340600052844487181860205260406000208660008114613b6d57866001868406011115613b68578160ff1c8860011b17600052602060002093505b613b71565b8193505b5050819550600185019450808503613b245750949350505050565b826020528160051c60005260406000208054600052818319601f16536000519055505050565b6000613bbc612cd6565b5490506000829003613bd857613bd863b562e8dd60e01b612ccc565b6001600160a01b0383164260a01b6001841460e11b1717613bf7612cd6565b60008381526004919091016020526040902055680100000000000000018202613c1e612cd6565b6001600160a01b0385166000818152600592909201602052604082208054909301909255819003613c5857613c58622e076360e81b612ccc565b818301825b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103613c5d5781613c9c612cd6565b5550611738915050565b638b78c6d8600c52826000526020600c20805483811783613cc8575080841681185b80835580600c5160601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a3505050505050565b8151600060308214603183141715613d37576461723a2f2f64ffffffffff60058601511603613d375760019050600584019350602b84525b8015613d66576000613d4885613f12565b602001516461723a2f2f865260041990950183815294865550613d80565b60018501613d7485826150cf565b508215613d8057600085555b5050505050565b606083518015611837576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526106708515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f18603f52602083018181015b6003880197508751603f8160121c1651600053603f81600c1c1651600153603f8160061c1651600253603f811651600353506000518252600482019150808210613df757602001604052613d3d60f01b60038406600204808303919091526000861515909102918290035290038252509392505050565b600080838510613e7c578493505b6000600019860160018261010087900490506000196001881b018989035b83811684821860011c019650808411613ef157848701838104600090815260208f90526040902054908490068a021c821695508b8614613ef157858c11613ee657506000198601613e9a565b866001019350613e9a565b50505050931582151796188617159760018218909602189091019450505050565b6060815180156110675760038160021c0260038216613f475783820151613d3d18601e81901a1560ff90911615019003613f51565b6003821601600019015b60405192508083526020830181810191507ffc000000fc00686c7074787c8084888c9094989ca0a4a8acb0b4b8bcc0c4c8cc80605b527804080c1014181c2024282c3034383c4044484c5054585c6064603b526ef8fcf800fcd0d4d8dce0e4e8ecf0f4601a525b600486019550855180601f1a5160061c81601e1a5183161760061c81601d1a5183161760061c81601c1a51831617835250600382019150828210613fb8575050602081016040526000815250600060605250919050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915290565b803560ff8116811461238957600080fd5b60006020828403121561408657600080fd5b61171682614063565b60008083601f8401126140a157600080fd5b5081356001600160401b038111156140b857600080fd5b6020830191508360208260051b85010111156140d357600080fd5b9250929050565b600080600080606085870312156140f057600080fd5b6140f985614063565b935060208501356001600160401b0381111561411457600080fd5b6141208782880161408f565b9598909750949560400135949350505050565b6001600160e01b03198116811461114b57600080fd5b60006020828403121561415b57600080fd5b813561171681614133565b60005b83811015614181578181015183820152602001614169565b50506000910152565b600081518084526141a2816020860160208601614166565b601f01601f19169290920160200192915050565b602081526000611716602083018461418a565b6000602082840312156141db57600080fd5b5035919050565b80356001600160a01b038116811461238957600080fd5b6000806040838503121561420c57600080fd5b614215836141e2565b946020939093013593505050565b6000806020838503121561423657600080fd5b82356001600160401b0381111561424c57600080fd5b6142588582860161408f565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b8181101561384957835160ff1683529284019291840191600101614280565b6000806000606084860312156142b457600080fd5b6142bd846141e2565b92506142cb602085016141e2565b9150604084013590509250925092565b6000602082840312156142ed57600080fd5b611716826141e2565b6000806040838503121561430957600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156143485781518752958201959082019060010161432c565b509495945050505050565b6020815260006117166020830184614318565b805160ff1682526020810151614384602084018263ffffffff169052565b50604081015161439c604084018263ffffffff169052565b5060608101516143b4606084018263ffffffff169052565b5060808101516143cc608084018263ffffffff169052565b5060a08101516143e460a084018263ffffffff169052565b5060c081015160c083015260e081015161440260e084018215159052565b50610100818101511515908301526101208082015180151582850152612231565b61014081016110578284614366565b803561ffff8116811461238957600080fd5b60006020828403121561445657600080fd5b61171682614432565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156144985761449861445f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156144c6576144c661445f565b604052919050565b60006001600160401b038211156144e7576144e761445f565b50601f01601f191660200190565b6000614508614503846144ce565b61449e565b905082815283838301111561451c57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261454457600080fd5b611716838335602085016144f5565b60006020828403121561456557600080fd5b81356001600160401b0381111561457b57600080fd5b61202184828501614533565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b81811015613849576145f2838551614587565b92840192608092909201916001016145df565b60008060006040848603121561461a57600080fd5b614623846141e2565b925060208401356001600160401b038082111561463f57600080fd5b818601915086601f83011261465357600080fd5b81358181111561466257600080fd5b87602082850101111561467457600080fd5b6020830194508093505050509250925092565b803563ffffffff8116811461238957600080fd5b8035801515811461238957600080fd5b600060c082840312156146bd57600080fd5b60405160c081018181106001600160401b03821117156146df576146df61445f565b6040529050806146ee83614063565b81526146fc60208401614687565b602082015261470d60408401614687565b604082015261471e60608401614687565b606082015261472f6080840161469b565b608082015261474060a0840161469b565b60a08201525092915050565b600060c0828403121561475e57600080fd5b61171683836146ab565b6000806040838503121561477b57600080fd5b61478483614063565b91506114e560208401614687565b600082601f8301126147a357600080fd5b813560206001600160401b038211156147be576147be61445f565b6147cc818360051b0161449e565b82815260c092830285018201928282019190878511156147eb57600080fd5b8387015b8581101561480e5761480189826146ab565b84529284019281016147ef565b5090979650505050505050565b60006020828403121561482d57600080fd5b81356001600160401b038082111561484457600080fd5b90830190610140828603121561485957600080fd5b614861614475565b82358281111561487057600080fd5b61487c87828601614533565b82525060208301358281111561489157600080fd5b61489d87828601614533565b6020830152506148af604084016141e2565b60408201526060830135828111156148c657600080fd5b6148d287828601614533565b6060830152506080830135828111156148ea57600080fd5b6148f687828601614533565b60808301525061490860a084016141e2565b60a082015261491960c08401614432565b60c082015261492a60e0840161469b565b60e082015261010061493d81850161469b565b90820152610120838101358381111561495557600080fd5b61496188828701614792565b918301919091525095945050505050565b60008060006060848603121561498757600080fd5b61499084614063565b925061499e60208501614687565b91506149ac60408501614687565b90509250925092565b600080604083850312156149c857600080fd5b6149d183614063565b91506114e56020840161469b565b6000806000606084860312156149f457600080fd5b6149fd846141e2565b95602085013595506040909401359392505050565b60008060408385031215614a2557600080fd5b6149d1836141e2565b60008060008060808587031215614a4457600080fd5b614a4d856141e2565b9350614a5b602086016141e2565b92506040850135915060608501356001600160401b03811115614a7d57600080fd5b8501601f81018713614a8e57600080fd5b614a9d878235602084016144f5565b91505092959194509250565b600080600060608486031215614abe57600080fd5b6149fd84614063565b608081016110578284614587565b600081518084526020808501945080840160005b8381101561434857614afc878351614366565b610140969096019590820190600101614ae9565b60208152600082516101c0806020850152614b2f6101e085018361418a565b91506020850151601f1980868503016040870152614b4d848361418a565b93506040870151915080868503016060870152614b6a848361418a565b93506060870151915080868503016080870152614b87848361418a565b935060808701519150614ba560a08701836001600160a01b03169052565b60a08701516001600160a01b03811660c0880152915060c087015180151560e0880152915060e08701519150610100614be18188018415159052565b8701519150610120614bf88782018461ffff169052565b8701516101408781019190915287015161016080880191909152870151610180808801919091528701516101a080880191909152870151868503909101838701529050614c458382614ad5565b9695505050505050565b60008060408385031215614c6257600080fd5b614c6b836141e2565b91506114e5602084016141e2565b600080600060608486031215614c8e57600080fd5b6142bd84614063565b634e487b7160e01b600052603260045260246000fd5b8183526000602080850194508260005b85811015614348576001600160a01b03614cd6836141e2565b1687529582019590820190600101614cbd565b60ff86168152608060208201526000614d06608083018688614cad565b604083019490945250606001529392505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561105757611057614d1a565b600060208284031215614d5557600080fd5b81516001600160401b03811115614d6b57600080fd5b8201601f81018413614d7c57600080fd5b8051614d8a614503826144ce565b818152856020838501011115614d9f57600080fd5b611a89826020830160208601614166565b60008351614dc2818460208801614166565b835190830190614dd6818360208801614166565b01949350505050565b60ff8151168252602081015163ffffffff8082166020850152806040840151166040850152806060840151166060850152505060808101511515608083015260a0810151151560a08301525050565b60c081016110578284614ddf565b600081518084526020808501945080840160005b8381101561434857614e63878351614ddf565b60c0969096019590820190600101614e50565b6020815260008251610140806020850152614e9561016085018361418a565b91506020850151601f1980868503016040870152614eb3848361418a565b935060408701519150614ed160608701836001600160a01b03169052565b6060870151915080868503016080870152614eec848361418a565b935060808701519150808685030160a0870152614f09848361418a565b935060a08701519150614f2760c08701836001600160a01b03169052565b60c087015161ffff811660e0880152915060e08701519150610100614f4f8188018415159052565b8701519150610120614f648782018415159052565b870151868503909101838701529050614c458382614e3c565b600060018060a01b03808816835260806020840152614fa0608084018789614cad565b8381036040850152614fb28187614318565b9250508084166060840152509695505050505050565b6001600160a01b0384168152606060208201819052600090614fec9083018561418a565b8281036040840152614c45818561418a565b600181811c9082168061501257607f821691505b60208210810361106757634e487b7160e01b600052602260045260246000fd5b60008161504157615041614d1a565b506000190190565b6461723a2f2f60d81b815260008251615069816005850160208701614166565b602f60f81b6005939091019283015250600601919050565b601f82111561173857600081815260208120601f850160051c810160208610156150a85750805b601f850160051c820191505b818110156150c7578281556001016150b4565b505050505050565b81516001600160401b038111156150e8576150e861445f565b6150fc816150f68454614ffe565b84615081565b602080601f83116001811461513157600084156151195750858301515b600019600386901b1c1916600185901b1785556150c7565b600085815260208120601f198616915b8281101561516057888601518255948401946001909101908401615141565b508582101561517e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614c459083018461418a565b6000602082840312156151d357600080fd5b81516117168161413356fea2646970667358221220b9810ca74651b7c8b97730ce45adf169e17e89b27cbee934f566e9f39a4bf8f064736f6c63430008130033