{
  "address": "0x6d2eecf5a50fB741D39244E9B485bA3e4e676AE8",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_paymentManager",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_certificateVerifier",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AccessControlBadConfirmation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "neededRole",
          "type": "bytes32"
        }
      ],
      "name": "AccessControlUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "CerificateOwnerMismatch",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "DomainNameAlreadyRegistered",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyCountryCode",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyDomainName",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyOperator",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "EmptyPartyId",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "InvalidCertificate",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "NoRolesProvided",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "PartyAlreadyRegistered",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "PartyNotRegistered",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "enum OcnRegistry.Role",
          "name": "role",
          "type": "uint8"
        },
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "ProviderNotFound",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "reason",
          "type": "string"
        }
      ],
      "name": "SignerMismatch",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "name": "OperatorUpdate",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldAdmin",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "indexed": false,
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnCvManager.CvStatus",
          "name": "cvStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        }
      ],
      "name": "PartyDelete",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "indexed": false,
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "enum IOcnCvManager.CvStatus",
          "name": "cvStatus",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operatorAddress",
          "type": "address"
        }
      ],
      "name": "PartyUpdate",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "previousAdminRole",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "newAdminRole",
          "type": "bytes32"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "adminDeleteOperator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        }
      ],
      "name": "adminDeleteParty",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "certificateVerifier",
      "outputs": [
        {
          "internalType": "contract ICertificateVerifier",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "deleteNode",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "deleteNodeRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "deleteParty",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "party",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "deletePartyRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "getNode",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNodeOperators",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "party",
          "type": "address"
        }
      ],
      "name": "getOperatorByAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        }
      ],
      "name": "getOperatorByOcpi",
      "outputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getParties",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "getPartiesByOperator",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum OcnRegistry.Role",
          "name": "role",
          "type": "uint8"
        }
      ],
      "name": "getPartiesByRole",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getPartiesCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_partyAddress",
          "type": "address"
        }
      ],
      "name": "getPartyDetailsByAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "operatorAddress",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "_countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "_partyId",
          "type": "bytes3"
        }
      ],
      "name": "getPartyDetailsByOcpi",
      "outputs": [
        {
          "internalType": "address",
          "name": "partyAddress",
          "type": "address"
        },
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "internalType": "enum OcnRegistry.Role[]",
          "name": "roles",
          "type": "uint8[]"
        },
        {
          "internalType": "enum IOcnPaymentManager.PaymentStatus",
          "name": "paymentStatus",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "operatorAddress",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "isAllowedVerifier",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paymentManager",
      "outputs": [
        {
          "internalType": "contract IOcnPaymentManager",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "removeVerifier",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "callerConfirmation",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        }
      ],
      "name": "setNode",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "domain",
          "type": "string"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "setNodeRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "certificateData",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "signature",
              "type": "bytes"
            },
            {
              "internalType": "enum OcnRegistry.Role",
              "name": "role",
              "type": "uint8"
            }
          ],
          "internalType": "struct OcnRegistry.RoleDetails[]",
          "name": "roles",
          "type": "tuple[]"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        }
      ],
      "name": "setParty",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "party",
          "type": "address"
        },
        {
          "internalType": "bytes2",
          "name": "countryCode",
          "type": "bytes2"
        },
        {
          "internalType": "bytes3",
          "name": "partyId",
          "type": "bytes3"
        },
        {
          "components": [
            {
              "internalType": "bytes",
              "name": "certificateData",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "signature",
              "type": "bytes"
            },
            {
              "internalType": "enum OcnRegistry.Role",
              "name": "role",
              "type": "uint8"
            }
          ],
          "internalType": "struct OcnRegistry.RoleDetails[]",
          "name": "roles",
          "type": "tuple[]"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "url",
          "type": "string"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "setPartyRaw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum OcnRegistry.Role",
          "name": "role",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "oracleAddress",
          "type": "address"
        }
      ],
      "name": "setProviderOracle",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "verifier",
          "type": "address"
        }
      ],
      "name": "setVerifier",
      "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": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x8cc3d4403f66a354845c674b535743db84bc24414f055f149a957f41f828a475",
  "receipt": {
    "to": null,
    "from": "0xdD3D370a673cfdCfB0c4cA2a3fE313e1559d1fdc",
    "contractAddress": "0x6d2eecf5a50fB741D39244E9B485bA3e4e676AE8",
    "transactionIndex": 0,
    "gasUsed": "4018873",
    "logsBloom": "0x00000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000800000000000020100000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000001000000000200000000000000000000000000000000000000000000000000100000000000020000000000000000000000000000000000000200000000000000000000000000000",
    "blockHash": "0x3e99f0994ed1f20c9ec4b2210649c4e9ec141ba54c083ed0f0f3f6219ecffdb9",
    "transactionHash": "0x8cc3d4403f66a354845c674b535743db84bc24414f055f149a957f41f828a475",
    "logs": [
      {
        "transactionIndex": 0,
        "blockNumber": 15,
        "transactionHash": "0x8cc3d4403f66a354845c674b535743db84bc24414f055f149a957f41f828a475",
        "address": "0x6d2eecf5a50fB741D39244E9B485bA3e4e676AE8",
        "topics": [
          "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x000000000000000000000000dd3d370a673cfdcfb0c4ca2a3fe313e1559d1fdc",
          "0x000000000000000000000000dd3d370a673cfdcfb0c4ca2a3fe313e1559d1fdc"
        ],
        "data": "0x",
        "logIndex": 0,
        "blockHash": "0x3e99f0994ed1f20c9ec4b2210649c4e9ec141ba54c083ed0f0f3f6219ecffdb9"
      }
    ],
    "blockNumber": 15,
    "cumulativeGasUsed": "4018873",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xd26131272867B163d7037A26cd7AB5B1c12f2659",
    "0x789Ee7dA07388810a4B32Ec53ede3Bb6204f76F4"
  ],
  "numDeployments": 1,
  "solcInputHash": "4df7959444b7c5ddbe744b4be2594459",
  "metadata": "{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_paymentManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_certificateVerifier\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessControlBadConfirmation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"neededRole\",\"type\":\"bytes32\"}],\"name\":\"AccessControlUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"CerificateOwnerMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"DomainNameAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyCountryCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyDomainName\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"EmptyPartyId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"InvalidCertificate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"NoRolesProvided\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"PartyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"PartyNotRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"ProviderNotFound\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"SignerMismatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"name\":\"OperatorUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"indexed\":false,\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"enum IOcnCvManager.CvStatus\",\"name\":\"cvStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"name\":\"PartyDelete\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"indexed\":false,\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"enum IOcnCvManager.CvStatus\",\"name\":\"cvStatus\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"}],\"name\":\"PartyUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"adminDeleteOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"}],\"name\":\"adminDeleteParty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"certificateVerifier\",\"outputs\":[{\"internalType\":\"contract ICertificateVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deleteNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"deleteNodeRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deleteParty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"party\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"deletePartyRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getNode\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeOperators\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"party\",\"type\":\"address\"}],\"name\":\"getOperatorByAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"}],\"name\":\"getOperatorByOcpi\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getParties\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getPartiesByOperator\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"name\":\"getPartiesByRole\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPartiesCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_partyAddress\",\"type\":\"address\"}],\"name\":\"getPartyDetailsByAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"_countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"_partyId\",\"type\":\"bytes3\"}],\"name\":\"getPartyDetailsByOcpi\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"partyAddress\",\"type\":\"address\"},{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"internalType\":\"enum OcnRegistry.Role[]\",\"name\":\"roles\",\"type\":\"uint8[]\"},{\"internalType\":\"enum IOcnPaymentManager.PaymentStatus\",\"name\":\"paymentStatus\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"operatorAddress\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"isAllowedVerifier\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paymentManager\",\"outputs\":[{\"internalType\":\"contract IOcnPaymentManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"removeVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"callerConfirmation\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"}],\"name\":\"setNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"domain\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setNodeRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"certificateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"internalType\":\"struct OcnRegistry.RoleDetails[]\",\"name\":\"roles\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"}],\"name\":\"setParty\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"party\",\"type\":\"address\"},{\"internalType\":\"bytes2\",\"name\":\"countryCode\",\"type\":\"bytes2\"},{\"internalType\":\"bytes3\",\"name\":\"partyId\",\"type\":\"bytes3\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"certificateData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"},{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"}],\"internalType\":\"struct OcnRegistry.RoleDetails[]\",\"name\":\"roles\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"url\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"setPartyRaw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enum OcnRegistry.Role\",\"name\":\"role\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"oracleAddress\",\"type\":\"address\"}],\"name\":\"setProviderOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"setVerifier\",\"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\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AccessControlBadConfirmation()\":[{\"details\":\"The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\"}],\"AccessControlUnauthorizedAccount(address,bytes32)\":[{\"details\":\"The `account` is missing a role.\"}]},\"events\":{\"RoleAdminChanged(bytes32,bytes32,bytes32)\":{\"details\":\"Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this.\"},\"RoleGranted(bytes32,address,address)\":{\"details\":\"Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}.\"},\"RoleRevoked(bytes32,address,address)\":{\"details\":\"Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)\"}},\"kind\":\"dev\",\"methods\":{\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"renounceRole(bytes32,address)\":{\"details\":\"Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/OcnRegistry.sol\":\"OcnRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IAccessControl} from \\\"./IAccessControl.sol\\\";\\nimport {Context} from \\\"../utils/Context.sol\\\";\\nimport {ERC165} from \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```solidity\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```solidity\\n * function foo() public {\\n *     require(hasRole(MY_ROLE, msg.sender));\\n *     ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\\n * to enforce additional security measures for this role.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n    struct RoleData {\\n        mapping(address account => bool) hasRole;\\n        bytes32 adminRole;\\n    }\\n\\n    mapping(bytes32 role => RoleData) private _roles;\\n\\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n    /**\\n     * @dev Modifier that checks that an account has a specific role. Reverts\\n     * with an {AccessControlUnauthorizedAccount} error including the required role.\\n     */\\n    modifier onlyRole(bytes32 role) {\\n        _checkRole(role);\\n        _;\\n    }\\n\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) public view virtual returns (bool) {\\n        return _roles[role].hasRole[account];\\n    }\\n\\n    /**\\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\\n     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\\n     */\\n    function _checkRole(bytes32 role) internal view virtual {\\n        _checkRole(role, _msgSender());\\n    }\\n\\n    /**\\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\\n     * is missing `role`.\\n     */\\n    function _checkRole(bytes32 role, address account) internal view virtual {\\n        if (!hasRole(role, account)) {\\n            revert AccessControlUnauthorizedAccount(account, role);\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\\n        return _roles[role].adminRole;\\n    }\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     *\\n     * May emit a {RoleGranted} event.\\n     */\\n    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n        _grantRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\\n        _revokeRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `callerConfirmation`.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function renounceRole(bytes32 role, address callerConfirmation) public virtual {\\n        if (callerConfirmation != _msgSender()) {\\n            revert AccessControlBadConfirmation();\\n        }\\n\\n        _revokeRole(role, callerConfirmation);\\n    }\\n\\n    /**\\n     * @dev Sets `adminRole` as ``role``'s admin role.\\n     *\\n     * Emits a {RoleAdminChanged} event.\\n     */\\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n        bytes32 previousAdminRole = getRoleAdmin(role);\\n        _roles[role].adminRole = adminRole;\\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n    }\\n\\n    /**\\n     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\\n     *\\n     * Internal function without access restriction.\\n     *\\n     * May emit a {RoleGranted} event.\\n     */\\n    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\\n        if (!hasRole(role, account)) {\\n            _roles[role].hasRole[account] = true;\\n            emit RoleGranted(role, account, _msgSender());\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\\n     *\\n     * Internal function without access restriction.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\\n        if (hasRole(role, account)) {\\n            _roles[role].hasRole[account] = false;\\n            emit RoleRevoked(role, account, _msgSender());\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa0e92d42942f4f57c5be50568dac11e9d00c93efcb458026e18d2d9b9b2e7308\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n    /**\\n     * @dev The `account` is missing a role.\\n     */\\n    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\\n\\n    /**\\n     * @dev The caller of a function is not the expected one.\\n     *\\n     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\\n     */\\n    error AccessControlBadConfirmation();\\n\\n    /**\\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n     *\\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n     * {RoleAdminChanged} not being emitted signaling this.\\n     */\\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n    /**\\n     * @dev Emitted when `account` is granted `role`.\\n     *\\n     * `sender` is the account that originated the contract call, an admin role\\n     * bearer except when using {AccessControl-_setupRole}.\\n     */\\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Emitted when `account` is revoked `role`.\\n     *\\n     * `sender` is the account that originated the contract call:\\n     *   - if using `revokeRole`, it is the admin role bearer\\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n     */\\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n    /**\\n     * @dev Returns `true` if `account` has been granted `role`.\\n     */\\n    function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n    /**\\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\\n     * {revokeRole}.\\n     *\\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n     */\\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function grantRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have ``role``'s admin role.\\n     */\\n    function revokeRole(bytes32 role, address account) external;\\n\\n    /**\\n     * @dev Revokes `role` from the calling account.\\n     *\\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n     * purpose is to provide a mechanism for accounts to lose their privileges\\n     * if they are compromised (such as when a trusted device is misplaced).\\n     *\\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\\n     * event.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must be `callerConfirmation`.\\n     */\\n    function renounceRole(bytes32 role, address callerConfirmation) external;\\n}\\n\",\"keccak256\":\"0xb6b36edd6a2999fd243ff226d6cbf84bd71af2432bbd0dfe19392996a1d9cb41\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    /**\\n     * @dev Returns the value of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the value of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\\n     * caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 value) external returns (bool);\\n\\n    /**\\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\\n     * allowance mechanism. `value` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\\n}\\n\",\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n\\n    function _contextSuffixLength() internal view virtual returns (uint256) {\\n        return 0;\\n    }\\n}\\n\",\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\nimport {IERC165} from \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n */\\nabstract contract ERC165 is IERC165 {\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\\n        return interfaceId == type(IERC165).interfaceId;\\n    }\\n}\\n\",\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.20;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"license\":\"MIT\"},\"contracts/IOcnCvManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.24;\\n\\ninterface IOcnCvManager {\\n    /* ********************************** */\\n    /*               ENUMS                */\\n    /* ********************************** */\\n\\n    enum CvStatus { NOT_VERIFIED, APPROVED, FAILED }\\n\\n}\\n\",\"keccak256\":\"0x8b6cd5f155c9df3ad3f60f6d6c7ee3ea1a9f4cf4260bd4b534546fcae5fff71d\",\"license\":\"GPL-3.0\"},\"contracts/IOcnPaymentManager.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.24;\\n\\nimport {IERC20} from \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\ninterface IOcnPaymentManager {\\n    /* ********************************** */\\n    /*               ENUMS                */\\n    /* ********************************** */\\n\\n    enum PaymentStatus { PENDING, PAYMENT_UP_TO_DATE, INSUFFICIENT_FUNDS, INACTIVE }\\n\\n    /* ********************************** */\\n    /*               EVENTS               */\\n    /* ********************************** */\\n\\n    event OwnershipTransferred(address indexed oldAdmin, address indexed  newAdmin);\\n    event PartyStaked(address stakedBy, address party, uint256 amount);\\n    event StakeWithdrawn(address indexed party, uint256 amount);\\n\\n    /* ********************************** */\\n    /*            FUNCTIONS               */\\n    /* ********************************** */\\n\\n    function initialize(address _euroStablecoin, uint256 _fundingYearlyAmount, address _operator) external;\\n    function pay(address party) external;\\n    function withdrawToRegistryOperator(address party) external;\\n    function getPaymentStatus(address party) external view returns (PaymentStatus);\\n\\n    /* ********************************** */\\n    /*       STORAGE VARIABLES            */\\n    /* ********************************** */\\n\\n    function euroStablecoin() external view returns (IERC20);\\n    function stakedFunds(address party) external view returns (uint256);\\n    function stakingBlock(address party) external view returns (uint256);\\n\\n    /* ********************************** */\\n    /*  ERRORS                            */\\n    /* ********************************** */\\n\\n    error StakeAlreadyDeposited();\\n    error InsufficientAllowance();\\n    error TransferFailed();\\n    error NoFundsStaked();\\n    error WithdrawalNotAllowed();\\n}\\n\",\"keccak256\":\"0x5af91a51457db2daa8e1a561c817d4f99138c9ffd97aa442115f9afe51d63ff5\",\"license\":\"GPL-3.0\"},\"contracts/OcnRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.24;\\n\\nimport {IOcnPaymentManager} from \\\"./IOcnPaymentManager.sol\\\";\\nimport {IOcnCvManager} from \\\"./IOcnCvManager.sol\\\";\\nimport \\\"./interfaces/ICertificateVerifier.sol\\\";\\nimport \\\"./interfaces/IProviderOracle.sol\\\";\\n\\nimport {AccessControl} from \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\n\\ncontract OcnRegistry is AccessControl {\\n    /* ********************************** */\\n    /*       STORAGE VARIABLES            */\\n    /* ********************************** */\\n\\n    string private prefix;\\n\\n    // OCN Node Operator Listings\\n    mapping(address => string) private nodeOf;\\n    mapping(string => bool) private uniqueDomains;\\n    mapping(address => bool) private uniqueOperators;\\n    address[] private operators;\\n\\n    // OCPI Party Listings\\n    enum Role {\\n        CPO,\\n        EMSP,\\n        NAP,\\n        NSP,\\n        OTHER,\\n        SCSP\\n    }\\n\\n    struct RoleDetails {\\n        bytes certificateData;\\n        bytes signature;\\n        Role role;\\n    }\\n\\n    struct PartyDetails {\\n        bytes2 countryCode;\\n        bytes3 partyId;\\n        Role[] roles;\\n        string name;\\n        string url;\\n        IOcnPaymentManager.PaymentStatus paymentStatus;\\n        IOcnCvManager.CvStatus cvStatus;\\n        bool active;\\n        uint256 partyIndex;\\n    }\\n\\n    mapping(bytes2 => mapping(bytes3 => address)) private uniqueParties;\\n    mapping(address => bool) private uniquePartyAddresses;\\n    mapping(address => PartyDetails) private partyOf;\\n    mapping(address => address) private operatorOf;\\n    mapping(address => bool) private allowedCertificateVerifiers;\\n    address[] private parties;\\n\\n    IOcnPaymentManager public paymentManager;\\n    ICertificateVerifier public certificateVerifier;\\n\\n    // Providers Oracle\\n    mapping(Role => IProviderOracle) private roleOracle;\\n\\n    /* ********************************** */\\n    /*          CUSTOM ERRORS             */\\n    /* ********************************** */\\n    error EmptyDomainName(string reason);\\n    error DomainNameAlreadyRegistered(string reason);\\n    error EmptyCountryCode(string reason);\\n    error EmptyPartyId(string reason);\\n    error NoRolesProvided(string reason);\\n    error EmptyOperator(string reason);\\n    error PartyAlreadyRegistered(string reason);\\n    error PartyNotRegistered(string reason);\\n    error SignerMismatch(string reason);\\n    error InvalidCertificate(address verifier, string reason);\\n    error ProviderNotFound(Role role, string reason);\\n    error CerificateOwnerMismatch(string reason);\\n\\n    /* ********************************** */\\n    /*               EVENTS               */\\n    /* ********************************** */\\n\\n    event OwnershipTransferred(address indexed oldAdmin, address indexed newAdmin);\\n    event OperatorUpdate(address indexed operator, string domain);\\n    event PartyUpdate(bytes2 countryCode, bytes3 partyId, address indexed partyAddress, Role[] roles, string name, string url, IOcnPaymentManager.PaymentStatus paymentStatus, IOcnCvManager.CvStatus cvStatus, bool active, address indexed operatorAddress);\\n\\n    event PartyDelete(bytes2 countryCode, bytes3 partyId, address indexed partyAddress, Role[] roles, string name, string url, IOcnPaymentManager.PaymentStatus paymentStatus, IOcnCvManager.CvStatus cvStatus, bool active);\\n\\n    /* ********************************** */\\n    /*          INITIALIZER               */\\n    /* ********************************** */\\n\\n    constructor(address _paymentManager, address _certificateVerifier) {\\n        prefix = \\\"\\\\u0019Ethereum Signed Message:\\\\n32\\\";\\n        paymentManager = IOcnPaymentManager(_paymentManager);\\n        certificateVerifier = ICertificateVerifier(_certificateVerifier);\\n        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n    }\\n\\n    function transferOwnership(address newOwner) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        grantRole(DEFAULT_ADMIN_ROLE, newOwner);\\n        revokeRole(DEFAULT_ADMIN_ROLE, msg.sender);\\n\\n        emit OwnershipTransferred(msg.sender, newOwner);\\n    }\\n\\n    function adminDeleteOperator(address operator) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        deleteNode(operator);\\n    }\\n\\n    function adminDeleteParty(bytes2 countryCode, bytes3 partyId) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        address party = uniqueParties[countryCode][partyId];\\n        deleteParty(party);\\n    }\\n\\n    function setNode(address operator, string memory domain) private {\\n        if (bytes(domain).length == 0) {\\n            revert EmptyDomainName(\\\"Cannot set empty domain name. Use deleteNode method instead.\\\");\\n        }\\n        if (uniqueDomains[domain]) {\\n            revert DomainNameAlreadyRegistered(\\\"Domain name already registered.\\\");\\n        }\\n        uniqueDomains[domain] = true;\\n\\n        if (!uniqueOperators[operator]) {\\n            operators.push(operator);\\n        }\\n\\n        uniqueOperators[operator] = true;\\n        nodeOf[operator] = domain;\\n        emit OperatorUpdate(operator, domain);\\n    }\\n\\n    function setNode(string memory domain) public {\\n        setNode(msg.sender, domain);\\n    }\\n\\n    function setNodeRaw(address operator, string memory domain, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes32 paramHash = keccak256(abi.encodePacked(operator, domain));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        setNode(signer, domain);\\n    }\\n\\n    function deleteNode(address operator) private {\\n        string memory domain = nodeOf[operator];\\n        if (bytes(domain).length == 0) {\\n            revert EmptyDomainName(\\\"Cannot delete node that does not exist.\\\");\\n        }\\n        uniqueDomains[domain] = false;\\n        delete nodeOf[operator];\\n        emit OperatorUpdate(operator, \\\"\\\");\\n    }\\n\\n    function deleteNode() public {\\n        deleteNode(msg.sender);\\n    }\\n\\n    function deleteNodeRaw(address operator, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes32 paramHash = keccak256(abi.encodePacked(operator));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        deleteNode(signer);\\n    }\\n\\n    function getNode(address operator) public view returns (string memory) {\\n        return nodeOf[operator];\\n    }\\n\\n    function getNodeOperators() public view returns (address[] memory) {\\n        return operators;\\n    }\\n\\n    function setParty(bytes2 countryCode, bytes3 partyId, RoleDetails[] memory roles, address operator, string memory name, string memory url) public {\\n        if (countryCode == bytes2(0)) {\\n            revert EmptyCountryCode(\\\"Cannot set empty country_code. Use deleteParty method instead.\\\");\\n        }\\n        if (partyId == bytes3(0)) {\\n            revert EmptyPartyId(\\\"Cannot set empty party_id. Use deleteParty method instead.\\\");\\n        }\\n        if (roles.length == 0) {\\n            revert NoRolesProvided(\\\"No roles provided.\\\");\\n        }\\n        if (operator == address(0)) {\\n            revert EmptyOperator(\\\"Cannot set empty operator. Use deleteParty method instead.\\\");\\n        }\\n\\n        Role[] memory verifiedRoles = new Role[](roles.length);\\n        address credentialOwner = address(0);\\n\\n        // VC verification (All roles must be verified)\\n        for (uint8 i = 0; i < roles.length; i++) {\\n            RoleDetails memory roleDetails = roles[i];\\n            (string memory certificateIdentifier, address owner) = verifyCertificate(roleDetails);\\n\\n            if (credentialOwner == address(0)) {\\n                credentialOwner = owner;\\n            }\\n\\n            if (credentialOwner != owner) {\\n                revert CerificateOwnerMismatch(\\\"Certificates have different owners\\\");\\n            }\\n\\n            IProviderOracle oracle = roleOracle[roleDetails.role];\\n            if (address(oracle) != address(0)) {\\n                IProviderOracle.Provider memory provider = oracle.getProvider(certificateIdentifier);\\n                if (!compareIdentifiers(certificateIdentifier, provider.identifier)) {\\n                    revert ProviderNotFound(roleDetails.role, \\\"Not active in oracle\\\");\\n                }\\n            }\\n\\n            verifiedRoles[i] = roleDetails.role;\\n        }\\n\\n        address registeredParty = uniqueParties[countryCode][partyId];\\n        if (registeredParty != address(0) && registeredParty != credentialOwner) {\\n            revert PartyAlreadyRegistered(\\\"Party with country_code/party_id already registered under different address.\\\");\\n        }\\n        uniqueParties[countryCode][partyId] = credentialOwner;\\n        if (bytes(nodeOf[operator]).length == 0) {\\n            revert PartyNotRegistered(\\\"Provided operator not registered.\\\");\\n        }\\n\\n        uint256 partyIndex = partyOf[credentialOwner].partyIndex;\\n        if (!uniquePartyAddresses[credentialOwner]) {\\n            parties.push(credentialOwner);\\n            // get last index of the array\\n            partyIndex = parties.length - 1;\\n        }\\n\\n        uniquePartyAddresses[credentialOwner] = true;\\n\\n        IOcnPaymentManager.PaymentStatus paymentStatus = paymentManager.getPaymentStatus(credentialOwner);\\n        partyOf[credentialOwner] = PartyDetails(countryCode, partyId, verifiedRoles, name, url, paymentStatus, IOcnCvManager.CvStatus.NOT_VERIFIED, true, partyIndex);\\n        operatorOf[credentialOwner] = operator;\\n\\n        PartyDetails memory details = partyOf[credentialOwner];\\n        emit PartyUpdate(details.countryCode, details.partyId, credentialOwner, details.roles, details.name, details.url, details.paymentStatus, details.cvStatus, details.active, operator);\\n    }\\n\\n    function setPartyRaw(address party, bytes2 countryCode, bytes3 partyId, RoleDetails[] memory roles, address operator, string memory name, string memory url, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes memory rolesBytes = \\\"\\\";\\n        for (uint8 i = 0; i < roles.length; i++) {\\n            RoleDetails memory roleDetails = roles[i];\\n            rolesBytes = abi.encodePacked(rolesBytes, roleDetails.certificateData, roleDetails.signature, roleDetails.role);\\n        }\\n        bytes32 rolesHash = keccak256(rolesBytes);\\n        bytes32 paramHash = keccak256(abi.encodePacked(party, countryCode, partyId, rolesHash, operator, name, url));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        if (signer != party) {\\n            revert SignerMismatch(\\\"Signer and provided party address different.\\\");\\n        }\\n        setParty(countryCode, partyId, roles, operator, name, url);\\n    }\\n\\n    function deleteParty(address party) private {\\n        if (operatorOf[party] == address(0)) {\\n            revert PartyNotRegistered(\\\"Cannot delete party that does not exist. No operator found for given party.\\\");\\n        }\\n        delete operatorOf[party];\\n        PartyDetails memory details = partyOf[party];\\n        delete uniqueParties[details.countryCode][details.partyId];\\n        delete partyOf[party];\\n        delete parties[details.partyIndex];\\n        uniquePartyAddresses[party] = false;\\n\\n        emit PartyDelete(details.countryCode, details.partyId, party, details.roles, details.name, details.url, details.paymentStatus, details.cvStatus, details.active);\\n    }\\n\\n    function deleteParty() public {\\n        deleteParty(msg.sender);\\n    }\\n\\n    function deletePartyRaw(address party, uint8 v, bytes32 r, bytes32 s) public {\\n        bytes32 paramHash = keccak256(abi.encodePacked(party));\\n        address signer = ecrecover(keccak256(abi.encodePacked(prefix, paramHash)), v, r, s);\\n        if (signer != party) {\\n            revert SignerMismatch(\\\"Signer and provided party address different.\\\");\\n        }\\n        deleteParty(signer);\\n    }\\n\\n    function getOperatorByAddress(address party) public view returns (address operator, string memory domain) {\\n        operator = operatorOf[party];\\n        domain = nodeOf[operator];\\n    }\\n\\n    function getOperatorByOcpi(bytes2 countryCode, bytes3 partyId) public view returns (address operator, string memory domain) {\\n        address party = uniqueParties[countryCode][partyId];\\n        operator = operatorOf[party];\\n        domain = nodeOf[operator];\\n    }\\n\\n    function getPartyDetailsByAddress(address _partyAddress) public view returns (address partyAddress, bytes2 countryCode, bytes3 partyId, Role[] memory roles, IOcnPaymentManager.PaymentStatus paymentStatus, address operatorAddress, string memory name, string memory url, bool active) {\\n        PartyDetails storage details = partyOf[_partyAddress];\\n        partyAddress = _partyAddress;\\n        countryCode = details.countryCode;\\n        partyId = details.partyId;\\n        roles = details.roles;\\n        paymentStatus = details.paymentStatus;\\n        operatorAddress = operatorOf[_partyAddress];\\n        name = details.name;\\n        url = details.url;\\n        active = details.active;\\n    }\\n\\n    function getPartyDetailsByOcpi(bytes2 _countryCode, bytes3 _partyId) public view returns (address partyAddress, bytes2 countryCode, bytes3 partyId, Role[] memory roles, IOcnPaymentManager.PaymentStatus paymentStatus, address operatorAddress, string memory name, string memory url, bool active) {\\n        partyAddress = uniqueParties[_countryCode][_partyId];\\n        PartyDetails storage details = partyOf[partyAddress];\\n        countryCode = details.countryCode;\\n        partyId = details.partyId;\\n        roles = details.roles;\\n        paymentStatus = details.paymentStatus;\\n        operatorAddress = operatorOf[partyAddress];\\n        name = details.name;\\n        url = details.url;\\n        active = details.active;\\n    }\\n\\n    function getPartiesCount() public view returns (uint256) {\\n        return parties.length;\\n    }\\n\\n    function getParties() public view returns (address[] memory) {\\n        return parties;\\n    }\\n\\n    function getPartiesByOperator(address operator) public view returns (address[] memory) {\\n        address[] memory filteredParties = new address[](parties.length);\\n        uint32 count = 0;\\n        for (uint32 i = 0; i < parties.length; i++) {\\n            if (operatorOf[parties[i]] == operator) {\\n                filteredParties[count] = parties[i];\\n                count++;\\n            }\\n        }\\n        address[] memory result = new address[](count);\\n        for (uint32 i = 0; i < count; i++) {\\n            result[i] = filteredParties[i];\\n        }\\n        return result;\\n    }\\n\\n    function getPartiesByRole(Role role) public view returns (address[] memory) {\\n        address[] memory filteredParties = new address[](parties.length);\\n        uint32 count = 0;\\n        for (uint32 i = 0; i < parties.length; i++) {\\n            PartyDetails memory details = partyOf[parties[i]];\\n            for (uint32 j = 0; j < details.roles.length; j++) {\\n                if (details.roles[j] == role) {\\n                    filteredParties[count] = parties[i];\\n                    count++;\\n                    break;\\n                }\\n            }\\n        }\\n        address[] memory result = new address[](count);\\n        for (uint32 i = 0; i < count; i++) {\\n            result[i] = filteredParties[i];\\n        }\\n        return result;\\n    }\\n\\n    function setVerifier(address verifier) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        require(verifier != address(0), \\\"Invalid verifier address\\\");\\n        require(!allowedCertificateVerifiers[verifier], \\\"Verifier already allowed\\\");\\n\\n        allowedCertificateVerifiers[verifier] = true;\\n    }\\n\\n    function removeVerifier(address verifier) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        require(verifier != address(0), \\\"Invalid verifier address\\\");\\n        require(allowedCertificateVerifiers[verifier], \\\"Verifier not currently allowed\\\");\\n\\n        allowedCertificateVerifiers[verifier] = false;\\n    }\\n\\n    function isAllowedVerifier(address verifier) public view returns (bool) {\\n        return allowedCertificateVerifiers[verifier];\\n    }\\n\\n    function setProviderOracle(Role role, address oracleAddress) public onlyRole(DEFAULT_ADMIN_ROLE) {\\n        roleOracle[role] = IProviderOracle(oracleAddress);\\n    }\\n\\n    function verifyCertificate(RoleDetails memory roleDetails) private view returns (string memory, address) {\\n        if (roleDetails.role == Role.EMSP) {\\n            (address verifier, ICertificateVerifier.EMPCertificate memory certificate, ) = certificateVerifier.verifyEMP(roleDetails.certificateData, roleDetails.signature);\\n            if (!isAllowedVerifier(verifier)) {\\n                revert InvalidCertificate(verifier, \\\"Invalid EMP certificate\\\");\\n            }\\n            return (certificate.identifier, certificate.owner);\\n        } else if (roleDetails.role == Role.CPO) {\\n            (address verifier, ICertificateVerifier.CPOCertificate memory certificate, ) = certificateVerifier.verifyCPO(roleDetails.certificateData, roleDetails.signature);\\n            if (!isAllowedVerifier(verifier)) {\\n                revert InvalidCertificate(verifier, \\\"Invalid CPO certificate\\\");\\n            }\\n            return (certificate.identifier, certificate.owner);\\n        } else {\\n            (address verifier, ICertificateVerifier.OtherCertificate memory certificate, ) = certificateVerifier.verifyOther(roleDetails.certificateData, roleDetails.signature);\\n            if (!isAllowedVerifier(verifier)) {\\n                revert InvalidCertificate(verifier, \\\"Invalid Other certificate\\\");\\n            }\\n            return (certificate.identifier, certificate.owner);\\n        }\\n    }\\n\\n    function compareIdentifiers(string memory a, string memory b) private pure returns (bool) {\\n        return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\\n    }\\n}\\n\",\"keccak256\":\"0x1e17d393a610fc40045049ac69d5fdb030f77011261b0eba28766ed63b9308bc\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/ICertificateVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.24;\\n\\ninterface ICertificateVerifier {\\n    struct Signature {\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n    }\\n\\n    struct EMPCertificate {\\n        string identifier;\\n        string name;\\n        string marktfunktion;\\n        string lieferant;\\n        string bilanzkreis;\\n        address owner;\\n    }\\n\\n    struct CPOCertificate {\\n        string identifier;\\n        string name;\\n        address owner;\\n    }\\n\\n    struct OtherCertificate {\\n        string identifier;\\n        string name;\\n        address owner;\\n    }\\n\\n    function verifyEMP(\\n        bytes memory certificateData,\\n        bytes memory signature\\n    ) external view returns (address, EMPCertificate memory, Signature memory);\\n\\n    function verifyCPO(\\n        bytes memory certificateData,\\n        bytes memory signature\\n    ) external view returns (address, CPOCertificate memory, Signature memory);\\n\\n    function verifyOther(\\n        bytes memory certificateData,\\n        bytes memory signature\\n    ) external view returns (address, OtherCertificate memory, Signature memory);\\n}\\n\",\"keccak256\":\"0xa1fb3ec459b1344973479676bbd58d31cbaa1f3e9735338a6bf6ff85a526d59a\",\"license\":\"MIT\"},\"contracts/interfaces/IProviderOracle.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.24;\\n\\ninterface IProviderOracle {\\n    struct Provider {\\n        string name;\\n        string identifier;\\n    }\\n\\n    function getProvider(\\n        string memory identifier\\n    ) external view returns (Provider memory);\\n\\n    function addProvider(Provider memory provider) external;\\n}\\n\",\"keccak256\":\"0x8ed559df15b641e541236e0e4558bd8dec99c2efc31218f4939b67a4114b5723\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x60806040523480156200001157600080fd5b50604051620049193803806200491983398101604081905262000034916200018a565b60408051808201909152601c81527f19457468657265756d205369676e6564204d6573736167653a0a333200000000602082015260019062000077908262000269565b50600c80546001600160a01b038085166001600160a01b031992831617909255600d805492841692909116919091179055620000b5600033620000be565b50505062000335565b6000828152602081815260408083206001600160a01b038516845290915281205460ff1662000163576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200011a3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000167565b5060005b92915050565b80516001600160a01b03811681146200018557600080fd5b919050565b600080604083850312156200019e57600080fd5b620001a9836200016d565b9150620001b9602084016200016d565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001ed57607f821691505b6020821081036200020e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000264576000816000526020600020601f850160051c810160208610156200023f5750805b601f850160051c820191505b8181101562000260578281556001016200024b565b5050505b505050565b81516001600160401b03811115620002855762000285620001c2565b6200029d81620002968454620001d8565b8462000214565b602080601f831160018114620002d55760008415620002bc5750858301515b600019600386901b1c1916600185901b17855562000260565b600085815260208120601f198616915b828110156200030657888601518255948401946001909101908401620002e5565b5085821015620003255787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6145d480620003456000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806391d148541161011a578063aee1fe49116100ad578063d63a84d41161007c578063d63a84d41461048f578063df516128146104a2578063dfd93d3b146104b5578063e1e64995146104c8578063f2fde38b146104db57600080fd5b8063aee1fe4914610436578063bdb8107814610461578063ca2dfd0a14610469578063d547741f1461047c57600080fd5b8063a33db09f116100e9578063a33db09f146103eb578063a5b5ffbb146103fe578063a8311aa814610426578063acaef0e01461042e57600080fd5b806391d148541461039d57806399bd6901146103b05780639d209048146103c3578063a217fddf146103e357600080fd5b80635437988d1161019d5780636c265bbc1161016c5780636c265bbc146103305780637a091aa51461034357806381939d661461036457806385cb86021461037757806388cf72a01461038a57600080fd5b80635437988d146102d65780635cf0685f146102e957806366acaa331461031557806366e706fb1461031d57600080fd5b80632d8fe452116101d95780632d8fe4521461027d5780632f2ff15d1461029057806336568abe146102a357806339581c21146102b657600080fd5b806301ffc9a71461020b578063031d2bd5146102335780630799363d14610245578063248a9ca31461025a575b600080fd5b61021e61021936600461354e565b6104ee565b60405190151581526020015b60405180910390f35b600b545b60405190815260200161022a565b6102586102533660046137fa565b610525565b005b6102376102683660046138b6565b60009081526020819052604090206001015490565b61025861028b3660046138cf565b611096565b61025861029e3660046138ec565b6110ae565b6102586102b13660046138ec565b6110d9565b6102c96102c436600461391c565b611111565b60405161022a9190613937565b6102586102e43660046138cf565b6115e6565b61021e6102f73660046138cf565b6001600160a01b03166000908152600a602052604090205460ff1690565b6102c96116d0565b61025861032b36600461399e565b611732565b61025861033e36600461399e565b61182b565b6103566103513660046139e4565b6118ea565b60405161022a929190613a67565b610258610372366004613a93565b6119d7565b610258610385366004613abf565b611a41565b6103566103983660046138cf565b611a4e565b61021e6103ab3660046138ec565b611b0d565b6102586103be366004613af3565b611b36565b6103d66103d13660046138cf565b611bf7565b60405161022a9190613b66565b610237600081565b6102c96103f93660046138cf565b611ca3565b61041161040c3660046139e4565b611e9d565b60405161022a99989796959493929190613bf6565b6102c96120e8565b610258612148565b600c54610449906001600160a01b031681565b6040516001600160a01b03909116815260200161022a565b610258612153565b6102586104773660046138cf565b61215c565b61025861048a3660046138ec565b612242565b61025861049d3660046139e4565b612267565b6104116104b03660046138cf565b6122b3565b600d54610449906001600160a01b031681565b6102586104d6366004613c92565b612500565b6102586104e93660046138cf565b61269b565b60006001600160e01b03198216637965db0b60e01b148061051f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160f01b031986166105a857604051633a50519760e21b815260206004820152603e60248201527f43616e6e6f742073657420656d70747920636f756e7472795f636f64652e205560448201527f73652064656c6574655061727479206d6574686f6420696e73746561642e000060648201526084015b60405180910390fd5b6001600160e81b031985166106265760405163373a953760e11b815260206004820152603a60248201527f43616e6e6f742073657420656d7074792070617274795f69642e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e000000000000606482015260840161059f565b835160000361066d5760405163cab73b6560e01b81526020600482015260126024820152712737903937b632b990383937bb34b232b21760711b604482015260640161059f565b6001600160a01b0383166106ea5760405163fac855f560e01b815260206004820152603a60248201527f43616e6e6f742073657420656d707479206f70657261746f722e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e000000000000606482015260840161059f565b600084516001600160401b03811115610705576107056135b4565b60405190808252806020026020018201604052801561072e578160200160208202803683370190505b5090506000805b86518160ff16101561094b576000878260ff168151811061075857610758613d82565b6020026020010151905060008061076e836126f6565b90925090506001600160a01b038516610785578094505b806001600160a01b0316856001600160a01b0316146107f2576040516316c7354f60e01b815260206004820152602260248201527f436572746966696361746573206861766520646966666572656e74206f776e65604482015261727360f01b606482015260840161059f565b6000600e60008560400151600581111561080e5761080e613b79565b600581111561081f5761081f613b79565b81526020810191909152604001600020546001600160a01b0316905080156108ea576040516350cadc8560e01b81526000906001600160a01b038316906350cadc8590610870908790600401613b66565b600060405180830381865afa15801561088d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108b59190810190613ddd565b90506108c5848260200151612a6c565b6108e85784604001516040516303458c0d60e21b815260040161059f9190613e83565b505b8360400151878660ff168151811061090457610904613d82565b6020026020010190600581111561091d5761091d613b79565b9081600581111561093057610930613b79565b8152505050505050808061094390613ed7565b915050610735565b506001600160f01b0319881660009081526006602090815260408083206001600160e81b03198b1684529091529020546001600160a01b031680158015906109a55750816001600160a01b0316816001600160a01b031614155b15610a2e5760405163618270d960e01b815260206004820152604c60248201527f5061727479207769746820636f756e7472795f636f64652f70617274795f696460448201527f20616c7265616479207265676973746572656420756e6465722064696666657260648201526b32b73a1030b2323932b9b99760a11b608482015260a40161059f565b6001600160f01b0319891660009081526006602090815260408083206001600160e81b03198c168452825280832080546001600160a01b0319166001600160a01b038781169190911790915589168352600290915290208054610a9090613ef6565b9050600003610aec57604051634523c97f60e01b815260206004820152602160248201527f50726f7669646564206f70657261746f72206e6f7420726567697374657265646044820152601760f91b606482015260840161059f565b6001600160a01b03821660009081526008602090815260408083206005015460079092529091205460ff16610b7757600b80546001808201835560008390527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990910180546001600160a01b0319166001600160a01b0387161790559054610b749190613f30565b90505b6001600160a01b03838116600081815260076020526040808220805460ff19166001179055600c549051632222c8a160e21b815260048101939093529092169063888b228490602401602060405180830381865afa158015610bdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c019190613f43565b90506040518061012001604052808c6001600160f01b03191681526020018b6001600160e81b0319168152602001868152602001888152602001878152602001826003811115610c5357610c53613b79565b8152602001600081526001602080830182905260409283018690526001600160a01b038816600090815260088252839020845181548684015160e81c620100000264ffffffffff1990911660f09290921c91909117178155928401518051610cc293850192919091019061342a565b5060608201516002820190610cd79082613fac565b5060808201516003820190610cec9082613fac565b5060a082015160048201805460ff19166001836003811115610d1057610d10613b79565b021790555060c082015160048201805461ff001916610100836002811115610d3a57610d3a613b79565b021790555060e082015160048201805462ff00001916620100009215158302179055610100909201516005909101556001600160a01b03858116600090815260096020908152604080832080546001600160a01b031916948e169490941790935560088152828220835161012081018552815460f081901b6001600160f01b03191682529590950460e81b6001600160e81b031916858301526001810180548551818502810185018752818152949695929492860193830182828015610e4f57602002820191906000526020600020906000905b82829054906101000a900460ff166005811115610e2d57610e2d613b79565b815260206001928301818104948501949093039092029101808411610e0e5790505b50505050508152602001600282018054610e6890613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9490613ef6565b8015610ee15780601f10610eb657610100808354040283529160200191610ee1565b820191906000526020600020905b815481529060010190602001808311610ec457829003601f168201915b50505050508152602001600382018054610efa90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2690613ef6565b8015610f735780601f10610f4857610100808354040283529160200191610f73565b820191906000526020600020905b815481529060010190602001808311610f5657829003601f168201915b5050509183525050600482015460209091019060ff166003811115610f9a57610f9a613b79565b6003811115610fab57610fab613b79565b81526020016004820160019054906101000a900460ff166002811115610fd357610fd3613b79565b6002811115610fe457610fe4613b79565b81526020016004820160029054906101000a900460ff161515151581526020016005820154815250509050886001600160a01b0316856001600160a01b03167fc16bf12458bfb0cf1345674275c1e82f2c14cf06a3996e1bb297f2015ff66f78836000015184602001518560400151866060015187608001518860a001518960c001518a60e0015160405161108098979695949392919061406b565b60405180910390a3505050505050505050505050565b60006110a181612ac5565b6110aa82612acf565b5050565b6000828152602081905260409020600101546110c981612ac5565b6110d38383612c76565b50505050565b6001600160a01b03811633146111025760405163334bd91960e11b815260040160405180910390fd5b61110c8282612d08565b505050565b600b546060906000906001600160401b03811115611131576111316135b4565b60405190808252806020026020018201604052801561115a578160200160208202803683370190505b5090506000805b600b5463ffffffff8216101561152157600060086000600b8463ffffffff168154811061119057611190613d82565b60009182526020808320909101546001600160a01b03168352828101939093526040918201902081516101208101835281546001600160f01b031960f082901b1682526001600160e81b03196201000090910460e81b168185015260018201805484518187028101870186528181529295939486019383018282801561126557602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561124357611243613b79565b8152602060019283018181049485019490930390920291018084116112245790505b5050505050815260200160028201805461127e90613ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546112aa90613ef6565b80156112f75780601f106112cc576101008083540402835291602001916112f7565b820191906000526020600020905b8154815290600101906020018083116112da57829003601f168201915b5050505050815260200160038201805461131090613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461133c90613ef6565b80156113895780601f1061135e57610100808354040283529160200191611389565b820191906000526020600020905b81548152906001019060200180831161136c57829003601f168201915b5050509183525050600482015460209091019060ff1660038111156113b0576113b0613b79565b60038111156113c1576113c1613b79565b81526020016004820160019054906101000a900460ff1660028111156113e9576113e9613b79565b60028111156113fa576113fa613b79565b8152600482015462010000900460ff1615156020820152600590910154604090910152905060005b8160400151518163ffffffff16101561150c5786600581111561144757611447613b79565b82604001518263ffffffff168151811061146357611463613d82565b6020026020010151600581111561147c5761147c613b79565b036114fa57600b8363ffffffff168154811061149a5761149a613d82565b9060005260206000200160009054906101000a90046001600160a01b0316858563ffffffff16815181106114d0576114d0613d82565b6001600160a01b0390921660209283029190910190910152836114f281614104565b94505061150c565b8061150481614104565b915050611422565b5050808061151990614104565b915050611161565b5060008163ffffffff166001600160401b03811115611542576115426135b4565b60405190808252806020026020018201604052801561156b578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115dd57838163ffffffff168151811061159d5761159d613d82565b6020026020010151828263ffffffff16815181106115bd576115bd613d82565b6001600160a01b0390921660209283029190910190910152600101611571565b50949350505050565b60006115f181612ac5565b6001600160a01b0382166116425760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b604482015260640161059f565b6001600160a01b0382166000908152600a602052604090205460ff16156116ab5760405162461bcd60e51b815260206004820152601860248201527f566572696669657220616c726561647920616c6c6f7765640000000000000000604482015260640161059f565b506001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6060600580548060200260200160405190810160405280929190818152602001828054801561172857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161170a575b5050505050905090565b6040516001600160601b0319606086901b16602082015260009060340160405160208183030381529060405280519060200120905060006001808360405160200161177e929190614127565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156117dc573d6000803e3d6000fd5b505050602060405103519050856001600160a01b0316816001600160a01b03161461181a5760405163331e1b8160e21b815260040161059f906141a2565b61182381612d73565b505050505050565b6040516001600160601b0319606086901b166020820152600090603401604051602081830303815290604052805190602001209050600060018083604051602001611877929190614127565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156118d5573d6000803e3d6000fd5b50505060206040510351905061182381612acf565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b0319851684528252808320546001600160a01b039081168085526009845282852054909116808552600290935292208054919260609290919061194f90613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461197b90613ef6565b80156119c85780601f1061199d576101008083540402835291602001916119c8565b820191906000526020600020905b8154815290600101906020018083116119ab57829003601f168201915b50505050509150509250929050565b60006119e281612ac5565b81600e60008560058111156119f9576119f9613b79565b6005811115611a0a57611a0a613b79565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b611a4b33826131fb565b50565b6001600160a01b038082166000908152600960209081526040808320549093168083526002909152919020805460609190611a8890613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab490613ef6565b8015611b015780601f10611ad657610100808354040283529160200191611b01565b820191906000526020600020905b815481529060010190602001808311611ae457829003601f168201915b50505050509050915091565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008585604051602001611b4b9291906141ee565b604051602081830303815290604052805190602001209050600060018083604051602001611b7a929190614127565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611bd8573d6000803e3d6000fd5b505050602060405103519050611bee81876131fb565b50505050505050565b6001600160a01b0381166000908152600260205260409020805460609190611c1e90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4a90613ef6565b8015611c975780601f10611c6c57610100808354040283529160200191611c97565b820191906000526020600020905b815481529060010190602001808311611c7a57829003601f168201915b50505050509050919050565b600b546060906000906001600160401b03811115611cc357611cc36135b4565b604051908082528060200260200182016040528015611cec578160200160208202803683370190505b5090506000805b600b5463ffffffff82161015611de157846001600160a01b031660096000600b8463ffffffff1681548110611d2a57611d2a613d82565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541603611dcf57600b8163ffffffff1681548110611d7357611d73613d82565b9060005260206000200160009054906101000a90046001600160a01b0316838363ffffffff1681518110611da957611da9613d82565b6001600160a01b039092166020928302919091019091015281611dcb81614104565b9250505b80611dd981614104565b915050611cf3565b5060008163ffffffff166001600160401b03811115611e0257611e026135b4565b604051908082528060200260200182016040528015611e2b578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115dd57838163ffffffff1681518110611e5d57611e5d613d82565b6020026020010151828263ffffffff1681518110611e7d57611e7d613d82565b6001600160a01b0390921660209283029190910190910152600101611e31565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b0319851684528252808320546001600160a01b0316808452600883528184208054600182018054855181880281018801909652808652939660f083901b966201000090930460e81b956060959194859487948594879492830182828015611f7657602002820191906000526020600020906000905b82829054906101000a900460ff166005811115611f5457611f54613b79565b815260206001928301818104948501949093039092029101808411611f355790505b5050505060048301546001600160a01b038d8116600090815260096020526040902054600286018054959c5060ff9093169a5016975091611fb79150613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe390613ef6565b80156120305780601f1061200557610100808354040283529160200191612030565b820191906000526020600020905b81548152906001019060200180831161201357829003601f168201915b5050505050935080600301805461204690613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461207290613ef6565b80156120bf5780601f10612094576101008083540402835291602001916120bf565b820191906000526020600020905b8154815290600101906020018083116120a257829003601f168201915b505050505092508060040160029054906101000a900460ff169150509295985092959850929598565b6060600b805480602002602001604051908101604052809291908181526020018280548015611728576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161170a575050505050905090565b61215133612acf565b565b61215133612d73565b600061216781612ac5565b6001600160a01b0382166121b85760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b604482015260640161059f565b6001600160a01b0382166000908152600a602052604090205460ff166122205760405162461bcd60e51b815260206004820152601e60248201527f5665726966696572206e6f742063757272656e746c7920616c6c6f7765640000604482015260640161059f565b506001600160a01b03166000908152600a60205260409020805460ff19169055565b60008281526020819052604090206001015461225d81612ac5565b6110d38383612d08565b600061227281612ac5565b6001600160f01b0319831660009081526006602090815260408083206001600160e81b0319861684529091529020546001600160a01b03166110d381612d73565b6001600160a01b03811660009081526008602090815260408083208054600182018054845181870281018701909552808552879660f084901b966201000090940460e81b956060959194859487948594879490939092919083018282801561236a57602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561234857612348613b79565b8152602060019283018181049485019490930390920291018084116123295790505b505050505096508060040160009054906101000a900460ff169550600960008c6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b031694508060020180546123cf90613ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546123fb90613ef6565b80156124485780601f1061241d57610100808354040283529160200191612448565b820191906000526020600020905b81548152906001019060200180831161242b57829003601f168201915b5050505050935080600301805461245e90613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461248a90613ef6565b80156124d75780601f106124ac576101008083540402835291602001916124d7565b820191906000526020600020905b8154815290600101906020018083116124ba57829003601f168201915b505050505092508060040160029054906101000a900460ff169150509193959799909294969850565b604080516020810190915260008082525b88518160ff161015612586576000898260ff168151811061253457612534613d82565b60200260200101519050828160000151826020015183604001516040516020016125619493929190614226565b604051602081830303815290604052925050808061257e90613ed7565b915050612511565b5060008180519060200120905060008c8c8c848c8c8c6040516020016125b29796959493929190614284565b6040516020818303038152906040528051906020012090506000600180836040516020016125e1929190614127565b60408051601f198184030181528282528051602091820120600084529083018083525260ff8a1690820152606081018890526080810187905260a0016020604051602081039080840390855afa15801561263f573d6000803e3d6000fd5b5050506020604051035190508d6001600160a01b0316816001600160a01b03161461267d5760405163331e1b8160e21b815260040161059f906141a2565b61268b8d8d8d8d8d8d610525565b5050505050505050505050505050565b60006126a681612ac5565b6126b16000836110ae565b6126bc600033612242565b6040516001600160a01b0383169033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600060018360400151600581111561271257612712613b79565b0361283057600d548351602085015160405163fbb87f9760e01b815260009384936001600160a01b039091169263fbb87f9792612753929190600401614304565b600060405180830381865afa158015612770573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127989190810190614380565b50915091506127bf826001600160a01b03166000908152600a602052604090205460ff1690565b61281d5760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c696420454d50206365727469666963617465000000000000000000606482015260840161059f565b805160a090910151909590945092505050565b60008360400151600581111561284857612848613b79565b0361296657600d548351602085015160405163055b37fb60e51b815260009384936001600160a01b039091169263ab66ff6092612889929190600401614304565b600060405180830381865afa1580156128a6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128ce919081019061452a565b50915091506128f5826001600160a01b03166000908152600a602052604090205460ff1690565b6129535760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c69642043504f206365727469666963617465000000000000000000606482015260840161059f565b8051604090910151909590945092505050565b600d548351602085015160405163fab285c960e01b815260009384936001600160a01b039091169263fab285c9926129a2929190600401614304565b600060405180830381865afa1580156129bf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129e7919081019061452a565b5091509150612a0e826001600160a01b03166000908152600a602052604090205460ff1690565b6129535760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601960448201527f496e76616c6964204f7468657220636572746966696361746500000000000000606482015260840161059f565b600081604051602001612a7f9190614582565b6040516020818303038152906040528051906020012083604051602001612aa69190614582565b6040516020818303038152906040528051906020012014905092915050565b611a4b81336133f1565b6001600160a01b03811660009081526002602052604081208054612af290613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054612b1e90613ef6565b8015612b6b5780601f10612b4057610100808354040283529160200191612b6b565b820191906000526020600020905b815481529060010190602001808311612b4e57829003601f168201915b505050505090508051600003612bd457604051639d8b847760e01b815260206004820152602760248201527f43616e6e6f742064656c657465206e6f6465207468617420646f6573206e6f746044820152661032bc34b9ba1760c91b606482015260840161059f565b6000600382604051612be69190614582565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526002909152908120612c27916134de565b816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d6604051612c6a90602080825260009082015260400190565b60405180910390a25050565b6000612c828383611b0d565b612d00576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055612cb83390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161051f565b50600061051f565b6000612d148383611b0d565b15612d00576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161051f565b6001600160a01b0381811660009081526009602052604090205416612e1557604051634523c97f60e01b815260206004820152604b60248201527f43616e6e6f742064656c657465207061727479207468617420646f6573206e6f60448201527f742065786973742e204e6f206f70657261746f7220666f756e6420666f72206760648201526a34bb32b7103830b93a3c9760a91b608482015260a40161059f565b6001600160a01b038116600090815260096020908152604080832080546001600160a01b031916905560088252808320815161012081018352815460f081901b6001600160f01b031916825262010000900460e81b6001600160e81b03191681850152600182018054845181870281018701865281815292959394860193830182828015612ef257602002820191906000526020600020906000905b82829054906101000a900460ff166005811115612ed057612ed0613b79565b815260206001928301818104948501949093039092029101808411612eb15790505b50505050508152602001600282018054612f0b90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054612f3790613ef6565b8015612f845780601f10612f5957610100808354040283529160200191612f84565b820191906000526020600020905b815481529060010190602001808311612f6757829003601f168201915b50505050508152602001600382018054612f9d90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054612fc990613ef6565b80156130165780601f10612feb57610100808354040283529160200191613016565b820191906000526020600020905b815481529060010190602001808311612ff957829003601f168201915b5050509183525050600482015460209091019060ff16600381111561303d5761303d613b79565b600381111561304e5761304e613b79565b81526020016004820160019054906101000a900460ff16600281111561307657613076613b79565b600281111561308757613087613b79565b8152600482015462010000900460ff16151560208083019190915260059092015460409182015282516001600160f01b031916600090815260068352818120848401516001600160e81b0319168252835281812080546001600160a01b03191690556001600160a01b038616815260089092528120805464ffffffffff191681559192506131186001830182613518565b6131266002830160006134de565b6131346003830160006134de565b5060048101805462ffffff191690556000600590910155610100810151600b8054909190811061316657613166613d82565b6000918252602080832090910180546001600160a01b03191690556001600160a01b03841680835260078252604092839020805460ff19169055835191840151848401516060860151608087015160a088015160c089015160e08a0151985196987ff1cf4c42833aa61e1c774181a5389a7b164a71351b75cf37a76762f31b17073998612c6a9890979695949392919061406b565b805160000361327357604051639d8b847760e01b815260206004820152603c60248201527f43616e6e6f742073657420656d70747920646f6d61696e206e616d652e20557360448201527f652064656c6574654e6f6465206d6574686f6420696e73746561642e00000000606482015260840161059f565b6003816040516132839190614582565b9081526040519081900360200190205460ff16156132e45760405163f1f1b1c760e01b815260206004820152601f60248201527f446f6d61696e206e616d6520616c726561647920726567697374657265642e00604482015260640161059f565b60016003826040516132f69190614582565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526004909152205460ff1661338057600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600460209081526040808320805460ff19166001179055600290915290206133b78282613fac565b50816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d682604051612c6a9190613b66565b6133fb8282611b0d565b6110aa5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161059f565b82805482825590600052602060002090601f016020900481019282156134ce5791602002820160005b8382111561349f57835183826101000a81548160ff0219169083600581111561347e5761347e613b79565b02179055509260200192600101602081600001049283019260010302613453565b80156134cc5782816101000a81549060ff021916905560010160208160000104928301926001030261349f565b505b506134da929150613539565b5090565b5080546134ea90613ef6565b6000825580601f106134fa575050565b601f016020900490600052602060002090810190611a4b9190613539565b50805460008255601f016020900490600052602060002090810190611a4b91905b5b808211156134da576000815560010161353a565b60006020828403121561356057600080fd5b81356001600160e01b03198116811461357857600080fd5b9392505050565b80356001600160f01b03198116811461359757600080fd5b919050565b80356001600160e81b03198116811461359757600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156135ec576135ec6135b4565b60405290565b60405160c081016001600160401b03811182821017156135ec576135ec6135b4565b604051601f8201601f191681016001600160401b038111828210171561363c5761363c6135b4565b604052919050565b60006001600160401b0382111561365d5761365d6135b4565b50601f01601f191660200190565b600082601f83011261367c57600080fd5b813561368f61368a82613644565b613614565b8181528460208386010111156136a457600080fd5b816020850160208301376000918101602001919091529392505050565b80356006811061359757600080fd5b600082601f8301126136e157600080fd5b813560206001600160401b03808311156136fd576136fd6135b4565b8260051b61370c838201613614565b938452858101830193838101908886111561372657600080fd5b84880192505b858310156137ce578235848111156137445760008081fd5b88016060818b03601f190181131561375c5760008081fd5b6137646135ca565b87830135878111156137765760008081fd5b6137848d8a8387010161366b565b8252506040808401358881111561379b5760008081fd5b6137a98e8b8388010161366b565b8a840152506137b98385016136c1565b9082015284525050918401919084019061372c565b98975050505050505050565b6001600160a01b0381168114611a4b57600080fd5b8035613597816137da565b60008060008060008060c0878903121561381357600080fd5b61381c8761357f565b955061382a6020880161359c565b945060408701356001600160401b038082111561384657600080fd5b6138528a838b016136d0565b955060608901359150613864826137da565b9093506080880135908082111561387a57600080fd5b6138868a838b0161366b565b935060a089013591508082111561389c57600080fd5b506138a989828a0161366b565b9150509295509295509295565b6000602082840312156138c857600080fd5b5035919050565b6000602082840312156138e157600080fd5b8135613578816137da565b600080604083850312156138ff57600080fd5b823591506020830135613911816137da565b809150509250929050565b60006020828403121561392e57600080fd5b613578826136c1565b6020808252825182820181905260009190848201906040850190845b818110156139785783516001600160a01b031683529284019291840191600101613953565b50909695505050505050565b60ff81168114611a4b57600080fd5b803561359781613984565b600080600080608085870312156139b457600080fd5b84356139bf816137da565b935060208501356139cf81613984565b93969395505050506040820135916060013590565b600080604083850312156139f757600080fd5b613a008361357f565b9150613a0e6020840161359c565b90509250929050565b60005b83811015613a32578181015183820152602001613a1a565b50506000910152565b60008151808452613a53816020860160208601613a17565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090613a8b90830184613a3b565b949350505050565b60008060408385031215613aa657600080fd5b613aaf836136c1565b91506020830135613911816137da565b600060208284031215613ad157600080fd5b81356001600160401b03811115613ae757600080fd5b613a8b8482850161366b565b600080600080600060a08688031215613b0b57600080fd5b8535613b16816137da565b945060208601356001600160401b03811115613b3157600080fd5b613b3d8882890161366b565b9450506040860135613b4e81613984565b94979396509394606081013594506080013592915050565b6020815260006135786020830184613a3b565b634e487b7160e01b600052602160045260246000fd5b60068110613b9f57613b9f613b79565b9052565b60008151808452602080850194506020840160005b83811015613bdb57613bcb878351613b8f565b9582019590820190600101613bb8565b509495945050505050565b60048110613b9f57613b9f613b79565b6001600160a01b038a811682526001600160f01b03198a1660208301526001600160e81b03198916604083015261012060608301819052600091613c3c8483018b613ba3565b9150613c4b608085018a613be6565b871660a084015282810360c0840152613c648187613a3b565b905082810360e0840152613c788186613a3b565b9150508215156101008301529a9950505050505050505050565b6000806000806000806000806000806101408b8d031215613cb257600080fd5b613cbb8b6137ef565b9950613cc960208c0161357f565b9850613cd760408c0161359c565b975060608b01356001600160401b0380821115613cf357600080fd5b613cff8e838f016136d0565b9850613d0d60808e016137ef565b975060a08d0135915080821115613d2357600080fd5b613d2f8e838f0161366b565b965060c08d0135915080821115613d4557600080fd5b50613d528d828e0161366b565b945050613d6160e08c01613993565b92506101008b013591506101208b013590509295989b9194979a5092959850565b634e487b7160e01b600052603260045260246000fd5b600082601f830112613da957600080fd5b8151613db761368a82613644565b818152846020838601011115613dcc57600080fd5b613a8b826020830160208701613a17565b600060208284031215613def57600080fd5b81516001600160401b0380821115613e0657600080fd5b9083019060408286031215613e1a57600080fd5b604051604081018181108382111715613e3557613e356135b4565b604052825182811115613e4757600080fd5b613e5387828601613d98565b825250602083015182811115613e6857600080fd5b613e7487828601613d98565b60208301525095945050505050565b613e8d8183613b8f565b604060208201819052601490820152734e6f742061637469766520696e206f7261636c6560601b6060820152608001919050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff8103613eed57613eed613ec1565b60010192915050565b600181811c90821680613f0a57607f821691505b602082108103613f2a57634e487b7160e01b600052602260045260246000fd5b50919050565b8181038181111561051f5761051f613ec1565b600060208284031215613f5557600080fd5b81516004811061357857600080fd5b601f82111561110c576000816000526020600020601f850160051c81016020861015613f8d5750805b601f850160051c820191505b8181101561182357828155600101613f99565b81516001600160401b03811115613fc557613fc56135b4565b613fd981613fd38454613ef6565b84613f64565b602080601f83116001811461400e5760008415613ff65750858301515b600019600386901b1c1916600185901b178555611823565b600085815260208120601f198616915b8281101561403d5788860151825594840194600190910190840161401e565b508582101561405b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160f01b0319891681526001600160e81b031988166020820152610100604082018190526000906140a18382018a613ba3565b905082810360608401526140b58189613a3b565b905082810360808401526140c98188613a3b565b9150506140d960a0830186613be6565b600384106140e9576140e9613b79565b8360c083015282151560e08301529998505050505050505050565b600063ffffffff80831681810361411d5761411d613ec1565b6001019392505050565b600080845461413581613ef6565b6001828116801561414d576001811461416257614191565b60ff1984168752821515830287019450614191565b8860005260208060002060005b858110156141885781548a82015290840190820161416f565b50505082870194505b505050938152602001949350505050565b6020808252602c908201527f5369676e657220616e642070726f76696465642070617274792061646472657360408201526b39903234b33332b932b73a1760a11b606082015260800190565b6bffffffffffffffffffffffff198360601b16815260008251614218816014850160208701613a17565b919091016014019392505050565b60008551614238818460208a01613a17565b85519083019061424c818360208a01613a17565b855191019061425f818360208901613a17565b016006841061427057614270613b79565b60f89390931b835250506001019392505050565b6001600160601b0319606089811b821683526001600160f01b0319891660148401526001600160e81b0319881660168401526019830187905285901b16603982015282516000906142dc81604d850160208801613a17565b8351908301906142f381604d840160208801613a17565b01604d019998505050505050505050565b6040815260006143176040830185613a3b565b82810360208401526143298185613a3b565b95945050505050565b8051613597816137da565b60006060828403121561434f57600080fd5b6143576135ca565b90508151815260208201516020820152604082015161437581613984565b604082015292915050565b600080600060a0848603121561439557600080fd5b83516143a0816137da565b60208501519093506001600160401b03808211156143bd57600080fd5b9085019060c082880312156143d157600080fd5b6143d96135f2565b8251828111156143e857600080fd5b6143f489828601613d98565b82525060208301518281111561440957600080fd5b61441589828601613d98565b60208301525060408301518281111561442d57600080fd5b61443989828601613d98565b60408301525060608301518281111561445157600080fd5b61445d89828601613d98565b60608301525060808301518281111561447557600080fd5b61448189828601613d98565b60808301525061449360a08401614332565b60a08201528094505050506144ab856040860161433d565b90509250925092565b6000606082840312156144c657600080fd5b6144ce6135ca565b905081516001600160401b03808211156144e757600080fd5b6144f385838601613d98565b8352602084015191508082111561450957600080fd5b5061451684828501613d98565b6020830152506040820151614375816137da565b600080600060a0848603121561453f57600080fd5b835161454a816137da565b60208501519093506001600160401b0381111561456657600080fd5b614572868287016144b4565b9250506144ab856040860161433d565b60008251614594818460208701613a17565b919091019291505056fea264697066735822122049bb10b5acebe5e51a19e4b9e0833a653659bb5c78d6abd0deb6d2e06c7cb5be64736f6c63430008180033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c806391d148541161011a578063aee1fe49116100ad578063d63a84d41161007c578063d63a84d41461048f578063df516128146104a2578063dfd93d3b146104b5578063e1e64995146104c8578063f2fde38b146104db57600080fd5b8063aee1fe4914610436578063bdb8107814610461578063ca2dfd0a14610469578063d547741f1461047c57600080fd5b8063a33db09f116100e9578063a33db09f146103eb578063a5b5ffbb146103fe578063a8311aa814610426578063acaef0e01461042e57600080fd5b806391d148541461039d57806399bd6901146103b05780639d209048146103c3578063a217fddf146103e357600080fd5b80635437988d1161019d5780636c265bbc1161016c5780636c265bbc146103305780637a091aa51461034357806381939d661461036457806385cb86021461037757806388cf72a01461038a57600080fd5b80635437988d146102d65780635cf0685f146102e957806366acaa331461031557806366e706fb1461031d57600080fd5b80632d8fe452116101d95780632d8fe4521461027d5780632f2ff15d1461029057806336568abe146102a357806339581c21146102b657600080fd5b806301ffc9a71461020b578063031d2bd5146102335780630799363d14610245578063248a9ca31461025a575b600080fd5b61021e61021936600461354e565b6104ee565b60405190151581526020015b60405180910390f35b600b545b60405190815260200161022a565b6102586102533660046137fa565b610525565b005b6102376102683660046138b6565b60009081526020819052604090206001015490565b61025861028b3660046138cf565b611096565b61025861029e3660046138ec565b6110ae565b6102586102b13660046138ec565b6110d9565b6102c96102c436600461391c565b611111565b60405161022a9190613937565b6102586102e43660046138cf565b6115e6565b61021e6102f73660046138cf565b6001600160a01b03166000908152600a602052604090205460ff1690565b6102c96116d0565b61025861032b36600461399e565b611732565b61025861033e36600461399e565b61182b565b6103566103513660046139e4565b6118ea565b60405161022a929190613a67565b610258610372366004613a93565b6119d7565b610258610385366004613abf565b611a41565b6103566103983660046138cf565b611a4e565b61021e6103ab3660046138ec565b611b0d565b6102586103be366004613af3565b611b36565b6103d66103d13660046138cf565b611bf7565b60405161022a9190613b66565b610237600081565b6102c96103f93660046138cf565b611ca3565b61041161040c3660046139e4565b611e9d565b60405161022a99989796959493929190613bf6565b6102c96120e8565b610258612148565b600c54610449906001600160a01b031681565b6040516001600160a01b03909116815260200161022a565b610258612153565b6102586104773660046138cf565b61215c565b61025861048a3660046138ec565b612242565b61025861049d3660046139e4565b612267565b6104116104b03660046138cf565b6122b3565b600d54610449906001600160a01b031681565b6102586104d6366004613c92565b612500565b6102586104e93660046138cf565b61269b565b60006001600160e01b03198216637965db0b60e01b148061051f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160f01b031986166105a857604051633a50519760e21b815260206004820152603e60248201527f43616e6e6f742073657420656d70747920636f756e7472795f636f64652e205560448201527f73652064656c6574655061727479206d6574686f6420696e73746561642e000060648201526084015b60405180910390fd5b6001600160e81b031985166106265760405163373a953760e11b815260206004820152603a60248201527f43616e6e6f742073657420656d7074792070617274795f69642e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e000000000000606482015260840161059f565b835160000361066d5760405163cab73b6560e01b81526020600482015260126024820152712737903937b632b990383937bb34b232b21760711b604482015260640161059f565b6001600160a01b0383166106ea5760405163fac855f560e01b815260206004820152603a60248201527f43616e6e6f742073657420656d707479206f70657261746f722e20557365206460448201527f656c6574655061727479206d6574686f6420696e73746561642e000000000000606482015260840161059f565b600084516001600160401b03811115610705576107056135b4565b60405190808252806020026020018201604052801561072e578160200160208202803683370190505b5090506000805b86518160ff16101561094b576000878260ff168151811061075857610758613d82565b6020026020010151905060008061076e836126f6565b90925090506001600160a01b038516610785578094505b806001600160a01b0316856001600160a01b0316146107f2576040516316c7354f60e01b815260206004820152602260248201527f436572746966696361746573206861766520646966666572656e74206f776e65604482015261727360f01b606482015260840161059f565b6000600e60008560400151600581111561080e5761080e613b79565b600581111561081f5761081f613b79565b81526020810191909152604001600020546001600160a01b0316905080156108ea576040516350cadc8560e01b81526000906001600160a01b038316906350cadc8590610870908790600401613b66565b600060405180830381865afa15801561088d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108b59190810190613ddd565b90506108c5848260200151612a6c565b6108e85784604001516040516303458c0d60e21b815260040161059f9190613e83565b505b8360400151878660ff168151811061090457610904613d82565b6020026020010190600581111561091d5761091d613b79565b9081600581111561093057610930613b79565b8152505050505050808061094390613ed7565b915050610735565b506001600160f01b0319881660009081526006602090815260408083206001600160e81b03198b1684529091529020546001600160a01b031680158015906109a55750816001600160a01b0316816001600160a01b031614155b15610a2e5760405163618270d960e01b815260206004820152604c60248201527f5061727479207769746820636f756e7472795f636f64652f70617274795f696460448201527f20616c7265616479207265676973746572656420756e6465722064696666657260648201526b32b73a1030b2323932b9b99760a11b608482015260a40161059f565b6001600160f01b0319891660009081526006602090815260408083206001600160e81b03198c168452825280832080546001600160a01b0319166001600160a01b038781169190911790915589168352600290915290208054610a9090613ef6565b9050600003610aec57604051634523c97f60e01b815260206004820152602160248201527f50726f7669646564206f70657261746f72206e6f7420726567697374657265646044820152601760f91b606482015260840161059f565b6001600160a01b03821660009081526008602090815260408083206005015460079092529091205460ff16610b7757600b80546001808201835560008390527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990910180546001600160a01b0319166001600160a01b0387161790559054610b749190613f30565b90505b6001600160a01b03838116600081815260076020526040808220805460ff19166001179055600c549051632222c8a160e21b815260048101939093529092169063888b228490602401602060405180830381865afa158015610bdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c019190613f43565b90506040518061012001604052808c6001600160f01b03191681526020018b6001600160e81b0319168152602001868152602001888152602001878152602001826003811115610c5357610c53613b79565b8152602001600081526001602080830182905260409283018690526001600160a01b038816600090815260088252839020845181548684015160e81c620100000264ffffffffff1990911660f09290921c91909117178155928401518051610cc293850192919091019061342a565b5060608201516002820190610cd79082613fac565b5060808201516003820190610cec9082613fac565b5060a082015160048201805460ff19166001836003811115610d1057610d10613b79565b021790555060c082015160048201805461ff001916610100836002811115610d3a57610d3a613b79565b021790555060e082015160048201805462ff00001916620100009215158302179055610100909201516005909101556001600160a01b03858116600090815260096020908152604080832080546001600160a01b031916948e169490941790935560088152828220835161012081018552815460f081901b6001600160f01b03191682529590950460e81b6001600160e81b031916858301526001810180548551818502810185018752818152949695929492860193830182828015610e4f57602002820191906000526020600020906000905b82829054906101000a900460ff166005811115610e2d57610e2d613b79565b815260206001928301818104948501949093039092029101808411610e0e5790505b50505050508152602001600282018054610e6890613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9490613ef6565b8015610ee15780601f10610eb657610100808354040283529160200191610ee1565b820191906000526020600020905b815481529060010190602001808311610ec457829003601f168201915b50505050508152602001600382018054610efa90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2690613ef6565b8015610f735780601f10610f4857610100808354040283529160200191610f73565b820191906000526020600020905b815481529060010190602001808311610f5657829003601f168201915b5050509183525050600482015460209091019060ff166003811115610f9a57610f9a613b79565b6003811115610fab57610fab613b79565b81526020016004820160019054906101000a900460ff166002811115610fd357610fd3613b79565b6002811115610fe457610fe4613b79565b81526020016004820160029054906101000a900460ff161515151581526020016005820154815250509050886001600160a01b0316856001600160a01b03167fc16bf12458bfb0cf1345674275c1e82f2c14cf06a3996e1bb297f2015ff66f78836000015184602001518560400151866060015187608001518860a001518960c001518a60e0015160405161108098979695949392919061406b565b60405180910390a3505050505050505050505050565b60006110a181612ac5565b6110aa82612acf565b5050565b6000828152602081905260409020600101546110c981612ac5565b6110d38383612c76565b50505050565b6001600160a01b03811633146111025760405163334bd91960e11b815260040160405180910390fd5b61110c8282612d08565b505050565b600b546060906000906001600160401b03811115611131576111316135b4565b60405190808252806020026020018201604052801561115a578160200160208202803683370190505b5090506000805b600b5463ffffffff8216101561152157600060086000600b8463ffffffff168154811061119057611190613d82565b60009182526020808320909101546001600160a01b03168352828101939093526040918201902081516101208101835281546001600160f01b031960f082901b1682526001600160e81b03196201000090910460e81b168185015260018201805484518187028101870186528181529295939486019383018282801561126557602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561124357611243613b79565b8152602060019283018181049485019490930390920291018084116112245790505b5050505050815260200160028201805461127e90613ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546112aa90613ef6565b80156112f75780601f106112cc576101008083540402835291602001916112f7565b820191906000526020600020905b8154815290600101906020018083116112da57829003601f168201915b5050505050815260200160038201805461131090613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461133c90613ef6565b80156113895780601f1061135e57610100808354040283529160200191611389565b820191906000526020600020905b81548152906001019060200180831161136c57829003601f168201915b5050509183525050600482015460209091019060ff1660038111156113b0576113b0613b79565b60038111156113c1576113c1613b79565b81526020016004820160019054906101000a900460ff1660028111156113e9576113e9613b79565b60028111156113fa576113fa613b79565b8152600482015462010000900460ff1615156020820152600590910154604090910152905060005b8160400151518163ffffffff16101561150c5786600581111561144757611447613b79565b82604001518263ffffffff168151811061146357611463613d82565b6020026020010151600581111561147c5761147c613b79565b036114fa57600b8363ffffffff168154811061149a5761149a613d82565b9060005260206000200160009054906101000a90046001600160a01b0316858563ffffffff16815181106114d0576114d0613d82565b6001600160a01b0390921660209283029190910190910152836114f281614104565b94505061150c565b8061150481614104565b915050611422565b5050808061151990614104565b915050611161565b5060008163ffffffff166001600160401b03811115611542576115426135b4565b60405190808252806020026020018201604052801561156b578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115dd57838163ffffffff168151811061159d5761159d613d82565b6020026020010151828263ffffffff16815181106115bd576115bd613d82565b6001600160a01b0390921660209283029190910190910152600101611571565b50949350505050565b60006115f181612ac5565b6001600160a01b0382166116425760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b604482015260640161059f565b6001600160a01b0382166000908152600a602052604090205460ff16156116ab5760405162461bcd60e51b815260206004820152601860248201527f566572696669657220616c726561647920616c6c6f7765640000000000000000604482015260640161059f565b506001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6060600580548060200260200160405190810160405280929190818152602001828054801561172857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161170a575b5050505050905090565b6040516001600160601b0319606086901b16602082015260009060340160405160208183030381529060405280519060200120905060006001808360405160200161177e929190614127565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156117dc573d6000803e3d6000fd5b505050602060405103519050856001600160a01b0316816001600160a01b03161461181a5760405163331e1b8160e21b815260040161059f906141a2565b61182381612d73565b505050505050565b6040516001600160601b0319606086901b166020820152600090603401604051602081830303815290604052805190602001209050600060018083604051602001611877929190614127565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156118d5573d6000803e3d6000fd5b50505060206040510351905061182381612acf565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b0319851684528252808320546001600160a01b039081168085526009845282852054909116808552600290935292208054919260609290919061194f90613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461197b90613ef6565b80156119c85780601f1061199d576101008083540402835291602001916119c8565b820191906000526020600020905b8154815290600101906020018083116119ab57829003601f168201915b50505050509150509250929050565b60006119e281612ac5565b81600e60008560058111156119f9576119f9613b79565b6005811115611a0a57611a0a613b79565b815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550505050565b611a4b33826131fb565b50565b6001600160a01b038082166000908152600960209081526040808320549093168083526002909152919020805460609190611a8890613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab490613ef6565b8015611b015780601f10611ad657610100808354040283529160200191611b01565b820191906000526020600020905b815481529060010190602001808311611ae457829003601f168201915b50505050509050915091565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60008585604051602001611b4b9291906141ee565b604051602081830303815290604052805190602001209050600060018083604051602001611b7a929190614127565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611bd8573d6000803e3d6000fd5b505050602060405103519050611bee81876131fb565b50505050505050565b6001600160a01b0381166000908152600260205260409020805460609190611c1e90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4a90613ef6565b8015611c975780601f10611c6c57610100808354040283529160200191611c97565b820191906000526020600020905b815481529060010190602001808311611c7a57829003601f168201915b50505050509050919050565b600b546060906000906001600160401b03811115611cc357611cc36135b4565b604051908082528060200260200182016040528015611cec578160200160208202803683370190505b5090506000805b600b5463ffffffff82161015611de157846001600160a01b031660096000600b8463ffffffff1681548110611d2a57611d2a613d82565b60009182526020808320909101546001600160a01b0390811684529083019390935260409091019020541603611dcf57600b8163ffffffff1681548110611d7357611d73613d82565b9060005260206000200160009054906101000a90046001600160a01b0316838363ffffffff1681518110611da957611da9613d82565b6001600160a01b039092166020928302919091019091015281611dcb81614104565b9250505b80611dd981614104565b915050611cf3565b5060008163ffffffff166001600160401b03811115611e0257611e026135b4565b604051908082528060200260200182016040528015611e2b578160200160208202803683370190505b50905060005b8263ffffffff168163ffffffff1610156115dd57838163ffffffff1681518110611e5d57611e5d613d82565b6020026020010151828263ffffffff1681518110611e7d57611e7d613d82565b6001600160a01b0390921660209283029190910190910152600101611e31565b6001600160f01b0319821660009081526006602090815260408083206001600160e81b0319851684528252808320546001600160a01b0316808452600883528184208054600182018054855181880281018801909652808652939660f083901b966201000090930460e81b956060959194859487948594879492830182828015611f7657602002820191906000526020600020906000905b82829054906101000a900460ff166005811115611f5457611f54613b79565b815260206001928301818104948501949093039092029101808411611f355790505b5050505060048301546001600160a01b038d8116600090815260096020526040902054600286018054959c5060ff9093169a5016975091611fb79150613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe390613ef6565b80156120305780601f1061200557610100808354040283529160200191612030565b820191906000526020600020905b81548152906001019060200180831161201357829003601f168201915b5050505050935080600301805461204690613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461207290613ef6565b80156120bf5780601f10612094576101008083540402835291602001916120bf565b820191906000526020600020905b8154815290600101906020018083116120a257829003601f168201915b505050505092508060040160029054906101000a900460ff169150509295985092959850929598565b6060600b805480602002602001604051908101604052809291908181526020018280548015611728576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161170a575050505050905090565b61215133612acf565b565b61215133612d73565b600061216781612ac5565b6001600160a01b0382166121b85760405162461bcd60e51b8152602060048201526018602482015277496e76616c6964207665726966696572206164647265737360401b604482015260640161059f565b6001600160a01b0382166000908152600a602052604090205460ff166122205760405162461bcd60e51b815260206004820152601e60248201527f5665726966696572206e6f742063757272656e746c7920616c6c6f7765640000604482015260640161059f565b506001600160a01b03166000908152600a60205260409020805460ff19169055565b60008281526020819052604090206001015461225d81612ac5565b6110d38383612d08565b600061227281612ac5565b6001600160f01b0319831660009081526006602090815260408083206001600160e81b0319861684529091529020546001600160a01b03166110d381612d73565b6001600160a01b03811660009081526008602090815260408083208054600182018054845181870281018701909552808552879660f084901b966201000090940460e81b956060959194859487948594879490939092919083018282801561236a57602002820191906000526020600020906000905b82829054906101000a900460ff16600581111561234857612348613b79565b8152602060019283018181049485019490930390920291018084116123295790505b505050505096508060040160009054906101000a900460ff169550600960008c6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a90046001600160a01b031694508060020180546123cf90613ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546123fb90613ef6565b80156124485780601f1061241d57610100808354040283529160200191612448565b820191906000526020600020905b81548152906001019060200180831161242b57829003601f168201915b5050505050935080600301805461245e90613ef6565b80601f016020809104026020016040519081016040528092919081815260200182805461248a90613ef6565b80156124d75780601f106124ac576101008083540402835291602001916124d7565b820191906000526020600020905b8154815290600101906020018083116124ba57829003601f168201915b505050505092508060040160029054906101000a900460ff169150509193959799909294969850565b604080516020810190915260008082525b88518160ff161015612586576000898260ff168151811061253457612534613d82565b60200260200101519050828160000151826020015183604001516040516020016125619493929190614226565b604051602081830303815290604052925050808061257e90613ed7565b915050612511565b5060008180519060200120905060008c8c8c848c8c8c6040516020016125b29796959493929190614284565b6040516020818303038152906040528051906020012090506000600180836040516020016125e1929190614127565b60408051601f198184030181528282528051602091820120600084529083018083525260ff8a1690820152606081018890526080810187905260a0016020604051602081039080840390855afa15801561263f573d6000803e3d6000fd5b5050506020604051035190508d6001600160a01b0316816001600160a01b03161461267d5760405163331e1b8160e21b815260040161059f906141a2565b61268b8d8d8d8d8d8d610525565b5050505050505050505050505050565b60006126a681612ac5565b6126b16000836110ae565b6126bc600033612242565b6040516001600160a01b0383169033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600060018360400151600581111561271257612712613b79565b0361283057600d548351602085015160405163fbb87f9760e01b815260009384936001600160a01b039091169263fbb87f9792612753929190600401614304565b600060405180830381865afa158015612770573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526127989190810190614380565b50915091506127bf826001600160a01b03166000908152600a602052604090205460ff1690565b61281d5760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c696420454d50206365727469666963617465000000000000000000606482015260840161059f565b805160a090910151909590945092505050565b60008360400151600581111561284857612848613b79565b0361296657600d548351602085015160405163055b37fb60e51b815260009384936001600160a01b039091169263ab66ff6092612889929190600401614304565b600060405180830381865afa1580156128a6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128ce919081019061452a565b50915091506128f5826001600160a01b03166000908152600a602052604090205460ff1690565b6129535760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601760448201527f496e76616c69642043504f206365727469666963617465000000000000000000606482015260840161059f565b8051604090910151909590945092505050565b600d548351602085015160405163fab285c960e01b815260009384936001600160a01b039091169263fab285c9926129a2929190600401614304565b600060405180830381865afa1580156129bf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129e7919081019061452a565b5091509150612a0e826001600160a01b03166000908152600a602052604090205460ff1690565b6129535760408051637a0c0ca960e01b81526001600160a01b03841660048201526024810191909152601960448201527f496e76616c6964204f7468657220636572746966696361746500000000000000606482015260840161059f565b600081604051602001612a7f9190614582565b6040516020818303038152906040528051906020012083604051602001612aa69190614582565b6040516020818303038152906040528051906020012014905092915050565b611a4b81336133f1565b6001600160a01b03811660009081526002602052604081208054612af290613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054612b1e90613ef6565b8015612b6b5780601f10612b4057610100808354040283529160200191612b6b565b820191906000526020600020905b815481529060010190602001808311612b4e57829003601f168201915b505050505090508051600003612bd457604051639d8b847760e01b815260206004820152602760248201527f43616e6e6f742064656c657465206e6f6465207468617420646f6573206e6f746044820152661032bc34b9ba1760c91b606482015260840161059f565b6000600382604051612be69190614582565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526002909152908120612c27916134de565b816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d6604051612c6a90602080825260009082015260400190565b60405180910390a25050565b6000612c828383611b0d565b612d00576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055612cb83390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161051f565b50600061051f565b6000612d148383611b0d565b15612d00576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a450600161051f565b6001600160a01b0381811660009081526009602052604090205416612e1557604051634523c97f60e01b815260206004820152604b60248201527f43616e6e6f742064656c657465207061727479207468617420646f6573206e6f60448201527f742065786973742e204e6f206f70657261746f7220666f756e6420666f72206760648201526a34bb32b7103830b93a3c9760a91b608482015260a40161059f565b6001600160a01b038116600090815260096020908152604080832080546001600160a01b031916905560088252808320815161012081018352815460f081901b6001600160f01b031916825262010000900460e81b6001600160e81b03191681850152600182018054845181870281018701865281815292959394860193830182828015612ef257602002820191906000526020600020906000905b82829054906101000a900460ff166005811115612ed057612ed0613b79565b815260206001928301818104948501949093039092029101808411612eb15790505b50505050508152602001600282018054612f0b90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054612f3790613ef6565b8015612f845780601f10612f5957610100808354040283529160200191612f84565b820191906000526020600020905b815481529060010190602001808311612f6757829003601f168201915b50505050508152602001600382018054612f9d90613ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054612fc990613ef6565b80156130165780601f10612feb57610100808354040283529160200191613016565b820191906000526020600020905b815481529060010190602001808311612ff957829003601f168201915b5050509183525050600482015460209091019060ff16600381111561303d5761303d613b79565b600381111561304e5761304e613b79565b81526020016004820160019054906101000a900460ff16600281111561307657613076613b79565b600281111561308757613087613b79565b8152600482015462010000900460ff16151560208083019190915260059092015460409182015282516001600160f01b031916600090815260068352818120848401516001600160e81b0319168252835281812080546001600160a01b03191690556001600160a01b038616815260089092528120805464ffffffffff191681559192506131186001830182613518565b6131266002830160006134de565b6131346003830160006134de565b5060048101805462ffffff191690556000600590910155610100810151600b8054909190811061316657613166613d82565b6000918252602080832090910180546001600160a01b03191690556001600160a01b03841680835260078252604092839020805460ff19169055835191840151848401516060860151608087015160a088015160c089015160e08a0151985196987ff1cf4c42833aa61e1c774181a5389a7b164a71351b75cf37a76762f31b17073998612c6a9890979695949392919061406b565b805160000361327357604051639d8b847760e01b815260206004820152603c60248201527f43616e6e6f742073657420656d70747920646f6d61696e206e616d652e20557360448201527f652064656c6574654e6f6465206d6574686f6420696e73746561642e00000000606482015260840161059f565b6003816040516132839190614582565b9081526040519081900360200190205460ff16156132e45760405163f1f1b1c760e01b815260206004820152601f60248201527f446f6d61696e206e616d6520616c726561647920726567697374657265642e00604482015260640161059f565b60016003826040516132f69190614582565b9081526040805160209281900383019020805460ff1916931515939093179092556001600160a01b03841660009081526004909152205460ff1661338057600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382166000908152600460209081526040808320805460ff19166001179055600290915290206133b78282613fac565b50816001600160a01b03167fb1f254c0ae74a753185ba13a1b17818bc803e32d05ef56851955c0ebf230f0d682604051612c6a9190613b66565b6133fb8282611b0d565b6110aa5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161059f565b82805482825590600052602060002090601f016020900481019282156134ce5791602002820160005b8382111561349f57835183826101000a81548160ff0219169083600581111561347e5761347e613b79565b02179055509260200192600101602081600001049283019260010302613453565b80156134cc5782816101000a81549060ff021916905560010160208160000104928301926001030261349f565b505b506134da929150613539565b5090565b5080546134ea90613ef6565b6000825580601f106134fa575050565b601f016020900490600052602060002090810190611a4b9190613539565b50805460008255601f016020900490600052602060002090810190611a4b91905b5b808211156134da576000815560010161353a565b60006020828403121561356057600080fd5b81356001600160e01b03198116811461357857600080fd5b9392505050565b80356001600160f01b03198116811461359757600080fd5b919050565b80356001600160e81b03198116811461359757600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156135ec576135ec6135b4565b60405290565b60405160c081016001600160401b03811182821017156135ec576135ec6135b4565b604051601f8201601f191681016001600160401b038111828210171561363c5761363c6135b4565b604052919050565b60006001600160401b0382111561365d5761365d6135b4565b50601f01601f191660200190565b600082601f83011261367c57600080fd5b813561368f61368a82613644565b613614565b8181528460208386010111156136a457600080fd5b816020850160208301376000918101602001919091529392505050565b80356006811061359757600080fd5b600082601f8301126136e157600080fd5b813560206001600160401b03808311156136fd576136fd6135b4565b8260051b61370c838201613614565b938452858101830193838101908886111561372657600080fd5b84880192505b858310156137ce578235848111156137445760008081fd5b88016060818b03601f190181131561375c5760008081fd5b6137646135ca565b87830135878111156137765760008081fd5b6137848d8a8387010161366b565b8252506040808401358881111561379b5760008081fd5b6137a98e8b8388010161366b565b8a840152506137b98385016136c1565b9082015284525050918401919084019061372c565b98975050505050505050565b6001600160a01b0381168114611a4b57600080fd5b8035613597816137da565b60008060008060008060c0878903121561381357600080fd5b61381c8761357f565b955061382a6020880161359c565b945060408701356001600160401b038082111561384657600080fd5b6138528a838b016136d0565b955060608901359150613864826137da565b9093506080880135908082111561387a57600080fd5b6138868a838b0161366b565b935060a089013591508082111561389c57600080fd5b506138a989828a0161366b565b9150509295509295509295565b6000602082840312156138c857600080fd5b5035919050565b6000602082840312156138e157600080fd5b8135613578816137da565b600080604083850312156138ff57600080fd5b823591506020830135613911816137da565b809150509250929050565b60006020828403121561392e57600080fd5b613578826136c1565b6020808252825182820181905260009190848201906040850190845b818110156139785783516001600160a01b031683529284019291840191600101613953565b50909695505050505050565b60ff81168114611a4b57600080fd5b803561359781613984565b600080600080608085870312156139b457600080fd5b84356139bf816137da565b935060208501356139cf81613984565b93969395505050506040820135916060013590565b600080604083850312156139f757600080fd5b613a008361357f565b9150613a0e6020840161359c565b90509250929050565b60005b83811015613a32578181015183820152602001613a1a565b50506000910152565b60008151808452613a53816020860160208601613a17565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090613a8b90830184613a3b565b949350505050565b60008060408385031215613aa657600080fd5b613aaf836136c1565b91506020830135613911816137da565b600060208284031215613ad157600080fd5b81356001600160401b03811115613ae757600080fd5b613a8b8482850161366b565b600080600080600060a08688031215613b0b57600080fd5b8535613b16816137da565b945060208601356001600160401b03811115613b3157600080fd5b613b3d8882890161366b565b9450506040860135613b4e81613984565b94979396509394606081013594506080013592915050565b6020815260006135786020830184613a3b565b634e487b7160e01b600052602160045260246000fd5b60068110613b9f57613b9f613b79565b9052565b60008151808452602080850194506020840160005b83811015613bdb57613bcb878351613b8f565b9582019590820190600101613bb8565b509495945050505050565b60048110613b9f57613b9f613b79565b6001600160a01b038a811682526001600160f01b03198a1660208301526001600160e81b03198916604083015261012060608301819052600091613c3c8483018b613ba3565b9150613c4b608085018a613be6565b871660a084015282810360c0840152613c648187613a3b565b905082810360e0840152613c788186613a3b565b9150508215156101008301529a9950505050505050505050565b6000806000806000806000806000806101408b8d031215613cb257600080fd5b613cbb8b6137ef565b9950613cc960208c0161357f565b9850613cd760408c0161359c565b975060608b01356001600160401b0380821115613cf357600080fd5b613cff8e838f016136d0565b9850613d0d60808e016137ef565b975060a08d0135915080821115613d2357600080fd5b613d2f8e838f0161366b565b965060c08d0135915080821115613d4557600080fd5b50613d528d828e0161366b565b945050613d6160e08c01613993565b92506101008b013591506101208b013590509295989b9194979a5092959850565b634e487b7160e01b600052603260045260246000fd5b600082601f830112613da957600080fd5b8151613db761368a82613644565b818152846020838601011115613dcc57600080fd5b613a8b826020830160208701613a17565b600060208284031215613def57600080fd5b81516001600160401b0380821115613e0657600080fd5b9083019060408286031215613e1a57600080fd5b604051604081018181108382111715613e3557613e356135b4565b604052825182811115613e4757600080fd5b613e5387828601613d98565b825250602083015182811115613e6857600080fd5b613e7487828601613d98565b60208301525095945050505050565b613e8d8183613b8f565b604060208201819052601490820152734e6f742061637469766520696e206f7261636c6560601b6060820152608001919050565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff8103613eed57613eed613ec1565b60010192915050565b600181811c90821680613f0a57607f821691505b602082108103613f2a57634e487b7160e01b600052602260045260246000fd5b50919050565b8181038181111561051f5761051f613ec1565b600060208284031215613f5557600080fd5b81516004811061357857600080fd5b601f82111561110c576000816000526020600020601f850160051c81016020861015613f8d5750805b601f850160051c820191505b8181101561182357828155600101613f99565b81516001600160401b03811115613fc557613fc56135b4565b613fd981613fd38454613ef6565b84613f64565b602080601f83116001811461400e5760008415613ff65750858301515b600019600386901b1c1916600185901b178555611823565b600085815260208120601f198616915b8281101561403d5788860151825594840194600190910190840161401e565b508582101561405b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160f01b0319891681526001600160e81b031988166020820152610100604082018190526000906140a18382018a613ba3565b905082810360608401526140b58189613a3b565b905082810360808401526140c98188613a3b565b9150506140d960a0830186613be6565b600384106140e9576140e9613b79565b8360c083015282151560e08301529998505050505050505050565b600063ffffffff80831681810361411d5761411d613ec1565b6001019392505050565b600080845461413581613ef6565b6001828116801561414d576001811461416257614191565b60ff1984168752821515830287019450614191565b8860005260208060002060005b858110156141885781548a82015290840190820161416f565b50505082870194505b505050938152602001949350505050565b6020808252602c908201527f5369676e657220616e642070726f76696465642070617274792061646472657360408201526b39903234b33332b932b73a1760a11b606082015260800190565b6bffffffffffffffffffffffff198360601b16815260008251614218816014850160208701613a17565b919091016014019392505050565b60008551614238818460208a01613a17565b85519083019061424c818360208a01613a17565b855191019061425f818360208901613a17565b016006841061427057614270613b79565b60f89390931b835250506001019392505050565b6001600160601b0319606089811b821683526001600160f01b0319891660148401526001600160e81b0319881660168401526019830187905285901b16603982015282516000906142dc81604d850160208801613a17565b8351908301906142f381604d840160208801613a17565b01604d019998505050505050505050565b6040815260006143176040830185613a3b565b82810360208401526143298185613a3b565b95945050505050565b8051613597816137da565b60006060828403121561434f57600080fd5b6143576135ca565b90508151815260208201516020820152604082015161437581613984565b604082015292915050565b600080600060a0848603121561439557600080fd5b83516143a0816137da565b60208501519093506001600160401b03808211156143bd57600080fd5b9085019060c082880312156143d157600080fd5b6143d96135f2565b8251828111156143e857600080fd5b6143f489828601613d98565b82525060208301518281111561440957600080fd5b61441589828601613d98565b60208301525060408301518281111561442d57600080fd5b61443989828601613d98565b60408301525060608301518281111561445157600080fd5b61445d89828601613d98565b60608301525060808301518281111561447557600080fd5b61448189828601613d98565b60808301525061449360a08401614332565b60a08201528094505050506144ab856040860161433d565b90509250925092565b6000606082840312156144c657600080fd5b6144ce6135ca565b905081516001600160401b03808211156144e757600080fd5b6144f385838601613d98565b8352602084015191508082111561450957600080fd5b5061451684828501613d98565b6020830152506040820151614375816137da565b600080600060a0848603121561453f57600080fd5b835161454a816137da565b60208501519093506001600160401b0381111561456657600080fd5b614572868287016144b4565b9250506144ab856040860161433d565b60008251614594818460208701613a17565b919091019291505056fea264697066735822122049bb10b5acebe5e51a19e4b9e0833a653659bb5c78d6abd0deb6d2e06c7cb5be64736f6c63430008180033",
  "devdoc": {
    "errors": {
      "AccessControlBadConfirmation()": [
        {
          "details": "The caller of a function is not the expected one. NOTE: Don't confuse with {AccessControlUnauthorizedAccount}."
        }
      ],
      "AccessControlUnauthorizedAccount(address,bytes32)": [
        {
          "details": "The `account` is missing a role."
        }
      ]
    },
    "events": {
      "RoleAdminChanged(bytes32,bytes32,bytes32)": {
        "details": "Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite {RoleAdminChanged} not being emitted signaling this."
      },
      "RoleGranted(bytes32,address,address)": {
        "details": "Emitted when `account` is granted `role`. `sender` is the account that originated the contract call, an admin role bearer except when using {AccessControl-_setupRole}."
      },
      "RoleRevoked(bytes32,address,address)": {
        "details": "Emitted when `account` is revoked `role`. `sender` is the account that originated the contract call:   - if using `revokeRole`, it is the admin role bearer   - if using `renounceRole`, it is the role bearer (i.e. `account`)"
      }
    },
    "kind": "dev",
    "methods": {
      "getRoleAdmin(bytes32)": {
        "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}."
      },
      "grantRole(bytes32,address)": {
        "details": "Grants `role` to `account`. If `account` had not been already granted `role`, emits a {RoleGranted} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleGranted} event."
      },
      "hasRole(bytes32,address)": {
        "details": "Returns `true` if `account` has been granted `role`."
      },
      "renounceRole(bytes32,address)": {
        "details": "Revokes `role` from the calling account. Roles are often managed via {grantRole} and {revokeRole}: this function's purpose is to provide a mechanism for accounts to lose their privileges if they are compromised (such as when a trusted device is misplaced). If the calling account had been revoked `role`, emits a {RoleRevoked} event. Requirements: - the caller must be `callerConfirmation`. May emit a {RoleRevoked} event."
      },
      "revokeRole(bytes32,address)": {
        "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role. May emit a {RoleRevoked} event."
      },
      "supportsInterface(bytes4)": {
        "details": "See {IERC165-supportsInterface}."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 911,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "_roles",
        "offset": 0,
        "slot": "0",
        "type": "t_mapping(t_bytes32,t_struct(RoleData)906_storage)"
      },
      {
        "astId": 2583,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "prefix",
        "offset": 0,
        "slot": "1",
        "type": "t_string_storage"
      },
      {
        "astId": 2587,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "nodeOf",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_address,t_string_storage)"
      },
      {
        "astId": 2591,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniqueDomains",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_string_memory_ptr,t_bool)"
      },
      {
        "astId": 2595,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniqueOperators",
        "offset": 0,
        "slot": "4",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 2598,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "operators",
        "offset": 0,
        "slot": "5",
        "type": "t_array(t_address)dyn_storage"
      },
      {
        "astId": 2642,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniqueParties",
        "offset": 0,
        "slot": "6",
        "type": "t_mapping(t_bytes2,t_mapping(t_bytes3,t_address))"
      },
      {
        "astId": 2646,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "uniquePartyAddresses",
        "offset": 0,
        "slot": "7",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 2651,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "partyOf",
        "offset": 0,
        "slot": "8",
        "type": "t_mapping(t_address,t_struct(PartyDetails)2636_storage)"
      },
      {
        "astId": 2655,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "operatorOf",
        "offset": 0,
        "slot": "9",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 2659,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "allowedCertificateVerifiers",
        "offset": 0,
        "slot": "10",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 2662,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "parties",
        "offset": 0,
        "slot": "11",
        "type": "t_array(t_address)dyn_storage"
      },
      {
        "astId": 2665,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "paymentManager",
        "offset": 0,
        "slot": "12",
        "type": "t_contract(IOcnPaymentManager)2187"
      },
      {
        "astId": 2668,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "certificateVerifier",
        "offset": 0,
        "slot": "13",
        "type": "t_contract(ICertificateVerifier)4452"
      },
      {
        "astId": 2674,
        "contract": "contracts/OcnRegistry.sol:OcnRegistry",
        "label": "roleOracle",
        "offset": 0,
        "slot": "14",
        "type": "t_mapping(t_enum(Role)2605,t_contract(IProviderOracle)4474)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_address)dyn_storage": {
        "base": "t_address",
        "encoding": "dynamic_array",
        "label": "address[]",
        "numberOfBytes": "32"
      },
      "t_array(t_enum(Role)2605)dyn_storage": {
        "base": "t_enum(Role)2605",
        "encoding": "dynamic_array",
        "label": "enum OcnRegistry.Role[]",
        "numberOfBytes": "32"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes2": {
        "encoding": "inplace",
        "label": "bytes2",
        "numberOfBytes": "2"
      },
      "t_bytes3": {
        "encoding": "inplace",
        "label": "bytes3",
        "numberOfBytes": "3"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_contract(ICertificateVerifier)4452": {
        "encoding": "inplace",
        "label": "contract ICertificateVerifier",
        "numberOfBytes": "20"
      },
      "t_contract(IOcnPaymentManager)2187": {
        "encoding": "inplace",
        "label": "contract IOcnPaymentManager",
        "numberOfBytes": "20"
      },
      "t_contract(IProviderOracle)4474": {
        "encoding": "inplace",
        "label": "contract IProviderOracle",
        "numberOfBytes": "20"
      },
      "t_enum(CvStatus)2099": {
        "encoding": "inplace",
        "label": "enum IOcnCvManager.CvStatus",
        "numberOfBytes": "1"
      },
      "t_enum(PaymentStatus)2109": {
        "encoding": "inplace",
        "label": "enum IOcnPaymentManager.PaymentStatus",
        "numberOfBytes": "1"
      },
      "t_enum(Role)2605": {
        "encoding": "inplace",
        "label": "enum OcnRegistry.Role",
        "numberOfBytes": "1"
      },
      "t_mapping(t_address,t_address)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_address,t_string_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => string)",
        "numberOfBytes": "32",
        "value": "t_string_storage"
      },
      "t_mapping(t_address,t_struct(PartyDetails)2636_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct OcnRegistry.PartyDetails)",
        "numberOfBytes": "32",
        "value": "t_struct(PartyDetails)2636_storage"
      },
      "t_mapping(t_bytes2,t_mapping(t_bytes3,t_address))": {
        "encoding": "mapping",
        "key": "t_bytes2",
        "label": "mapping(bytes2 => mapping(bytes3 => address))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_bytes3,t_address)"
      },
      "t_mapping(t_bytes3,t_address)": {
        "encoding": "mapping",
        "key": "t_bytes3",
        "label": "mapping(bytes3 => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_mapping(t_bytes32,t_struct(RoleData)906_storage)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => struct AccessControl.RoleData)",
        "numberOfBytes": "32",
        "value": "t_struct(RoleData)906_storage"
      },
      "t_mapping(t_enum(Role)2605,t_contract(IProviderOracle)4474)": {
        "encoding": "mapping",
        "key": "t_enum(Role)2605",
        "label": "mapping(enum OcnRegistry.Role => contract IProviderOracle)",
        "numberOfBytes": "32",
        "value": "t_contract(IProviderOracle)4474"
      },
      "t_mapping(t_string_memory_ptr,t_bool)": {
        "encoding": "mapping",
        "key": "t_string_memory_ptr",
        "label": "mapping(string => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_string_memory_ptr": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_string_storage": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_struct(PartyDetails)2636_storage": {
        "encoding": "inplace",
        "label": "struct OcnRegistry.PartyDetails",
        "members": [
          {
            "astId": 2615,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "countryCode",
            "offset": 0,
            "slot": "0",
            "type": "t_bytes2"
          },
          {
            "astId": 2617,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "partyId",
            "offset": 2,
            "slot": "0",
            "type": "t_bytes3"
          },
          {
            "astId": 2621,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "roles",
            "offset": 0,
            "slot": "1",
            "type": "t_array(t_enum(Role)2605)dyn_storage"
          },
          {
            "astId": 2623,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "name",
            "offset": 0,
            "slot": "2",
            "type": "t_string_storage"
          },
          {
            "astId": 2625,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "url",
            "offset": 0,
            "slot": "3",
            "type": "t_string_storage"
          },
          {
            "astId": 2628,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "paymentStatus",
            "offset": 0,
            "slot": "4",
            "type": "t_enum(PaymentStatus)2109"
          },
          {
            "astId": 2631,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "cvStatus",
            "offset": 1,
            "slot": "4",
            "type": "t_enum(CvStatus)2099"
          },
          {
            "astId": 2633,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "active",
            "offset": 2,
            "slot": "4",
            "type": "t_bool"
          },
          {
            "astId": 2635,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "partyIndex",
            "offset": 0,
            "slot": "5",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "192"
      },
      "t_struct(RoleData)906_storage": {
        "encoding": "inplace",
        "label": "struct AccessControl.RoleData",
        "members": [
          {
            "astId": 903,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "hasRole",
            "offset": 0,
            "slot": "0",
            "type": "t_mapping(t_address,t_bool)"
          },
          {
            "astId": 905,
            "contract": "contracts/OcnRegistry.sol:OcnRegistry",
            "label": "adminRole",
            "offset": 0,
            "slot": "1",
            "type": "t_bytes32"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}