{
  "address": "0x9aDF1E99b06CeDDB5787675f9744bc53B4e34a41",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "axlGateway",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "axlGasReceiver",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "lzEndpoint",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "isTestnet",
          "type": "bool"
        },
        {
          "internalType": "uint32",
          "name": "homeChainId",
          "type": "uint32"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "requestId",
          "type": "uint256"
        }
      ],
      "name": "ALREADY_EXECUTED",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AlreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "name": "BRIDGE_LIMITS",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "lzEndpoint",
          "type": "address"
        }
      ],
      "name": "INVALID_ENDPOINT",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        }
      ],
      "name": "INVALID_SENDER",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "name": "INVALID_TARGET_OR_CHAINID",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidAddressString",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "required",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "sent",
          "type": "uint256"
        }
      ],
      "name": "LZ_FEE",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MISSING_FEE",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "NOT_GUARDIAN",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotApprovedByGateway",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TRANSFER",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TRANSFER_FROM",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "name": "UNSUPPORTED_CHAIN",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "WRONG_TOKEN",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "previousAdmin",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "AdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "beacon",
          "type": "address"
        }
      ],
      "name": "BeaconUpgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "targetChainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "normalizedAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "enum IMessagePassingBridge.BridgeService",
          "name": "bridge",
          "type": "uint8"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "BridgeRequest",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "normalizedAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "fee",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "sourceChainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "enum IMessagePassingBridge.BridgeService",
          "name": "bridge",
          "type": "uint8"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "ExecutedTransfer",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "sourceChainId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "sourceAddress",
          "type": "address"
        }
      ],
      "name": "FalseSender",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "_nonce",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_payload",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_reason",
          "type": "bytes"
        }
      ],
      "name": "MessageFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "_nonce",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "_payloadHash",
          "type": "bytes32"
        }
      ],
      "name": "RetryMessageSuccess",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_dstChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_type",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_minDstGas",
          "type": "uint256"
        }
      ],
      "name": "SetMinDstGas",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "precrime",
          "type": "address"
        }
      ],
      "name": "SetPrecrime",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_remoteChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_path",
          "type": "bytes"
        }
      ],
      "name": "SetTrustedRemote",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "_remoteChainId",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "_remoteAddress",
          "type": "bytes"
        }
      ],
      "name": "SetTrustedRemoteAddress",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_PAYLOAD_SIZE_LIMIT",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "HOME_CHAIN_ID",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "TESTNET",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "accountsDailyLimit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "lastTransferReset",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "bridged24Hours",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "lzChainId",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "name": "addLzChainSupport",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "approveRequest",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "approvedRequests",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "avatar",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "bridgeDailyLimit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "lastTransferReset",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "bridged24Hours",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "bridgeFees",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "minFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "maxFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "fee",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "bridgeLimits",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "dailyLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "txLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "accountDailyLimit",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minAmount",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "onlyWhitelisted",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "targetChainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "enum IMessagePassingBridge.BridgeService",
          "name": "bridge",
          "type": "uint8"
        }
      ],
      "name": "bridgeTo",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "targetChainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "gasRefundAddress",
          "type": "address"
        }
      ],
      "name": "bridgeToWithAxelar",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "targetChainId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "adapterParams",
          "type": "bytes"
        }
      ],
      "name": "bridgeToWithLz",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "canBridge",
      "outputs": [
        {
          "internalType": "bool",
          "name": "isWithinLimit",
          "type": "bool"
        },
        {
          "internalType": "string",
          "name": "error",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "currentId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "dao",
      "outputs": [
        {
          "internalType": "contract Controller",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "disabledSourceBridges",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_dstChainId",
          "type": "uint16"
        },
        {
          "internalType": "address",
          "name": "_fromAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_toAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_normalizedAmount",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_useZro",
          "type": "bool"
        },
        {
          "internalType": "bytes",
          "name": "_adapterParams",
          "type": "bytes"
        }
      ],
      "name": "estimateSendFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "nativeFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "zroFee",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "commandId",
          "type": "bytes32"
        },
        {
          "internalType": "string",
          "name": "sourceChain",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "sourceAddress",
          "type": "string"
        },
        {
          "internalType": "bytes",
          "name": "payload",
          "type": "bytes"
        }
      ],
      "name": "execute",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "commandId",
          "type": "bytes32"
        },
        {
          "internalType": "string",
          "name": "sourceChain",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "sourceAddress",
          "type": "string"
        },
        {
          "internalType": "bytes",
          "name": "payload",
          "type": "bytes"
        },
        {
          "internalType": "string",
          "name": "tokenSymbol",
          "type": "string"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "executeWithToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "executedRequests",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        },
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "name": "failedMessages",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "faucet",
      "outputs": [
        {
          "internalType": "contract IFaucet",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeRecipient",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        }
      ],
      "name": "forceResumeReceive",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "axlChainId",
          "type": "string"
        }
      ],
      "name": "fromAxelarChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "lzChainId",
          "type": "uint16"
        }
      ],
      "name": "fromLzChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "gasService",
      "outputs": [
        {
          "internalType": "contract IAxelarGasService",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "gateway",
      "outputs": [
        {
          "internalType": "contract IAxelarGateway",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_version",
          "type": "uint16"
        },
        {
          "internalType": "uint16",
          "name": "_chainId",
          "type": "uint16"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_configType",
          "type": "uint256"
        }
      ],
      "name": "getConfig",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_remoteChainId",
          "type": "uint16"
        }
      ],
      "name": "getTrustedRemoteAddress",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "guardian",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract INameService",
          "name": "nameService",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "dailyLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "txLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "accountDailyLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmount",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "onlyWhitelisted",
              "type": "bool"
            }
          ],
          "internalType": "struct IMessagePassingBridge.BridgeLimits",
          "name": "limits",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "minFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "fee",
              "type": "uint256"
            }
          ],
          "internalType": "struct IMessagePassingBridge.BridgeFees",
          "name": "fees",
          "type": "tuple"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isClosed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        }
      ],
      "name": "isTrustedRemote",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "lzChainIdsMapping",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "lzChainToIdsMapping",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lzEndpoint",
      "outputs": [
        {
          "internalType": "contract ILayerZeroEndpointUpgradeable",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lzEndpoint_",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        },
        {
          "internalType": "uint64",
          "name": "_nonce",
          "type": "uint64"
        },
        {
          "internalType": "bytes",
          "name": "_payload",
          "type": "bytes"
        }
      ],
      "name": "lzReceive",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        },
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "minDstGasLookup",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nameService",
      "outputs": [
        {
          "internalType": "contract INameService",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nativeToken",
      "outputs": [
        {
          "internalType": "contract IGoodDollar",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        },
        {
          "internalType": "uint64",
          "name": "_nonce",
          "type": "uint64"
        },
        {
          "internalType": "bytes",
          "name": "_payload",
          "type": "bytes"
        }
      ],
      "name": "nonblockingLzReceive",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "isPaused",
          "type": "bool"
        }
      ],
      "name": "pauseBridge",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "payloadSizeLimitLookup",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "precrime",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "preventRequest",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_srcAddress",
          "type": "bytes"
        },
        {
          "internalType": "uint64",
          "name": "_nonce",
          "type": "uint64"
        },
        {
          "internalType": "bytes",
          "name": "_payload",
          "type": "bytes"
        }
      ],
      "name": "retryMessage",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "minFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "fee",
              "type": "uint256"
            }
          ],
          "internalType": "struct IMessagePassingBridge.BridgeFees",
          "name": "fees",
          "type": "tuple"
        }
      ],
      "name": "setBridgeFees",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "dailyLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "txLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "accountDailyLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmount",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "onlyWhitelisted",
              "type": "bool"
            }
          ],
          "internalType": "struct IMessagePassingBridge.BridgeLimits",
          "name": "limits",
          "type": "tuple"
        }
      ],
      "name": "setBridgeLimits",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_version",
          "type": "uint16"
        },
        {
          "internalType": "uint16",
          "name": "_chainId",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "_configType",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_config",
          "type": "bytes"
        }
      ],
      "name": "setConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "bridgeKeys",
          "type": "bytes32[]"
        },
        {
          "internalType": "bool[]",
          "name": "disabled",
          "type": "bool[]"
        }
      ],
      "name": "setDisabledBridges",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_faucet",
          "type": "address"
        }
      ],
      "name": "setFaucet",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        }
      ],
      "name": "setFeeRecipient",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_guardian",
          "type": "address"
        }
      ],
      "name": "setGuardian",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_dstChainId",
          "type": "uint16"
        },
        {
          "internalType": "uint16",
          "name": "_packetType",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "_minGas",
          "type": "uint256"
        }
      ],
      "name": "setMinDstGas",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_dstChainId",
          "type": "uint16"
        },
        {
          "internalType": "uint256",
          "name": "_size",
          "type": "uint256"
        }
      ],
      "name": "setPayloadSizeLimit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_precrime",
          "type": "address"
        }
      ],
      "name": "setPrecrime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_version",
          "type": "uint16"
        }
      ],
      "name": "setReceiveVersion",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_version",
          "type": "uint16"
        }
      ],
      "name": "setSendVersion",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_srcChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_path",
          "type": "bytes"
        }
      ],
      "name": "setTrustedRemote",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_remoteChainId",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_remoteAddress",
          "type": "bytes"
        }
      ],
      "name": "setTrustedRemoteAddress",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "name": "toAxelarChainId",
      "outputs": [
        {
          "internalType": "string",
          "name": "axlChainId",
          "type": "string"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        }
      ],
      "name": "toLzChainId",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "lzChainId",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "name": "trustedRemoteLookup",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "updateAvatar",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "upgrade",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        }
      ],
      "name": "upgradeTo",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x930b47da270c853838089e294850c2da76f4120b1c260813ab7a417b25455a64",
  "receipt": {
    "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
    "from": "0x2CeADe86A04e474F3cf9BD87208514d818010627",
    "contractAddress": null,
    "transactionIndex": 0,
    "gasUsed": "5264091",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xf37dc6c44242400e01c6b91c9d93cfe96b1aca38d2b823fa71e92bdba780315f",
    "transactionHash": "0x930b47da270c853838089e294850c2da76f4120b1c260813ab7a417b25455a64",
    "logs": [],
    "blockNumber": 91928870,
    "cumulativeGasUsed": "5264091",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xe432150cce91c13a887f7D836923d5597adD8E31",
    "0xbE406F0189A0B4cf3A05C286473D23791Dd44Cc6",
    "0xb6319cC6c8c27A8F5dAF0dD3DF91EA35C4720dd7",
    false,
    42220
  ],
  "numDeployments": 6,
  "solcInputHash": "3dab9aa1e8bbfccb699ee7f782d621db",
  "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"axlGateway\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"axlGasReceiver\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"lzEndpoint\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isTestnet\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"homeChainId\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"name\":\"ALREADY_EXECUTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"BRIDGE_LIMITS\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"lzEndpoint\",\"type\":\"address\"}],\"name\":\"INVALID_ENDPOINT\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"}],\"name\":\"INVALID_SENDER\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"INVALID_TARGET_OR_CHAINID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddressString\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"sent\",\"type\":\"uint256\"}],\"name\":\"LZ_FEE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MISSING_FEE\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"NOT_GUARDIAN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotApprovedByGateway\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TRANSFER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TRANSFER_FROM\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"UNSUPPORTED_CHAIN\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"WRONG_TOKEN\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"targetChainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"normalizedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum IMessagePassingBridge.BridgeService\",\"name\":\"bridge\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"BridgeRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"normalizedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"sourceChainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum IMessagePassingBridge.BridgeService\",\"name\":\"bridge\",\"type\":\"uint8\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"ExecutedTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"sourceChainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceAddress\",\"type\":\"address\"}],\"name\":\"FalseSender\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"_nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_reason\",\"type\":\"bytes\"}],\"name\":\"MessageFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"_nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"_payloadHash\",\"type\":\"bytes32\"}],\"name\":\"RetryMessageSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_type\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_minDstGas\",\"type\":\"uint256\"}],\"name\":\"SetMinDstGas\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"precrime\",\"type\":\"address\"}],\"name\":\"SetPrecrime\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_remoteChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_path\",\"type\":\"bytes\"}],\"name\":\"SetTrustedRemote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"_remoteChainId\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_remoteAddress\",\"type\":\"bytes\"}],\"name\":\"SetTrustedRemoteAddress\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_PAYLOAD_SIZE_LIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOME_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TESTNET\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"accountsDailyLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"lastTransferReset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bridged24Hours\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"lzChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"addLzChainSupport\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"approveRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"approvedRequests\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"avatar\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeDailyLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"lastTransferReset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bridged24Hours\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"minFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bridgeLimits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"dailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"txLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accountDailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minAmount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"onlyWhitelisted\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetChainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"enum IMessagePassingBridge.BridgeService\",\"name\":\"bridge\",\"type\":\"uint8\"}],\"name\":\"bridgeTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetChainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasRefundAddress\",\"type\":\"address\"}],\"name\":\"bridgeToWithAxelar\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetChainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"adapterParams\",\"type\":\"bytes\"}],\"name\":\"bridgeToWithLz\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"canBridge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isWithinLimit\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"error\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"dao\",\"outputs\":[{\"internalType\":\"contract Controller\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"disabledSourceBridges\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"_fromAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_toAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_normalizedAmount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_useZro\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_adapterParams\",\"type\":\"bytes\"}],\"name\":\"estimateSendFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"nativeFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"zroFee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"commandId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"sourceChain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sourceAddress\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"commandId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"sourceChain\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sourceAddress\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"string\",\"name\":\"tokenSymbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"executeWithToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"executedRequests\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"failedMessages\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"faucet\",\"outputs\":[{\"internalType\":\"contract IFaucet\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"}],\"name\":\"forceResumeReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"axlChainId\",\"type\":\"string\"}],\"name\":\"fromAxelarChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"lzChainId\",\"type\":\"uint16\"}],\"name\":\"fromLzChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasService\",\"outputs\":[{\"internalType\":\"contract IAxelarGasService\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gateway\",\"outputs\":[{\"internalType\":\"contract IAxelarGateway\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_version\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"_chainId\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_configType\",\"type\":\"uint256\"}],\"name\":\"getConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_remoteChainId\",\"type\":\"uint16\"}],\"name\":\"getTrustedRemoteAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"guardian\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract INameService\",\"name\":\"nameService\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"dailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"txLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accountDailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minAmount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"onlyWhitelisted\",\"type\":\"bool\"}],\"internalType\":\"struct IMessagePassingBridge.BridgeLimits\",\"name\":\"limits\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"internalType\":\"struct IMessagePassingBridge.BridgeFees\",\"name\":\"fees\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isClosed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"}],\"name\":\"isTrustedRemote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"lzChainIdsMapping\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"lzChainToIdsMapping\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lzEndpoint\",\"outputs\":[{\"internalType\":\"contract ILayerZeroEndpointUpgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lzEndpoint_\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"lzReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"minDstGasLookup\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nameService\",\"outputs\":[{\"internalType\":\"contract INameService\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nativeToken\",\"outputs\":[{\"internalType\":\"contract IGoodDollar\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"nonblockingLzReceive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"isPaused\",\"type\":\"bool\"}],\"name\":\"pauseBridge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"payloadSizeLimitLookup\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"precrime\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"preventRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_srcAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_payload\",\"type\":\"bytes\"}],\"name\":\"retryMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"minFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"internalType\":\"struct IMessagePassingBridge.BridgeFees\",\"name\":\"fees\",\"type\":\"tuple\"}],\"name\":\"setBridgeFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"dailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"txLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accountDailyLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minAmount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"onlyWhitelisted\",\"type\":\"bool\"}],\"internalType\":\"struct IMessagePassingBridge.BridgeLimits\",\"name\":\"limits\",\"type\":\"tuple\"}],\"name\":\"setBridgeLimits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_version\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"_chainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_configType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_config\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"bridgeKeys\",\"type\":\"bytes32[]\"},{\"internalType\":\"bool[]\",\"name\":\"disabled\",\"type\":\"bool[]\"}],\"name\":\"setDisabledBridges\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_faucet\",\"type\":\"address\"}],\"name\":\"setFaucet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"setFeeRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_guardian\",\"type\":\"address\"}],\"name\":\"setGuardian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"_packetType\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_minGas\",\"type\":\"uint256\"}],\"name\":\"setMinDstGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_dstChainId\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_size\",\"type\":\"uint256\"}],\"name\":\"setPayloadSizeLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_precrime\",\"type\":\"address\"}],\"name\":\"setPrecrime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_version\",\"type\":\"uint16\"}],\"name\":\"setReceiveVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_version\",\"type\":\"uint16\"}],\"name\":\"setSendVersion\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_srcChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_path\",\"type\":\"bytes\"}],\"name\":\"setTrustedRemote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_remoteChainId\",\"type\":\"uint16\"},{\"internalType\":\"bytes\",\"name\":\"_remoteAddress\",\"type\":\"bytes\"}],\"name\":\"setTrustedRemoteAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"toAxelarChainId\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"axlChainId\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"name\":\"toLzChainId\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"lzChainId\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"trustedRemoteLookup\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateAvatar\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"upgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"A contract for bridging assets between chains\",\"kind\":\"dev\",\"methods\":{\"addLzChainSupport(uint16,uint256)\":{\"details\":\"function for adding lz chaind support\"},\"approveRequest(uint256)\":{\"details\":\"Function for approving requests above limits\",\"params\":{\"id\":\"The bridgerequest id\"}},\"constructor\":{\"details\":\"Constructor function for the AxelarBridge contract\",\"params\":{\"axlGasReceiver\":\"The address of the gas receiver contract\",\"axlGateway\":\"The address of the gateway contract\"}},\"initialize(address,(uint256,uint256,uint256,uint256,bool),(uint256,uint256,uint256))\":{\"details\":\"Function for initializing the contract\",\"params\":{\"nameService\":\"The address of the name service contract\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pauseBridge(bool)\":{\"details\":\"Function for pausing the bridge\",\"params\":{\"isPaused\":\"Whether to pause the bridge or not\"}},\"preventRequest(uint256)\":{\"details\":\"Function for prevent a request by marking it as executed\",\"params\":{\"id\":\"The bridgerequest id\"}},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setBridgeFees((uint256,uint256,uint256))\":{\"details\":\"Function for setting the bridge fees\",\"params\":{\"fees\":\"The bridge fees to set\"}},\"setBridgeLimits((uint256,uint256,uint256,uint256,bool))\":{\"details\":\"Function for setting the bridge limits\",\"params\":{\"limits\":\"The bridge limits to set\"}},\"setFaucet(address)\":{\"details\":\"Function for setting the faucet contract\",\"params\":{\"_faucet\":\"The faucet contract to set\"}},\"setFeeRecipient(address)\":{\"details\":\"Function for setting the fee recipient\",\"params\":{\"recipient\":\"The fee recipient to set\"}},\"setGuardian(address)\":{\"details\":\"Function for setting the guardian contract\",\"params\":{\"_guardian\":\"The guardian to set\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"withdraw(address,uint256)\":{\"details\":\"Function for withdrawing tokens\",\"params\":{\"amount\":\"The amount to withdraw\",\"token\":\"The address of the token to withdraw\"}}},\"title\":\"MessagePassingBridge\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/messagePassingBridge/MessagePassingBridge.sol\":\"MessagePassingBridge\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":0},\"remappings\":[]},\"sources\":{\"@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport { IAxelarGateway } from '../interfaces/IAxelarGateway.sol';\\nimport { IAxelarExecutable } from '../interfaces/IAxelarExecutable.sol';\\n\\ncontract AxelarExecutable is IAxelarExecutable {\\n    IAxelarGateway public immutable gateway;\\n\\n    constructor(address gateway_) {\\n        if (gateway_ == address(0)) revert InvalidAddress();\\n\\n        gateway = IAxelarGateway(gateway_);\\n    }\\n\\n    function execute(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload\\n    ) external {\\n        bytes32 payloadHash = keccak256(payload);\\n\\n        if (!gateway.validateContractCall(commandId, sourceChain, sourceAddress, payloadHash))\\n            revert NotApprovedByGateway();\\n\\n        _execute(sourceChain, sourceAddress, payload);\\n    }\\n\\n    function executeWithToken(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload,\\n        string calldata tokenSymbol,\\n        uint256 amount\\n    ) external {\\n        bytes32 payloadHash = keccak256(payload);\\n\\n        if (\\n            !gateway.validateContractCallAndMint(\\n                commandId,\\n                sourceChain,\\n                sourceAddress,\\n                payloadHash,\\n                tokenSymbol,\\n                amount\\n            )\\n        ) revert NotApprovedByGateway();\\n\\n        _executeWithToken(sourceChain, sourceAddress, payload, tokenSymbol, amount);\\n    }\\n\\n    function _execute(\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload\\n    ) internal virtual {}\\n\\n    function _executeWithToken(\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload,\\n        string calldata tokenSymbol,\\n        uint256 amount\\n    ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x2a88d046f9cdc664afc7b788d6c5b534d361b46fb45ab7abf721a58dd813359b\",\"license\":\"MIT\"},\"@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarExecutable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport { IAxelarGateway } from './IAxelarGateway.sol';\\n\\ninterface IAxelarExecutable {\\n    error InvalidAddress();\\n    error NotApprovedByGateway();\\n\\n    function gateway() external view returns (IAxelarGateway);\\n\\n    function execute(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload\\n    ) external;\\n\\n    function executeWithToken(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload,\\n        string calldata tokenSymbol,\\n        uint256 amount\\n    ) external;\\n}\\n\",\"keccak256\":\"0x4279ef3b4fe5e7082f39c665d4aeddc6d84fcc6fadaacd1d8ae604ba6146b8e6\",\"license\":\"MIT\"},\"@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n// This should be owned by the microservice that is paying for gas.\\ninterface IAxelarGasService {\\n    error NothingReceived();\\n    error InvalidAddress();\\n    error NotCollector();\\n    error InvalidAmounts();\\n\\n    event GasPaidForContractCall(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event GasPaidForContractCallWithToken(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        string symbol,\\n        uint256 amount,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event NativeGasPaidForContractCall(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event NativeGasPaidForContractCallWithToken(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        string symbol,\\n        uint256 amount,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event GasPaidForExpressCallWithToken(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        string symbol,\\n        uint256 amount,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event NativeGasPaidForExpressCallWithToken(\\n        address indexed sourceAddress,\\n        string destinationChain,\\n        string destinationAddress,\\n        bytes32 indexed payloadHash,\\n        string symbol,\\n        uint256 amount,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event GasAdded(\\n        bytes32 indexed txHash,\\n        uint256 indexed logIndex,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event NativeGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress);\\n\\n    event ExpressGasAdded(\\n        bytes32 indexed txHash,\\n        uint256 indexed logIndex,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    event NativeExpressGasAdded(\\n        bytes32 indexed txHash,\\n        uint256 indexed logIndex,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    );\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payGasForContractCall(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    ) external;\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payGasForContractCallWithToken(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        string calldata symbol,\\n        uint256 amount,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    ) external;\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payNativeGasForContractCall(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        address refundAddress\\n    ) external payable;\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payNativeGasForContractCallWithToken(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        string calldata symbol,\\n        uint256 amount,\\n        address refundAddress\\n    ) external payable;\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payGasForExpressCallWithToken(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        string calldata symbol,\\n        uint256 amount,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    ) external;\\n\\n    // This is called on the source chain before calling the gateway to execute a remote contract.\\n    function payNativeGasForExpressCallWithToken(\\n        address sender,\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        bytes calldata payload,\\n        string calldata symbol,\\n        uint256 amount,\\n        address refundAddress\\n    ) external payable;\\n\\n    function addGas(\\n        bytes32 txHash,\\n        uint256 txIndex,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    ) external;\\n\\n    function addNativeGas(\\n        bytes32 txHash,\\n        uint256 logIndex,\\n        address refundAddress\\n    ) external payable;\\n\\n    function addExpressGas(\\n        bytes32 txHash,\\n        uint256 txIndex,\\n        address gasToken,\\n        uint256 gasFeeAmount,\\n        address refundAddress\\n    ) external;\\n\\n    function addNativeExpressGas(\\n        bytes32 txHash,\\n        uint256 logIndex,\\n        address refundAddress\\n    ) external payable;\\n\\n    function collectFees(\\n        address payable receiver,\\n        address[] calldata tokens,\\n        uint256[] calldata amounts\\n    ) external;\\n\\n    function refund(\\n        address payable receiver,\\n        address token,\\n        uint256 amount\\n    ) external;\\n\\n    function gasCollector() external returns (address);\\n}\\n\",\"keccak256\":\"0xafab7fde3204bedcb81109a275dfb12f8999d190f0532e37d7e8c0f31dbf41de\",\"license\":\"MIT\"},\"@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\ninterface IAxelarGateway {\\n    /**********\\\\\\n    |* Errors *|\\n    \\\\**********/\\n\\n    error NotSelf();\\n    error NotProxy();\\n    error InvalidCodeHash();\\n    error SetupFailed();\\n    error InvalidAuthModule();\\n    error InvalidTokenDeployer();\\n    error InvalidAmount();\\n    error InvalidChainId();\\n    error InvalidCommands();\\n    error TokenDoesNotExist(string symbol);\\n    error TokenAlreadyExists(string symbol);\\n    error TokenDeployFailed(string symbol);\\n    error TokenContractDoesNotExist(address token);\\n    error BurnFailed(string symbol);\\n    error MintFailed(string symbol);\\n    error InvalidSetMintLimitsParams();\\n    error ExceedMintLimit(string symbol);\\n\\n    /**********\\\\\\n    |* Events *|\\n    \\\\**********/\\n\\n    event TokenSent(\\n        address indexed sender,\\n        string destinationChain,\\n        string destinationAddress,\\n        string symbol,\\n        uint256 amount\\n    );\\n\\n    event ContractCall(\\n        address indexed sender,\\n        string destinationChain,\\n        string destinationContractAddress,\\n        bytes32 indexed payloadHash,\\n        bytes payload\\n    );\\n\\n    event ContractCallWithToken(\\n        address indexed sender,\\n        string destinationChain,\\n        string destinationContractAddress,\\n        bytes32 indexed payloadHash,\\n        bytes payload,\\n        string symbol,\\n        uint256 amount\\n    );\\n\\n    event Executed(bytes32 indexed commandId);\\n\\n    event TokenDeployed(string symbol, address tokenAddresses);\\n\\n    event ContractCallApproved(\\n        bytes32 indexed commandId,\\n        string sourceChain,\\n        string sourceAddress,\\n        address indexed contractAddress,\\n        bytes32 indexed payloadHash,\\n        bytes32 sourceTxHash,\\n        uint256 sourceEventIndex\\n    );\\n\\n    event ContractCallApprovedWithMint(\\n        bytes32 indexed commandId,\\n        string sourceChain,\\n        string sourceAddress,\\n        address indexed contractAddress,\\n        bytes32 indexed payloadHash,\\n        string symbol,\\n        uint256 amount,\\n        bytes32 sourceTxHash,\\n        uint256 sourceEventIndex\\n    );\\n\\n    event TokenMintLimitUpdated(string symbol, uint256 limit);\\n\\n    event OperatorshipTransferred(bytes newOperatorsData);\\n\\n    event Upgraded(address indexed implementation);\\n\\n    /********************\\\\\\n    |* Public Functions *|\\n    \\\\********************/\\n\\n    function sendToken(\\n        string calldata destinationChain,\\n        string calldata destinationAddress,\\n        string calldata symbol,\\n        uint256 amount\\n    ) external;\\n\\n    function callContract(\\n        string calldata destinationChain,\\n        string calldata contractAddress,\\n        bytes calldata payload\\n    ) external;\\n\\n    function callContractWithToken(\\n        string calldata destinationChain,\\n        string calldata contractAddress,\\n        bytes calldata payload,\\n        string calldata symbol,\\n        uint256 amount\\n    ) external;\\n\\n    function isContractCallApproved(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        address contractAddress,\\n        bytes32 payloadHash\\n    ) external view returns (bool);\\n\\n    function isContractCallAndMintApproved(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        address contractAddress,\\n        bytes32 payloadHash,\\n        string calldata symbol,\\n        uint256 amount\\n    ) external view returns (bool);\\n\\n    function validateContractCall(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes32 payloadHash\\n    ) external returns (bool);\\n\\n    function validateContractCallAndMint(\\n        bytes32 commandId,\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes32 payloadHash,\\n        string calldata symbol,\\n        uint256 amount\\n    ) external returns (bool);\\n\\n    /***********\\\\\\n    |* Getters *|\\n    \\\\***********/\\n\\n    function authModule() external view returns (address);\\n\\n    function tokenDeployer() external view returns (address);\\n\\n    function tokenMintLimit(string memory symbol) external view returns (uint256);\\n\\n    function tokenMintAmount(string memory symbol) external view returns (uint256);\\n\\n    function allTokensFrozen() external view returns (bool);\\n\\n    function implementation() external view returns (address);\\n\\n    function tokenAddresses(string memory symbol) external view returns (address);\\n\\n    function tokenFrozen(string memory symbol) external view returns (bool);\\n\\n    function isCommandExecuted(bytes32 commandId) external view returns (bool);\\n\\n    function adminEpoch() external view returns (uint256);\\n\\n    function adminThreshold(uint256 epoch) external view returns (uint256);\\n\\n    function admins(uint256 epoch) external view returns (address[] memory);\\n\\n    /*******************\\\\\\n    |* Admin Functions *|\\n    \\\\*******************/\\n\\n    function setTokenMintLimits(string[] calldata symbols, uint256[] calldata limits) external;\\n\\n    function upgrade(\\n        address newImplementation,\\n        bytes32 newImplementationCodeHash,\\n        bytes calldata setupParams\\n    ) external;\\n\\n    /**********************\\\\\\n    |* External Functions *|\\n    \\\\**********************/\\n\\n    function setup(bytes calldata params) external;\\n\\n    function execute(bytes calldata input) external;\\n}\\n\",\"keccak256\":\"0xae3d4598622e927639e3cba383618476562631bc8afafe68b16dfbd1db21fd78\",\"license\":\"MIT\"},\"@axelar-network/axelar-gmp-sdk-solidity/contracts/utils/AddressString.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nlibrary StringToAddress {\\n    error InvalidAddressString();\\n\\n    function toAddress(string memory addressString) internal pure returns (address) {\\n        bytes memory stringBytes = bytes(addressString);\\n        uint160 addressNumber = 0;\\n        uint8 stringByte;\\n\\n        if (stringBytes.length != 42 || stringBytes[0] != '0' || stringBytes[1] != 'x') revert InvalidAddressString();\\n\\n        for (uint256 i = 2; i < 42; ++i) {\\n            stringByte = uint8(stringBytes[i]);\\n\\n            if ((stringByte >= 97) && (stringByte <= 102)) stringByte -= 87;\\n            else if ((stringByte >= 65) && (stringByte <= 70)) stringByte -= 55;\\n            else if ((stringByte >= 48) && (stringByte <= 57)) stringByte -= 48;\\n            else revert InvalidAddressString();\\n\\n            addressNumber |= uint160(uint256(stringByte) << ((41 - i) << 2));\\n        }\\n        return address(addressNumber);\\n    }\\n}\\n\\nlibrary AddressToString {\\n    function toString(address addr) internal pure returns (string memory) {\\n        bytes memory addressBytes = abi.encodePacked(addr);\\n        uint256 length = addressBytes.length;\\n        bytes memory characters = '0123456789abcdef';\\n        bytes memory stringBytes = new bytes(2 + addressBytes.length * 2);\\n\\n        stringBytes[0] = '0';\\n        stringBytes[1] = 'x';\\n\\n        for (uint256 i; i < length; ++i) {\\n            stringBytes[2 + i * 2] = characters[uint8(addressBytes[i] >> 4)];\\n            stringBytes[3 + i * 2] = characters[uint8(addressBytes[i] & 0x0f)];\\n        }\\n        return string(stringBytes);\\n    }\\n}\\n\",\"keccak256\":\"0xefd5b5b2b0e9b26068d48f43bcd57464f3d89a195d512dc672736c9e7dd3eaf6\",\"license\":\"MIT\"},\"@gooddollar/goodprotocol/contracts/DAOStackInterfaces.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\ninterface Avatar {\\n\\tfunction nativeToken() external view returns (address);\\n\\n\\tfunction nativeReputation() external view returns (address);\\n\\n\\tfunction owner() external view returns (address);\\n}\\n\\ninterface Controller {\\n\\tevent RegisterScheme(address indexed _sender, address indexed _scheme);\\n\\tevent UnregisterScheme(address indexed _sender, address indexed _scheme);\\n\\n\\tfunction genericCall(\\n\\t\\taddress _contract,\\n\\t\\tbytes calldata _data,\\n\\t\\taddress _avatar,\\n\\t\\tuint256 _value\\n\\t) external returns (bool, bytes memory);\\n\\n\\tfunction avatar() external view returns (address);\\n\\n\\tfunction unregisterScheme(address _scheme, address _avatar)\\n\\t\\texternal\\n\\t\\treturns (bool);\\n\\n\\tfunction unregisterSelf(address _avatar) external returns (bool);\\n\\n\\tfunction registerScheme(\\n\\t\\taddress _scheme,\\n\\t\\tbytes32 _paramsHash,\\n\\t\\tbytes4 _permissions,\\n\\t\\taddress _avatar\\n\\t) external returns (bool);\\n\\n\\tfunction isSchemeRegistered(address _scheme, address _avatar)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (bool);\\n\\n\\tfunction getSchemePermissions(address _scheme, address _avatar)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (bytes4);\\n\\n\\tfunction addGlobalConstraint(\\n\\t\\taddress _constraint,\\n\\t\\tbytes32 _paramHash,\\n\\t\\taddress _avatar\\n\\t) external returns (bool);\\n\\n\\tfunction mintTokens(\\n\\t\\tuint256 _amount,\\n\\t\\taddress _beneficiary,\\n\\t\\taddress _avatar\\n\\t) external returns (bool);\\n\\n\\tfunction externalTokenTransfer(\\n\\t\\taddress _token,\\n\\t\\taddress _recipient,\\n\\t\\tuint256 _amount,\\n\\t\\taddress _avatar\\n\\t) external returns (bool);\\n\\n\\tfunction sendEther(\\n\\t\\tuint256 _amountInWei,\\n\\t\\taddress payable _to,\\n\\t\\taddress _avatar\\n\\t) external returns (bool);\\n}\\n\\ninterface GlobalConstraintInterface {\\n\\tenum CallPhase {\\n\\t\\tPre,\\n\\t\\tPost,\\n\\t\\tPreAndPost\\n\\t}\\n\\n\\tfunction pre(\\n\\t\\taddress _scheme,\\n\\t\\tbytes32 _params,\\n\\t\\tbytes32 _method\\n\\t) external returns (bool);\\n\\n\\t/**\\n\\t * @dev when return if this globalConstraints is pre, post or both.\\n\\t * @return CallPhase enum indication  Pre, Post or PreAndPost.\\n\\t */\\n\\tfunction when() external returns (CallPhase);\\n}\\n\\ninterface ReputationInterface {\\n\\tfunction balanceOf(address _user) external view returns (uint256);\\n\\n\\tfunction balanceOfAt(address _user, uint256 _blockNumber)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (uint256);\\n\\n\\tfunction getVotes(address _user) external view returns (uint256);\\n\\n\\tfunction getVotesAt(\\n\\t\\taddress _user,\\n\\t\\tbool _global,\\n\\t\\tuint256 _blockNumber\\n\\t) external view returns (uint256);\\n\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\tfunction totalSupplyAt(uint256 _blockNumber)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (uint256);\\n\\n\\tfunction delegateOf(address _user) external returns (address);\\n}\\n\\ninterface SchemeRegistrar {\\n\\tfunction proposeScheme(\\n\\t\\tAvatar _avatar,\\n\\t\\taddress _scheme,\\n\\t\\tbytes32 _parametersHash,\\n\\t\\tbytes4 _permissions,\\n\\t\\tstring memory _descriptionHash\\n\\t) external returns (bytes32);\\n\\n\\tevent NewSchemeProposal(\\n\\t\\taddress indexed _avatar,\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _intVoteInterface,\\n\\t\\taddress _scheme,\\n\\t\\tbytes32 _parametersHash,\\n\\t\\tbytes4 _permissions,\\n\\t\\tstring _descriptionHash\\n\\t);\\n}\\n\\ninterface IntVoteInterface {\\n\\tevent NewProposal(\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _organization,\\n\\t\\tuint256 _numOfChoices,\\n\\t\\taddress _proposer,\\n\\t\\tbytes32 _paramsHash\\n\\t);\\n\\n\\tevent ExecuteProposal(\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _organization,\\n\\t\\tuint256 _decision,\\n\\t\\tuint256 _totalReputation\\n\\t);\\n\\n\\tevent VoteProposal(\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _organization,\\n\\t\\taddress indexed _voter,\\n\\t\\tuint256 _vote,\\n\\t\\tuint256 _reputation\\n\\t);\\n\\n\\tevent CancelProposal(\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _organization\\n\\t);\\n\\tevent CancelVoting(\\n\\t\\tbytes32 indexed _proposalId,\\n\\t\\taddress indexed _organization,\\n\\t\\taddress indexed _voter\\n\\t);\\n\\n\\t/**\\n\\t * @dev register a new proposal with the given parameters. Every proposal has a unique ID which is being\\n\\t * generated by calculating keccak256 of a incremented counter.\\n\\t * @param _numOfChoices number of voting choices\\n\\t * @param _proposalParameters defines the parameters of the voting machine used for this proposal\\n\\t * @param _proposer address\\n\\t * @param _organization address - if this address is zero the msg.sender will be used as the organization address.\\n\\t * @return proposal's id.\\n\\t */\\n\\tfunction propose(\\n\\t\\tuint256 _numOfChoices,\\n\\t\\tbytes32 _proposalParameters,\\n\\t\\taddress _proposer,\\n\\t\\taddress _organization\\n\\t) external returns (bytes32);\\n\\n\\tfunction vote(\\n\\t\\tbytes32 _proposalId,\\n\\t\\tuint256 _vote,\\n\\t\\tuint256 _rep,\\n\\t\\taddress _voter\\n\\t) external returns (bool);\\n\\n\\tfunction cancelVote(bytes32 _proposalId) external;\\n\\n\\tfunction getNumberOfChoices(bytes32 _proposalId)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (uint256);\\n\\n\\tfunction isVotable(bytes32 _proposalId) external view returns (bool);\\n\\n\\t/**\\n\\t * @dev voteStatus returns the reputation voted for a proposal for a specific voting choice.\\n\\t * @param _proposalId the ID of the proposal\\n\\t * @param _choice the index in the\\n\\t * @return voted reputation for the given choice\\n\\t */\\n\\tfunction voteStatus(bytes32 _proposalId, uint256 _choice)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (uint256);\\n\\n\\t/**\\n\\t * @dev isAbstainAllow returns if the voting machine allow abstain (0)\\n\\t * @return bool true or false\\n\\t */\\n\\tfunction isAbstainAllow() external pure returns (bool);\\n\\n\\t/**\\n     * @dev getAllowedRangeOfChoices returns the allowed range of choices for a voting machine.\\n     * @return min - minimum number of choices\\n               max - maximum number of choices\\n     */\\n\\tfunction getAllowedRangeOfChoices()\\n\\t\\texternal\\n\\t\\tpure\\n\\t\\treturns (uint256 min, uint256 max);\\n}\\n\",\"keccak256\":\"0x34e247b3a991a0d5f8e975c81df91199074eeb9d4999fcaac89bdf7787527b19\",\"license\":\"MIT\"},\"@gooddollar/goodprotocol/contracts/Interfaces.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\nimport { DataTypes } from \\\"./utils/DataTypes.sol\\\";\\npragma solidity >=0.8.0;\\n\\npragma experimental ABIEncoderV2;\\n\\ninterface ERC20 {\\n\\tfunction balanceOf(address addr) external view returns (uint256);\\n\\n\\tfunction transfer(address to, uint256 amount) external returns (bool);\\n\\n\\tfunction approve(address spender, uint256 amount) external returns (bool);\\n\\n\\tfunction decimals() external view returns (uint8);\\n\\n\\tfunction mint(address to, uint256 mintAmount) external returns (uint256);\\n\\n\\tfunction burn(uint256 amount) external;\\n\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\tfunction allowance(\\n\\t\\taddress owner,\\n\\t\\taddress spender\\n\\t) external view returns (uint256);\\n\\n\\tfunction transferFrom(\\n\\t\\taddress sender,\\n\\t\\taddress recipient,\\n\\t\\tuint256 amount\\n\\t) external returns (bool);\\n\\n\\tfunction name() external view returns (string memory);\\n\\n\\tfunction symbol() external view returns (string memory);\\n\\n\\tevent Transfer(address indexed from, address indexed to, uint256 amount);\\n\\tevent Transfer(\\n\\t\\taddress indexed from,\\n\\t\\taddress indexed to,\\n\\t\\tuint256 amount,\\n\\t\\tbytes data\\n\\t);\\n}\\n\\ninterface cERC20 is ERC20 {\\n\\tfunction mint(uint256 mintAmount) external returns (uint256);\\n\\n\\tfunction redeemUnderlying(uint256 mintAmount) external returns (uint256);\\n\\n\\tfunction redeem(uint256 mintAmount) external returns (uint256);\\n\\n\\tfunction exchangeRateCurrent() external returns (uint256);\\n\\n\\tfunction exchangeRateStored() external view returns (uint256);\\n\\n\\tfunction underlying() external returns (address);\\n}\\n\\ninterface IGoodDollar is ERC20 {\\n\\t// view functions\\n\\tfunction feeRecipient() external view returns (address);\\n\\n\\tfunction getFees(\\n\\t\\tuint256 value,\\n\\t\\taddress sender,\\n\\t\\taddress recipient\\n\\t) external view returns (uint256 fee, bool senderPays);\\n\\n\\tfunction cap() external view returns (uint256);\\n\\n\\tfunction isPauser(address _pauser) external view returns (bool);\\n\\n\\tfunction getFees(uint256 value) external view returns (uint256, bool);\\n\\n\\tfunction isMinter(address minter) external view returns (bool);\\n\\n\\tfunction formula() external view returns (address);\\n\\n\\tfunction identity() external view returns (address);\\n\\n\\tfunction owner() external view returns (address);\\n\\n\\t// state changing functions\\n\\tfunction setFeeRecipient(address _feeRecipient) external;\\n\\n\\tfunction setFormula(address _formula) external;\\n\\n\\tfunction transferOwnership(address _owner) external;\\n\\n\\tfunction addPauser(address _pauser) external;\\n\\n\\tfunction pause() external;\\n\\n\\tfunction unpause() external;\\n\\n\\tfunction burn(uint256 amount) external;\\n\\n\\tfunction burnFrom(address account, uint256 amount) external;\\n\\n\\tfunction renounceMinter() external;\\n\\n\\tfunction addMinter(address minter) external;\\n\\n\\tfunction transferAndCall(\\n\\t\\taddress to,\\n\\t\\tuint256 value,\\n\\t\\tbytes calldata data\\n\\t) external returns (bool);\\n\\n\\tfunction setIdentity(address identity) external;\\n}\\n\\ninterface IERC2917 is ERC20 {\\n\\t/// @dev This emit when interests amount per block is changed by the owner of the contract.\\n\\t/// It emits with the old interests amount and the new interests amount.\\n\\tevent InterestRatePerBlockChanged(uint256 oldValue, uint256 newValue);\\n\\n\\t/// @dev This emit when a users' productivity has changed\\n\\t/// It emits with the user's address and the the value after the change.\\n\\tevent ProductivityIncreased(address indexed user, uint256 value);\\n\\n\\t/// @dev This emit when a users' productivity has changed\\n\\t/// It emits with the user's address and the the value after the change.\\n\\tevent ProductivityDecreased(address indexed user, uint256 value);\\n\\n\\t/// @dev Return the current contract's interests rate per block.\\n\\t/// @return The amount of interests currently producing per each block.\\n\\tfunction interestsPerBlock() external view returns (uint256);\\n\\n\\t/// @notice Change the current contract's interests rate.\\n\\t/// @dev Note the best practice will be restrict the gross product provider's contract address to call this.\\n\\t/// @return The true/fase to notice that the value has successfully changed or not, when it succeed, it will emite the InterestRatePerBlockChanged event.\\n\\tfunction changeInterestRatePerBlock(uint256 value) external returns (bool);\\n\\n\\t/// @notice It will get the productivity of given user.\\n\\t/// @dev it will return 0 if user has no productivity proved in the contract.\\n\\t/// @return user's productivity and overall productivity.\\n\\tfunction getProductivity(\\n\\t\\taddress user\\n\\t) external view returns (uint256, uint256);\\n\\n\\t/// @notice increase a user's productivity.\\n\\t/// @dev Note the best practice will be restrict the callee to prove of productivity's contract address.\\n\\t/// @return true to confirm that the productivity added success.\\n\\tfunction increaseProductivity(\\n\\t\\taddress user,\\n\\t\\tuint256 value\\n\\t) external returns (bool);\\n\\n\\t/// @notice decrease a user's productivity.\\n\\t/// @dev Note the best practice will be restrict the callee to prove of productivity's contract address.\\n\\t/// @return true to confirm that the productivity removed success.\\n\\tfunction decreaseProductivity(\\n\\t\\taddress user,\\n\\t\\tuint256 value\\n\\t) external returns (bool);\\n\\n\\t/// @notice take() will return the interests that callee will get at current block height.\\n\\t/// @dev it will always calculated by block.number, so it will change when block height changes.\\n\\t/// @return amount of the interests that user are able to mint() at current block height.\\n\\tfunction take() external view returns (uint256);\\n\\n\\t/// @notice similar to take(), but with the block height joined to calculate return.\\n\\t/// @dev for instance, it returns (_amount, _block), which means at block height _block, the callee has accumulated _amount of interests.\\n\\t/// @return amount of interests and the block height.\\n\\tfunction takeWithBlock() external view returns (uint256, uint256);\\n\\n\\t/// @notice mint the avaiable interests to callee.\\n\\t/// @dev once it mint, the amount of interests will transfer to callee's address.\\n\\t/// @return the amount of interests minted.\\n\\tfunction mint() external returns (uint256);\\n}\\n\\ninterface Staking {\\n\\tstruct Staker {\\n\\t\\t// The staked DAI amount\\n\\t\\tuint256 stakedDAI;\\n\\t\\t// The latest block number which the\\n\\t\\t// staker has staked tokens\\n\\t\\tuint256 lastStake;\\n\\t}\\n\\n\\tfunction stakeDAI(uint256 amount) external;\\n\\n\\tfunction withdrawStake() external;\\n\\n\\tfunction stakers(address staker) external view returns (Staker memory);\\n}\\n\\ninterface Uniswap {\\n\\tfunction swapExactETHForTokens(\\n\\t\\tuint256 amountOutMin,\\n\\t\\taddress[] calldata path,\\n\\t\\taddress to,\\n\\t\\tuint256 deadline\\n\\t) external payable returns (uint256[] memory amounts);\\n\\n\\tfunction swapExactTokensForETH(\\n\\t\\tuint256 amountIn,\\n\\t\\tuint256 amountOutMin,\\n\\t\\taddress[] calldata path,\\n\\t\\taddress to,\\n\\t\\tuint256 deadline\\n\\t) external returns (uint256[] memory amounts);\\n\\n\\tfunction swapExactTokensForTokens(\\n\\t\\tuint256 amountIn,\\n\\t\\tuint256 amountOutMin,\\n\\t\\taddress[] calldata path,\\n\\t\\taddress to,\\n\\t\\tuint256 deadline\\n\\t) external returns (uint256[] memory amounts);\\n\\n\\tfunction WETH() external pure returns (address);\\n\\n\\tfunction factory() external pure returns (address);\\n\\n\\tfunction quote(\\n\\t\\tuint256 amountA,\\n\\t\\tuint256 reserveA,\\n\\t\\tuint256 reserveB\\n\\t) external pure returns (uint256 amountB);\\n\\n\\tfunction getAmountIn(\\n\\t\\tuint256 amountOut,\\n\\t\\tuint256 reserveIn,\\n\\t\\tuint256 reserveOut\\n\\t) external pure returns (uint256 amountIn);\\n\\n\\tfunction getAmountOut(\\n\\t\\tuint256 amountI,\\n\\t\\tuint256 reserveIn,\\n\\t\\tuint256 reserveOut\\n\\t) external pure returns (uint256 amountOut);\\n\\n\\tfunction getAmountsOut(\\n\\t\\tuint256 amountIn,\\n\\t\\taddress[] memory path\\n\\t) external pure returns (uint256[] memory amounts);\\n}\\n\\ninterface UniswapFactory {\\n\\tfunction getPair(\\n\\t\\taddress tokenA,\\n\\t\\taddress tokenB\\n\\t) external view returns (address);\\n}\\n\\ninterface UniswapPair {\\n\\tfunction getReserves()\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\\n\\n\\tfunction kLast() external view returns (uint256);\\n\\n\\tfunction token0() external view returns (address);\\n\\n\\tfunction token1() external view returns (address);\\n\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\tfunction balanceOf(address owner) external view returns (uint256);\\n}\\n\\ninterface Reserve {\\n\\tfunction buy(\\n\\t\\taddress _buyWith,\\n\\t\\tuint256 _tokenAmount,\\n\\t\\tuint256 _minReturn\\n\\t) external returns (uint256);\\n}\\n\\ninterface IIdentity {\\n\\tfunction isWhitelisted(address user) external view returns (bool);\\n\\n\\tfunction addWhitelistedWithDID(address account, string memory did) external;\\n\\n\\tfunction removeWhitelisted(address account) external;\\n\\n\\tfunction addBlacklisted(address account) external;\\n\\n\\tfunction removeBlacklisted(address account) external;\\n\\n\\tfunction isBlacklisted(address user) external view returns (bool);\\n\\n\\tfunction addIdentityAdmin(address account) external returns (bool);\\n\\n\\tfunction setAvatar(address _avatar) external;\\n\\n\\tfunction isIdentityAdmin(address account) external view returns (bool);\\n\\n\\tfunction owner() external view returns (address);\\n\\n\\tfunction removeContract(address account) external;\\n\\n\\tfunction isDAOContract(address account) external view returns (bool);\\n\\n\\tfunction addrToDID(address account) external view returns (string memory);\\n\\n\\tfunction didHashToAddress(bytes32 hash) external view returns (address);\\n\\n\\tfunction lastAuthenticated(address account) external view returns (uint256);\\n\\n\\tevent WhitelistedAdded(address user);\\n}\\n\\ninterface IIdentityV2 is IIdentity {\\n\\tfunction addWhitelistedWithDIDAndChain(\\n\\t\\taddress account,\\n\\t\\tstring memory did,\\n\\t\\tuint256 orgChainId,\\n\\t\\tuint256 dateAuthenticated\\n\\t) external;\\n\\n\\tfunction getWhitelistedRoot(\\n\\t\\taddress account\\n\\t) external view returns (address root);\\n}\\n\\ninterface IUBIScheme {\\n\\tfunction currentDay() external view returns (uint256);\\n\\n\\tfunction periodStart() external view returns (uint256);\\n\\n\\tfunction hasClaimed(address claimer) external view returns (bool);\\n}\\n\\ninterface IFirstClaimPool {\\n\\tfunction awardUser(address user) external returns (uint256);\\n\\n\\tfunction claimAmount() external view returns (uint256);\\n\\n\\tfunction end() external;\\n}\\n\\ninterface ProxyAdmin {\\n\\tfunction getProxyImplementation(\\n\\t\\taddress proxy\\n\\t) external view returns (address);\\n\\n\\tfunction getProxyAdmin(address proxy) external view returns (address);\\n\\n\\tfunction upgrade(address proxy, address implementation) external;\\n\\n\\tfunction owner() external view returns (address);\\n\\n\\tfunction transferOwnership(address newOwner) external;\\n\\n\\tfunction upgradeAndCall(\\n\\t\\taddress proxy,\\n\\t\\taddress implementation,\\n\\t\\tbytes memory data\\n\\t) external;\\n}\\n\\n/**\\n * @dev Interface for chainlink oracles to obtain price datas\\n */\\ninterface AggregatorV3Interface {\\n\\tfunction decimals() external view returns (uint8);\\n\\n\\tfunction description() external view returns (string memory);\\n\\n\\tfunction version() external view returns (uint256);\\n\\n\\t// getRoundData and latestRoundData should both raise \\\"No data present\\\"\\n\\t// if they do not have data to report, instead of returning unset values\\n\\t// which could be misinterpreted as actual reported values.\\n\\tfunction getRoundData(\\n\\t\\tuint80 _roundId\\n\\t)\\n\\t\\texternal\\n\\t\\tview\\n\\t\\treturns (\\n\\t\\t\\tuint80 roundId,\\n\\t\\t\\tint256 answer,\\n\\t\\t\\tuint256 startedAt,\\n\\t\\t\\tuint256 updatedAt,\\n\\t\\t\\tuint80 answeredInRound\\n\\t\\t);\\n\\n\\tfunction latestAnswer() external view returns (int256);\\n}\\n\\n/**\\n\\t@dev interface for AAVE lending Pool\\n */\\ninterface ILendingPool {\\n\\t/**\\n\\t * @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying aTokens.\\n\\t * - E.g. User deposits 100 USDC and gets in return 100 aUSDC\\n\\t * @param asset The address of the underlying asset to deposit\\n\\t * @param amount The amount to be deposited\\n\\t * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user\\n\\t *   wants to receive them on his own wallet, or a different address if the beneficiary of aTokens\\n\\t *   is a different wallet\\n\\t * @param referralCode Code used to register the integrator originating the operation, for potential rewards.\\n\\t *   0 if the action is executed directly by the user, without any middle-man\\n\\t **/\\n\\tfunction deposit(\\n\\t\\taddress asset,\\n\\t\\tuint256 amount,\\n\\t\\taddress onBehalfOf,\\n\\t\\tuint16 referralCode\\n\\t) external;\\n\\n\\t/**\\n\\t * @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned\\n\\t * E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC\\n\\t * @param asset The address of the underlying asset to withdraw\\n\\t * @param amount The underlying amount to be withdrawn\\n\\t *   - Send the value type(uint256).max in order to withdraw the whole aToken balance\\n\\t * @param to Address that will receive the underlying, same as msg.sender if the user\\n\\t *   wants to receive it on his own wallet, or a different address if the beneficiary is a\\n\\t *   different wallet\\n\\t * @return The final amount withdrawn\\n\\t **/\\n\\tfunction withdraw(\\n\\t\\taddress asset,\\n\\t\\tuint256 amount,\\n\\t\\taddress to\\n\\t) external returns (uint256);\\n\\n\\t/**\\n\\t * @dev Returns the state and configuration of the reserve\\n\\t * @param asset The address of the underlying asset of the reserve\\n\\t * @return The state of the reserve\\n\\t **/\\n\\tfunction getReserveData(\\n\\t\\taddress asset\\n\\t) external view returns (DataTypes.ReserveData memory);\\n}\\n\\ninterface IDonationStaking {\\n\\tfunction stakeDonations() external payable;\\n}\\n\\ninterface INameService {\\n\\tfunction getAddress(string memory _name) external view returns (address);\\n}\\n\\ninterface IAaveIncentivesController {\\n\\t/**\\n\\t * @dev Claims reward for an user, on all the assets of the lending pool, accumulating the pending rewards\\n\\t * @param amount Amount of rewards to claim\\n\\t * @param to Address that will be receiving the rewards\\n\\t * @return Rewards claimed\\n\\t **/\\n\\tfunction claimRewards(\\n\\t\\taddress[] calldata assets,\\n\\t\\tuint256 amount,\\n\\t\\taddress to\\n\\t) external returns (uint256);\\n\\n\\t/**\\n\\t * @dev Returns the total of rewards of an user, already accrued + not yet accrued\\n\\t * @param user The address of the user\\n\\t * @return The rewards\\n\\t **/\\n\\tfunction getRewardsBalance(\\n\\t\\taddress[] calldata assets,\\n\\t\\taddress user\\n\\t) external view returns (uint256);\\n}\\n\\ninterface IGoodStaking {\\n\\tfunction collectUBIInterest(\\n\\t\\taddress recipient\\n\\t) external returns (uint256, uint256, uint256);\\n\\n\\tfunction iToken() external view returns (address);\\n\\n\\tfunction currentGains(\\n\\t\\tbool _returnTokenBalanceInUSD,\\n\\t\\tbool _returnTokenGainsInUSD\\n\\t) external view returns (uint256, uint256, uint256, uint256, uint256);\\n\\n\\tfunction getRewardEarned(address user) external view returns (uint256);\\n\\n\\tfunction getGasCostForInterestTransfer() external view returns (uint256);\\n\\n\\tfunction rewardsMinted(\\n\\t\\taddress user,\\n\\t\\tuint256 rewardsPerBlock,\\n\\t\\tuint256 blockStart,\\n\\t\\tuint256 blockEnd\\n\\t) external returns (uint256);\\n}\\n\\ninterface IHasRouter {\\n\\tfunction getRouter() external view returns (Uniswap);\\n}\\n\\ninterface IAdminWallet {\\n\\tfunction addAdmins(address payable[] memory _admins) external;\\n\\n\\tfunction removeAdmins(address[] memory _admins) external;\\n\\n\\tfunction owner() external view returns (address);\\n\\n\\tfunction transferOwnership(address _owner) external;\\n}\\n\\ninterface IMultichainRouter {\\n\\t// Swaps `amount` `token` from this chain to `toChainID` chain with recipient `to`\\n\\tfunction anySwapOut(\\n\\t\\taddress token,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tuint256 toChainID\\n\\t) external;\\n\\n\\t// Swaps `amount` `token` from this chain to `toChainID` chain with recipient `to`\\n\\tfunction anySwapOutUnderlying(\\n\\t\\taddress token,\\n\\t\\taddress to,\\n\\t\\tuint256 amount,\\n\\t\\tuint256 toChainID\\n\\t) external;\\n}\\n\\n// @uniswap/v3-core\\ninterface ISwapRouter {\\n\\tstruct ExactInputSingleParams {\\n\\t\\taddress tokenIn;\\n\\t\\taddress tokenOut;\\n\\t\\tuint24 fee;\\n\\t\\taddress recipient;\\n\\t\\tuint256 amountIn;\\n\\t\\tuint256 amountOutMinimum;\\n\\t\\tuint160 sqrtPriceLimitX96;\\n\\t}\\n\\n\\t/// @notice Swaps `amountIn` of one token for as much as possible of another token\\n\\t/// @dev Setting `amountIn` to 0 will cause the contract to look up its own balance,\\n\\t/// and swap the entire amount, enabling contracts to send tokens before calling this function.\\n\\t/// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata\\n\\t/// @return amountOut The amount of the received token\\n\\tfunction exactInputSingle(\\n\\t\\tExactInputSingleParams calldata params\\n\\t) external payable returns (uint256 amountOut);\\n\\n\\tstruct ExactInputParams {\\n\\t\\tbytes path;\\n\\t\\taddress recipient;\\n\\t\\tuint256 amountIn;\\n\\t\\tuint256 amountOutMinimum;\\n\\t}\\n\\n\\t/// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path\\n\\t/// @dev Setting `amountIn` to 0 will cause the contract to look up its own balance,\\n\\t/// and swap the entire amount, enabling contracts to send tokens before calling this function.\\n\\t/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata\\n\\t/// @return amountOut The amount of the received token\\n\\tfunction exactInput(\\n\\t\\tExactInputParams calldata params\\n\\t) external payable returns (uint256 amountOut);\\n\\n\\tstruct ExactOutputSingleParams {\\n\\t\\taddress tokenIn;\\n\\t\\taddress tokenOut;\\n\\t\\tuint24 fee;\\n\\t\\taddress recipient;\\n\\t\\tuint256 amountOut;\\n\\t\\tuint256 amountInMaximum;\\n\\t\\tuint160 sqrtPriceLimitX96;\\n\\t}\\n\\n\\t/// @notice Swaps as little as possible of one token for `amountOut` of another token\\n\\t/// that may remain in the router after the swap.\\n\\t/// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata\\n\\t/// @return amountIn The amount of the input token\\n\\tfunction exactOutputSingle(\\n\\t\\tExactOutputSingleParams calldata params\\n\\t) external payable returns (uint256 amountIn);\\n\\n\\tstruct ExactOutputParams {\\n\\t\\tbytes path;\\n\\t\\taddress recipient;\\n\\t\\tuint256 amountOut;\\n\\t\\tuint256 amountInMaximum;\\n\\t}\\n\\n\\t/// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)\\n\\t/// that may remain in the router after the swap.\\n\\t/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata\\n\\t/// @return amountIn The amount of the input token\\n\\tfunction exactOutput(\\n\\t\\tExactOutputParams calldata params\\n\\t) external payable returns (uint256 amountIn);\\n}\\n\\ninterface IQuoterV2 {\\n\\t/// @notice Returns the amount out received for a given exact input swap without executing the swap\\n\\t/// @param path The path of the swap, i.e. each token pair and the pool fee\\n\\t/// @param amountIn The amount of the first token to swap\\n\\t/// @return amountOut The amount of the last token that would be received\\n\\t/// @return sqrtPriceX96AfterList List of the sqrt price after the swap for each pool in the path\\n\\t/// @return initializedTicksCrossedList List of the initialized ticks that the swap crossed for each pool in the path\\n\\t/// @return gasEstimate The estimate of the gas that the swap consumes\\n\\tfunction quoteExactInput(\\n\\t\\tbytes memory path,\\n\\t\\tuint256 amountIn\\n\\t)\\n\\t\\texternal\\n\\t\\treturns (\\n\\t\\t\\tuint256 amountOut,\\n\\t\\t\\tuint160[] memory sqrtPriceX96AfterList,\\n\\t\\t\\tuint32[] memory initializedTicksCrossedList,\\n\\t\\t\\tuint256 gasEstimate\\n\\t\\t);\\n\\n\\tstruct QuoteExactInputSingleParams {\\n\\t\\taddress tokenIn;\\n\\t\\taddress tokenOut;\\n\\t\\tuint256 amountIn;\\n\\t\\tuint24 fee;\\n\\t\\tuint160 sqrtPriceLimitX96;\\n\\t}\\n\\n\\t/// @notice Returns the amount out received for a given exact input but for a swap of a single pool\\n\\t/// @param params The params for the quote, encoded as `QuoteExactInputSingleParams`\\n\\t/// tokenIn The token being swapped in\\n\\t/// tokenOut The token being swapped out\\n\\t/// fee The fee of the token pool to consider for the pair\\n\\t/// amountIn The desired input amount\\n\\t/// sqrtPriceLimitX96 The price limit of the pool that cannot be exceeded by the swap\\n\\t/// @return amountOut The amount of `tokenOut` that would be received\\n\\t/// @return sqrtPriceX96After The sqrt price of the pool after the swap\\n\\t/// @return initializedTicksCrossed The number of initialized ticks that the swap crossed\\n\\t/// @return gasEstimate The estimate of the gas that the swap consumes\\n\\tfunction quoteExactInputSingle(\\n\\t\\tQuoteExactInputSingleParams memory params\\n\\t)\\n\\t\\texternal\\n\\t\\treturns (\\n\\t\\t\\tuint256 amountOut,\\n\\t\\t\\tuint160 sqrtPriceX96After,\\n\\t\\t\\tuint32 initializedTicksCrossed,\\n\\t\\t\\tuint256 gasEstimate\\n\\t\\t);\\n}\\n\",\"keccak256\":\"0xcd7659c3f640ba6d550def777a1ce0b5b33693ba62bd2be054c0890ca18f5e7c\",\"license\":\"MIT\"},\"@gooddollar/goodprotocol/contracts/utils/DAOContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\nimport \\\"../DAOStackInterfaces.sol\\\";\\nimport \\\"../Interfaces.sol\\\";\\n\\n/**\\n@title Simple contract that keeps DAO contracts registery\\n*/\\n\\ncontract DAOContract {\\n\\tController public dao;\\n\\n\\taddress public avatar;\\n\\n\\tINameService public nameService;\\n\\n\\tfunction _onlyAvatar() internal view {\\n\\t\\trequire(\\n\\t\\t\\taddress(dao.avatar()) == msg.sender,\\n\\t\\t\\t\\\"only avatar can call this method\\\"\\n\\t\\t);\\n\\t}\\n\\n\\tfunction setDAO(INameService _ns) internal {\\n\\t\\tnameService = _ns;\\n\\t\\tupdateAvatar();\\n\\t}\\n\\n\\tfunction updateAvatar() public {\\n\\t\\tdao = Controller(nameService.getAddress(\\\"CONTROLLER\\\"));\\n\\t\\tavatar = dao.avatar();\\n\\t}\\n\\n\\tfunction nativeToken() public view returns (IGoodDollar) {\\n\\t\\treturn IGoodDollar(nameService.getAddress(\\\"GOODDOLLAR\\\"));\\n\\t}\\n\\n\\tuint256[50] private gap;\\n}\\n\",\"keccak256\":\"0x82eb2588243e03c753d5e999514c50c01bb08aae30e4b025980dc4cb5b085b7b\",\"license\":\"MIT\"},\"@gooddollar/goodprotocol/contracts/utils/DAOUpgradeableContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\n\\nimport \\\"./DAOContract.sol\\\";\\n\\n/**\\n@title Simple contract that adds upgradability to DAOContract\\n*/\\n\\ncontract DAOUpgradeableContract is Initializable, UUPSUpgradeable, DAOContract {\\n\\tfunction _authorizeUpgrade(address) internal virtual override {\\n\\t\\t_onlyAvatar();\\n\\t}\\n}\\n\",\"keccak256\":\"0xecb2c36f87418eb33eb3877e0fab5711c1a9c2d6ceabfb0edeb2ad2b172ecdc2\",\"license\":\"MIT\"},\"@gooddollar/goodprotocol/contracts/utils/DataTypes.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\n\\nlibrary DataTypes {\\n\\t// refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties.\\n\\tstruct ReserveData {\\n\\t\\t//stores the reserve configuration\\n\\t\\tReserveConfigurationMap configuration;\\n\\t\\t//the liquidity index. Expressed in ray\\n\\t\\tuint128 liquidityIndex;\\n\\t\\t//variable borrow index. Expressed in ray\\n\\t\\tuint128 variableBorrowIndex;\\n\\t\\t//the current supply rate. Expressed in ray\\n\\t\\tuint128 currentLiquidityRate;\\n\\t\\t//the current variable borrow rate. Expressed in ray\\n\\t\\tuint128 currentVariableBorrowRate;\\n\\t\\t//the current stable borrow rate. Expressed in ray\\n\\t\\tuint128 currentStableBorrowRate;\\n\\t\\tuint40 lastUpdateTimestamp;\\n\\t\\t//tokens addresses\\n\\t\\taddress aTokenAddress;\\n\\t\\taddress stableDebtTokenAddress;\\n\\t\\taddress variableDebtTokenAddress;\\n\\t\\t//address of the interest rate strategy\\n\\t\\taddress interestRateStrategyAddress;\\n\\t\\t//the id of the reserve. Represents the position in the list of the active reserves\\n\\t\\tuint8 id;\\n\\t}\\n\\n\\tstruct ReserveConfigurationMap {\\n\\t\\t//bit 0-15: LTV\\n\\t\\t//bit 16-31: Liq. threshold\\n\\t\\t//bit 32-47: Liq. bonus\\n\\t\\t//bit 48-55: Decimals\\n\\t\\t//bit 56: Reserve is active\\n\\t\\t//bit 57: reserve is frozen\\n\\t\\t//bit 58: borrowing is enabled\\n\\t\\t//bit 59: stable rate borrowing enabled\\n\\t\\t//bit 60-63: reserved\\n\\t\\t//bit 64-79: reserve factor\\n\\t\\tuint256 data;\\n\\t}\\n\\tenum InterestRateMode { NONE, STABLE, VARIABLE }\\n}\\n\",\"keccak256\":\"0xbc0c2512438c5b8d92e7ecd3c4d0848edf24ef0bacaf51744048173f60a2114c\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/contracts-upgradable/interfaces/ILayerZeroEndpointUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"./ILayerZeroUserApplicationConfigUpgradeable.sol\\\";\\n\\ninterface ILayerZeroEndpointUpgradeable is ILayerZeroUserApplicationConfigUpgradeable {\\n    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.\\n    // @param _dstChainId - the destination chain identifier\\n    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains\\n    // @param _payload - a custom bytes payload to send to the destination contract\\n    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address\\n    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction\\n    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination\\n    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;\\n\\n    // @notice used by the messaging library to publish verified payload\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source contract (as bytes) at the source chain\\n    // @param _dstAddress - the address on destination chain\\n    // @param _nonce - the unbound message ordering nonce\\n    // @param _gasLimit - the gas limit for external contract execution\\n    // @param _payload - verified payload to send to the destination contract\\n    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;\\n\\n    // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source chain contract address\\n    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);\\n\\n    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM\\n    // @param _srcAddress - the source chain contract address\\n    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);\\n\\n    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery\\n    // @param _dstChainId - the destination chain identifier\\n    // @param _userApplication - the user app address on this EVM chain\\n    // @param _payload - the custom message to send over LayerZero\\n    // @param _payInZRO - if false, user app pays the protocol fee in native token\\n    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain\\n    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);\\n\\n    // @notice get this Endpoint's immutable source identifier\\n    function getChainId() external view returns (uint16);\\n\\n    // @notice the interface to retry failed message on this Endpoint destination\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source chain contract address\\n    // @param _payload - the payload to be retried\\n    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;\\n\\n    // @notice query if any STORED payload (message blocking) at the endpoint.\\n    // @param _srcChainId - the source chain identifier\\n    // @param _srcAddress - the source chain contract address\\n    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);\\n\\n    // @notice query if the _libraryAddress is valid for sending msgs.\\n    // @param _userApplication - the user app address on this EVM chain\\n    function getSendLibraryAddress(address _userApplication) external view returns (address);\\n\\n    // @notice query if the _libraryAddress is valid for receiving msgs.\\n    // @param _userApplication - the user app address on this EVM chain\\n    function getReceiveLibraryAddress(address _userApplication) external view returns (address);\\n\\n    // @notice query if the non-reentrancy guard for send() is on\\n    // @return true if the guard is on. false otherwise\\n    function isSendingPayload() external view returns (bool);\\n\\n    // @notice query if the non-reentrancy guard for receive() is on\\n    // @return true if the guard is on. false otherwise\\n    function isReceivingPayload() external view returns (bool);\\n\\n    // @notice get the configuration of the LayerZero messaging library of the specified version\\n    // @param _version - messaging library version\\n    // @param _chainId - the chainId for the pending config change\\n    // @param _userApplication - the contract address of the user application\\n    // @param _configType - type of configuration. every messaging library has its own convention.\\n    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);\\n\\n    // @notice get the send() LayerZero messaging library version\\n    // @param _userApplication - the contract address of the user application\\n    function getSendVersion(address _userApplication) external view returns (uint16);\\n\\n    // @notice get the lzReceive() LayerZero messaging library version\\n    // @param _userApplication - the contract address of the user application\\n    function getReceiveVersion(address _userApplication) external view returns (uint16);\\n}\\n\",\"keccak256\":\"0x748e7abf8908f264c6fff8ea7730b1766ab5a262be7962404f7d263066b41487\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/contracts-upgradable/interfaces/ILayerZeroReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\ninterface ILayerZeroReceiverUpgradeable {\\n    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination\\n    // @param _srcChainId - the source endpoint identifier\\n    // @param _srcAddress - the source sending contract address from the source chain\\n    // @param _nonce - the ordered message nonce\\n    // @param _payload - the signed payload is the UA bytes has encoded to be sent\\n    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;\\n}\\n\",\"keccak256\":\"0x6ce5593a1247719f7209cad8068573c249674b41b859c6379ace1baaea0ed2a3\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/contracts-upgradable/interfaces/ILayerZeroUserApplicationConfigUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\ninterface ILayerZeroUserApplicationConfigUpgradeable {\\n    // @notice set the configuration of the LayerZero messaging library of the specified version\\n    // @param _version - messaging library version\\n    // @param _chainId - the chainId for the pending config change\\n    // @param _configType - type of configuration. every messaging library has its own convention.\\n    // @param _config - configuration in the bytes. can encode arbitrary content.\\n    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;\\n\\n    // @notice set the send() LayerZero messaging library version to _version\\n    // @param _version - new messaging library version\\n    function setSendVersion(uint16 _version) external;\\n\\n    // @notice set the lzReceive() LayerZero messaging library version to _version\\n    // @param _version - new messaging library version\\n    function setReceiveVersion(uint16 _version) external;\\n\\n    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload\\n    // @param _srcChainId - the chainId of the source chain\\n    // @param _srcAddress - the contract address of the source contract at the source chain\\n    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;\\n}\\n\",\"keccak256\":\"0xa808baa32db12c453b982320e0c9a8c07aec8c0f3bb36ac2ed26f3ad47476879\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/contracts-upgradable/lzApp/LzAppUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"../interfaces/ILayerZeroReceiverUpgradeable.sol\\\";\\nimport \\\"../interfaces/ILayerZeroUserApplicationConfigUpgradeable.sol\\\";\\nimport \\\"../interfaces/ILayerZeroEndpointUpgradeable.sol\\\";\\nimport \\\"../../util/BytesLib.sol\\\";\\n\\n/*\\n * a generic LzReceiver implementation\\n */\\nabstract contract LzAppUpgradeable is Initializable, OwnableUpgradeable, ILayerZeroReceiverUpgradeable, ILayerZeroUserApplicationConfigUpgradeable {\\n    using BytesLib for bytes;\\n\\n    // ua can not send payload larger than this by default, but it can be changed by the ua owner\\n    uint constant public DEFAULT_PAYLOAD_SIZE_LIMIT = 10000;\\n\\n    ILayerZeroEndpointUpgradeable public lzEndpoint;\\n    mapping(uint16 => bytes) public trustedRemoteLookup;\\n    mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup;\\n    mapping(uint16 => uint) public payloadSizeLimitLookup;\\n    address public precrime;\\n\\n    event SetPrecrime(address precrime);\\n    event SetTrustedRemote(uint16 _remoteChainId, bytes _path);\\n    event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress);\\n    event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas);\\n\\n    function __LzAppUpgradeable_init(address _endpoint) internal onlyInitializing {\\n        __Ownable_init_unchained();\\n        __LzAppUpgradeable_init_unchained(_endpoint);\\n    }\\n\\n    function __LzAppUpgradeable_init_unchained(address _endpoint) internal onlyInitializing {\\n        lzEndpoint = ILayerZeroEndpointUpgradeable(_endpoint);\\n    }\\n\\n    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual override {\\n        // lzReceive must be called by the endpoint for security\\n        require(_msgSender() == address(lzEndpoint), \\\"LzApp: invalid endpoint caller\\\");\\n\\n        bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];\\n        // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.\\n        require(_srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), \\\"LzApp: invalid source sending contract\\\");\\n\\n        _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);\\n    }\\n\\n    // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging\\n    function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;\\n\\n    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint _nativeFee) internal virtual {\\n        bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];\\n        require(trustedRemote.length != 0, \\\"LzApp: destination chain is not a trusted source\\\");\\n        _checkPayloadSize(_dstChainId, _payload.length);\\n        lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams);\\n    }\\n\\n    function _checkGasLimit(uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas) internal view virtual {\\n        uint providedGasLimit = _getGasLimit(_adapterParams);\\n        uint minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas;\\n        require(minGasLimit > 0, \\\"LzApp: minGasLimit not set\\\");\\n        require(providedGasLimit >= minGasLimit, \\\"LzApp: gas limit is too low\\\");\\n    }\\n\\n    function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) {\\n        require(_adapterParams.length >= 34, \\\"LzApp: invalid adapterParams\\\");\\n        assembly {\\n            gasLimit := mload(add(_adapterParams, 34))\\n        }\\n    }\\n\\n    function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual {\\n        uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId];\\n        if (payloadSizeLimit == 0) { // use default if not set\\n            payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT;\\n        }\\n        require(_payloadSize <= payloadSizeLimit, \\\"LzApp: payload size is too large\\\");\\n    }\\n\\n    //---------------------------UserApplication config----------------------------------------\\n    function getConfig(uint16 _version, uint16 _chainId, address, uint _configType) external view returns (bytes memory) {\\n        return lzEndpoint.getConfig(_version, _chainId, address(this), _configType);\\n    }\\n\\n    // generic config for LayerZero user Application\\n    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner {\\n        lzEndpoint.setConfig(_version, _chainId, _configType, _config);\\n    }\\n\\n    function setSendVersion(uint16 _version) external override onlyOwner {\\n        lzEndpoint.setSendVersion(_version);\\n    }\\n\\n    function setReceiveVersion(uint16 _version) external override onlyOwner {\\n        lzEndpoint.setReceiveVersion(_version);\\n    }\\n\\n    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {\\n        lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress);\\n    }\\n\\n    // _path = abi.encodePacked(remoteAddress, localAddress)\\n    // this function set the trusted path for the cross-chain communication\\n    function setTrustedRemote(uint16 _srcChainId, bytes calldata _path) external onlyOwner {\\n        trustedRemoteLookup[_srcChainId] = _path;\\n        emit SetTrustedRemote(_srcChainId, _path);\\n    }\\n\\n    function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner {\\n        trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this));\\n        emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress);\\n    }\\n\\n    function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) {\\n        bytes memory path = trustedRemoteLookup[_remoteChainId];\\n        require(path.length != 0, \\\"LzApp: no trusted path record\\\");\\n        return path.slice(0, path.length - 20); // the last 20 bytes should be address(this)\\n    }\\n\\n    function setPrecrime(address _precrime) external onlyOwner {\\n        precrime = _precrime;\\n        emit SetPrecrime(_precrime);\\n    }\\n\\n    function setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint _minGas) external onlyOwner {\\n        require(_minGas > 0, \\\"LzApp: invalid minGas\\\");\\n        minDstGasLookup[_dstChainId][_packetType] = _minGas;\\n        emit SetMinDstGas(_dstChainId, _packetType, _minGas);\\n    }\\n\\n    // if the size is 0, it means default size limit\\n    function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner {\\n        payloadSizeLimitLookup[_dstChainId] = _size;\\n    }\\n\\n    //--------------------------- VIEW FUNCTION ----------------------------------------\\n    function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) {\\n        bytes memory trustedSource = trustedRemoteLookup[_srcChainId];\\n        return keccak256(trustedSource) == keccak256(_srcAddress);\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint[45] private __gap;\\n}\\n\",\"keccak256\":\"0xdb4821e980d9ae21ed437cdcedbdac901253f2411f518704eaa1de9af250f4b0\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/contracts-upgradable/lzApp/NonblockingLzAppUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"./LzAppUpgradeable.sol\\\";\\nimport \\\"../../util/ExcessivelySafeCall.sol\\\";\\n\\n/*\\n * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel\\n * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking\\n * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress)\\n */\\nabstract contract NonblockingLzAppUpgradeable is Initializable, LzAppUpgradeable {\\n    using ExcessivelySafeCall for address;\\n\\n    function __NonblockingLzAppUpgradeable_init(address _endpoint) internal onlyInitializing {\\n        __Ownable_init_unchained();\\n        __LzAppUpgradeable_init_unchained(_endpoint);\\n    }\\n\\n    function __NonblockingLzAppUpgradeable_init_unchained(address _endpoint) internal onlyInitializing {}\\n\\n    mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages;\\n\\n    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason);\\n    event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash);\\n\\n    // overriding the virtual function in LzReceiver\\n    function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override {\\n        (bool success, bytes memory reason) = address(this).excessivelySafeCall(gasleft(), 150, abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload));\\n        // try-catch all errors/exceptions\\n        if (!success) {\\n            _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason);\\n        }\\n    }\\n\\n    function _storeFailedMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload, bytes memory _reason) internal virtual {\\n        failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);\\n        emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason);\\n    }\\n\\n    function nonblockingLzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public virtual {\\n        // only internal transaction\\n        require(_msgSender() == address(this), \\\"NonblockingLzApp: caller must be LzApp\\\");\\n        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);\\n    }\\n\\n    //@notice override this function\\n    function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual;\\n\\n    function retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) public payable virtual {\\n        // assert there is message to retry\\n        bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce];\\n        require(payloadHash != bytes32(0), \\\"NonblockingLzApp: no stored message\\\");\\n        require(keccak256(_payload) == payloadHash, \\\"NonblockingLzApp: invalid payload\\\");\\n        // clear the stored message\\n        failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);\\n        // execute the message. revert if it fails again\\n        _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);\\n        emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash);\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint[49] private __gap;\\n}\\n\",\"keccak256\":\"0x128f7c8d0d1d04c147cea7a2a6c2244387bef408f2a6f0a9c2a01cf54a66eea3\",\"license\":\"MIT\"},\"@layerzerolabs/solidity-examples/contracts/util/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: Unlicense\\n/*\\n * @title Solidity Bytes Arrays Utils\\n * @author Gon\\u00e7alo S\\u00e1 <goncalo.sa@consensys.net>\\n *\\n * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.\\n *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.\\n */\\npragma solidity >=0.8.0 <0.9.0;\\n\\n\\nlibrary BytesLib {\\n    function concat(\\n        bytes memory _preBytes,\\n        bytes memory _postBytes\\n    )\\n    internal\\n    pure\\n    returns (bytes memory)\\n    {\\n        bytes memory tempBytes;\\n\\n        assembly {\\n        // Get a location of some free memory and store it in tempBytes as\\n        // Solidity does for memory variables.\\n            tempBytes := mload(0x40)\\n\\n        // Store the length of the first bytes array at the beginning of\\n        // the memory for tempBytes.\\n            let length := mload(_preBytes)\\n            mstore(tempBytes, length)\\n\\n        // Maintain a memory counter for the current write location in the\\n        // temp bytes array by adding the 32 bytes for the array length to\\n        // the starting location.\\n            let mc := add(tempBytes, 0x20)\\n        // Stop copying when the memory counter reaches the length of the\\n        // first bytes array.\\n            let end := add(mc, length)\\n\\n            for {\\n            // Initialize a copy counter to the start of the _preBytes data,\\n            // 32 bytes into its memory.\\n                let cc := add(_preBytes, 0x20)\\n            } lt(mc, end) {\\n            // Increase both counters by 32 bytes each iteration.\\n                mc := add(mc, 0x20)\\n                cc := add(cc, 0x20)\\n            } {\\n            // Write the _preBytes data into the tempBytes memory 32 bytes\\n            // at a time.\\n                mstore(mc, mload(cc))\\n            }\\n\\n        // Add the length of _postBytes to the current length of tempBytes\\n        // and store it as the new length in the first 32 bytes of the\\n        // tempBytes memory.\\n            length := mload(_postBytes)\\n            mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n        // Move the memory counter back from a multiple of 0x20 to the\\n        // actual end of the _preBytes data.\\n            mc := end\\n        // Stop copying when the memory counter reaches the new combined\\n        // length of the arrays.\\n            end := add(mc, length)\\n\\n            for {\\n                let cc := add(_postBytes, 0x20)\\n            } lt(mc, end) {\\n                mc := add(mc, 0x20)\\n                cc := add(cc, 0x20)\\n            } {\\n                mstore(mc, mload(cc))\\n            }\\n\\n        // Update the free-memory pointer by padding our last write location\\n        // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n        // next 32 byte block, then round down to the nearest multiple of\\n        // 32. If the sum of the length of the two arrays is zero then add\\n        // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n            mstore(0x40, and(\\n            add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n            not(31) // Round down to the nearest 32 bytes.\\n            ))\\n        }\\n\\n        return tempBytes;\\n    }\\n\\n    function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n        assembly {\\n        // Read the first 32 bytes of _preBytes storage, which is the length\\n        // of the array. (We don't need to use the offset into the slot\\n        // because arrays use the entire slot.)\\n            let fslot := sload(_preBytes.slot)\\n        // Arrays of 31 bytes or less have an even value in their slot,\\n        // while longer arrays have an odd value. The actual length is\\n        // the slot divided by two for odd values, and the lowest order\\n        // byte divided by two for even values.\\n        // If the slot is even, bitwise and the slot with 255 and divide by\\n        // two to get the length. If the slot is odd, bitwise and the slot\\n        // with -1 and divide by two.\\n            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n            let mlength := mload(_postBytes)\\n            let newlength := add(slength, mlength)\\n        // slength can contain both the length and contents of the array\\n        // if length < 32 bytes so let's prepare for that\\n        // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n            switch add(lt(slength, 32), lt(newlength, 32))\\n            case 2 {\\n            // Since the new array still fits in the slot, we just need to\\n            // update the contents of the slot.\\n            // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n                sstore(\\n                _preBytes.slot,\\n                // all the modifications to the slot are inside this\\n                // next block\\n                add(\\n                // we can just add to the slot contents because the\\n                // bytes we want to change are the LSBs\\n                fslot,\\n                add(\\n                mul(\\n                div(\\n                // load the bytes from memory\\n                mload(add(_postBytes, 0x20)),\\n                // zero all bytes to the right\\n                exp(0x100, sub(32, mlength))\\n                ),\\n                // and now shift left the number of bytes to\\n                // leave space for the length in the slot\\n                exp(0x100, sub(32, newlength))\\n                ),\\n                // increase length by the double of the memory\\n                // bytes length\\n                mul(mlength, 2)\\n                )\\n                )\\n                )\\n            }\\n            case 1 {\\n            // The stored value fits in the slot, but the combined value\\n            // will exceed it.\\n            // get the keccak hash to get the contents of the array\\n                mstore(0x0, _preBytes.slot)\\n                let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n            // save new length\\n                sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n            // The contents of the _postBytes array start 32 bytes into\\n            // the structure. Our first read should obtain the `submod`\\n            // bytes that can fit into the unused space in the last word\\n            // of the stored array. To get this, we read 32 bytes starting\\n            // from `submod`, so the data we read overlaps with the array\\n            // contents by `submod` bytes. Masking the lowest-order\\n            // `submod` bytes allows us to add that value directly to the\\n            // stored value.\\n\\n                let submod := sub(32, slength)\\n                let mc := add(_postBytes, submod)\\n                let end := add(_postBytes, mlength)\\n                let mask := sub(exp(0x100, submod), 1)\\n\\n                sstore(\\n                sc,\\n                add(\\n                and(\\n                fslot,\\n                0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\\n                ),\\n                and(mload(mc), mask)\\n                )\\n                )\\n\\n                for {\\n                    mc := add(mc, 0x20)\\n                    sc := add(sc, 1)\\n                } lt(mc, end) {\\n                    sc := add(sc, 1)\\n                    mc := add(mc, 0x20)\\n                } {\\n                    sstore(sc, mload(mc))\\n                }\\n\\n                mask := exp(0x100, sub(mc, end))\\n\\n                sstore(sc, mul(div(mload(mc), mask), mask))\\n            }\\n            default {\\n            // get the keccak hash to get the contents of the array\\n                mstore(0x0, _preBytes.slot)\\n            // Start copying to the last used word of the stored array.\\n                let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n            // save new length\\n                sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n            // Copy over the first `submod` bytes of the new data as in\\n            // case 1 above.\\n                let slengthmod := mod(slength, 32)\\n                let mlengthmod := mod(mlength, 32)\\n                let submod := sub(32, slengthmod)\\n                let mc := add(_postBytes, submod)\\n                let end := add(_postBytes, mlength)\\n                let mask := sub(exp(0x100, submod), 1)\\n\\n                sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n                for {\\n                    sc := add(sc, 1)\\n                    mc := add(mc, 0x20)\\n                } lt(mc, end) {\\n                    sc := add(sc, 1)\\n                    mc := add(mc, 0x20)\\n                } {\\n                    sstore(sc, mload(mc))\\n                }\\n\\n                mask := exp(0x100, sub(mc, end))\\n\\n                sstore(sc, mul(div(mload(mc), mask), mask))\\n            }\\n        }\\n    }\\n\\n    function slice(\\n        bytes memory _bytes,\\n        uint256 _start,\\n        uint256 _length\\n    )\\n    internal\\n    pure\\n    returns (bytes memory)\\n    {\\n        require(_length + 31 >= _length, \\\"slice_overflow\\\");\\n        require(_bytes.length >= _start + _length, \\\"slice_outOfBounds\\\");\\n\\n        bytes memory tempBytes;\\n\\n        assembly {\\n            switch iszero(_length)\\n            case 0 {\\n            // Get a location of some free memory and store it in tempBytes as\\n            // Solidity does for memory variables.\\n                tempBytes := mload(0x40)\\n\\n            // The first word of the slice result is potentially a partial\\n            // word read from the original array. To read it, we calculate\\n            // the length of that partial word and start copying that many\\n            // bytes into the array. The first word we copy will start with\\n            // data we don't care about, but the last `lengthmod` bytes will\\n            // land at the beginning of the contents of the new array. When\\n            // we're done copying, we overwrite the full first word with\\n            // the actual length of the slice.\\n                let lengthmod := and(_length, 31)\\n\\n            // The multiplication in the next line is necessary\\n            // because when slicing multiples of 32 bytes (lengthmod == 0)\\n            // the following copy loop was copying the origin's length\\n            // and then ending prematurely not copying everything it should.\\n                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))\\n                let end := add(mc, _length)\\n\\n                for {\\n                // The multiplication in the next line has the same exact purpose\\n                // as the one above.\\n                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)\\n                } lt(mc, end) {\\n                    mc := add(mc, 0x20)\\n                    cc := add(cc, 0x20)\\n                } {\\n                    mstore(mc, mload(cc))\\n                }\\n\\n                mstore(tempBytes, _length)\\n\\n            //update free-memory pointer\\n            //allocating the array padded to 32 bytes like the compiler does now\\n                mstore(0x40, and(add(mc, 31), not(31)))\\n            }\\n            //if we want a zero-length slice let's just return a zero-length array\\n            default {\\n                tempBytes := mload(0x40)\\n            //zero out the 32 bytes slice we are about to return\\n            //we need to do it because Solidity does not garbage collect\\n                mstore(tempBytes, 0)\\n\\n                mstore(0x40, add(tempBytes, 0x20))\\n            }\\n        }\\n\\n        return tempBytes;\\n    }\\n\\n    function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {\\n        require(_bytes.length >= _start + 20, \\\"toAddress_outOfBounds\\\");\\n        address tempAddress;\\n\\n        assembly {\\n            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n        }\\n\\n        return tempAddress;\\n    }\\n\\n    function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {\\n        require(_bytes.length >= _start + 1 , \\\"toUint8_outOfBounds\\\");\\n        uint8 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x1), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {\\n        require(_bytes.length >= _start + 2, \\\"toUint16_outOfBounds\\\");\\n        uint16 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x2), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {\\n        require(_bytes.length >= _start + 4, \\\"toUint32_outOfBounds\\\");\\n        uint32 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x4), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {\\n        require(_bytes.length >= _start + 8, \\\"toUint64_outOfBounds\\\");\\n        uint64 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x8), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {\\n        require(_bytes.length >= _start + 12, \\\"toUint96_outOfBounds\\\");\\n        uint96 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0xc), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {\\n        require(_bytes.length >= _start + 16, \\\"toUint128_outOfBounds\\\");\\n        uint128 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x10), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {\\n        require(_bytes.length >= _start + 32, \\\"toUint256_outOfBounds\\\");\\n        uint256 tempUint;\\n\\n        assembly {\\n            tempUint := mload(add(add(_bytes, 0x20), _start))\\n        }\\n\\n        return tempUint;\\n    }\\n\\n    function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {\\n        require(_bytes.length >= _start + 32, \\\"toBytes32_outOfBounds\\\");\\n        bytes32 tempBytes32;\\n\\n        assembly {\\n            tempBytes32 := mload(add(add(_bytes, 0x20), _start))\\n        }\\n\\n        return tempBytes32;\\n    }\\n\\n    function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n        bool success = true;\\n\\n        assembly {\\n            let length := mload(_preBytes)\\n\\n        // if lengths don't match the arrays are not equal\\n            switch eq(length, mload(_postBytes))\\n            case 1 {\\n            // cb is a circuit breaker in the for loop since there's\\n            //  no said feature for inline assembly loops\\n            // cb = 1 - don't breaker\\n            // cb = 0 - break\\n                let cb := 1\\n\\n                let mc := add(_preBytes, 0x20)\\n                let end := add(mc, length)\\n\\n                for {\\n                    let cc := add(_postBytes, 0x20)\\n                // the next line is the loop condition:\\n                // while(uint256(mc < end) + cb == 2)\\n                } eq(add(lt(mc, end), cb), 2) {\\n                    mc := add(mc, 0x20)\\n                    cc := add(cc, 0x20)\\n                } {\\n                // if any of these checks fails then arrays are not equal\\n                    if iszero(eq(mload(mc), mload(cc))) {\\n                    // unsuccess:\\n                        success := 0\\n                        cb := 0\\n                    }\\n                }\\n            }\\n            default {\\n            // unsuccess:\\n                success := 0\\n            }\\n        }\\n\\n        return success;\\n    }\\n\\n    function equalStorage(\\n        bytes storage _preBytes,\\n        bytes memory _postBytes\\n    )\\n    internal\\n    view\\n    returns (bool)\\n    {\\n        bool success = true;\\n\\n        assembly {\\n        // we know _preBytes_offset is 0\\n            let fslot := sload(_preBytes.slot)\\n        // Decode the length of the stored array like in concatStorage().\\n            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n            let mlength := mload(_postBytes)\\n\\n        // if lengths don't match the arrays are not equal\\n            switch eq(slength, mlength)\\n            case 1 {\\n            // slength can contain both the length and contents of the array\\n            // if length < 32 bytes so let's prepare for that\\n            // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n                if iszero(iszero(slength)) {\\n                    switch lt(slength, 32)\\n                    case 1 {\\n                    // blank the last byte which is the length\\n                        fslot := mul(div(fslot, 0x100), 0x100)\\n\\n                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n                        // unsuccess:\\n                            success := 0\\n                        }\\n                    }\\n                    default {\\n                    // cb is a circuit breaker in the for loop since there's\\n                    //  no said feature for inline assembly loops\\n                    // cb = 1 - don't breaker\\n                    // cb = 0 - break\\n                        let cb := 1\\n\\n                    // get the keccak hash to get the contents of the array\\n                        mstore(0x0, _preBytes.slot)\\n                        let sc := keccak256(0x0, 0x20)\\n\\n                        let mc := add(_postBytes, 0x20)\\n                        let end := add(mc, mlength)\\n\\n                    // the next line is the loop condition:\\n                    // while(uint256(mc < end) + cb == 2)\\n                        for {} eq(add(lt(mc, end), cb), 2) {\\n                            sc := add(sc, 1)\\n                            mc := add(mc, 0x20)\\n                        } {\\n                            if iszero(eq(sload(sc), mload(mc))) {\\n                            // unsuccess:\\n                                success := 0\\n                                cb := 0\\n                            }\\n                        }\\n                    }\\n                }\\n            }\\n            default {\\n            // unsuccess:\\n                success := 0\\n            }\\n        }\\n\\n        return success;\\n    }\\n}\\n\",\"keccak256\":\"0x2255aadad70e87ed42b158776330175644b07fbbc7e77ed32cd6330974abbcee\",\"license\":\"Unlicense\"},\"@layerzerolabs/solidity-examples/contracts/util/ExcessivelySafeCall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT OR Apache-2.0\\npragma solidity >=0.7.6;\\n\\nlibrary ExcessivelySafeCall {\\n    uint256 constant LOW_28_MASK =\\n    0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;\\n\\n    /// @notice Use when you _really_ really _really_ don't trust the called\\n    /// contract. This prevents the called contract from causing reversion of\\n    /// the caller in as many ways as we can.\\n    /// @dev The main difference between this and a solidity low-level call is\\n    /// that we limit the number of bytes that the callee can cause to be\\n    /// copied to caller memory. This prevents stupid things like malicious\\n    /// contracts returning 10,000,000 bytes causing a local OOG when copying\\n    /// to memory.\\n    /// @param _target The address to call\\n    /// @param _gas The amount of gas to forward to the remote contract\\n    /// @param _maxCopy The maximum number of bytes of returndata to copy\\n    /// to memory.\\n    /// @param _calldata The data to send to the remote contract\\n    /// @return success and returndata, as `.call()`. Returndata is capped to\\n    /// `_maxCopy` bytes.\\n    function excessivelySafeCall(\\n        address _target,\\n        uint256 _gas,\\n        uint16 _maxCopy,\\n        bytes memory _calldata\\n    ) internal returns (bool, bytes memory) {\\n        // set up for assembly call\\n        uint256 _toCopy;\\n        bool _success;\\n        bytes memory _returnData = new bytes(_maxCopy);\\n        // dispatch message to recipient\\n        // by assembly calling \\\"handle\\\" function\\n        // we call via assembly to avoid memcopying a very large returndata\\n        // returned by a malicious contract\\n        assembly {\\n            _success := call(\\n            _gas, // gas\\n            _target, // recipient\\n            0, // ether value\\n            add(_calldata, 0x20), // inloc\\n            mload(_calldata), // inlen\\n            0, // outloc\\n            0 // outlen\\n            )\\n        // limit our copy to 256 bytes\\n            _toCopy := returndatasize()\\n            if gt(_toCopy, _maxCopy) {\\n                _toCopy := _maxCopy\\n            }\\n        // Store the length of the copied bytes\\n            mstore(_returnData, _toCopy)\\n        // copy the bytes from returndata[0:_toCopy]\\n            returndatacopy(add(_returnData, 0x20), 0, _toCopy)\\n        }\\n        return (_success, _returnData);\\n    }\\n\\n    /// @notice Use when you _really_ really _really_ don't trust the called\\n    /// contract. This prevents the called contract from causing reversion of\\n    /// the caller in as many ways as we can.\\n    /// @dev The main difference between this and a solidity low-level call is\\n    /// that we limit the number of bytes that the callee can cause to be\\n    /// copied to caller memory. This prevents stupid things like malicious\\n    /// contracts returning 10,000,000 bytes causing a local OOG when copying\\n    /// to memory.\\n    /// @param _target The address to call\\n    /// @param _gas The amount of gas to forward to the remote contract\\n    /// @param _maxCopy The maximum number of bytes of returndata to copy\\n    /// to memory.\\n    /// @param _calldata The data to send to the remote contract\\n    /// @return success and returndata, as `.call()`. Returndata is capped to\\n    /// `_maxCopy` bytes.\\n    function excessivelySafeStaticCall(\\n        address _target,\\n        uint256 _gas,\\n        uint16 _maxCopy,\\n        bytes memory _calldata\\n    ) internal view returns (bool, bytes memory) {\\n        // set up for assembly call\\n        uint256 _toCopy;\\n        bool _success;\\n        bytes memory _returnData = new bytes(_maxCopy);\\n        // dispatch message to recipient\\n        // by assembly calling \\\"handle\\\" function\\n        // we call via assembly to avoid memcopying a very large returndata\\n        // returned by a malicious contract\\n        assembly {\\n            _success := staticcall(\\n            _gas, // gas\\n            _target, // recipient\\n            add(_calldata, 0x20), // inloc\\n            mload(_calldata), // inlen\\n            0, // outloc\\n            0 // outlen\\n            )\\n        // limit our copy to 256 bytes\\n            _toCopy := returndatasize()\\n            if gt(_toCopy, _maxCopy) {\\n                _toCopy := _maxCopy\\n            }\\n        // Store the length of the copied bytes\\n            mstore(_returnData, _toCopy)\\n        // copy the bytes from returndata[0:_toCopy]\\n            returndatacopy(add(_returnData, 0x20), 0, _toCopy)\\n        }\\n        return (_success, _returnData);\\n    }\\n\\n    /**\\n     * @notice Swaps function selectors in encoded contract calls\\n     * @dev Allows reuse of encoded calldata for functions with identical\\n     * argument types but different names. It simply swaps out the first 4 bytes\\n     * for the new selector. This function modifies memory in place, and should\\n     * only be used with caution.\\n     * @param _newSelector The new 4-byte selector\\n     * @param _buf The encoded contract args\\n     */\\n    function swapSelector(bytes4 _newSelector, bytes memory _buf)\\n    internal\\n    pure\\n    {\\n        require(_buf.length >= 4);\\n        uint256 _mask = LOW_28_MASK;\\n        assembly {\\n        // load the first word of\\n            let _word := mload(add(_buf, 0x20))\\n        // mask out the top 4 bytes\\n        // /x\\n            _word := and(_word, _mask)\\n            _word := or(_newSelector, _word)\\n            mstore(add(_buf, 0x20), _word)\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x23942250ddd277c443fa27c6b4ab51e6b3b5e654548b6b9e8d785a88ebec4dfe\",\"license\":\"MIT OR Apache-2.0\"},\"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlUpgradeable.sol\\\";\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../utils/StringsUpgradeable.sol\\\";\\nimport \\\"../utils/introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.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 * ```\\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 * ```\\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.\\n */\\nabstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {\\n    function __AccessControl_init() internal onlyInitializing {\\n    }\\n\\n    function __AccessControl_init_unchained() internal onlyInitializing {\\n    }\\n    struct RoleData {\\n        mapping(address => bool) members;\\n        bytes32 adminRole;\\n    }\\n\\n    mapping(bytes32 => 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 a standardized message including the required role.\\n     *\\n     * The format of the revert reason is given by the following regular expression:\\n     *\\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n     *\\n     * _Available since v4.1._\\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(IAccessControlUpgradeable).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 override returns (bool) {\\n        return _roles[role].members[account];\\n    }\\n\\n    /**\\n     * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n     * Overriding this function changes the behavior of the {onlyRole} modifier.\\n     *\\n     * Format of the revert message is described in {_checkRole}.\\n     *\\n     * _Available since v4.6._\\n     */\\n    function _checkRole(bytes32 role) internal view virtual {\\n        _checkRole(role, _msgSender());\\n    }\\n\\n    /**\\n     * @dev Revert with a standard message if `account` is missing `role`.\\n     *\\n     * The format of the revert reason is given by the following regular expression:\\n     *\\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n     */\\n    function _checkRole(bytes32 role, address account) internal view virtual {\\n        if (!hasRole(role, account)) {\\n            revert(\\n                string(\\n                    abi.encodePacked(\\n                        \\\"AccessControl: account \\\",\\n                        StringsUpgradeable.toHexString(account),\\n                        \\\" is missing role \\\",\\n                        StringsUpgradeable.toHexString(uint256(role), 32)\\n                    )\\n                )\\n            );\\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 override 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 override 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 override 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 `account`.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function renounceRole(bytes32 role, address account) public virtual override {\\n        require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n        _revokeRole(role, account);\\n    }\\n\\n    /**\\n     * @dev Grants `role` to `account`.\\n     *\\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\\n     * event. Note that unlike {grantRole}, this function doesn't perform any\\n     * checks on the calling account.\\n     *\\n     * May emit a {RoleGranted} event.\\n     *\\n     * [WARNING]\\n     * ====\\n     * This function should only be called from the constructor when setting\\n     * up the initial roles for the system.\\n     *\\n     * Using this function in any other way is effectively circumventing the admin\\n     * system imposed by {AccessControl}.\\n     * ====\\n     *\\n     * NOTE: This function is deprecated in favor of {_grantRole}.\\n     */\\n    function _setupRole(bytes32 role, address account) internal virtual {\\n        _grantRole(role, account);\\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 Grants `role` to `account`.\\n     *\\n     * Internal function without access restriction.\\n     *\\n     * May emit a {RoleGranted} event.\\n     */\\n    function _grantRole(bytes32 role, address account) internal virtual {\\n        if (!hasRole(role, account)) {\\n            _roles[role].members[account] = true;\\n            emit RoleGranted(role, account, _msgSender());\\n        }\\n    }\\n\\n    /**\\n     * @dev Revokes `role` from `account`.\\n     *\\n     * Internal function without access restriction.\\n     *\\n     * May emit a {RoleRevoked} event.\\n     */\\n    function _revokeRole(bytes32 role, address account) internal virtual {\\n        if (hasRole(role, account)) {\\n            _roles[role].members[account] = false;\\n            emit RoleRevoked(role, account, _msgSender());\\n        }\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xe8f27a3e3e25067334e76799f03d4de6d8f8535c3fc4806468228a9ebd5de51a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControlUpgradeable {\\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     * _Available since v3.1._\\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 `account`.\\n     */\\n    function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0xb8f5302f12138c5561362e88a78d061573e6298b7a1a5afe84a1e2c8d4d5aeaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal onlyInitializing {\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal onlyInitializing {\\n        _transferOwnership(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        _checkOwner();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if the sender is not the owner.\\n     */\\n    function _checkOwner() internal view virtual {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822ProxiableUpgradeable {\\n    /**\\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n     * address.\\n     *\\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n     * function revert if invoked through a proxy.\\n     */\\n    function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeaconUpgradeable.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/StorageSlotUpgradeable.sol\\\";\\nimport \\\"../utils/Initializable.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967UpgradeUpgradeable is Initializable {\\n    function __ERC1967Upgrade_init() internal onlyInitializing {\\n    }\\n\\n    function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\\n    }\\n    // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n    /**\\n     * @dev Storage slot with the address of the current implementation.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n     * validated in the constructor.\\n     */\\n    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n    /**\\n     * @dev Emitted when the implementation is upgraded.\\n     */\\n    event Upgraded(address indexed implementation);\\n\\n    /**\\n     * @dev Returns the current implementation address.\\n     */\\n    function _getImplementation() internal view returns (address) {\\n        return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the EIP1967 implementation slot.\\n     */\\n    function _setImplementation(address newImplementation) private {\\n        require(AddressUpgradeable.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n        StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeTo(address newImplementation) internal {\\n        _setImplementation(newImplementation);\\n        emit Upgraded(newImplementation);\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade with additional setup call.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeToAndCall(\\n        address newImplementation,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        _upgradeTo(newImplementation);\\n        if (data.length > 0 || forceCall) {\\n            _functionDelegateCall(newImplementation, data);\\n        }\\n    }\\n\\n    /**\\n     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function _upgradeToAndCallUUPS(\\n        address newImplementation,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        // Upgrades from old implementations will perform a rollback test. This test requires the new\\n        // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n        // this special case will break upgrade paths from old UUPS implementation to new ones.\\n        if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n            _setImplementation(newImplementation);\\n        } else {\\n            try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n                require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n            } catch {\\n                revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n            }\\n            _upgradeToAndCall(newImplementation, data, forceCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Storage slot with the admin of the contract.\\n     * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n     * validated in the constructor.\\n     */\\n    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n    /**\\n     * @dev Emitted when the admin account has changed.\\n     */\\n    event AdminChanged(address previousAdmin, address newAdmin);\\n\\n    /**\\n     * @dev Returns the current admin.\\n     */\\n    function _getAdmin() internal view returns (address) {\\n        return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new address in the EIP1967 admin slot.\\n     */\\n    function _setAdmin(address newAdmin) private {\\n        require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n        StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n    }\\n\\n    /**\\n     * @dev Changes the admin of the proxy.\\n     *\\n     * Emits an {AdminChanged} event.\\n     */\\n    function _changeAdmin(address newAdmin) internal {\\n        emit AdminChanged(_getAdmin(), newAdmin);\\n        _setAdmin(newAdmin);\\n    }\\n\\n    /**\\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n     */\\n    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n    /**\\n     * @dev Emitted when the beacon is upgraded.\\n     */\\n    event BeaconUpgraded(address indexed beacon);\\n\\n    /**\\n     * @dev Returns the current beacon.\\n     */\\n    function _getBeacon() internal view returns (address) {\\n        return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\\n    }\\n\\n    /**\\n     * @dev Stores a new beacon in the EIP1967 beacon slot.\\n     */\\n    function _setBeacon(address newBeacon) private {\\n        require(AddressUpgradeable.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n        require(\\n            AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\\n            \\\"ERC1967: beacon implementation is not a contract\\\"\\n        );\\n        StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n    }\\n\\n    /**\\n     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n     *\\n     * Emits a {BeaconUpgraded} event.\\n     */\\n    function _upgradeBeaconToAndCall(\\n        address newBeacon,\\n        bytes memory data,\\n        bool forceCall\\n    ) internal {\\n        _setBeacon(newBeacon);\\n        emit BeaconUpgraded(newBeacon);\\n        if (data.length > 0 || forceCall) {\\n            _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\\n        }\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) {\\n        require(AddressUpgradeable.isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return AddressUpgradeable.verifyCallResult(success, returndata, \\\"Address: low-level delegate call failed\\\");\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x315887e846f1e5f8d8fa535a229d318bb9290aaa69485117f1ee8a9a6b3be823\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeaconUpgradeable {\\n    /**\\n     * @dev Must return an address that can be used as a delegate call target.\\n     *\\n     * {BeaconProxy} will check that this address is a contract.\\n     */\\n    function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n *     function initialize() initializer public {\\n *         __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n *     }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n *     function initializeV2() reinitializer(2) public {\\n *         __ERC20Permit_init(\\\"MyToken\\\");\\n *     }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n *     _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     * @custom:oz-retyped-from bool\\n     */\\n    uint8 private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Triggered when the contract has been initialized or reinitialized.\\n     */\\n    event Initialized(uint8 version);\\n\\n    /**\\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n     * `onlyInitializing` functions can be used to initialize parent contracts.\\n     *\\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\\n     * constructor.\\n     *\\n     * Emits an {Initialized} event.\\n     */\\n    modifier initializer() {\\n        bool isTopLevelCall = !_initializing;\\n        require(\\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n            \\\"Initializable: contract is already initialized\\\"\\n        );\\n        _initialized = 1;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n        }\\n        _;\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n            emit Initialized(1);\\n        }\\n    }\\n\\n    /**\\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n     * used to initialize parent contracts.\\n     *\\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\\n     * are added through upgrades and that require initialization.\\n     *\\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\\n     *\\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n     * a contract, executing them in the right order is up to the developer or operator.\\n     *\\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\\n     *\\n     * Emits an {Initialized} event.\\n     */\\n    modifier reinitializer(uint8 version) {\\n        require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n        _initialized = version;\\n        _initializing = true;\\n        _;\\n        _initializing = false;\\n        emit Initialized(version);\\n    }\\n\\n    /**\\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n     */\\n    modifier onlyInitializing() {\\n        require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n     * through proxies.\\n     *\\n     * Emits an {Initialized} event the first time it is successfully executed.\\n     */\\n    function _disableInitializers() internal virtual {\\n        require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n        if (_initialized < type(uint8).max) {\\n            _initialized = type(uint8).max;\\n            emit Initialized(type(uint8).max);\\n        }\\n    }\\n\\n    /**\\n     * @dev Internal function that returns the initialized version. Returns `_initialized`\\n     */\\n    function _getInitializedVersion() internal view returns (uint8) {\\n        return _initialized;\\n    }\\n\\n    /**\\n     * @dev Internal function that returns the initialized version. Returns `_initializing`\\n     */\\n    function _isInitializing() internal view returns (bool) {\\n        return _initializing;\\n    }\\n}\\n\",\"keccak256\":\"0xe798cadb41e2da274913e4b3183a80f50fb057a42238fe8467e077268100ec27\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/draft-IERC1822Upgradeable.sol\\\";\\nimport \\\"../ERC1967/ERC1967UpgradeUpgradeable.sol\\\";\\nimport \\\"./Initializable.sol\\\";\\n\\n/**\\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\\n *\\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\\n * `UUPSUpgradeable` with a custom implementation of upgrades.\\n *\\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\\n *\\n * _Available since v4.1._\\n */\\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\\n    function __UUPSUpgradeable_init() internal onlyInitializing {\\n    }\\n\\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\\n    }\\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\\n    address private immutable __self = address(this);\\n\\n    /**\\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\\n     * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\\n     * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\\n     * fail.\\n     */\\n    modifier onlyProxy() {\\n        require(address(this) != __self, \\\"Function must be called through delegatecall\\\");\\n        require(_getImplementation() == __self, \\\"Function must be called through active proxy\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\\n     * callable on the implementing contract but not through proxies.\\n     */\\n    modifier notDelegated() {\\n        require(address(this) == __self, \\\"UUPSUpgradeable: must not be called through delegatecall\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\\n     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\\n     *\\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\\n     */\\n    function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\\n        return _IMPLEMENTATION_SLOT;\\n    }\\n\\n    /**\\n     * @dev Upgrade the implementation of the proxy to `newImplementation`.\\n     *\\n     * Calls {_authorizeUpgrade}.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function upgradeTo(address newImplementation) external virtual onlyProxy {\\n        _authorizeUpgrade(newImplementation);\\n        _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\\n    }\\n\\n    /**\\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\\n     * encoded in `data`.\\n     *\\n     * Calls {_authorizeUpgrade}.\\n     *\\n     * Emits an {Upgraded} event.\\n     */\\n    function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy {\\n        _authorizeUpgrade(newImplementation);\\n        _upgradeToAndCallUUPS(newImplementation, data, true);\\n    }\\n\\n    /**\\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\\n     * {upgradeTo} and {upgradeToAndCall}.\\n     *\\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\\n     *\\n     * ```solidity\\n     * function _authorizeUpgrade(address) internal override onlyOwner {}\\n     * ```\\n     */\\n    function _authorizeUpgrade(address newImplementation) internal virtual;\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x7967d130887c4b40666cd88f8744691d4527039a1b2a38aa0de41481ef646778\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n     *\\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n     * constructor.\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize/address.code.length, which returns 0\\n        // for contracts in construction, since the code is only stored at the end\\n        // of the constructor execution.\\n\\n        return account.code.length > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n     *\\n     * _Available since v4.8._\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        if (success) {\\n            if (returndata.length == 0) {\\n                // only check isContract if the call was successful and the return data is empty\\n                // otherwise we already know that it was a contract\\n                require(isContract(target), \\\"Address: call to non-contract\\\");\\n            }\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason or using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n        // Look for revert reason and bubble it up if present\\n        if (returndata.length > 0) {\\n            // The easiest way to bubble the revert reason is using memory via assembly\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                let returndata_size := mload(returndata)\\n                revert(add(32, returndata), returndata_size)\\n            }\\n        } else {\\n            revert(errorMessage);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x2edcb41c121abc510932e8d83ff8b82cf9cdde35e7c297622f5c29ef0af25183\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal onlyInitializing {\\n    }\\n\\n    function __Context_init_unchained() internal onlyInitializing {\\n    }\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n *     function _getImplementation() internal view returns (address) {\\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n *     }\\n *\\n *     function _setImplementation(address newImplementation) internal {\\n *         require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n *     }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlotUpgradeable {\\n    struct AddressSlot {\\n        address value;\\n    }\\n\\n    struct BooleanSlot {\\n        bool value;\\n    }\\n\\n    struct Bytes32Slot {\\n        bytes32 value;\\n    }\\n\\n    struct Uint256Slot {\\n        uint256 value;\\n    }\\n\\n    /**\\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n     */\\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n     */\\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n     */\\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n     */\\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            r.slot := slot\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x09864aea84f01e39313375b5610c73a3c1c68abbdc51e5ccdd25ff977fdadf9a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/MathUpgradeable.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n    bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n    uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        unchecked {\\n            uint256 length = MathUpgradeable.log10(value) + 1;\\n            string memory buffer = new string(length);\\n            uint256 ptr;\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                ptr := add(buffer, add(32, length))\\n            }\\n            while (true) {\\n                ptr--;\\n                /// @solidity memory-safe-assembly\\n                assembly {\\n                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n                }\\n                value /= 10;\\n                if (value == 0) break;\\n            }\\n            return buffer;\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(uint256 value) internal pure returns (string memory) {\\n        unchecked {\\n            return toHexString(value, MathUpgradeable.log256(value) + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n     */\\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n        bytes memory buffer = new bytes(2 * length + 2);\\n        buffer[0] = \\\"0\\\";\\n        buffer[1] = \\\"x\\\";\\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\\n            buffer[i] = _SYMBOLS[value & 0xf];\\n            value >>= 4;\\n        }\\n        require(value == 0, \\\"Strings: hex length insufficient\\\");\\n        return string(buffer);\\n    }\\n\\n    /**\\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(address addr) internal pure returns (string memory) {\\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n    }\\n}\\n\",\"keccak256\":\"0x6b9a5d35b744b25529a2856a8093e7c03fb35a34b1c4fb5499e560f8ade140da\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\\n    function __ERC165_init() internal onlyInitializing {\\n    }\\n\\n    function __ERC165_init_unchained() internal onlyInitializing {\\n    }\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return interfaceId == type(IERC165Upgradeable).interfaceId;\\n    }\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary MathUpgradeable {\\n    enum Rounding {\\n        Down, // Toward negative infinity\\n        Up, // Toward infinity\\n        Zero // Toward zero\\n    }\\n\\n    /**\\n     * @dev Returns the largest of two numbers.\\n     */\\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a > b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the smallest of two numbers.\\n     */\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a < b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the average of two numbers. The result is rounded towards\\n     * zero.\\n     */\\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b) / 2 can overflow.\\n        return (a & b) + (a ^ b) / 2;\\n    }\\n\\n    /**\\n     * @dev Returns the ceiling of the division of two numbers.\\n     *\\n     * This differs from standard division with `/` in that it rounds up instead\\n     * of rounding down.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b - 1) / b can overflow on addition, so we distribute.\\n        return a == 0 ? 0 : (a - 1) / b + 1;\\n    }\\n\\n    /**\\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n     * with further edits by Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(\\n        uint256 x,\\n        uint256 y,\\n        uint256 denominator\\n    ) internal pure returns (uint256 result) {\\n        unchecked {\\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n            // variables such that product = prod1 * 2^256 + prod0.\\n            uint256 prod0; // Least significant 256 bits of the product\\n            uint256 prod1; // Most significant 256 bits of the product\\n            assembly {\\n                let mm := mulmod(x, y, not(0))\\n                prod0 := mul(x, y)\\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n            }\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (prod1 == 0) {\\n                return prod0 / denominator;\\n            }\\n\\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n            require(denominator > prod1);\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [prod1 prod0].\\n            uint256 remainder;\\n            assembly {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                prod1 := sub(prod1, gt(remainder, prod0))\\n                prod0 := sub(prod0, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n            // See https://cs.stackexchange.com/q/138556/92363.\\n\\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\\n            uint256 twos = denominator & (~denominator + 1);\\n            assembly {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [prod1 prod0] by twos.\\n                prod0 := div(prod0, twos)\\n\\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n                twos := add(div(sub(0, twos), twos), 1)\\n            }\\n\\n            // Shift in bits from prod1 into prod0.\\n            prod0 |= prod1 * twos;\\n\\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv = 1 mod 2^4.\\n            uint256 inverse = (3 * denominator) ^ 2;\\n\\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n            // in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n            // is no longer required.\\n            result = prod0 * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n     */\\n    function mulDiv(\\n        uint256 x,\\n        uint256 y,\\n        uint256 denominator,\\n        Rounding rounding\\n    ) internal pure returns (uint256) {\\n        uint256 result = mulDiv(x, y, denominator);\\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n            result += 1;\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n     *\\n     * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n        //\\n        // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n        //\\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n        // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n        // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n        //\\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n        uint256 result = 1 << (log2(a) >> 1);\\n\\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n        // into the expected uint128 result.\\n        unchecked {\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            return min(result, a / result);\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates sqrt(a), following the selected rounding direction.\\n     */\\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = sqrt(a);\\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >> 128 > 0) {\\n                value >>= 128;\\n                result += 128;\\n            }\\n            if (value >> 64 > 0) {\\n                value >>= 64;\\n                result += 64;\\n            }\\n            if (value >> 32 > 0) {\\n                value >>= 32;\\n                result += 32;\\n            }\\n            if (value >> 16 > 0) {\\n                value >>= 16;\\n                result += 16;\\n            }\\n            if (value >> 8 > 0) {\\n                value >>= 8;\\n                result += 8;\\n            }\\n            if (value >> 4 > 0) {\\n                value >>= 4;\\n                result += 4;\\n            }\\n            if (value >> 2 > 0) {\\n                value >>= 2;\\n                result += 2;\\n            }\\n            if (value >> 1 > 0) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log2(value);\\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log10(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >= 10**64) {\\n                value /= 10**64;\\n                result += 64;\\n            }\\n            if (value >= 10**32) {\\n                value /= 10**32;\\n                result += 32;\\n            }\\n            if (value >= 10**16) {\\n                value /= 10**16;\\n                result += 16;\\n            }\\n            if (value >= 10**8) {\\n                value /= 10**8;\\n                result += 8;\\n            }\\n            if (value >= 10**4) {\\n                value /= 10**4;\\n                result += 4;\\n            }\\n            if (value >= 10**2) {\\n                value /= 10**2;\\n                result += 2;\\n            }\\n            if (value >= 10**1) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log10(value);\\n            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     *\\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n     */\\n    function log256(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >> 128 > 0) {\\n                value >>= 128;\\n                result += 16;\\n            }\\n            if (value >> 64 > 0) {\\n                value >>= 64;\\n                result += 8;\\n            }\\n            if (value >> 32 > 0) {\\n                value >>= 32;\\n                result += 4;\\n            }\\n            if (value >> 16 > 0) {\\n                value >>= 16;\\n                result += 2;\\n            }\\n            if (value >> 8 > 0) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log256(value);\\n            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xc1bd5b53319c68f84e3becd75694d941e8f4be94049903232cd8bc7c535aaa5a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\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 amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` 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 amount) 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 `amount` as the allowance of `spender` over the 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 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `from` to `to` using the\\n     * allowance mechanism. `amount` 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(\\n        address from,\\n        address to,\\n        uint256 amount\\n    ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the symbol of the token.\\n     */\\n    function symbol() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the decimals places of the token.\\n     */\\n    function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n    bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n    uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        unchecked {\\n            uint256 length = Math.log10(value) + 1;\\n            string memory buffer = new string(length);\\n            uint256 ptr;\\n            /// @solidity memory-safe-assembly\\n            assembly {\\n                ptr := add(buffer, add(32, length))\\n            }\\n            while (true) {\\n                ptr--;\\n                /// @solidity memory-safe-assembly\\n                assembly {\\n                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n                }\\n                value /= 10;\\n                if (value == 0) break;\\n            }\\n            return buffer;\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(uint256 value) internal pure returns (string memory) {\\n        unchecked {\\n            return toHexString(value, Math.log256(value) + 1);\\n        }\\n    }\\n\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n     */\\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n        bytes memory buffer = new bytes(2 * length + 2);\\n        buffer[0] = \\\"0\\\";\\n        buffer[1] = \\\"x\\\";\\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\\n            buffer[i] = _SYMBOLS[value & 0xf];\\n            value >>= 4;\\n        }\\n        require(value == 0, \\\"Strings: hex length insufficient\\\");\\n        return string(buffer);\\n    }\\n\\n    /**\\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n     */\\n    function toHexString(address addr) internal pure returns (string memory) {\\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n    }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Down, // Toward negative infinity\\n        Up, // Toward infinity\\n        Zero // Toward zero\\n    }\\n\\n    /**\\n     * @dev Returns the largest of two numbers.\\n     */\\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a > b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the smallest of two numbers.\\n     */\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a < b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the average of two numbers. The result is rounded towards\\n     * zero.\\n     */\\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b) / 2 can overflow.\\n        return (a & b) + (a ^ b) / 2;\\n    }\\n\\n    /**\\n     * @dev Returns the ceiling of the division of two numbers.\\n     *\\n     * This differs from standard division with `/` in that it rounds up instead\\n     * of rounding down.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b - 1) / b can overflow on addition, so we distribute.\\n        return a == 0 ? 0 : (a - 1) / b + 1;\\n    }\\n\\n    /**\\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n     * with further edits by Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(\\n        uint256 x,\\n        uint256 y,\\n        uint256 denominator\\n    ) internal pure returns (uint256 result) {\\n        unchecked {\\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n            // variables such that product = prod1 * 2^256 + prod0.\\n            uint256 prod0; // Least significant 256 bits of the product\\n            uint256 prod1; // Most significant 256 bits of the product\\n            assembly {\\n                let mm := mulmod(x, y, not(0))\\n                prod0 := mul(x, y)\\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n            }\\n\\n            // Handle non-overflow cases, 256 by 256 division.\\n            if (prod1 == 0) {\\n                return prod0 / denominator;\\n            }\\n\\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n            require(denominator > prod1);\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [prod1 prod0].\\n            uint256 remainder;\\n            assembly {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                prod1 := sub(prod1, gt(remainder, prod0))\\n                prod0 := sub(prod0, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n            // See https://cs.stackexchange.com/q/138556/92363.\\n\\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\\n            uint256 twos = denominator & (~denominator + 1);\\n            assembly {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [prod1 prod0] by twos.\\n                prod0 := div(prod0, twos)\\n\\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n                twos := add(div(sub(0, twos), twos), 1)\\n            }\\n\\n            // Shift in bits from prod1 into prod0.\\n            prod0 |= prod1 * twos;\\n\\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv = 1 mod 2^4.\\n            uint256 inverse = (3 * denominator) ^ 2;\\n\\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n            // in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n            // is no longer required.\\n            result = prod0 * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n     */\\n    function mulDiv(\\n        uint256 x,\\n        uint256 y,\\n        uint256 denominator,\\n        Rounding rounding\\n    ) internal pure returns (uint256) {\\n        uint256 result = mulDiv(x, y, denominator);\\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n            result += 1;\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n     *\\n     * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n        //\\n        // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n        //\\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n        // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n        // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n        //\\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n        uint256 result = 1 << (log2(a) >> 1);\\n\\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n        // into the expected uint128 result.\\n        unchecked {\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            return min(result, a / result);\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates sqrt(a), following the selected rounding direction.\\n     */\\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = sqrt(a);\\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >> 128 > 0) {\\n                value >>= 128;\\n                result += 128;\\n            }\\n            if (value >> 64 > 0) {\\n                value >>= 64;\\n                result += 64;\\n            }\\n            if (value >> 32 > 0) {\\n                value >>= 32;\\n                result += 32;\\n            }\\n            if (value >> 16 > 0) {\\n                value >>= 16;\\n                result += 16;\\n            }\\n            if (value >> 8 > 0) {\\n                value >>= 8;\\n                result += 8;\\n            }\\n            if (value >> 4 > 0) {\\n                value >>= 4;\\n                result += 4;\\n            }\\n            if (value >> 2 > 0) {\\n                value >>= 2;\\n                result += 2;\\n            }\\n            if (value >> 1 > 0) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log2(value);\\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log10(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >= 10**64) {\\n                value /= 10**64;\\n                result += 64;\\n            }\\n            if (value >= 10**32) {\\n                value /= 10**32;\\n                result += 32;\\n            }\\n            if (value >= 10**16) {\\n                value /= 10**16;\\n                result += 16;\\n            }\\n            if (value >= 10**8) {\\n                value /= 10**8;\\n                result += 8;\\n            }\\n            if (value >= 10**4) {\\n                value /= 10**4;\\n                result += 4;\\n            }\\n            if (value >= 10**2) {\\n                value /= 10**2;\\n                result += 2;\\n            }\\n            if (value >= 10**1) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log10(value);\\n            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     *\\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n     */\\n    function log256(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >> 128 > 0) {\\n                value >>= 128;\\n                result += 16;\\n            }\\n            if (value >> 64 > 0) {\\n                value >>= 64;\\n                result += 8;\\n            }\\n            if (value >> 32 > 0) {\\n                value >>= 32;\\n                result += 4;\\n            }\\n            if (value >> 16 > 0) {\\n                value >>= 16;\\n                result += 2;\\n            }\\n            if (value >> 8 > 0) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log256(value);\\n            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/AxelarHandlerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\n\\nimport {IAxelarGasService} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol';\\nimport {AxelarExecutable} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol';\\nimport {StringToAddress, AddressToString} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/utils/AddressString.sol';\\nimport '@openzeppelin/contracts/utils/Strings.sol';\\n\\n/**\\n * @title AxelarHandlerUpgradeable\\n * @dev A contract for using axelar for bridging\\n */\\nabstract contract AxelarHandlerUpgradeable is AxelarExecutable {\\n    using StringToAddress for string;\\n    using AddressToString for address;\\n\\n    // An interface for the gas service contract\\n    IAxelarGasService public immutable gasService;\\n\\n    //Gap array\\n    uint256[50] _gap;\\n\\n    constructor(address gateway, address gasReceiver) AxelarExecutable(gateway) {\\n        gasService = IAxelarGasService(gasReceiver);\\n    }\\n\\n    function _axelarBridgeTo(\\n        bytes memory payload,\\n        string memory targetChainId,\\n        address refundAddress\\n    ) internal virtual {\\n        string memory stringAddress = address(this).toString();\\n        gasService.payNativeGasForContractCall{value: msg.value}(\\n            address(this),\\n            targetChainId,\\n            stringAddress,\\n            payload,\\n            refundAddress\\n        );\\n        gateway.callContract(targetChainId, stringAddress, payload);\\n    }\\n\\n    /**\\n     * @dev Executes a transfer, override axelar execute\\n     * @param sourceChain The chain the transfer is coming from\\n     * @param sourceAddress The address the transfer is coming from\\n     * @param payload The payload of the transfer\\n     */\\n    function _execute(\\n        string calldata sourceChain,\\n        string calldata sourceAddress,\\n        bytes calldata payload\\n    ) internal override {\\n        // the message should come from same contract on other chains\\n        address source = sourceAddress.toAddress();\\n        (address from, address to, uint256 amount, uint256 id) = abi.decode(\\n            payload,\\n            (address, address, uint256, uint256)\\n        );\\n        _axelarBridgeFrom(sourceChain, source, from, to, amount, id);\\n    }\\n\\n    function _axelarBridgeFrom(\\n        string memory sourceChain,\\n        address sourceAddress,\\n        address from,\\n        address to,\\n        uint normalizedAmount,\\n        uint requestId\\n    ) internal virtual;\\n}\\n\",\"keccak256\":\"0x1e8d27b11b3aaf0ece5cb05f38a833d1287cc86c1b7c220d1726896020dc2a52\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/BridgeHelperLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\nimport {INameService} from '@gooddollar/goodprotocol/contracts/utils/DAOUpgradeableContract.sol';\\nimport './IMessagePassingBridge.sol';\\n\\ninterface IIdentity {\\n    function isWhitelisted(address) external view returns (bool);\\n}\\n\\nlibrary BridgeHelperLibrary {\\n    /**\\n     * @dev Function for normalizing token amounts to 18 decimals\\n     * @param amount The amount to normalize\\n     * @return normalized amount\\n     */\\n    function normalizeFromTokenTo18Decimals(uint256 amount, uint8 decimals) external pure returns (uint256 normalized) {\\n        normalized = amount;\\n        if (decimals < 18) {\\n            uint256 diff = 18 - decimals;\\n            normalized = amount * 10 ** diff;\\n        } else if (decimals > 18) {\\n            uint256 diff = decimals - 18;\\n            normalized = amount / 10 ** diff;\\n        }\\n    }\\n\\n    /**\\n     * @dev Function for normalizing token amounts from 18 decimals\\n     * @param amount The amount to normalize\\n     * @return normalized amount\\n     */\\n    function normalizeFrom18ToTokenDecimals(uint256 amount, uint8 decimals) external pure returns (uint256 normalized) {\\n        normalized = amount;\\n        if (decimals < 18) {\\n            uint256 diff = 18 - decimals;\\n            normalized = amount / 10 ** diff;\\n        } else if (decimals > 18) {\\n            uint256 diff = decimals - 18;\\n            normalized = amount * 10 ** diff;\\n        }\\n    }\\n\\n    /**\\n     * @dev Function for checking if a bridge is possible\\n     * @param from The address of the sender\\n     * @param amount The amount to bridge\\n     * @return isWithinLimit Whether the bridge is within the limit\\n     * @return error The error message, if any\\n     */\\n    function canBridge(\\n        IMessagePassingBridge.BridgeLimits memory bridgeLimits,\\n        IMessagePassingBridge.AccountLimit memory accountDailyLimit,\\n        IMessagePassingBridge.BridgeDailyLimit memory bridgeDailyLimit,\\n        INameService nameService,\\n        bool isClosed,\\n        address from,\\n        uint256 amount\\n    ) public view returns (bool isWithinLimit, string memory error) {\\n        if (isClosed) return (false, 'closed');\\n\\n        if (amount < bridgeLimits.minAmount) return (false, 'minAmount');\\n\\n        uint256 account24hours = accountDailyLimit.bridged24Hours;\\n        if (accountDailyLimit.lastTransferReset < block.timestamp - 1 days) {\\n            account24hours = amount;\\n        } else {\\n            account24hours += amount;\\n        }\\n\\n        if (bridgeLimits.onlyWhitelisted && address(nameService) != address(0)) {\\n            IIdentity id = IIdentity(nameService.getAddress('IDENTITY'));\\n            if (address(id) != address(0))\\n                if (id.isWhitelisted(from) == false) return (false, 'not whitelisted');\\n        }\\n\\n        if (account24hours > bridgeLimits.accountDailyLimit) return (false, 'accountDailyLimit');\\n\\n        if (amount > bridgeLimits.txLimit) return (false, 'txLimit');\\n\\n        if (bridgeDailyLimit.lastTransferReset < block.timestamp - 1 days) {\\n            if (amount > bridgeLimits.dailyLimit) return (false, 'dailyLimit');\\n        } else {\\n            if (bridgeDailyLimit.bridged24Hours + amount > bridgeLimits.dailyLimit) return (false, 'dailyLimit');\\n        }\\n\\n        return (true, '');\\n    }\\n}\\n\",\"keccak256\":\"0x813ebf4ef30b4d4e7ea0fa6cb9298ad513b1c2ae5b6b390896f986542b799eac\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/IMessagePassingBridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\n\\ninterface ILayerZeroFeeEstimator {\\n    function estimateSendFee(\\n        uint16 _dstChainId,\\n        address _fromAddress,\\n        address _toAddress,\\n        uint _normalizedAmount,\\n        bool _useZro,\\n        bytes memory _adapterParams\\n    ) external view returns (uint nativeFee, uint zroFee);\\n}\\n\\ninterface IMessagePassingBridge {\\n    enum BridgeService {\\n        AXELAR,\\n        LZ\\n    }\\n\\n    // A struct for storing account limits\\n    struct AccountLimit {\\n        uint256 lastTransferReset;\\n        uint256 bridged24Hours;\\n    }\\n\\n    // A struct for storing bridge daily limits\\n    struct BridgeDailyLimit {\\n        uint256 lastTransferReset;\\n        uint256 bridged24Hours;\\n    }\\n\\n    // A struct for storing bridge fees\\n    struct BridgeFees {\\n        uint256 minFee;\\n        uint256 maxFee;\\n        uint256 fee;\\n    }\\n\\n    // A struct for storing bridge limits\\n    struct BridgeLimits {\\n        uint256 dailyLimit;\\n        uint256 txLimit;\\n        uint256 accountDailyLimit;\\n        uint256 minAmount;\\n        bool onlyWhitelisted;\\n    }\\n\\n    function lzEndpoint_() external view returns (address);\\n\\n    function TESTNET() external view returns (bool);\\n\\n    function guardian() external view returns (address);\\n\\n    function bridgeFees() external view returns (uint256 minFee, uint256 maxFee, uint256 fee);\\n\\n    function bridgeLimits()\\n        external\\n        view\\n        returns (\\n            uint256 dailyLimit,\\n            uint256 txLimit,\\n            uint256 accountDailyLimit,\\n            uint256 minAmount,\\n            bool onlyWhitelisted\\n        );\\n\\n    function bridgeDailyLimit() external view returns (uint256 lastTransferReset, uint256 bridged24Hours);\\n\\n    function feeRecipient() external view returns (address);\\n\\n    function toLzChainId(uint256 chainId) external view returns (uint16 lzChainId);\\n\\n    function setFeeRecipient(address recipient) external;\\n\\n    function setBridgeLimits(BridgeLimits memory _limits) external;\\n\\n    function setBridgeFees(BridgeFees memory _fees) external;\\n\\n    function setDisabledBridges(bytes32[] memory bridgeKeys, bool[] memory disabled) external;\\n\\n    function setFaucet(address _faucet) external;\\n\\n    function setGuardian(address _guardian) external;\\n\\n    function canBridge(address from, uint256 amount) external view returns (bool isWithinLimit, string memory error);\\n\\n    function withdraw(address token, uint256 amount) external;\\n\\n    function pauseBridge(bool isPaused) external;\\n\\n    function bridgeTo(address target, uint256 targetChainId, uint256 amount, BridgeService bridge) external payable;\\n\\n    function bridgeToWithLz(\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        bytes calldata adapterParams\\n    ) external payable;\\n\\n    function bridgeToWithAxelar(\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        address gasRefundAddress\\n    ) external payable;\\n\\n    function executedRequests(uint256 id) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc178bba8f79f5d1602828b7f54e04091a5aaf82df0802efab6862ca94979e74b\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/LZHandlerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.2;\\n\\nimport '@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol';\\nimport '@layerzerolabs/solidity-examples/contracts/contracts-upgradable/lzApp/NonblockingLzAppUpgradeable.sol';\\n\\nabstract contract LZHandlerUpgradeable is Initializable, NonblockingLzAppUpgradeable {\\n    using BytesLib for bytes;\\n\\n    error INVALID_SENDER(bytes _srcAddress);\\n    error INVALID_ENDPOINT(address lzEndpoint);\\n\\n    function __LZHandlerUpgradeable_init(address _lzEndpoint) internal onlyInitializing {\\n        __Ownable_init_unchained();\\n        __LzAppUpgradeable_init_unchained(_lzEndpoint);\\n    }\\n\\n    function __LZHandlerUpgradeable_init_unchained() internal onlyInitializing {}\\n\\n    //override lzReceive for simpler trustedRemote handling\\n    function lzReceive(\\n        uint16 _srcChainId,\\n        bytes calldata _srcAddress,\\n        uint64 _nonce,\\n        bytes calldata _payload\\n    ) public virtual override {\\n        // lzReceive must be called by the endpoint for security\\n        if (_msgSender() != address(lzEndpoint)) revert INVALID_ENDPOINT(_msgSender());\\n\\n        _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);\\n    }\\n\\n    function estimateSendFee(\\n        uint16 _dstChainId,\\n        address _fromAddress,\\n        address _toAddress,\\n        uint _normalizedAmount,\\n        bool _useZro,\\n        bytes memory _adapterParams\\n    ) public view virtual returns (uint nativeFee, uint zroFee) {\\n        bytes memory payload = abi.encode(_fromAddress, _toAddress, _normalizedAmount, 0); //fake request id as 0, just for fee estimation, shouldnt make a difference\\n        return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams);\\n    }\\n\\n    function _nonblockingLzReceive(\\n        uint16 _srcChainId,\\n        bytes memory _srcAddress,\\n        uint64 _nonce,\\n        bytes memory _payload\\n    ) internal virtual override {\\n        (address from, address to, uint normalizedAmount, uint requestId) = abi.decode(\\n            _payload,\\n            (address, address, uint, uint)\\n        );\\n\\n        address sourceAddress;\\n        assembly {\\n            sourceAddress := mload(add(_srcAddress, 20))\\n        }\\n\\n        _lzBridgeFrom(_srcChainId, sourceAddress, _nonce, from, to, normalizedAmount, requestId);\\n    }\\n\\n    function _lzBridgeTo(\\n        bytes memory _payload,\\n        uint16 _dstChainId,\\n        address payable _refundAddress,\\n        address _zroPaymentAddress,\\n        bytes memory _adapterParams\\n    ) internal virtual {\\n        _lzSend(_dstChainId, _payload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value);\\n    }\\n\\n    function _lzBridgeFrom(\\n        uint16 _srcChainId,\\n        address _srcAddress,\\n        uint64 _nonce,\\n        address _from,\\n        address _to,\\n        uint _normalizedAmount,\\n        uint _requestId\\n    ) internal virtual;\\n\\n    /**\\n     * @dev This empty reserved space is put in place to allow future versions to add new\\n     * variables without shifting down storage in the inheritance chain.\\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n     */\\n    uint[49] private __gap;\\n}\\n\",\"keccak256\":\"0xdc22ebdc7ff7eaef0ce253da366372bb7f52a23f7fd42ac96d4697fb0553e0cd\",\"license\":\"MIT\"},\"contracts/messagePassingBridge/MessagePassingBridge.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0;\\nimport {IAxelarGateway} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol';\\nimport {IAxelarGasService} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol';\\nimport {DAOUpgradeableContract, INameService} from '@gooddollar/goodprotocol/contracts/utils/DAOUpgradeableContract.sol';\\nimport {AxelarExecutable} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol';\\nimport {StringToAddress, AddressToString} from '@axelar-network/axelar-gmp-sdk-solidity/contracts/utils/AddressString.sol';\\nimport {AccessControlUpgradeable} from '@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol';\\nimport '@openzeppelin/contracts/utils/Strings.sol';\\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\\nimport './LZHandlerUpgradeable.sol';\\nimport './AxelarHandlerUpgradeable.sol';\\nimport './BridgeHelperLibrary.sol';\\nimport './IMessagePassingBridge.sol';\\n\\ninterface IFaucet {\\n    function canTop(address) external view returns (bool);\\n\\n    function topWallet(address) external;\\n}\\n\\n/**\\n * @title MessagePassingBridge\\n * @dev A contract for bridging assets between chains\\n */\\ncontract MessagePassingBridge is\\n    IMessagePassingBridge,\\n    DAOUpgradeableContract,\\n    LZHandlerUpgradeable,\\n    AxelarHandlerUpgradeable\\n{\\n    using StringToAddress for string;\\n    using AddressToString for address;\\n\\n    address public immutable lzEndpoint_;\\n    bool public immutable TESTNET;\\n    uint32 public immutable HOME_CHAIN_ID;\\n\\n    // // A constant for the guardian role\\n    // bytes32 public constant GUARDIAN_ROLE = keccak256('GUARDIAN_ROLE');\\n\\n    // An error message for when the contract is already initialized\\n    error AlreadyInitialized();\\n\\n    // An error message for when the caller is not a guardian\\n    error NOT_GUARDIAN(address sender);\\n\\n    error WRONG_TOKEN(address token);\\n    error INVALID_TARGET_OR_CHAINID(address target, uint256 chainId);\\n    error BRIDGE_LIMITS(string);\\n    error TRANSFER_FROM();\\n    error TRANSFER();\\n    error ALREADY_EXECUTED(uint256 requestId);\\n    error MISSING_FEE();\\n    error UNSUPPORTED_CHAIN(uint256 chainId);\\n    error LZ_FEE(uint256 required, uint256 sent);\\n\\n    // An event emitted when a bridge request is made\\n    event BridgeRequest(\\n        address indexed from,\\n        address indexed to,\\n        uint256 targetChainId,\\n        uint256 normalizedAmount,\\n        uint256 timestamp,\\n        BridgeService bridge,\\n        uint256 indexed id\\n    );\\n\\n    // An event emitted when a transfer is executed\\n    event ExecutedTransfer(\\n        address indexed from,\\n        address indexed to,\\n        uint256 normalizedAmount,\\n        uint256 fee,\\n        uint256 sourceChainId,\\n        BridgeService bridge,\\n        uint256 indexed id\\n    );\\n\\n    event FalseSender(uint256 sourceChainId, address sourceAddress);\\n\\n    address public guardian;\\n\\n    // A mapping for executed requests\\n    mapping(uint256 => bool) public executedRequests;\\n\\n    // A mapping for disabled source bridges (key is hash(sourceChainId,bridgeservice))\\n    mapping(bytes32 => bool) public disabledSourceBridges;\\n\\n    // A boolean for whether the bridge is closed\\n    bool public isClosed;\\n\\n    // A variable for storing bridge fees\\n    BridgeFees public bridgeFees;\\n\\n    // A variable for storing bridge limits\\n    BridgeLimits public bridgeLimits;\\n\\n    // A variable for storing bridge daily limits\\n    BridgeDailyLimit public bridgeDailyLimit;\\n\\n    // A mapping for storing account limits\\n    mapping(address => AccountLimit) public accountsDailyLimit;\\n\\n    // An interface for the faucet contract\\n    IFaucet public faucet;\\n\\n    // A variable for storing the current ID\\n    uint256 public currentId;\\n\\n    mapping(uint256 => uint16) public lzChainIdsMapping;\\n\\n    address public feeRecipient;\\n\\n    // A mapping for approved requests above limits\\n    mapping(uint256 => bool) public approvedRequests;\\n\\n    mapping(uint16 => uint256) public lzChainToIdsMapping;\\n\\n    /**\\n     * @dev Constructor function for the AxelarBridge contract\\n     * @param axlGateway The address of the gateway contract\\n     * @param axlGasReceiver The address of the gas receiver contract\\n     */\\n    constructor(\\n        address axlGateway,\\n        address axlGasReceiver,\\n        address lzEndpoint,\\n        bool isTestnet,\\n        uint32 homeChainId\\n    ) AxelarHandlerUpgradeable(axlGateway, axlGasReceiver) {\\n        lzEndpoint_ = lzEndpoint;\\n        TESTNET = isTestnet;\\n        HOME_CHAIN_ID = homeChainId;\\n    }\\n\\n    function _authorizeUpgrade(address impl) internal virtual override onlyOwner {}\\n\\n    function _onlyOwnerOrGuardian() internal view {\\n        if ((guardian == msg.sender || avatar == msg.sender || owner() == msg.sender) == false)\\n            revert NOT_GUARDIAN(msg.sender);\\n    }\\n\\n    /**\\n     * @dev Function for initializing the contract\\n     * @param nameService The address of the name service contract\\n     */\\n    function initialize(\\n        INameService nameService,\\n        BridgeLimits memory limits,\\n        BridgeFees memory fees\\n    ) public initializer {\\n        setDAO(nameService);\\n        __LZHandlerUpgradeable_init(lzEndpoint_);\\n        guardian = msg.sender;\\n        bridgeLimits = limits;\\n        bridgeFees = fees;\\n        feeRecipient = nameService.getAddress('UBISCHEME');\\n        if (feeRecipient == address(0)) feeRecipient = avatar;\\n\\n        // trust celo/eth/fuse we assume they are all deployed together at same address\\n        // if they are not deployed at the same time there's a risk of a malicious actor deploying the proxy at the same address\\n        // with modified malicious implementation\\n        addLzChainSupport(101, 1); // eth\\n        addLzChainSupport(125, 42220); // celo\\n        addLzChainSupport(138, 122); // fuse\\n        addLzChainSupport(365, 50); // xdc\\n    }\\n\\n    function upgrade() public reinitializer(2) {\\n        addLzChainSupport(101, 1); // eth\\n        addLzChainSupport(125, 42220); // celo\\n        addLzChainSupport(138, 122); // fuse\\n        addLzChainSupport(365, 50); // xdc\\n    }\\n\\n    /**\\n     *\\n     * @dev function for adding lz chaind support\\n     */\\n    function addLzChainSupport(uint16 lzChainId, uint256 chainId) public {\\n        _onlyOwnerOrGuardian();\\n        if (lzChainToIdsMapping[lzChainId] != 0) revert AlreadyInitialized();\\n        lzChainToIdsMapping[lzChainId] = chainId;\\n        lzChainIdsMapping[chainId] = lzChainId;\\n        trustedRemoteLookup[lzChainId] = abi.encodePacked(address(this), address(this));\\n    }\\n\\n    /**\\n     * @dev Function for approving requests above limits\\n     * @param id The bridgerequest id\\n     */\\n    function approveRequest(uint256 id) external {\\n        _onlyOwnerOrGuardian();\\n        approvedRequests[id] = true;\\n    }\\n\\n    /**\\n     * @dev Function for prevent a request by marking it as executed\\n     * @param id The bridgerequest id\\n     */\\n    function preventRequest(uint256 id) external {\\n        _onlyOwnerOrGuardian();\\n        executedRequests[id] = true;\\n    }\\n\\n    /**\\n     * @dev Function for setting the fee recipient\\n     * @param recipient The fee recipient to set\\n     */\\n    function setFeeRecipient(address recipient) external {\\n        _onlyOwnerOrGuardian();\\n        feeRecipient = recipient;\\n    }\\n\\n    /**\\n     * @dev Function for setting the bridge limits\\n     * @param limits The bridge limits to set\\n     */\\n    function setBridgeLimits(BridgeLimits memory limits) external {\\n        _onlyOwnerOrGuardian();\\n        bridgeLimits = limits;\\n    }\\n\\n    /**\\n     * @dev Function for setting the bridge fees\\n     * @param fees The bridge fees to set\\n     */\\n    function setBridgeFees(BridgeFees memory fees) external {\\n        _onlyOwnerOrGuardian();\\n        bridgeFees = fees;\\n    }\\n\\n    function setDisabledBridges(bytes32[] memory bridgeKeys, bool[] memory disabled) external {\\n        _onlyOwnerOrGuardian();\\n        for (uint256 i = 0; i < bridgeKeys.length; i++) disabledSourceBridges[bridgeKeys[i]] = disabled[i];\\n    }\\n\\n    /**\\n     * @dev Function for setting the faucet contract\\n     * @param _faucet The faucet contract to set\\n     */\\n    function setFaucet(address _faucet) external {\\n        _onlyOwnerOrGuardian();\\n        faucet = IFaucet(_faucet);\\n    }\\n\\n    /**\\n     * @dev Function for setting the guardian contract\\n     * @param _guardian The guardian to set\\n     */\\n    function setGuardian(address _guardian) external {\\n        _onlyOwnerOrGuardian();\\n        guardian = _guardian;\\n    }\\n\\n    /**\\n     * @dev Function for withdrawing tokens\\n     * @param token The address of the token to withdraw\\n     * @param amount The amount to withdraw\\n     */\\n    function withdraw(address token, uint256 amount) external {\\n        _onlyAvatar();\\n        if (amount == 0) amount = IERC20(token).balanceOf(address(this));\\n        IERC20(token).transfer(msg.sender, amount);\\n    }\\n\\n    /**\\n     * @dev Function for pausing the bridge\\n     * @param isPaused Whether to pause the bridge or not\\n     */\\n    function pauseBridge(bool isPaused) external {\\n        _onlyOwnerOrGuardian();\\n        isClosed = isPaused;\\n    }\\n\\n    function canBridge(address from, uint256 amount) public view returns (bool isWithinLimit, string memory error) {\\n        return\\n            BridgeHelperLibrary.canBridge(\\n                bridgeLimits,\\n                accountsDailyLimit[from],\\n                bridgeDailyLimit,\\n                nameService,\\n                isClosed,\\n                from,\\n                amount\\n            );\\n    }\\n\\n    /**\\n     * @dev Function for handling token transfers\\n     * @param from The address of the sender\\n     * @param amount The amount to transfer\\n     * @param data The data to decode of format (uint256 targetChainId, address target, BridgeService bridge, bytes memory lzAdapterParams)\\n     * @return Whether the transfer was successful or not\\n     */\\n    //TODO: this wouldnt work as onTokenTransfer doesnt support value passing\\n    // function onTokenTransfer(address from, uint256 amount, bytes calldata data) external payable returns (bool) {\\n    //     if (msg.sender != address(nativeToken())) revert WRONG_TOKEN(msg.sender);\\n\\n    //     (uint256 targetChainId, address target, BridgeService bridge, bytes memory lzAdapterParams) = abi.decode(\\n    //         data,\\n    //         (uint256, address, BridgeService, bytes)\\n    //     );\\n\\n    //     _bridgeTo(from, target, targetChainId, amount, true, bridge, lzAdapterParams, address(0));\\n    //     return true;\\n    // }\\n\\n    /**\\n     * @dev Enforces transfer limits and checks if the transfer is valid\\n     * @param from The address to transfer from\\n     * @param target The address to transfer to\\n     * @param amount The amount to transfer\\n     * @param targetChainId The chain ID of the target chain\\n     */\\n    function _enforceLimits(address from, address target, uint256 amount, uint256 targetChainId) internal virtual {\\n        if (target == address(0) || targetChainId == 0) revert INVALID_TARGET_OR_CHAINID(target, targetChainId);\\n\\n        if (bridgeDailyLimit.lastTransferReset < block.timestamp - 1 days) {\\n            bridgeDailyLimit.lastTransferReset = block.timestamp;\\n            bridgeDailyLimit.bridged24Hours = 0;\\n        }\\n\\n        if (accountsDailyLimit[from].lastTransferReset < block.timestamp - 1 days) {\\n            accountsDailyLimit[from].lastTransferReset = block.timestamp;\\n            accountsDailyLimit[from].bridged24Hours = 0;\\n        }\\n        (bool isValid, string memory reason) = canBridge(from, amount);\\n        if (isValid == false) revert BRIDGE_LIMITS(reason);\\n\\n        bridgeDailyLimit.bridged24Hours += amount;\\n        accountsDailyLimit[from].bridged24Hours += amount;\\n    }\\n\\n    function bridgeTo(address target, uint256 targetChainId, uint256 amount, BridgeService bridge) external payable {\\n        _bridgeTo(msg.sender, target, targetChainId, amount, bridge, '', address(0));\\n    }\\n\\n    function bridgeToWithLz(\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        bytes calldata adapterParams\\n    ) external payable {\\n        _bridgeTo(msg.sender, target, targetChainId, amount, BridgeService.LZ, adapterParams, address(0));\\n    }\\n\\n    function bridgeToWithAxelar(\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        address gasRefundAddress\\n    ) external payable {\\n        _bridgeTo(msg.sender, target, targetChainId, amount, BridgeService.AXELAR, '', gasRefundAddress);\\n    }\\n\\n    /**\\n     * @dev Bridges tokens from one chain to another, this performs burning or locking\\n     * @param from The address to bridge tokens from\\n     * @param target The address to bridge tokens to\\n     * @param targetChainId The chain ID of the target chain\\n     * @param amount The amount of tokens to bridge\\n     * @param lzAdapterParams extra params for lz\\n     * @param axelarGasRefundAddress gas refund address to axelar (default to msg.sender if 0)\\n     */\\n    function _bridgeTo(\\n        address from,\\n        address target,\\n        uint256 targetChainId,\\n        uint256 amount,\\n        BridgeService bridge,\\n        bytes memory lzAdapterParams,\\n        address axelarGasRefundAddress\\n    ) internal {\\n        if (isClosed) revert BRIDGE_LIMITS('closed');\\n\\n        // lock on celo, burn on other chains\\n        if (_chainId() == HOME_CHAIN_ID) {\\n            if (nativeToken().transferFrom(from, address(this), amount) == false) revert TRANSFER_FROM();\\n        } else nativeToken().burnFrom(from, amount);\\n        uint256 normalizedAmount = BridgeHelperLibrary.normalizeFromTokenTo18Decimals(amount, nativeToken().decimals()); //on bridge request we normalize amount from source chain decimals to 18 decimals\\n\\n        if (msg.value == 0) revert MISSING_FEE();\\n\\n        uint256 requestId = uint256(keccak256(abi.encode(address(this), _chainId(), currentId++)));\\n        bytes memory payload = abi.encode(from, target, normalizedAmount, requestId);\\n\\n        if (bridge == BridgeService.AXELAR) {\\n            string memory chainId = toAxelarChainId(targetChainId);\\n            if (bytes(chainId).length == 0) revert UNSUPPORTED_CHAIN(targetChainId);\\n            _axelarBridgeTo(\\n                payload,\\n                chainId,\\n                axelarGasRefundAddress == address(0) ? msg.sender : axelarGasRefundAddress\\n            );\\n        } else if (bridge == BridgeService.LZ) {\\n            if (lzAdapterParams.length == 0) {\\n                lzAdapterParams = abi.encodePacked(uint16(1), uint256(400000)); //default 400k gas estimate for bridge tx https://layerzero.gitbook.io/docs/evm-guides/advanced/relayer-adapter-parameters\\n            }\\n            uint16 chainId = toLzChainId(targetChainId);\\n\\n            if (chainId == 0) revert UNSUPPORTED_CHAIN(targetChainId);\\n            (uint256 nativeFee, ) = estimateSendFee(chainId, from, target, normalizedAmount, false, lzAdapterParams);\\n\\n            if (nativeFee > msg.value) revert LZ_FEE(nativeFee, msg.value);\\n\\n            _lzBridgeTo(payload, chainId, payable(from), address(0), lzAdapterParams);\\n        }\\n\\n        emit BridgeRequest(from, target, targetChainId, normalizedAmount, block.timestamp, bridge, requestId);\\n    }\\n\\n    /**\\n     * @dev Takes a fee from the amount being transferred\\n     * @param amount The amount being transferred\\n     * @return fee amount\\n     */\\n    function _takeFee(uint256 amount) internal view returns (uint256 fee) {\\n        fee = (amount * bridgeFees.fee) / 10000;\\n    }\\n\\n    /**\\n     * we override the callback that is triggered when a message is received\\n     * @param sourceChainId the source chain\\n     * @param sourceAddress the source contract\\n     * @param from sender\\n     * @param to recipient\\n     * @param normalizedAmount amount in 18 decimals\\n     * @param requestId request id\\n     */\\n    function _axelarBridgeFrom(\\n        string memory sourceChainId,\\n        address sourceAddress,\\n        address from,\\n        address to,\\n        uint256 normalizedAmount,\\n        uint256 requestId\\n    ) internal virtual override {\\n        uint256 chainId = fromAxelarChainId(sourceChainId);\\n\\n        _bridgeFrom(from, to, normalizedAmount, chainId, sourceAddress, requestId, BridgeService.AXELAR);\\n    }\\n\\n    /**\\n     * we override the callback that is triggered when a message is received\\n     * @param sourceChainId source chain\\n     * @param sourceAddress source contract\\n     * @param from sender\\n     * @param to recipient\\n     * @param normalizedAmount amount in 18 decimals\\n     * @param requestId request id\\n     */\\n    function _lzBridgeFrom(\\n        uint16 sourceChainId,\\n        address sourceAddress,\\n        uint64 /*nonce*/,\\n        address from,\\n        address to,\\n        uint256 normalizedAmount,\\n        uint256 requestId\\n    ) internal virtual override {\\n        uint256 chainId = fromLzChainId(sourceChainId);\\n\\n        _bridgeFrom(from, to, normalizedAmount, chainId, sourceAddress, requestId, BridgeService.LZ);\\n    }\\n\\n    /**\\n     * @dev Bridges tokens from one chain to another, this performs minting or unlock\\n     * @param from The address to bridge tokens from\\n     * @param target The address to bridge tokens to\\n     * @param normalizedAmount The amount of tokens to bridge\\n     * @param sourceChainId The chain ID of the source chain\\n     * @param id The ID of the transfer\\n     */\\n    function _bridgeFrom(\\n        address from,\\n        address target,\\n        uint256 normalizedAmount,\\n        uint256 sourceChainId,\\n        address sourceContract,\\n        uint256 id,\\n        BridgeService bridge\\n    ) internal {\\n        if (toLzChainId(sourceChainId) == 0) revert UNSUPPORTED_CHAIN(sourceChainId);\\n        if (disabledSourceBridges[keccak256(abi.encode(sourceChainId, bridge))])\\n            revert BRIDGE_LIMITS('source disabled');\\n\\n        if (executedRequests[id]) revert ALREADY_EXECUTED(id);\\n\\n        //verify that we trust the source (using lz format)\\n        bytes memory trustedRemote = trustedRemoteLookup[toLzChainId(sourceChainId)];\\n        bytes memory sourceUA = abi.encodePacked(sourceContract, address(this));\\n        // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.\\n        if (\\n            sourceUA.length != trustedRemote.length ||\\n            trustedRemote.length == 0 ||\\n            keccak256(sourceUA) != keccak256(trustedRemote)\\n        ) {\\n            emit FalseSender(sourceChainId, sourceContract);\\n            return;\\n        }\\n\\n        //skip limits for manually approved/stuck TXs\\n        if (approvedRequests[id] == false) _enforceLimits(from, target, normalizedAmount, _chainId());\\n\\n        uint256 tokenAmount = BridgeHelperLibrary.normalizeFrom18ToTokenDecimals(\\n            normalizedAmount,\\n            nativeToken().decimals()\\n        ); //on transfer we normalize the request which is in 18 decimals back to local chain token decimals\\n\\n        uint256 fee = _takeFee(tokenAmount);\\n\\n        //make it easier to find out for relayers about the status\\n        executedRequests[id] = true;\\n        _topGas(target);\\n\\n        //unlock on celo mint on other chains\\n        if (_chainId() == HOME_CHAIN_ID) {\\n            if (nativeToken().transfer(target, tokenAmount - fee) == false) revert TRANSFER();\\n            if (fee > 0 && feeRecipient == address(0)) nativeToken().burn(fee);\\n            else if (fee > 0) nativeToken().transfer(feeRecipient, fee);\\n        } else {\\n            dao.mintTokens(tokenAmount - fee, target, avatar);\\n            if (fee > 0) dao.mintTokens(fee, feeRecipient, avatar);\\n        }\\n\\n        emit ExecutedTransfer(from, target, normalizedAmount, fee, sourceChainId, bridge, id);\\n    }\\n\\n    /**\\n     * @dev Tops up gas for a wallet\\n     * @param target The address of the wallet to top up gas for\\n     */\\n    function _topGas(address target) internal {\\n        if (address(faucet) != address(0) && faucet.canTop(target)) {\\n            try faucet.topWallet(target) {} catch {}\\n        }\\n    }\\n\\n    /**\\n     * @dev Gets the chain ID of the current chain\\n     * @return chainId The chain ID\\n     */\\n    function _chainId() internal view virtual returns (uint256 chainId) {\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    function toLzChainId(uint256 chainId) public view returns (uint16 lzChainId) {\\n        return lzChainIdsMapping[chainId];\\n    }\\n\\n    function fromLzChainId(uint16 lzChainId) public view returns (uint256 chainId) {\\n        return lzChainToIdsMapping[lzChainId];\\n    }\\n\\n    function toAxelarChainId(uint256 chainId) public pure returns (string memory axlChainId) {\\n        if (chainId == 1) return 'Ethereum';\\n        if (chainId == 5) return 'ethereum-2';\\n        if (chainId == 42220) return 'celo';\\n        if (chainId == 44787) return 'celo';\\n    }\\n\\n    function fromAxelarChainId(string memory axlChainId) public view returns (uint256 chainId) {\\n        bytes32 chainHash = keccak256(bytes(axlChainId));\\n        if (chainHash == keccak256('Ethereum')) return 1;\\n        if (chainHash == keccak256('ethereum-2')) return 5;\\n        if (chainHash == keccak256('celo'))\\n            if (TESTNET) return 44787;\\n            else return 42220;\\n    }\\n}\\n\",\"keccak256\":\"0xca927fdf5d8623e94c4cc9b7175bd985b79626d2235d745b9333843b9e55f602\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x610140604052306080523480156200001657600080fd5b5060405162005fdc38038062005fdc8339810160408190526200003991620000b7565b8484816001600160a01b038116620000645760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0390811660a05290811660c0529390931660e0529015156101005263ffffffff1661012052506200013a915050565b80516001600160a01b0381168114620000b257600080fd5b919050565b600080600080600060a08688031215620000d057600080fd5b620000db866200009a565b9450620000eb602087016200009a565b9350620000fb604087016200009a565b9250606086015180151581146200011157600080fd5b608087015190925063ffffffff811681146200012c57600080fd5b809150509295509295909350565b60805160a05160c05160e0516101005161012051615dfe620001de60003960008181610a3401528181612a9a01526141ae0152600081816108ba01526118fa01526000818161038f0152612763015260008181610871015261353c0152600081816104af015281816110e80152818161164501526135d50152600081816113f701528181611437015281816117070152818161174701526117c30152615dfe6000f3fe6080604052600436106103565760003560e01c80621d35671461035b578063020051cf1461037d57806305fead15146103c757806307e0db17146103fc5780630dce292e1461041c5780630df374831461045d57806310ddb1371461047d578063116191b61461049d57806316ad5512146104d15780631a394795146104ff5780631a98b2e01461051f5780631b3c90a81461053f5780631fec5c5c1461055457806329b70872146105675780633095634a146105875780633659cfe6146105b55780633d8b38f6146105d55780633e6326fc146105f55780633f1f4fa41461061557806340a00aaf146106435780634162169f14610656578063425cfb531461067657806342d65a8d146106a7578063452a9320146106c757806346904840146106e857806349160658146107095780634f1ef2861461072957806352d1902d1461073c57806356026f37146107515780635aef7de6146107715780635b23a990146107915780635b8c41e6146107be57806366ad5c8a1461080e57806369c20d361461082e5780636a22d8cc1461085f578063715018a61461089357806372891b2d146108a857806373800fc4146108dc5780637533d7881461090a5780637b0240c01461093757806382dc737d146109745780638a0dac4a146109945780638caa2d35146109b45780638cfd8f5c146109d45780638da5cb5b14610a0d5780638f65be8514610a22578063950c8a7414610a6b5780639a9ee08114610a8c5780639f38369a14610aac578063a6c3d16514610acc578063b2f7667f14610aec578063b353aaa714610b09578063b5569f1814610b29578063baf3292d14610b5b578063c2b6b58c14610b7b578063c446183414610b96578063c56bbdd914610bac578063c612f9ea14610bbf578063c6dd812f14610bdf578063c78ab88214610c38578063cbed8b9c14610c58578063d1deba1f14610c78578063d422794714610c8b578063d55ec69714610cc0578063d7d1bbdb14610cd5578063d8b31c7714610cf5578063de5f72fd14610d15578063df2a5b3b14610d36578063e00dd16114610d56578063e1758bd814610d6d578063e74b981b14610d82578063eb8d72b714610da2578063f2fde38b14610dc2578063f3fef3a314610de2578063f5ecbdbc14610e02578063fad16abe14610e22575b600080fd5b34801561036757600080fd5b5061037b61037636600461496d565b610e42565b005b34801561038957600080fd5b506103b17f000000000000000000000000000000000000000000000000000000000000000081565b6040516103be9190614a0d565b60405180910390f35b3480156103d357600080fd5b506103e76103e2366004614b0f565b610eff565b604080519283526020830191909152016103be565b34801561040857600080fd5b5061037b610417366004614b9c565b610fbf565b34801561042857600080fd5b5061044d610437366004614bb7565b6101d86020526000908152604090205460ff1681565b60405190151581526020016103be565b34801561046957600080fd5b5061037b610478366004614bd0565b61102c565b34801561048957600080fd5b5061037b610498366004614b9c565b61104c565b3480156104a957600080fd5b506103b17f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506104f16104ec366004614b9c565b611084565b6040519081526020016103be565b34801561050b57600080fd5b5061037b61051a366004614bfa565b61109b565b34801561052b57600080fd5b5061037b61053a366004614c17565b6110b7565b34801561054b57600080fd5b5061037b61119a565b61037b610562366004614cf0565b6112c1565b34801561057357600080fd5b5061037b610582366004614db7565b6112e6565b34801561059357600080fd5b506105a76105a2366004614dd3565b611327565b6040516103be929190614e49565b3480156105c157600080fd5b5061037b6105d0366004614e6c565b6113ec565b3480156105e157600080fd5b5061044d6105f0366004614e89565b6114b5565b34801561060157600080fd5b506067546103b1906001600160a01b031681565b34801561062157600080fd5b506104f1610630366004614b9c565b6101016020526000908152604090205481565b61037b610651366004614edb565b611582565b34801561066257600080fd5b506065546103b1906001600160a01b031681565b34801561068257600080fd5b5061044d610691366004614bb7565b6101c66020526000908152604090205460ff1681565b3480156106b357600080fd5b5061037b6106c2366004614e89565b6115a1565b3480156106d357600080fd5b506101c5546103b1906001600160a01b031681565b3480156106f457600080fd5b506101d7546103b1906001600160a01b031681565b34801561071557600080fd5b5061037b610724366004614f1a565b611614565b61037b610737366004614fbd565b6116fc565b34801561074857600080fd5b506104f16117b6565b34801561075d57600080fd5b506104f161076c36600461500c565b611864565b34801561077d57600080fd5b506066546103b1906001600160a01b031681565b34801561079d57600080fd5b506107b16107ac366004614bb7565b611938565b6040516103be9190615054565b3480156107ca57600080fd5b506104f16107d9366004615063565b610130602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561081a57600080fd5b5061037b61082936600461496d565b61194f565b34801561083a57600080fd5b5061044d610849366004614bb7565b6101c76020526000908152604090205460ff1681565b34801561086b57600080fd5b506103b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561089f57600080fd5b5061037b611a23565b3480156108b457600080fd5b5061044d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156108e857600080fd5b506104f16108f7366004614b9c565b6101d96020526000908152604090205481565b34801561091657600080fd5b5061092a610925366004614b9c565b611a37565b6040516103be91906150c0565b34801561094357600080fd5b506101c9546101ca546101cb5461095992919083565b604080519384526020840192909252908201526060016103be565b34801561098057600080fd5b5061037b61098f36600461512e565b611ad1565b3480156109a057600080fd5b5061037b6109af366004614e6c565b611af2565b3480156109c057600080fd5b5061037b6109cf366004614bd0565b611b1d565b3480156109e057600080fd5b506104f16109ef36600461514a565b61010060209081526000928352604080842090915290825290205481565b348015610a1957600080fd5b506103b1611bd3565b348015610a2e57600080fd5b50610a567f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103be565b348015610a7757600080fd5b50610102546103b1906001600160a01b031681565b348015610a9857600080fd5b5061092a610aa7366004614bb7565b611be2565b348015610ab857600080fd5b5061092a610ac7366004614b9c565b611c99565b348015610ad857600080fd5b5061037b610ae7366004614e89565b611da9565b348015610af857600080fd5b506101d1546101d2546103e7919082565b348015610b1557600080fd5b5060fe546103b1906001600160a01b031681565b348015610b3557600080fd5b506107b1610b44366004614bb7565b6101d66020526000908152604090205461ffff1681565b348015610b6757600080fd5b5061037b610b76366004614e6c565b611e3c565b348015610b8757600080fd5b506101c85461044d9060ff1681565b348015610ba257600080fd5b506104f161271081565b61037b610bba36600461517d565b611e9b565b348015610bcb57600080fd5b5061037b610bda366004614bb7565b611ee0565b348015610beb57600080fd5b506101cc546101cd546101ce546101cf546101d054610c0e949392919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016103be565b348015610c4457600080fd5b5061037b610c53366004615278565b611f04565b348015610c6457600080fd5b5061037b610c73366004615326565b611f89565b61037b610c8636600461496d565b612002565b348015610c9757600080fd5b506103e7610ca6366004614e6c565b6101d3602052600090815260409020805460019091015482565b348015610ccc57600080fd5b5061037b61221a565b348015610ce157600080fd5b5061037b610cf0366004614bb7565b6122ca565b348015610d0157600080fd5b5061037b610d10366004614e6c565b6122ee565b348015610d2157600080fd5b506101d4546103b1906001600160a01b031681565b348015610d4257600080fd5b5061037b610d51366004615377565b612319565b348015610d6257600080fd5b506104f16101d55481565b348015610d7957600080fd5b506103b16123cc565b348015610d8e57600080fd5b5061037b610d9d366004614e6c565b612459565b348015610dae57600080fd5b5061037b610dbd366004614e89565b612484565b348015610dce57600080fd5b5061037b610ddd366004614e6c565b6124de565b348015610dee57600080fd5b5061037b610dfd366004614dd3565b612554565b348015610e0e57600080fd5b5061092a610e1d3660046153b3565b612642565b348015610e2e57600080fd5b5061037b610e3d366004615400565b6126d5565b60fe546001600160a01b0316336001600160a01b031614610e815733604051634a43969960e11b8152600401610e789190614a0d565b60405180910390fd5b610ef78686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061292092505050565b505050505050565b604080516001600160a01b0387811660208301528681168284015260608201869052600060808084018290528451808503909101815260a084019485905260fe5463040a7bb160e41b90955290938493919216906340a7bb1090610f6f908c90309086908b908b9060a40161543f565b6040805180830381865afa158015610f8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610faf9190615493565b9250925050965096945050505050565b610fc7612999565b60fe546040516307e0db1760e01b81526001600160a01b03909116906307e0db1790610ff7908490600401615054565b600060405180830381600087803b15801561101157600080fd5b505af1158015611025573d6000803e3d6000fd5b5050505050565b611034612999565b61ffff90911660009081526101016020526040902055565b611054612999565b60fe546040516310ddb13760e01b81526001600160a01b03909116906310ddb13790610ff7908490600401615054565b61ffff1660009081526101d9602052604090205490565b6110a36129f8565b6101c8805460ff1916911515919091179055565b600085856040516110c99291906154b7565b604051908190038120631876eed960e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631876eed99061112d908e908e908e908e908e9089908d908d908d906004016154f0565b6020604051808303816000875af115801561114c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611170919061554f565b61118d57604051631403112d60e21b815260040160405180910390fd5b5050505050505050505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa1580156111fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611221919061556c565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f919061556c565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6112e03385858585604051806020016040528060008152506000612a55565b50505050565b6112ee6129f8565b80516101cc5560208101516101cd5560408101516101ce5560608101516101cf55608001516101d0805460ff1916911515919091179055565b6001600160a01b0380831660009081526101d360205260408082206067546101c8549251633de4799760e11b81529394606094735D4C25c3B621027A8011474Eb005e45Dd014a2c194637bc8f32e9461139b946101cc9491936101d193919092169160ff909116908c908c90600401615589565b600060405180830381865af41580156113b8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113e09190810190615649565b915091505b9250929050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156114355760405162461bcd60e51b8152600401610e78906156a3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611467612f10565b6001600160a01b03161461148d5760405162461bcd60e51b8152600401610e78906156dd565b61149681612f2c565b604080516000808252602082019092526114b291839190612f34565b50565b61ffff8316600090815260ff6020526040812080548291906114d690615717565b80601f016020809104026020016040519081016040528092919081815260200182805461150290615717565b801561154f5780601f106115245761010080835404028352916020019161154f565b820191906000526020600020905b81548152906001019060200180831161153257829003601f168201915b5050505050905083836040516115669291906154b7565b60405180910390208180519060200120149150505b9392505050565b6112e03385858560006040518060200160405280600081525087612a55565b6115a9612999565b60fe546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d906115dd9086908690869060040161574c565b600060405180830381600087803b1580156115f757600080fd5b505af115801561160b573d6000803e3d6000fd5b50505050505050565b600082826040516116269291906154b7565b604051908190038120635f6970c360e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635f6970c390611684908b908b908b908b908b90899060040161576a565b6020604051808303816000875af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c7919061554f565b6116e457604051631403112d60e21b815260040160405180910390fd5b6116f287878787878761309f565b5050505050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156117455760405162461bcd60e51b8152600401610e78906156a3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611777612f10565b6001600160a01b03161461179d5760405162461bcd60e51b8152600401610e78906156dd565b6117a682612f2c565b6117b282826001612f34565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118515760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b6064820152608401610e78565b50600080516020615d6283398151915290565b805160208201206000907f564ccaf7594d66b1eaaea24fe01f0585bf52ee70852af4eac0cc4b04711cd0e281141561189f5750600192915050565b7f43ab905ae53adfdd46d0850022d385a6c09c15bfde5206c98fa0fc8dc340c3f88114156118d05750600592915050565b7f2ab2bf4c5cabc3000e2502e33470a863db2755809d7561237424a0eb373154c2811415611932577f000000000000000000000000000000000000000000000000000000000000000015611928575061aef392915050565b5061a4ec92915050565b50919050565b60009081526101d6602052604090205461ffff1690565b3330146119ad5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610e78565b610ef78686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061314192505050565b611a2b612999565b611a356000613179565b565b60ff6020526000908152604090208054611a5090615717565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7c90615717565b8015611ac95780601f10611a9e57610100808354040283529160200191611ac9565b820191906000526020600020905b815481529060010190602001808311611aac57829003601f168201915b505050505081565b611ad96129f8565b80516101c95560208101516101ca55604001516101cb55565b611afa6129f8565b6101c580546001600160a01b0319166001600160a01b0392909216919091179055565b611b256129f8565b61ffff821660009081526101d9602052604090205415611b575760405162dc149f60e41b815260040160405180910390fd5b61ffff821660008181526101d9602090815260408083208590558483526101d6825291829020805461ffff191690931790925551611b999130918291016157ab565b60408051601f1981840301815291815261ffff8416600090815260ff60209081529190208251611bce939192909101906147f6565b505050565b60cc546001600160a01b031690565b60608160011415611c11575050604080518082019091526008815267457468657265756d60c01b602082015290565b8160051415611c4057505060408051808201909152600a81526932ba3432b932bab6969960b11b602082015290565b8161a4ec1415611c6a57505060408051808201909152600481526363656c6f60e01b602082015290565b8161aef31415611c9457505060408051808201909152600481526363656c6f60e01b602082015290565b919050565b61ffff8116600090815260ff6020526040812080546060929190611cbc90615717565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce890615717565b8015611d355780601f10611d0a57610100808354040283529160200191611d35565b820191906000526020600020905b815481529060010190602001808311611d1857829003601f168201915b50505050509050805160001415611d8e5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610e78565b61157b600060148351611da191906157e3565b8391906131cb565b611db1612999565b818130604051602001611dc6939291906157fa565b60408051601f1981840301815291815261ffff8516600090815260ff60209081529190208251611dfb939192909101906147f6565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611e2f9392919061574c565b60405180910390a1505050565b611e44612999565b61010280546001600160a01b0319166001600160a01b0383161790556040517f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90611e90908390614a0d565b60405180910390a150565b61102533868686600187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250612a55915050565b611ee86129f8565b60009081526101c660205260409020805460ff19166001179055565b611f0c6129f8565b60005b8251811015611bce57818181518110611f2a57611f2a61581b565b60200260200101516101c76000858481518110611f4957611f4961581b565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f8190615831565b915050611f0f565b611f91612999565b60fe546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c90611fc9908890889088908890889060040161584c565b600060405180830381600087803b158015611fe357600080fd5b505af1158015611ff7573d6000803e3d6000fd5b505050505050505050565b61ffff861660009081526101306020526040808220905161202690889088906154b7565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806120a65760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610e78565b8083836040516120b79291906154b7565b6040518091039020146121165760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610e78565b61ffff871660009081526101306020526040808220905161213a90899089906154b7565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f880182900482028301820190528682526121d2918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061314192505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051612209959493929190615885565b60405180910390a150505050505050565b600054600290610100900460ff1615801561223c575060005460ff8083169116105b6122585760405162461bcd60e51b8152600401610e78906158c0565b6000805461ffff191660ff83161761010017905561227860656001611b1d565b612285607d61a4ec611b1d565b612291608a607a611b1d565b61229e61016d6032611b1d565b6000805461ff001916905560405160ff82168152600080516020615d8283398151915290602001611e90565b6122d26129f8565b60009081526101d860205260409020805460ff19166001179055565b6122f66129f8565b6101d480546001600160a01b0319166001600160a01b0392909216919091179055565b612321612999565b600081116123695760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610e78565b61ffff8381166000818152610100602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611e2f565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612454919061556c565b905090565b6124616129f8565b6101d780546001600160a01b0319166001600160a01b0392909216919091179055565b61248c612999565b61ffff8316600090815260ff602052604090206124aa90838361487a565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611e2f9392919061574c565b6124e6612999565b6001600160a01b03811661254b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e78565b6114b281613179565b61255c6132d8565b806125d1576040516370a0823160e01b81526001600160a01b038316906370a082319061258d903090600401614a0d565b602060405180830381865afa1580156125aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ce919061590e565b90505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906125ff9033908590600401615927565b6020604051808303816000875af115801561261e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bce919061554f565b60fe54604051633d7b2f6f60e21b815261ffff808716600483015285166024820152306044820152606481018390526060916001600160a01b03169063f5ecbdbc90608401600060405180830381865afa1580156126a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126cc9190810190615940565b95945050505050565b600054610100900460ff16158080156126f55750600054600160ff909116105b8061271657506127043061339b565b158015612716575060005460ff166001145b6127325760405162461bcd60e51b8152600401610e78906158c0565b6000805460ff191660011790558015612755576000805461ff0019166101001790555b61275e846133aa565b6127877f00000000000000000000000000000000000000000000000000000000000000006133cd565b6101c58054336001600160a01b031990911617905582516101cc556020808401516101cd556040808501516101ce5560608501516101cf5560808501516101d0805460ff191691151591909117905583516101c955838201516101ca55838101516101cb555163bf40fac160e01b815260048101919091526009602482015268554249534348454d4560b81b60448201526001600160a01b0385169063bf40fac190606401602060405180830381865afa158015612849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286d919061556c565b6101d780546001600160a01b0319166001600160a01b039290921691821790556128b5576066546101d780546001600160a01b0319166001600160a01b039092169190911790555b6128c160656001611b1d565b6128ce607d61a4ec611b1d565b6128da608a607a611b1d565b6128e761016d6032611b1d565b80156112e0576000805461ff001916905560405160018152600080516020615d828339815191529060200160405180910390a150505050565b6000806129835a60966366ad5c8a60e01b898989896040516024016129489493929190615988565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190613405565b9150915081610ef757610ef7868686868561348f565b336129a2611bd3565b6001600160a01b031614611a355760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e78565b6101c5546001600160a01b0316331480612a1c57506066546001600160a01b031633145b80612a36575033612a2b611bd3565b6001600160a01b0316145b611a35573360405163b63b5ad960e01b8152600401610e789190614a0d565b6101c85460ff1615612a935760405163c5426f8d60e01b815260206004820152600660248201526518db1bdcd95960d21b6044820152606401610e78565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016461415612b6657612ac96123cc565b6040516323b872dd60e01b81526001600160a01b0389811660048301523060248301526044820187905291909116906323b872dd906064016020604051808303816000875af1158015612b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b44919061554f565b612b61576040516316431e9360e11b815260040160405180910390fd5b612bce565b612b6e6123cc565b6001600160a01b03166379cc679088866040518363ffffffff1660e01b8152600401612b9b929190615927565b600060405180830381600087803b158015612bb557600080fd5b505af1158015612bc9573d6000803e3d6000fd5b505050505b6000735D4C25c3B621027A8011474Eb005e45Dd014a2c163aac673c386612bf36123cc565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5491906159c6565b6040516001600160e01b031960e085901b168152600481019290925260ff166024820152604401602060405180830381865af4158015612c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cbc919061590e565b905034612cdc57604051630ba4e53360e21b815260040160405180910390fd5b600030466101d58054906000612cf183615831565b90915550604080516001600160a01b039094166020850152830191909152606082015260800160408051808303601f1901815282825280516020918201206001600160a01b03808e1692850192909252908b16918301919091526060820184905260808201819052915060009060a00160408051601f1981840301815291905290506000866001811115612d8757612d876159e9565b1415612de6576000612d9889611be2565b9050805160001415612dc05760405163068a505360e01b8152600481018a9052602401610e78565b612de082826001600160a01b03881615612dda578761352d565b3361352d565b50612eb2565b6001866001811115612dfa57612dfa6159e9565b1415612eb2578451612e3157604051600160f01b602082015262061a80602282015260420160405160208183030381529060405294505b6000612e3c89611938565b905061ffff8116612e635760405163068a505360e01b8152600481018a9052602401610e78565b6000612e74828d8d8860008c610eff565b50905034811115612ea1576040516324a89fab60e21b815260048101829052346024820152604401610e78565b612eaf83838e60008b61363f565b50505b81896001600160a01b03168b6001600160a01b03167fabeeb7182c7294cd8efcd40e9ff952c1b759c2165b3634aac589429de5d55ad08b87428c604051612efc9493929190615a21565b60405180910390a450505050505050505050565b600080516020615d62833981519152546001600160a01b031690565b6114b2612999565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612f6757611bce8361364d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612fc1575060408051601f3d908101601f19168201909252612fbe9181019061590e565b60015b6130245760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610e78565b600080516020615d6283398151915281146130935760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610e78565b50611bce8383836136e7565b60006130e085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061370c92505050565b905060008080806130f386880188615a43565b935093509350935061118d8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250889150879050868661388b565b6000806000808480602001905181019061315b9190615a89565b60148b015193975091955093509150611ff7898289888888886138a8565b60cc80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060816131d981601f615ad1565b10156132185760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610e78565b6132228284615ad1565b845110156132665760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610e78565b60608215801561328557604051915060008252602082016040526132cf565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156132be5780518352602092830192016132a6565b5050858452601f01601f1916604052505b50949350505050565b60655460408051632d77bef360e11b8152905133926001600160a01b031691635aef7de69160048083019260209291908290030181865afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613345919061556c565b6001600160a01b031614611a355760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206176617461722063616e2063616c6c2074686973206d6574686f646044820152606401610e78565b6001600160a01b03163b151590565b606780546001600160a01b0319166001600160a01b0383161790556114b261119a565b600054610100900460ff166133f45760405162461bcd60e51b8152600401610e7890615ae9565b6133fc6138c5565b6114b2816138f5565b6000606060008060008661ffff166001600160401b0381111561342a5761342a614a44565b6040519080825280601f01601f191660200182016040528015613454576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115613476578692505b828152826000602083013e909890975095505050505050565b818051906020012061013060008761ffff1661ffff168152602001908152602001600020856040516134c19190615b34565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c9061351e9087908790879087908790615b50565b60405180910390a15050505050565b60006135383061393e565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630c93e3bb3430868589886040518763ffffffff1660e01b815260040161358f959493929190615ba2565b6000604051808303818588803b1580156135a857600080fd5b505af11580156135bc573d6000803e3d6000fd5b5050604051631c92115f60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169350631c92115f92506136119150869085908990600401615c00565b600060405180830381600087803b15801561362b57600080fd5b505af11580156116f2573d6000803e3d6000fd5b611025848685858534613b83565b6136568161339b565b6136b85760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610e78565b600080516020615d6283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6136f083613d0d565b6000825111806136fd5750805b15611bce576112e08383613d4d565b6000808290506000808251602a14158061374c5750826000815181106137345761373461581b565b6020910101516001600160f81b031916600360fc1b14155b8061377d5750826001815181106137655761376561581b565b6020910101516001600160f81b031916600f60fb1b14155b1561379b57604051636fa478cf60e11b815260040160405180910390fd5b60025b602a811015613881578381815181106137b9576137b961581b565b016020015160f81c9150606182108015906137d8575060668260ff1611155b156137ef576137e8605783615c43565b9150613858565b60418260ff1610158015613807575060468260ff1611155b15613817576137e8603783615c43565b60308260ff161015801561382f575060398260ff1611155b1561383f576137e8603083615c43565b604051636fa478cf60e11b815260040160405180910390fd5b60026138658260296157e3565b60ff8416911b1b929092179161387a81615831565b905061379e565b5090949350505050565b600061389687611864565b905061160b858585848a876000613e36565b60006138b388611084565b90506116f2858585848b876001613e36565b600054610100900460ff166138ec5760405162461bcd60e51b8152600401610e7890615ae9565b611a3533613179565b600054610100900460ff1661391c5760405162461bcd60e51b8152600401610e7890615ae9565b60fe80546001600160a01b0319166001600160a01b0392909216919091179055565b604051606082811b6001600160601b03191660208301529060009060340160408051601f198184030181528282528051838301909252601083526f181899199a1a9b1b9c1cb0b131b232b360811b602084015280519093509091906000906139a7906002615c66565b6139b2906002615ad1565b6001600160401b038111156139c9576139c9614a44565b6040519080825280601f01601f1916602001820160405280156139f3576020820181803683370190505b509050600360fc1b81600081518110613a0e57613a0e61581b565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613a3d57613a3d61581b565b60200101906001600160f81b031916908160001a90535060005b83811015613b7957826004868381518110613a7457613a7461581b565b016020015182516001600160f81b031990911690911c60f81c908110613a9c57613a9c61581b565b01602001516001600160f81b03191682613ab7836002615c66565b613ac2906002615ad1565b81518110613ad257613ad261581b565b60200101906001600160f81b031916908160001a90535082858281518110613afc57613afc61581b565b602091010151815160f89190911c600f16908110613b1c57613b1c61581b565b01602001516001600160f81b03191682613b37836002615c66565b613b42906003615ad1565b81518110613b5257613b5261581b565b60200101906001600160f81b031916908160001a905350613b7281615831565b9050613a57565b5095945050505050565b61ffff8616600090815260ff602052604081208054613ba190615717565b80601f0160208091040260200160405190810160405280929190818152602001828054613bcd90615717565b8015613c1a5780601f10613bef57610100808354040283529160200191613c1a565b820191906000526020600020905b815481529060010190602001808311613bfd57829003601f168201915b50505050509050805160001415613c8c5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610e78565b613c97878751614502565b60fe5460405162c5803160e81b81526001600160a01b039091169063c5803100908490613cd2908b9086908c908c908c908c90600401615c85565b6000604051808303818588803b158015613ceb57600080fd5b505af1158015613cff573d6000803e3d6000fd5b505050505050505050505050565b613d168161364d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060613d588361339b565b613db35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610e78565b600080846001600160a01b031684604051613dce9190615b34565b600060405180830381855af49150503d8060008114613e09576040519150601f19603f3d011682016040523d82523d6000602084013e613e0e565b606091505b50915091506126cc8282604051806060016040528060278152602001615da260279139614571565b613e3f84611938565b61ffff16613e635760405163068a505360e01b815260048101859052602401610e78565b6101c760008583604051602001613e7b929190615cec565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615613ee45760405163c5426f8d60e01b815260206004820152600f60248201526e1cdbdd5c98d948191a5cd8589b1959608a1b6044820152606401610e78565b60008281526101c6602052604090205460ff1615613f1857604051636e91c2f160e11b815260048101839052602401610e78565b600060ff6000613f2787611938565b61ffff1661ffff1681526020019081526020016000208054613f4890615717565b80601f0160208091040260200160405190810160405280929190818152602001828054613f7490615717565b8015613fc15780601f10613f9657610100808354040283529160200191613fc1565b820191906000526020600020905b815481529060010190602001808311613fa457829003601f168201915b5050505050905060008430604051602001613fdd9291906157ab565b604051602081830303815290604052905081518151141580613ffe57508151155b8061401757508180519060200120818051906020012014155b1561406457604080518781526001600160a01b03871660208201527f1eafb58197ea0dc76b9278ccad47f61a239f00b017d89a19081a89321cce213d910160405180910390a1505061160b565b60008481526101d8602052604090205460ff16614087576140878989894661458a565b6000735D4C25c3B621027A8011474Eb005e45Dd014a2c163e62381b6896140ac6123cc565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061410d91906159c6565b6040516001600160e01b031960e085901b168152600481019290925260ff166024820152604401602060405180830381865af4158015614151573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614175919061590e565b90506000614182826146b7565b60008781526101c660205260409020805460ff1916600117905590506141a78a6146dc565b63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001646141561438a576141dd6123cc565b6001600160a01b031663a9059cbb8b6141f684866157e3565b6040518363ffffffff1660e01b8152600401614213929190615927565b6020604051808303816000875af1158015614232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614256919061554f565b614273576040516376420e1d60e01b815260040160405180910390fd5b60008111801561428d57506101d7546001600160a01b0316155b156142fe5761429a6123cc565b6001600160a01b03166342966c68826040518263ffffffff1660e01b81526004016142c791815260200190565b600060405180830381600087803b1580156142e157600080fd5b505af11580156142f5573d6000803e3d6000fd5b505050506144a3565b80156143855761430c6123cc565b6101d75460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92614340929116908590600401615927565b6020604051808303816000875af115801561435f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614383919061554f565b505b6144a3565b6065546001600160a01b0316636407e4326143a583856157e3565b6066546040516001600160e01b031960e085901b1681526143d792918f916001600160a01b0390911690600401615d00565b6020604051808303816000875af11580156143f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061441a919061554f565b5080156144a3576065546101d754606654604051633203f21960e11b81526001600160a01b0393841693636407e4329361445e938793918316921690600401615d00565b6020604051808303816000875af115801561447d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144a1919061554f565b505b858a6001600160a01b03168c6001600160a01b03167f6cf712ce908185c8c38a073b7315f79687e7440fb057d9d1ca76a2509a1282ee8c858d8b6040516144ed9493929190615a21565b60405180910390a45050505050505050505050565b61ffff8216600090815261010160205260409020548061452157506127105b80821115611bce5760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610e78565b6060831561458057508161157b565b61157b83836147cc565b6001600160a01b038316158061459e575080155b156145c05782816040516314b2a5c360e31b8152600401610e78929190615927565b6145cd62015180426157e3565b6101d15410156145e357426101d15560006101d2555b6145f062015180426157e3565b6001600160a01b03851660009081526101d360205260409020541015614631576001600160a01b03841660009081526101d360205260408120428155600101555b60008061463e8685611327565b909250905081614663578060405163c5426f8d60e01b8152600401610e7891906150c0565b836101d160010160008282546146799190615ad1565b90915550506001600160a01b03861660009081526101d36020526040812060010180548692906146aa908490615ad1565b9091555050505050505050565b6101cb54600090612710906146cc9084615c66565b6146d69190615d1f565b92915050565b6101d4546001600160a01b03161580159061476457506101d4546040516374bf77e960e11b81526001600160a01b039091169063e97eefd290614723908490600401614a0d565b602060405180830381865afa158015614740573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614764919061554f565b156114b2576101d4546040516306ee3b9f60e31b81526001600160a01b0390911690633771dcf89061479a908490600401614a0d565b600060405180830381600087803b1580156147b457600080fd5b505af19250505080156147c5575060015b6114b25750565b8151156147dc5781518083602001fd5b8060405162461bcd60e51b8152600401610e7891906150c0565b82805461480290615717565b90600052602060002090601f016020900481019282614824576000855561486a565b82601f1061483d57805160ff191683800117855561486a565b8280016001018555821561486a579182015b8281111561486a57825182559160200191906001019061484f565b506148769291506148ee565b5090565b82805461488690615717565b90600052602060002090601f0160209004810192826148a8576000855561486a565b82601f106148c15782800160ff1982351617855561486a565b8280016001018555821561486a579182015b8281111561486a5782358255916020019190600101906148d3565b5b8082111561487657600081556001016148ef565b803561ffff81168114611c9457600080fd5b60008083601f84011261492757600080fd5b5081356001600160401b0381111561493e57600080fd5b6020830191508360208285010111156113e557600080fd5b80356001600160401b0381168114611c9457600080fd5b6000806000806000806080878903121561498657600080fd5b61498f87614903565b955060208701356001600160401b03808211156149ab57600080fd5b6149b78a838b01614915565b90975095508591506149cb60408a01614956565b945060608901359150808211156149e157600080fd5b506149ee89828a01614915565b979a9699509497509295939492505050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146114b257600080fd5b80151581146114b257600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614a8257614a82614a44565b604052919050565b60006001600160401b03821115614aa357614aa3614a44565b50601f01601f191660200190565b6000614ac4614abf84614a8a565b614a5a565b9050828152838383011115614ad857600080fd5b828260208301376000602084830101529392505050565b600082601f830112614b0057600080fd5b61157b83833560208501614ab1565b60008060008060008060c08789031215614b2857600080fd5b614b3187614903565b95506020870135614b4181614a21565b94506040870135614b5181614a21565b9350606087013592506080870135614b6881614a36565b915060a08701356001600160401b03811115614b8357600080fd5b614b8f89828a01614aef565b9150509295509295509295565b600060208284031215614bae57600080fd5b61157b82614903565b600060208284031215614bc957600080fd5b5035919050565b60008060408385031215614be357600080fd5b614bec83614903565b946020939093013593505050565b600060208284031215614c0c57600080fd5b813561157b81614a36565b60008060008060008060008060008060c08b8d031215614c3657600080fd5b8a35995060208b01356001600160401b0380821115614c5457600080fd5b614c608e838f01614915565b909b50995060408d0135915080821115614c7957600080fd5b614c858e838f01614915565b909950975060608d0135915080821115614c9e57600080fd5b614caa8e838f01614915565b909750955060808d0135915080821115614cc357600080fd5b50614cd08d828e01614915565b9150809450508092505060a08b013590509295989b9194979a5092959850565b60008060008060808587031215614d0657600080fd5b8435614d1181614a21565b93506020850135925060408501359150606085013560028110614d3357600080fd5b939692955090935050565b600060a08284031215614d5057600080fd5b60405160a081016001600160401b0381118282101715614d7257614d72614a44565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135614daa81614a36565b6080919091015292915050565b600060a08284031215614dc957600080fd5b61157b8383614d3e565b60008060408385031215614de657600080fd5b8235614bec81614a21565b60005b83811015614e0c578181015183820152602001614df4565b838111156112e05750506000910152565b60008151808452614e35816020860160208601614df1565b601f01601f19169290920160200192915050565b8215158152604060208201526000614e646040830184614e1d565b949350505050565b600060208284031215614e7e57600080fd5b813561157b81614a21565b600080600060408486031215614e9e57600080fd5b614ea784614903565b925060208401356001600160401b03811115614ec257600080fd5b614ece86828701614915565b9497909650939450505050565b60008060008060808587031215614ef157600080fd5b8435614efc81614a21565b935060208501359250604085013591506060850135614d3381614a21565b60008060008060008060006080888a031215614f3557600080fd5b8735965060208801356001600160401b0380821115614f5357600080fd5b614f5f8b838c01614915565b909850965060408a0135915080821115614f7857600080fd5b614f848b838c01614915565b909650945060608a0135915080821115614f9d57600080fd5b50614faa8a828b01614915565b989b979a50959850939692959293505050565b60008060408385031215614fd057600080fd5b8235614fdb81614a21565b915060208301356001600160401b03811115614ff657600080fd5b61500285828601614aef565b9150509250929050565b60006020828403121561501e57600080fd5b81356001600160401b0381111561503457600080fd5b8201601f8101841361504557600080fd5b614e6484823560208401614ab1565b61ffff91909116815260200190565b60008060006060848603121561507857600080fd5b61508184614903565b925060208401356001600160401b0381111561509c57600080fd5b6150a886828701614aef565b9250506150b760408501614956565b90509250925092565b60208152600061157b6020830184614e1d565b6000606082840312156150e557600080fd5b604051606081016001600160401b038111828210171561510757615107614a44565b80604052508091508235815260208301356020820152604083013560408201525092915050565b60006060828403121561514057600080fd5b61157b83836150d3565b6000806040838503121561515d57600080fd5b61516683614903565b915061517460208401614903565b90509250929050565b60008060008060006080868803121561519557600080fd5b85356151a081614a21565b9450602086013593506040860135925060608601356001600160401b038111156151c957600080fd5b6151d588828901614915565b969995985093965092949392505050565b60006001600160401b038211156151ff576151ff614a44565b5060051b60200190565b600082601f83011261521a57600080fd5b8135602061522a614abf836151e6565b82815260059290921b8401810191818101908684111561524957600080fd5b8286015b8481101561526d57803561526081614a36565b835291830191830161524d565b509695505050505050565b6000806040838503121561528b57600080fd5b82356001600160401b03808211156152a257600080fd5b818501915085601f8301126152b657600080fd5b813560206152c6614abf836151e6565b82815260059290921b840181019181810190898411156152e557600080fd5b948201945b83861015615303578535825294820194908201906152ea565b9650508601359250508082111561531957600080fd5b5061500285828601615209565b60008060008060006080868803121561533e57600080fd5b61534786614903565b945061535560208701614903565b93506040860135925060608601356001600160401b038111156151c957600080fd5b60008060006060848603121561538c57600080fd5b61539584614903565b92506153a360208501614903565b9150604084013590509250925092565b600080600080608085870312156153c957600080fd5b6153d285614903565b93506153e060208601614903565b925060408501356153f081614a21565b9396929550929360600135925050565b6000806000610120848603121561541657600080fd5b833561542181614a21565b92506154308560208601614d3e565b91506150b78560c086016150d3565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061546d90830186614e1d565b841515606084015282810360808401526154878185614e1d565b98975050505050505050565b600080604083850312156154a657600080fd5b505080516020909101519092909150565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b89815260c06020820152600061550a60c083018a8c6154c7565b828103604084015261551d81898b6154c7565b905086606084015282810360808401526155388186886154c7565b9150508260a08301529a9950505050505050505050565b60006020828403121561556157600080fd5b815161157b81614a36565b60006020828403121561557e57600080fd5b815161157b81614a21565b8754815260018089015460208301526002890154604083015260038901546060830152600489015460ff1615156080830152875460a083015287015460c08201526101a08101865460e083015260018701546101008301526155ef610120830187614a00565b841515610140830152615606610160830185614a00565b8261018083015298975050505050505050565b6000615627614abf84614a8a565b905082815283838301111561563b57600080fd5b61157b836020830184614df1565b6000806040838503121561565c57600080fd5b825161566781614a36565b60208401519092506001600160401b0381111561568357600080fd5b8301601f8101851361569457600080fd5b61500285825160208401615619565b6020808252602c90820152600080516020615d4283398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c90820152600080516020615d4283398151915260408201526b6163746976652070726f787960a01b606082015260800190565b600181811c9082168061572b57607f821691505b6020821081141561193257634e487b7160e01b600052602260045260246000fd5b61ffff841681526040602082015260006126cc6040830184866154c7565b8681526080602082015260006157846080830187896154c7565b82810360408401526157978186886154c7565b915050826060830152979650505050505050565b6001600160601b0319606093841b811682529190921b16601482015260280190565b634e487b7160e01b600052601160045260246000fd5b6000828210156157f5576157f56157cd565b500390565b8284823760609190911b6001600160601b0319169101908152601401919050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415615845576158456157cd565b5060010190565b600061ffff80881683528087166020840152508460408301526080606083015261587a6080830184866154c7565b979650505050505050565b61ffff861681526080602082015260006158a36080830186886154c7565b6001600160401b0394909416604083015250606001529392505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60006020828403121561592057600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561595257600080fd5b81516001600160401b0381111561596857600080fd5b8201601f8101841361597957600080fd5b614e6484825160208401615619565b61ffff851681526080602082015260006159a56080830186614e1d565b6001600160401b0385166040840152828103606084015261587a8185614e1d565b6000602082840312156159d857600080fd5b815160ff8116811461157b57600080fd5b634e487b7160e01b600052602160045260246000fd5b60028110615a1d57634e487b7160e01b600052602160045260246000fd5b9052565b8481526020810184905260408101839052608081016126cc60608301846159ff565b60008060008060808587031215615a5957600080fd5b8435615a6481614a21565b93506020850135615a7481614a21565b93969395505050506040820135916060013590565b60008060008060808587031215615a9f57600080fd5b8451615aaa81614a21565b6020860151909450615abb81614a21565b6040860151606090960151949790965092505050565b60008219821115615ae457615ae46157cd565b500190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251615b46818460208701614df1565b9190910192915050565b61ffff8616815260a060208201526000615b6d60a0830187614e1d565b6001600160401b03861660408401528281036060840152615b8e8186614e1d565b905082810360808401526154878185614e1d565b600060018060a01b03808816835260a06020840152615bc460a0840188614e1d565b8381036040850152615bd68188614e1d565b90508381036060850152615bea8187614e1d565b9250508084166080840152509695505050505050565b606081526000615c136060830186614e1d565b8281036020840152615c258186614e1d565b90508281036040840152615c398185614e1d565b9695505050505050565b600060ff821660ff841680821015615c5d57615c5d6157cd565b90039392505050565b6000816000190483118215151615615c8057615c806157cd565b500290565b61ffff8716815260c060208201526000615ca260c0830188614e1d565b8281036040840152615cb48188614e1d565b6001600160a01b0387811660608601528616608085015283810360a08501529050615cdf8185614e1d565b9998505050505050505050565b8281526040810161157b60208301846159ff565b9283526001600160a01b03918216602084015216604082015260600190565b600082615d3c57634e487b7160e01b600052601260045260246000fd5b50049056fe46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201530e2393e82eb164f7f8bbcc9384bf9e383cdeeff8d2a64d9036b9e1c8b78ab64736f6c634300080a0033",
  "deployedBytecode": "0x6080604052600436106103565760003560e01c80621d35671461035b578063020051cf1461037d57806305fead15146103c757806307e0db17146103fc5780630dce292e1461041c5780630df374831461045d57806310ddb1371461047d578063116191b61461049d57806316ad5512146104d15780631a394795146104ff5780631a98b2e01461051f5780631b3c90a81461053f5780631fec5c5c1461055457806329b70872146105675780633095634a146105875780633659cfe6146105b55780633d8b38f6146105d55780633e6326fc146105f55780633f1f4fa41461061557806340a00aaf146106435780634162169f14610656578063425cfb531461067657806342d65a8d146106a7578063452a9320146106c757806346904840146106e857806349160658146107095780634f1ef2861461072957806352d1902d1461073c57806356026f37146107515780635aef7de6146107715780635b23a990146107915780635b8c41e6146107be57806366ad5c8a1461080e57806369c20d361461082e5780636a22d8cc1461085f578063715018a61461089357806372891b2d146108a857806373800fc4146108dc5780637533d7881461090a5780637b0240c01461093757806382dc737d146109745780638a0dac4a146109945780638caa2d35146109b45780638cfd8f5c146109d45780638da5cb5b14610a0d5780638f65be8514610a22578063950c8a7414610a6b5780639a9ee08114610a8c5780639f38369a14610aac578063a6c3d16514610acc578063b2f7667f14610aec578063b353aaa714610b09578063b5569f1814610b29578063baf3292d14610b5b578063c2b6b58c14610b7b578063c446183414610b96578063c56bbdd914610bac578063c612f9ea14610bbf578063c6dd812f14610bdf578063c78ab88214610c38578063cbed8b9c14610c58578063d1deba1f14610c78578063d422794714610c8b578063d55ec69714610cc0578063d7d1bbdb14610cd5578063d8b31c7714610cf5578063de5f72fd14610d15578063df2a5b3b14610d36578063e00dd16114610d56578063e1758bd814610d6d578063e74b981b14610d82578063eb8d72b714610da2578063f2fde38b14610dc2578063f3fef3a314610de2578063f5ecbdbc14610e02578063fad16abe14610e22575b600080fd5b34801561036757600080fd5b5061037b61037636600461496d565b610e42565b005b34801561038957600080fd5b506103b17f000000000000000000000000000000000000000000000000000000000000000081565b6040516103be9190614a0d565b60405180910390f35b3480156103d357600080fd5b506103e76103e2366004614b0f565b610eff565b604080519283526020830191909152016103be565b34801561040857600080fd5b5061037b610417366004614b9c565b610fbf565b34801561042857600080fd5b5061044d610437366004614bb7565b6101d86020526000908152604090205460ff1681565b60405190151581526020016103be565b34801561046957600080fd5b5061037b610478366004614bd0565b61102c565b34801561048957600080fd5b5061037b610498366004614b9c565b61104c565b3480156104a957600080fd5b506103b17f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd57600080fd5b506104f16104ec366004614b9c565b611084565b6040519081526020016103be565b34801561050b57600080fd5b5061037b61051a366004614bfa565b61109b565b34801561052b57600080fd5b5061037b61053a366004614c17565b6110b7565b34801561054b57600080fd5b5061037b61119a565b61037b610562366004614cf0565b6112c1565b34801561057357600080fd5b5061037b610582366004614db7565b6112e6565b34801561059357600080fd5b506105a76105a2366004614dd3565b611327565b6040516103be929190614e49565b3480156105c157600080fd5b5061037b6105d0366004614e6c565b6113ec565b3480156105e157600080fd5b5061044d6105f0366004614e89565b6114b5565b34801561060157600080fd5b506067546103b1906001600160a01b031681565b34801561062157600080fd5b506104f1610630366004614b9c565b6101016020526000908152604090205481565b61037b610651366004614edb565b611582565b34801561066257600080fd5b506065546103b1906001600160a01b031681565b34801561068257600080fd5b5061044d610691366004614bb7565b6101c66020526000908152604090205460ff1681565b3480156106b357600080fd5b5061037b6106c2366004614e89565b6115a1565b3480156106d357600080fd5b506101c5546103b1906001600160a01b031681565b3480156106f457600080fd5b506101d7546103b1906001600160a01b031681565b34801561071557600080fd5b5061037b610724366004614f1a565b611614565b61037b610737366004614fbd565b6116fc565b34801561074857600080fd5b506104f16117b6565b34801561075d57600080fd5b506104f161076c36600461500c565b611864565b34801561077d57600080fd5b506066546103b1906001600160a01b031681565b34801561079d57600080fd5b506107b16107ac366004614bb7565b611938565b6040516103be9190615054565b3480156107ca57600080fd5b506104f16107d9366004615063565b610130602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561081a57600080fd5b5061037b61082936600461496d565b61194f565b34801561083a57600080fd5b5061044d610849366004614bb7565b6101c76020526000908152604090205460ff1681565b34801561086b57600080fd5b506103b17f000000000000000000000000000000000000000000000000000000000000000081565b34801561089f57600080fd5b5061037b611a23565b3480156108b457600080fd5b5061044d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156108e857600080fd5b506104f16108f7366004614b9c565b6101d96020526000908152604090205481565b34801561091657600080fd5b5061092a610925366004614b9c565b611a37565b6040516103be91906150c0565b34801561094357600080fd5b506101c9546101ca546101cb5461095992919083565b604080519384526020840192909252908201526060016103be565b34801561098057600080fd5b5061037b61098f36600461512e565b611ad1565b3480156109a057600080fd5b5061037b6109af366004614e6c565b611af2565b3480156109c057600080fd5b5061037b6109cf366004614bd0565b611b1d565b3480156109e057600080fd5b506104f16109ef36600461514a565b61010060209081526000928352604080842090915290825290205481565b348015610a1957600080fd5b506103b1611bd3565b348015610a2e57600080fd5b50610a567f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103be565b348015610a7757600080fd5b50610102546103b1906001600160a01b031681565b348015610a9857600080fd5b5061092a610aa7366004614bb7565b611be2565b348015610ab857600080fd5b5061092a610ac7366004614b9c565b611c99565b348015610ad857600080fd5b5061037b610ae7366004614e89565b611da9565b348015610af857600080fd5b506101d1546101d2546103e7919082565b348015610b1557600080fd5b5060fe546103b1906001600160a01b031681565b348015610b3557600080fd5b506107b1610b44366004614bb7565b6101d66020526000908152604090205461ffff1681565b348015610b6757600080fd5b5061037b610b76366004614e6c565b611e3c565b348015610b8757600080fd5b506101c85461044d9060ff1681565b348015610ba257600080fd5b506104f161271081565b61037b610bba36600461517d565b611e9b565b348015610bcb57600080fd5b5061037b610bda366004614bb7565b611ee0565b348015610beb57600080fd5b506101cc546101cd546101ce546101cf546101d054610c0e949392919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016103be565b348015610c4457600080fd5b5061037b610c53366004615278565b611f04565b348015610c6457600080fd5b5061037b610c73366004615326565b611f89565b61037b610c8636600461496d565b612002565b348015610c9757600080fd5b506103e7610ca6366004614e6c565b6101d3602052600090815260409020805460019091015482565b348015610ccc57600080fd5b5061037b61221a565b348015610ce157600080fd5b5061037b610cf0366004614bb7565b6122ca565b348015610d0157600080fd5b5061037b610d10366004614e6c565b6122ee565b348015610d2157600080fd5b506101d4546103b1906001600160a01b031681565b348015610d4257600080fd5b5061037b610d51366004615377565b612319565b348015610d6257600080fd5b506104f16101d55481565b348015610d7957600080fd5b506103b16123cc565b348015610d8e57600080fd5b5061037b610d9d366004614e6c565b612459565b348015610dae57600080fd5b5061037b610dbd366004614e89565b612484565b348015610dce57600080fd5b5061037b610ddd366004614e6c565b6124de565b348015610dee57600080fd5b5061037b610dfd366004614dd3565b612554565b348015610e0e57600080fd5b5061092a610e1d3660046153b3565b612642565b348015610e2e57600080fd5b5061037b610e3d366004615400565b6126d5565b60fe546001600160a01b0316336001600160a01b031614610e815733604051634a43969960e11b8152600401610e789190614a0d565b60405180910390fd5b610ef78686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061292092505050565b505050505050565b604080516001600160a01b0387811660208301528681168284015260608201869052600060808084018290528451808503909101815260a084019485905260fe5463040a7bb160e41b90955290938493919216906340a7bb1090610f6f908c90309086908b908b9060a40161543f565b6040805180830381865afa158015610f8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610faf9190615493565b9250925050965096945050505050565b610fc7612999565b60fe546040516307e0db1760e01b81526001600160a01b03909116906307e0db1790610ff7908490600401615054565b600060405180830381600087803b15801561101157600080fd5b505af1158015611025573d6000803e3d6000fd5b5050505050565b611034612999565b61ffff90911660009081526101016020526040902055565b611054612999565b60fe546040516310ddb13760e01b81526001600160a01b03909116906310ddb13790610ff7908490600401615054565b61ffff1660009081526101d9602052604090205490565b6110a36129f8565b6101c8805460ff1916911515919091179055565b600085856040516110c99291906154b7565b604051908190038120631876eed960e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631876eed99061112d908e908e908e908e908e9089908d908d908d906004016154f0565b6020604051808303816000875af115801561114c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611170919061554f565b61118d57604051631403112d60e21b815260040160405180910390fd5b5050505050505050505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa1580156111fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611221919061556c565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f919061556c565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6112e03385858585604051806020016040528060008152506000612a55565b50505050565b6112ee6129f8565b80516101cc5560208101516101cd5560408101516101ce5560608101516101cf55608001516101d0805460ff1916911515919091179055565b6001600160a01b0380831660009081526101d360205260408082206067546101c8549251633de4799760e11b8152939460609473__$a63bfe16b493dd64599c9f3a1d32f7e383$__94637bc8f32e9461139b946101cc9491936101d193919092169160ff909116908c908c90600401615589565b600060405180830381865af41580156113b8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113e09190810190615649565b915091505b9250929050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156114355760405162461bcd60e51b8152600401610e78906156a3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611467612f10565b6001600160a01b03161461148d5760405162461bcd60e51b8152600401610e78906156dd565b61149681612f2c565b604080516000808252602082019092526114b291839190612f34565b50565b61ffff8316600090815260ff6020526040812080548291906114d690615717565b80601f016020809104026020016040519081016040528092919081815260200182805461150290615717565b801561154f5780601f106115245761010080835404028352916020019161154f565b820191906000526020600020905b81548152906001019060200180831161153257829003601f168201915b5050505050905083836040516115669291906154b7565b60405180910390208180519060200120149150505b9392505050565b6112e03385858560006040518060200160405280600081525087612a55565b6115a9612999565b60fe546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d906115dd9086908690869060040161574c565b600060405180830381600087803b1580156115f757600080fd5b505af115801561160b573d6000803e3d6000fd5b50505050505050565b600082826040516116269291906154b7565b604051908190038120635f6970c360e01b825291506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635f6970c390611684908b908b908b908b908b90899060040161576a565b6020604051808303816000875af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c7919061554f565b6116e457604051631403112d60e21b815260040160405180910390fd5b6116f287878787878761309f565b5050505050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156117455760405162461bcd60e51b8152600401610e78906156a3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611777612f10565b6001600160a01b03161461179d5760405162461bcd60e51b8152600401610e78906156dd565b6117a682612f2c565b6117b282826001612f34565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118515760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b6064820152608401610e78565b50600080516020615d6283398151915290565b805160208201206000907f564ccaf7594d66b1eaaea24fe01f0585bf52ee70852af4eac0cc4b04711cd0e281141561189f5750600192915050565b7f43ab905ae53adfdd46d0850022d385a6c09c15bfde5206c98fa0fc8dc340c3f88114156118d05750600592915050565b7f2ab2bf4c5cabc3000e2502e33470a863db2755809d7561237424a0eb373154c2811415611932577f000000000000000000000000000000000000000000000000000000000000000015611928575061aef392915050565b5061a4ec92915050565b50919050565b60009081526101d6602052604090205461ffff1690565b3330146119ad5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b6064820152608401610e78565b610ef78686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f89018190048102820181019092528781528993509150879087908190840183828082843760009201919091525061314192505050565b611a2b612999565b611a356000613179565b565b60ff6020526000908152604090208054611a5090615717565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7c90615717565b8015611ac95780601f10611a9e57610100808354040283529160200191611ac9565b820191906000526020600020905b815481529060010190602001808311611aac57829003601f168201915b505050505081565b611ad96129f8565b80516101c95560208101516101ca55604001516101cb55565b611afa6129f8565b6101c580546001600160a01b0319166001600160a01b0392909216919091179055565b611b256129f8565b61ffff821660009081526101d9602052604090205415611b575760405162dc149f60e41b815260040160405180910390fd5b61ffff821660008181526101d9602090815260408083208590558483526101d6825291829020805461ffff191690931790925551611b999130918291016157ab565b60408051601f1981840301815291815261ffff8416600090815260ff60209081529190208251611bce939192909101906147f6565b505050565b60cc546001600160a01b031690565b60608160011415611c11575050604080518082019091526008815267457468657265756d60c01b602082015290565b8160051415611c4057505060408051808201909152600a81526932ba3432b932bab6969960b11b602082015290565b8161a4ec1415611c6a57505060408051808201909152600481526363656c6f60e01b602082015290565b8161aef31415611c9457505060408051808201909152600481526363656c6f60e01b602082015290565b919050565b61ffff8116600090815260ff6020526040812080546060929190611cbc90615717565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce890615717565b8015611d355780601f10611d0a57610100808354040283529160200191611d35565b820191906000526020600020905b815481529060010190602001808311611d1857829003601f168201915b50505050509050805160001415611d8e5760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610e78565b61157b600060148351611da191906157e3565b8391906131cb565b611db1612999565b818130604051602001611dc6939291906157fa565b60408051601f1981840301815291815261ffff8516600090815260ff60209081529190208251611dfb939192909101906147f6565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051611e2f9392919061574c565b60405180910390a1505050565b611e44612999565b61010280546001600160a01b0319166001600160a01b0383161790556040517f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b90611e90908390614a0d565b60405180910390a150565b61102533868686600187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250612a55915050565b611ee86129f8565b60009081526101c660205260409020805460ff19166001179055565b611f0c6129f8565b60005b8251811015611bce57818181518110611f2a57611f2a61581b565b60200260200101516101c76000858481518110611f4957611f4961581b565b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611f8190615831565b915050611f0f565b611f91612999565b60fe546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c90611fc9908890889088908890889060040161584c565b600060405180830381600087803b158015611fe357600080fd5b505af1158015611ff7573d6000803e3d6000fd5b505050505050505050565b61ffff861660009081526101306020526040808220905161202690889088906154b7565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806120a65760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b6064820152608401610e78565b8083836040516120b79291906154b7565b6040518091039020146121165760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b6064820152608401610e78565b61ffff871660009081526101306020526040808220905161213a90899089906154b7565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f880182900482028301820190528682526121d2918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a93509150889088908190840183828082843760009201919091525061314192505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051612209959493929190615885565b60405180910390a150505050505050565b600054600290610100900460ff1615801561223c575060005460ff8083169116105b6122585760405162461bcd60e51b8152600401610e78906158c0565b6000805461ffff191660ff83161761010017905561227860656001611b1d565b612285607d61a4ec611b1d565b612291608a607a611b1d565b61229e61016d6032611b1d565b6000805461ff001916905560405160ff82168152600080516020615d8283398151915290602001611e90565b6122d26129f8565b60009081526101d860205260409020805460ff19166001179055565b6122f66129f8565b6101d480546001600160a01b0319166001600160a01b0392909216919091179055565b612321612999565b600081116123695760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610e78565b61ffff8381166000818152610100602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001611e2f565b60675460405163bf40fac160e01b815260206004820152600a60248201526923a7a7a22227a62620a960b11b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612454919061556c565b905090565b6124616129f8565b6101d780546001600160a01b0319166001600160a01b0392909216919091179055565b61248c612999565b61ffff8316600090815260ff602052604090206124aa90838361487a565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611e2f9392919061574c565b6124e6612999565b6001600160a01b03811661254b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e78565b6114b281613179565b61255c6132d8565b806125d1576040516370a0823160e01b81526001600160a01b038316906370a082319061258d903090600401614a0d565b602060405180830381865afa1580156125aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ce919061590e565b90505b60405163a9059cbb60e01b81526001600160a01b0383169063a9059cbb906125ff9033908590600401615927565b6020604051808303816000875af115801561261e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bce919061554f565b60fe54604051633d7b2f6f60e21b815261ffff808716600483015285166024820152306044820152606481018390526060916001600160a01b03169063f5ecbdbc90608401600060405180830381865afa1580156126a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126cc9190810190615940565b95945050505050565b600054610100900460ff16158080156126f55750600054600160ff909116105b8061271657506127043061339b565b158015612716575060005460ff166001145b6127325760405162461bcd60e51b8152600401610e78906158c0565b6000805460ff191660011790558015612755576000805461ff0019166101001790555b61275e846133aa565b6127877f00000000000000000000000000000000000000000000000000000000000000006133cd565b6101c58054336001600160a01b031990911617905582516101cc556020808401516101cd556040808501516101ce5560608501516101cf5560808501516101d0805460ff191691151591909117905583516101c955838201516101ca55838101516101cb555163bf40fac160e01b815260048101919091526009602482015268554249534348454d4560b81b60448201526001600160a01b0385169063bf40fac190606401602060405180830381865afa158015612849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286d919061556c565b6101d780546001600160a01b0319166001600160a01b039290921691821790556128b5576066546101d780546001600160a01b0319166001600160a01b039092169190911790555b6128c160656001611b1d565b6128ce607d61a4ec611b1d565b6128da608a607a611b1d565b6128e761016d6032611b1d565b80156112e0576000805461ff001916905560405160018152600080516020615d828339815191529060200160405180910390a150505050565b6000806129835a60966366ad5c8a60e01b898989896040516024016129489493929190615988565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915230929190613405565b9150915081610ef757610ef7868686868561348f565b336129a2611bd3565b6001600160a01b031614611a355760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e78565b6101c5546001600160a01b0316331480612a1c57506066546001600160a01b031633145b80612a36575033612a2b611bd3565b6001600160a01b0316145b611a35573360405163b63b5ad960e01b8152600401610e789190614a0d565b6101c85460ff1615612a935760405163c5426f8d60e01b815260206004820152600660248201526518db1bdcd95960d21b6044820152606401610e78565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016461415612b6657612ac96123cc565b6040516323b872dd60e01b81526001600160a01b0389811660048301523060248301526044820187905291909116906323b872dd906064016020604051808303816000875af1158015612b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b44919061554f565b612b61576040516316431e9360e11b815260040160405180910390fd5b612bce565b612b6e6123cc565b6001600160a01b03166379cc679088866040518363ffffffff1660e01b8152600401612b9b929190615927565b600060405180830381600087803b158015612bb557600080fd5b505af1158015612bc9573d6000803e3d6000fd5b505050505b600073__$a63bfe16b493dd64599c9f3a1d32f7e383$__63aac673c386612bf36123cc565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5491906159c6565b6040516001600160e01b031960e085901b168152600481019290925260ff166024820152604401602060405180830381865af4158015612c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cbc919061590e565b905034612cdc57604051630ba4e53360e21b815260040160405180910390fd5b600030466101d58054906000612cf183615831565b90915550604080516001600160a01b039094166020850152830191909152606082015260800160408051808303601f1901815282825280516020918201206001600160a01b03808e1692850192909252908b16918301919091526060820184905260808201819052915060009060a00160408051601f1981840301815291905290506000866001811115612d8757612d876159e9565b1415612de6576000612d9889611be2565b9050805160001415612dc05760405163068a505360e01b8152600481018a9052602401610e78565b612de082826001600160a01b03881615612dda578761352d565b3361352d565b50612eb2565b6001866001811115612dfa57612dfa6159e9565b1415612eb2578451612e3157604051600160f01b602082015262061a80602282015260420160405160208183030381529060405294505b6000612e3c89611938565b905061ffff8116612e635760405163068a505360e01b8152600481018a9052602401610e78565b6000612e74828d8d8860008c610eff565b50905034811115612ea1576040516324a89fab60e21b815260048101829052346024820152604401610e78565b612eaf83838e60008b61363f565b50505b81896001600160a01b03168b6001600160a01b03167fabeeb7182c7294cd8efcd40e9ff952c1b759c2165b3634aac589429de5d55ad08b87428c604051612efc9493929190615a21565b60405180910390a450505050505050505050565b600080516020615d62833981519152546001600160a01b031690565b6114b2612999565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612f6757611bce8361364d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612fc1575060408051601f3d908101601f19168201909252612fbe9181019061590e565b60015b6130245760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610e78565b600080516020615d6283398151915281146130935760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610e78565b50611bce8383836136e7565b60006130e085858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061370c92505050565b905060008080806130f386880188615a43565b935093509350935061118d8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250889150879050868661388b565b6000806000808480602001905181019061315b9190615a89565b60148b015193975091955093509150611ff7898289888888886138a8565b60cc80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060816131d981601f615ad1565b10156132185760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610e78565b6132228284615ad1565b845110156132665760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610e78565b60608215801561328557604051915060008252602082016040526132cf565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156132be5780518352602092830192016132a6565b5050858452601f01601f1916604052505b50949350505050565b60655460408051632d77bef360e11b8152905133926001600160a01b031691635aef7de69160048083019260209291908290030181865afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613345919061556c565b6001600160a01b031614611a355760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206176617461722063616e2063616c6c2074686973206d6574686f646044820152606401610e78565b6001600160a01b03163b151590565b606780546001600160a01b0319166001600160a01b0383161790556114b261119a565b600054610100900460ff166133f45760405162461bcd60e51b8152600401610e7890615ae9565b6133fc6138c5565b6114b2816138f5565b6000606060008060008661ffff166001600160401b0381111561342a5761342a614a44565b6040519080825280601f01601f191660200182016040528015613454576020820181803683370190505b50905060008087516020890160008d8df191503d925086831115613476578692505b828152826000602083013e909890975095505050505050565b818051906020012061013060008761ffff1661ffff168152602001908152602001600020856040516134c19190615b34565b9081526040805191829003602090810183206001600160401b0388166000908152915220919091557fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c9061351e9087908790879087908790615b50565b60405180910390a15050505050565b60006135383061393e565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630c93e3bb3430868589886040518763ffffffff1660e01b815260040161358f959493929190615ba2565b6000604051808303818588803b1580156135a857600080fd5b505af11580156135bc573d6000803e3d6000fd5b5050604051631c92115f60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169350631c92115f92506136119150869085908990600401615c00565b600060405180830381600087803b15801561362b57600080fd5b505af11580156116f2573d6000803e3d6000fd5b611025848685858534613b83565b6136568161339b565b6136b85760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610e78565b600080516020615d6283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6136f083613d0d565b6000825111806136fd5750805b15611bce576112e08383613d4d565b6000808290506000808251602a14158061374c5750826000815181106137345761373461581b565b6020910101516001600160f81b031916600360fc1b14155b8061377d5750826001815181106137655761376561581b565b6020910101516001600160f81b031916600f60fb1b14155b1561379b57604051636fa478cf60e11b815260040160405180910390fd5b60025b602a811015613881578381815181106137b9576137b961581b565b016020015160f81c9150606182108015906137d8575060668260ff1611155b156137ef576137e8605783615c43565b9150613858565b60418260ff1610158015613807575060468260ff1611155b15613817576137e8603783615c43565b60308260ff161015801561382f575060398260ff1611155b1561383f576137e8603083615c43565b604051636fa478cf60e11b815260040160405180910390fd5b60026138658260296157e3565b60ff8416911b1b929092179161387a81615831565b905061379e565b5090949350505050565b600061389687611864565b905061160b858585848a876000613e36565b60006138b388611084565b90506116f2858585848b876001613e36565b600054610100900460ff166138ec5760405162461bcd60e51b8152600401610e7890615ae9565b611a3533613179565b600054610100900460ff1661391c5760405162461bcd60e51b8152600401610e7890615ae9565b60fe80546001600160a01b0319166001600160a01b0392909216919091179055565b604051606082811b6001600160601b03191660208301529060009060340160408051601f198184030181528282528051838301909252601083526f181899199a1a9b1b9c1cb0b131b232b360811b602084015280519093509091906000906139a7906002615c66565b6139b2906002615ad1565b6001600160401b038111156139c9576139c9614a44565b6040519080825280601f01601f1916602001820160405280156139f3576020820181803683370190505b509050600360fc1b81600081518110613a0e57613a0e61581b565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613a3d57613a3d61581b565b60200101906001600160f81b031916908160001a90535060005b83811015613b7957826004868381518110613a7457613a7461581b565b016020015182516001600160f81b031990911690911c60f81c908110613a9c57613a9c61581b565b01602001516001600160f81b03191682613ab7836002615c66565b613ac2906002615ad1565b81518110613ad257613ad261581b565b60200101906001600160f81b031916908160001a90535082858281518110613afc57613afc61581b565b602091010151815160f89190911c600f16908110613b1c57613b1c61581b565b01602001516001600160f81b03191682613b37836002615c66565b613b42906003615ad1565b81518110613b5257613b5261581b565b60200101906001600160f81b031916908160001a905350613b7281615831565b9050613a57565b5095945050505050565b61ffff8616600090815260ff602052604081208054613ba190615717565b80601f0160208091040260200160405190810160405280929190818152602001828054613bcd90615717565b8015613c1a5780601f10613bef57610100808354040283529160200191613c1a565b820191906000526020600020905b815481529060010190602001808311613bfd57829003601f168201915b50505050509050805160001415613c8c5760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610e78565b613c97878751614502565b60fe5460405162c5803160e81b81526001600160a01b039091169063c5803100908490613cd2908b9086908c908c908c908c90600401615c85565b6000604051808303818588803b158015613ceb57600080fd5b505af1158015613cff573d6000803e3d6000fd5b505050505050505050505050565b613d168161364d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060613d588361339b565b613db35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610e78565b600080846001600160a01b031684604051613dce9190615b34565b600060405180830381855af49150503d8060008114613e09576040519150601f19603f3d011682016040523d82523d6000602084013e613e0e565b606091505b50915091506126cc8282604051806060016040528060278152602001615da260279139614571565b613e3f84611938565b61ffff16613e635760405163068a505360e01b815260048101859052602401610e78565b6101c760008583604051602001613e7b929190615cec565b60408051601f198184030181529181528151602092830120835290820192909252016000205460ff1615613ee45760405163c5426f8d60e01b815260206004820152600f60248201526e1cdbdd5c98d948191a5cd8589b1959608a1b6044820152606401610e78565b60008281526101c6602052604090205460ff1615613f1857604051636e91c2f160e11b815260048101839052602401610e78565b600060ff6000613f2787611938565b61ffff1661ffff1681526020019081526020016000208054613f4890615717565b80601f0160208091040260200160405190810160405280929190818152602001828054613f7490615717565b8015613fc15780601f10613f9657610100808354040283529160200191613fc1565b820191906000526020600020905b815481529060010190602001808311613fa457829003601f168201915b5050505050905060008430604051602001613fdd9291906157ab565b604051602081830303815290604052905081518151141580613ffe57508151155b8061401757508180519060200120818051906020012014155b1561406457604080518781526001600160a01b03871660208201527f1eafb58197ea0dc76b9278ccad47f61a239f00b017d89a19081a89321cce213d910160405180910390a1505061160b565b60008481526101d8602052604090205460ff16614087576140878989894661458a565b600073__$a63bfe16b493dd64599c9f3a1d32f7e383$__63e62381b6896140ac6123cc565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061410d91906159c6565b6040516001600160e01b031960e085901b168152600481019290925260ff166024820152604401602060405180830381865af4158015614151573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614175919061590e565b90506000614182826146b7565b60008781526101c660205260409020805460ff1916600117905590506141a78a6146dc565b63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001646141561438a576141dd6123cc565b6001600160a01b031663a9059cbb8b6141f684866157e3565b6040518363ffffffff1660e01b8152600401614213929190615927565b6020604051808303816000875af1158015614232573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614256919061554f565b614273576040516376420e1d60e01b815260040160405180910390fd5b60008111801561428d57506101d7546001600160a01b0316155b156142fe5761429a6123cc565b6001600160a01b03166342966c68826040518263ffffffff1660e01b81526004016142c791815260200190565b600060405180830381600087803b1580156142e157600080fd5b505af11580156142f5573d6000803e3d6000fd5b505050506144a3565b80156143855761430c6123cc565b6101d75460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb92614340929116908590600401615927565b6020604051808303816000875af115801561435f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614383919061554f565b505b6144a3565b6065546001600160a01b0316636407e4326143a583856157e3565b6066546040516001600160e01b031960e085901b1681526143d792918f916001600160a01b0390911690600401615d00565b6020604051808303816000875af11580156143f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061441a919061554f565b5080156144a3576065546101d754606654604051633203f21960e11b81526001600160a01b0393841693636407e4329361445e938793918316921690600401615d00565b6020604051808303816000875af115801561447d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144a1919061554f565b505b858a6001600160a01b03168c6001600160a01b03167f6cf712ce908185c8c38a073b7315f79687e7440fb057d9d1ca76a2509a1282ee8c858d8b6040516144ed9493929190615a21565b60405180910390a45050505050505050505050565b61ffff8216600090815261010160205260409020548061452157506127105b80821115611bce5760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610e78565b6060831561458057508161157b565b61157b83836147cc565b6001600160a01b038316158061459e575080155b156145c05782816040516314b2a5c360e31b8152600401610e78929190615927565b6145cd62015180426157e3565b6101d15410156145e357426101d15560006101d2555b6145f062015180426157e3565b6001600160a01b03851660009081526101d360205260409020541015614631576001600160a01b03841660009081526101d360205260408120428155600101555b60008061463e8685611327565b909250905081614663578060405163c5426f8d60e01b8152600401610e7891906150c0565b836101d160010160008282546146799190615ad1565b90915550506001600160a01b03861660009081526101d36020526040812060010180548692906146aa908490615ad1565b9091555050505050505050565b6101cb54600090612710906146cc9084615c66565b6146d69190615d1f565b92915050565b6101d4546001600160a01b03161580159061476457506101d4546040516374bf77e960e11b81526001600160a01b039091169063e97eefd290614723908490600401614a0d565b602060405180830381865afa158015614740573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614764919061554f565b156114b2576101d4546040516306ee3b9f60e31b81526001600160a01b0390911690633771dcf89061479a908490600401614a0d565b600060405180830381600087803b1580156147b457600080fd5b505af19250505080156147c5575060015b6114b25750565b8151156147dc5781518083602001fd5b8060405162461bcd60e51b8152600401610e7891906150c0565b82805461480290615717565b90600052602060002090601f016020900481019282614824576000855561486a565b82601f1061483d57805160ff191683800117855561486a565b8280016001018555821561486a579182015b8281111561486a57825182559160200191906001019061484f565b506148769291506148ee565b5090565b82805461488690615717565b90600052602060002090601f0160209004810192826148a8576000855561486a565b82601f106148c15782800160ff1982351617855561486a565b8280016001018555821561486a579182015b8281111561486a5782358255916020019190600101906148d3565b5b8082111561487657600081556001016148ef565b803561ffff81168114611c9457600080fd5b60008083601f84011261492757600080fd5b5081356001600160401b0381111561493e57600080fd5b6020830191508360208285010111156113e557600080fd5b80356001600160401b0381168114611c9457600080fd5b6000806000806000806080878903121561498657600080fd5b61498f87614903565b955060208701356001600160401b03808211156149ab57600080fd5b6149b78a838b01614915565b90975095508591506149cb60408a01614956565b945060608901359150808211156149e157600080fd5b506149ee89828a01614915565b979a9699509497509295939492505050565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b6001600160a01b03811681146114b257600080fd5b80151581146114b257600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614a8257614a82614a44565b604052919050565b60006001600160401b03821115614aa357614aa3614a44565b50601f01601f191660200190565b6000614ac4614abf84614a8a565b614a5a565b9050828152838383011115614ad857600080fd5b828260208301376000602084830101529392505050565b600082601f830112614b0057600080fd5b61157b83833560208501614ab1565b60008060008060008060c08789031215614b2857600080fd5b614b3187614903565b95506020870135614b4181614a21565b94506040870135614b5181614a21565b9350606087013592506080870135614b6881614a36565b915060a08701356001600160401b03811115614b8357600080fd5b614b8f89828a01614aef565b9150509295509295509295565b600060208284031215614bae57600080fd5b61157b82614903565b600060208284031215614bc957600080fd5b5035919050565b60008060408385031215614be357600080fd5b614bec83614903565b946020939093013593505050565b600060208284031215614c0c57600080fd5b813561157b81614a36565b60008060008060008060008060008060c08b8d031215614c3657600080fd5b8a35995060208b01356001600160401b0380821115614c5457600080fd5b614c608e838f01614915565b909b50995060408d0135915080821115614c7957600080fd5b614c858e838f01614915565b909950975060608d0135915080821115614c9e57600080fd5b614caa8e838f01614915565b909750955060808d0135915080821115614cc357600080fd5b50614cd08d828e01614915565b9150809450508092505060a08b013590509295989b9194979a5092959850565b60008060008060808587031215614d0657600080fd5b8435614d1181614a21565b93506020850135925060408501359150606085013560028110614d3357600080fd5b939692955090935050565b600060a08284031215614d5057600080fd5b60405160a081016001600160401b0381118282101715614d7257614d72614a44565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135614daa81614a36565b6080919091015292915050565b600060a08284031215614dc957600080fd5b61157b8383614d3e565b60008060408385031215614de657600080fd5b8235614bec81614a21565b60005b83811015614e0c578181015183820152602001614df4565b838111156112e05750506000910152565b60008151808452614e35816020860160208601614df1565b601f01601f19169290920160200192915050565b8215158152604060208201526000614e646040830184614e1d565b949350505050565b600060208284031215614e7e57600080fd5b813561157b81614a21565b600080600060408486031215614e9e57600080fd5b614ea784614903565b925060208401356001600160401b03811115614ec257600080fd5b614ece86828701614915565b9497909650939450505050565b60008060008060808587031215614ef157600080fd5b8435614efc81614a21565b935060208501359250604085013591506060850135614d3381614a21565b60008060008060008060006080888a031215614f3557600080fd5b8735965060208801356001600160401b0380821115614f5357600080fd5b614f5f8b838c01614915565b909850965060408a0135915080821115614f7857600080fd5b614f848b838c01614915565b909650945060608a0135915080821115614f9d57600080fd5b50614faa8a828b01614915565b989b979a50959850939692959293505050565b60008060408385031215614fd057600080fd5b8235614fdb81614a21565b915060208301356001600160401b03811115614ff657600080fd5b61500285828601614aef565b9150509250929050565b60006020828403121561501e57600080fd5b81356001600160401b0381111561503457600080fd5b8201601f8101841361504557600080fd5b614e6484823560208401614ab1565b61ffff91909116815260200190565b60008060006060848603121561507857600080fd5b61508184614903565b925060208401356001600160401b0381111561509c57600080fd5b6150a886828701614aef565b9250506150b760408501614956565b90509250925092565b60208152600061157b6020830184614e1d565b6000606082840312156150e557600080fd5b604051606081016001600160401b038111828210171561510757615107614a44565b80604052508091508235815260208301356020820152604083013560408201525092915050565b60006060828403121561514057600080fd5b61157b83836150d3565b6000806040838503121561515d57600080fd5b61516683614903565b915061517460208401614903565b90509250929050565b60008060008060006080868803121561519557600080fd5b85356151a081614a21565b9450602086013593506040860135925060608601356001600160401b038111156151c957600080fd5b6151d588828901614915565b969995985093965092949392505050565b60006001600160401b038211156151ff576151ff614a44565b5060051b60200190565b600082601f83011261521a57600080fd5b8135602061522a614abf836151e6565b82815260059290921b8401810191818101908684111561524957600080fd5b8286015b8481101561526d57803561526081614a36565b835291830191830161524d565b509695505050505050565b6000806040838503121561528b57600080fd5b82356001600160401b03808211156152a257600080fd5b818501915085601f8301126152b657600080fd5b813560206152c6614abf836151e6565b82815260059290921b840181019181810190898411156152e557600080fd5b948201945b83861015615303578535825294820194908201906152ea565b9650508601359250508082111561531957600080fd5b5061500285828601615209565b60008060008060006080868803121561533e57600080fd5b61534786614903565b945061535560208701614903565b93506040860135925060608601356001600160401b038111156151c957600080fd5b60008060006060848603121561538c57600080fd5b61539584614903565b92506153a360208501614903565b9150604084013590509250925092565b600080600080608085870312156153c957600080fd5b6153d285614903565b93506153e060208601614903565b925060408501356153f081614a21565b9396929550929360600135925050565b6000806000610120848603121561541657600080fd5b833561542181614a21565b92506154308560208601614d3e565b91506150b78560c086016150d3565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061546d90830186614e1d565b841515606084015282810360808401526154878185614e1d565b98975050505050505050565b600080604083850312156154a657600080fd5b505080516020909101519092909150565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b89815260c06020820152600061550a60c083018a8c6154c7565b828103604084015261551d81898b6154c7565b905086606084015282810360808401526155388186886154c7565b9150508260a08301529a9950505050505050505050565b60006020828403121561556157600080fd5b815161157b81614a36565b60006020828403121561557e57600080fd5b815161157b81614a21565b8754815260018089015460208301526002890154604083015260038901546060830152600489015460ff1615156080830152875460a083015287015460c08201526101a08101865460e083015260018701546101008301526155ef610120830187614a00565b841515610140830152615606610160830185614a00565b8261018083015298975050505050505050565b6000615627614abf84614a8a565b905082815283838301111561563b57600080fd5b61157b836020830184614df1565b6000806040838503121561565c57600080fd5b825161566781614a36565b60208401519092506001600160401b0381111561568357600080fd5b8301601f8101851361569457600080fd5b61500285825160208401615619565b6020808252602c90820152600080516020615d4283398151915260408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c90820152600080516020615d4283398151915260408201526b6163746976652070726f787960a01b606082015260800190565b600181811c9082168061572b57607f821691505b6020821081141561193257634e487b7160e01b600052602260045260246000fd5b61ffff841681526040602082015260006126cc6040830184866154c7565b8681526080602082015260006157846080830187896154c7565b82810360408401526157978186886154c7565b915050826060830152979650505050505050565b6001600160601b0319606093841b811682529190921b16601482015260280190565b634e487b7160e01b600052601160045260246000fd5b6000828210156157f5576157f56157cd565b500390565b8284823760609190911b6001600160601b0319169101908152601401919050565b634e487b7160e01b600052603260045260246000fd5b6000600019821415615845576158456157cd565b5060010190565b600061ffff80881683528087166020840152508460408301526080606083015261587a6080830184866154c7565b979650505050505050565b61ffff861681526080602082015260006158a36080830186886154c7565b6001600160401b0394909416604083015250606001529392505050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60006020828403121561592057600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b60006020828403121561595257600080fd5b81516001600160401b0381111561596857600080fd5b8201601f8101841361597957600080fd5b614e6484825160208401615619565b61ffff851681526080602082015260006159a56080830186614e1d565b6001600160401b0385166040840152828103606084015261587a8185614e1d565b6000602082840312156159d857600080fd5b815160ff8116811461157b57600080fd5b634e487b7160e01b600052602160045260246000fd5b60028110615a1d57634e487b7160e01b600052602160045260246000fd5b9052565b8481526020810184905260408101839052608081016126cc60608301846159ff565b60008060008060808587031215615a5957600080fd5b8435615a6481614a21565b93506020850135615a7481614a21565b93969395505050506040820135916060013590565b60008060008060808587031215615a9f57600080fd5b8451615aaa81614a21565b6020860151909450615abb81614a21565b6040860151606090960151949790965092505050565b60008219821115615ae457615ae46157cd565b500190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60008251615b46818460208701614df1565b9190910192915050565b61ffff8616815260a060208201526000615b6d60a0830187614e1d565b6001600160401b03861660408401528281036060840152615b8e8186614e1d565b905082810360808401526154878185614e1d565b600060018060a01b03808816835260a06020840152615bc460a0840188614e1d565b8381036040850152615bd68188614e1d565b90508381036060850152615bea8187614e1d565b9250508084166080840152509695505050505050565b606081526000615c136060830186614e1d565b8281036020840152615c258186614e1d565b90508281036040840152615c398185614e1d565b9695505050505050565b600060ff821660ff841680821015615c5d57615c5d6157cd565b90039392505050565b6000816000190483118215151615615c8057615c806157cd565b500290565b61ffff8716815260c060208201526000615ca260c0830188614e1d565b8281036040840152615cb48188614e1d565b6001600160a01b0387811660608601528616608085015283810360a08501529050615cdf8185614e1d565b9998505050505050505050565b8281526040810161157b60208301846159ff565b9283526001600160a01b03918216602084015216604082015260600190565b600082615d3c57634e487b7160e01b600052601260045260246000fd5b50049056fe46756e6374696f6e206d7573742062652063616c6c6564207468726f75676820360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201530e2393e82eb164f7f8bbcc9384bf9e383cdeeff8d2a64d9036b9e1c8b78ab64736f6c634300080a0033",
  "libraries": {
    "BridgeHelperLibrary": "0x5D4C25c3B621027A8011474Eb005e45Dd014a2c1"
  },
  "devdoc": {
    "details": "A contract for bridging assets between chains",
    "kind": "dev",
    "methods": {
      "addLzChainSupport(uint16,uint256)": {
        "details": "function for adding lz chaind support"
      },
      "approveRequest(uint256)": {
        "details": "Function for approving requests above limits",
        "params": {
          "id": "The bridgerequest id"
        }
      },
      "constructor": {
        "details": "Constructor function for the AxelarBridge contract",
        "params": {
          "axlGasReceiver": "The address of the gas receiver contract",
          "axlGateway": "The address of the gateway contract"
        }
      },
      "initialize(address,(uint256,uint256,uint256,uint256,bool),(uint256,uint256,uint256))": {
        "details": "Function for initializing the contract",
        "params": {
          "nameService": "The address of the name service contract"
        }
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "pauseBridge(bool)": {
        "details": "Function for pausing the bridge",
        "params": {
          "isPaused": "Whether to pause the bridge or not"
        }
      },
      "preventRequest(uint256)": {
        "details": "Function for prevent a request by marking it as executed",
        "params": {
          "id": "The bridgerequest id"
        }
      },
      "proxiableUUID()": {
        "details": "Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "setBridgeFees((uint256,uint256,uint256))": {
        "details": "Function for setting the bridge fees",
        "params": {
          "fees": "The bridge fees to set"
        }
      },
      "setBridgeLimits((uint256,uint256,uint256,uint256,bool))": {
        "details": "Function for setting the bridge limits",
        "params": {
          "limits": "The bridge limits to set"
        }
      },
      "setFaucet(address)": {
        "details": "Function for setting the faucet contract",
        "params": {
          "_faucet": "The faucet contract to set"
        }
      },
      "setFeeRecipient(address)": {
        "details": "Function for setting the fee recipient",
        "params": {
          "recipient": "The fee recipient to set"
        }
      },
      "setGuardian(address)": {
        "details": "Function for setting the guardian contract",
        "params": {
          "_guardian": "The guardian to set"
        }
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      },
      "upgradeTo(address)": {
        "details": "Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."
      },
      "upgradeToAndCall(address,bytes)": {
        "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."
      },
      "withdraw(address,uint256)": {
        "details": "Function for withdrawing tokens",
        "params": {
          "amount": "The amount to withdraw",
          "token": "The address of the token to withdraw"
        }
      }
    },
    "title": "MessagePassingBridge",
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 5096,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_uint8"
      },
      {
        "astId": 5099,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 5078,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "1",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 5393,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "51",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 2571,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "dao",
        "offset": 0,
        "slot": "101",
        "type": "t_contract(Controller)1248"
      },
      {
        "astId": 2573,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "avatar",
        "offset": 0,
        "slot": "102",
        "type": "t_address"
      },
      {
        "astId": 2576,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "nameService",
        "offset": 0,
        "slot": "103",
        "type": "t_contract(INameService)2296"
      },
      {
        "astId": 2644,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "gap",
        "offset": 0,
        "slot": "104",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 5719,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "154",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 4579,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "_owner",
        "offset": 0,
        "slot": "204",
        "type": "t_address"
      },
      {
        "astId": 4699,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "205",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 2918,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "lzEndpoint",
        "offset": 0,
        "slot": "254",
        "type": "t_contract(ILayerZeroEndpointUpgradeable)2849"
      },
      {
        "astId": 2922,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "trustedRemoteLookup",
        "offset": 0,
        "slot": "255",
        "type": "t_mapping(t_uint16,t_bytes_storage)"
      },
      {
        "astId": 2928,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "minDstGasLookup",
        "offset": 0,
        "slot": "256",
        "type": "t_mapping(t_uint16,t_mapping(t_uint16,t_uint256))"
      },
      {
        "astId": 2932,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "payloadSizeLimitLookup",
        "offset": 0,
        "slot": "257",
        "type": "t_mapping(t_uint16,t_uint256)"
      },
      {
        "astId": 2934,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "precrime",
        "offset": 0,
        "slot": "258",
        "type": "t_address"
      },
      {
        "astId": 3466,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "259",
        "type": "t_array(t_uint256)45_storage"
      },
      {
        "astId": 3509,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "failedMessages",
        "offset": 0,
        "slot": "304",
        "type": "t_mapping(t_uint16,t_mapping(t_bytes_memory_ptr,t_mapping(t_uint64,t_bytes32)))"
      },
      {
        "astId": 3728,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "305",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 8873,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "__gap",
        "offset": 0,
        "slot": "354",
        "type": "t_array(t_uint256)49_storage"
      },
      {
        "astId": 8045,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "_gap",
        "offset": 0,
        "slot": "403",
        "type": "t_array(t_uint256)50_storage"
      },
      {
        "astId": 9012,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "guardian",
        "offset": 0,
        "slot": "453",
        "type": "t_address"
      },
      {
        "astId": 9016,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "executedRequests",
        "offset": 0,
        "slot": "454",
        "type": "t_mapping(t_uint256,t_bool)"
      },
      {
        "astId": 9020,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "disabledSourceBridges",
        "offset": 0,
        "slot": "455",
        "type": "t_mapping(t_bytes32,t_bool)"
      },
      {
        "astId": 9022,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "isClosed",
        "offset": 0,
        "slot": "456",
        "type": "t_bool"
      },
      {
        "astId": 9025,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "bridgeFees",
        "offset": 0,
        "slot": "457",
        "type": "t_struct(BridgeFees)8495_storage"
      },
      {
        "astId": 9028,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "bridgeLimits",
        "offset": 0,
        "slot": "460",
        "type": "t_struct(BridgeLimits)8506_storage"
      },
      {
        "astId": 9031,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "bridgeDailyLimit",
        "offset": 0,
        "slot": "465",
        "type": "t_struct(BridgeDailyLimit)8488_storage"
      },
      {
        "astId": 9036,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "accountsDailyLimit",
        "offset": 0,
        "slot": "467",
        "type": "t_mapping(t_address,t_struct(AccountLimit)8483_storage)"
      },
      {
        "astId": 9039,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "faucet",
        "offset": 0,
        "slot": "468",
        "type": "t_contract(IFaucet)8909"
      },
      {
        "astId": 9041,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "currentId",
        "offset": 0,
        "slot": "469",
        "type": "t_uint256"
      },
      {
        "astId": 9045,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "lzChainIdsMapping",
        "offset": 0,
        "slot": "470",
        "type": "t_mapping(t_uint256,t_uint16)"
      },
      {
        "astId": 9047,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "feeRecipient",
        "offset": 0,
        "slot": "471",
        "type": "t_address"
      },
      {
        "astId": 9051,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "approvedRequests",
        "offset": 0,
        "slot": "472",
        "type": "t_mapping(t_uint256,t_bool)"
      },
      {
        "astId": 9055,
        "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
        "label": "lzChainToIdsMapping",
        "offset": 0,
        "slot": "473",
        "type": "t_mapping(t_uint16,t_uint256)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_uint256)45_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[45]",
        "numberOfBytes": "1440"
      },
      "t_array(t_uint256)49_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[49]",
        "numberOfBytes": "1568"
      },
      "t_array(t_uint256)50_storage": {
        "base": "t_uint256",
        "encoding": "inplace",
        "label": "uint256[50]",
        "numberOfBytes": "1600"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_bytes_memory_ptr": {
        "encoding": "bytes",
        "label": "bytes",
        "numberOfBytes": "32"
      },
      "t_bytes_storage": {
        "encoding": "bytes",
        "label": "bytes",
        "numberOfBytes": "32"
      },
      "t_contract(Controller)1248": {
        "encoding": "inplace",
        "label": "contract Controller",
        "numberOfBytes": "20"
      },
      "t_contract(IFaucet)8909": {
        "encoding": "inplace",
        "label": "contract IFaucet",
        "numberOfBytes": "20"
      },
      "t_contract(ILayerZeroEndpointUpgradeable)2849": {
        "encoding": "inplace",
        "label": "contract ILayerZeroEndpointUpgradeable",
        "numberOfBytes": "20"
      },
      "t_contract(INameService)2296": {
        "encoding": "inplace",
        "label": "contract INameService",
        "numberOfBytes": "20"
      },
      "t_mapping(t_address,t_struct(AccountLimit)8483_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct IMessagePassingBridge.AccountLimit)",
        "numberOfBytes": "32",
        "value": "t_struct(AccountLimit)8483_storage"
      },
      "t_mapping(t_bytes32,t_bool)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_bytes_memory_ptr,t_mapping(t_uint64,t_bytes32))": {
        "encoding": "mapping",
        "key": "t_bytes_memory_ptr",
        "label": "mapping(bytes => mapping(uint64 => bytes32))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_uint64,t_bytes32)"
      },
      "t_mapping(t_uint16,t_bytes_storage)": {
        "encoding": "mapping",
        "key": "t_uint16",
        "label": "mapping(uint16 => bytes)",
        "numberOfBytes": "32",
        "value": "t_bytes_storage"
      },
      "t_mapping(t_uint16,t_mapping(t_bytes_memory_ptr,t_mapping(t_uint64,t_bytes32)))": {
        "encoding": "mapping",
        "key": "t_uint16",
        "label": "mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32)))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_bytes_memory_ptr,t_mapping(t_uint64,t_bytes32))"
      },
      "t_mapping(t_uint16,t_mapping(t_uint16,t_uint256))": {
        "encoding": "mapping",
        "key": "t_uint16",
        "label": "mapping(uint16 => mapping(uint16 => uint256))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_uint16,t_uint256)"
      },
      "t_mapping(t_uint16,t_uint256)": {
        "encoding": "mapping",
        "key": "t_uint16",
        "label": "mapping(uint16 => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_uint256,t_bool)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_uint256,t_uint16)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => uint16)",
        "numberOfBytes": "32",
        "value": "t_uint16"
      },
      "t_mapping(t_uint64,t_bytes32)": {
        "encoding": "mapping",
        "key": "t_uint64",
        "label": "mapping(uint64 => bytes32)",
        "numberOfBytes": "32",
        "value": "t_bytes32"
      },
      "t_struct(AccountLimit)8483_storage": {
        "encoding": "inplace",
        "label": "struct IMessagePassingBridge.AccountLimit",
        "members": [
          {
            "astId": 8480,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "lastTransferReset",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 8482,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "bridged24Hours",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_struct(BridgeDailyLimit)8488_storage": {
        "encoding": "inplace",
        "label": "struct IMessagePassingBridge.BridgeDailyLimit",
        "members": [
          {
            "astId": 8485,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "lastTransferReset",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 8487,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "bridged24Hours",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_struct(BridgeFees)8495_storage": {
        "encoding": "inplace",
        "label": "struct IMessagePassingBridge.BridgeFees",
        "members": [
          {
            "astId": 8490,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "minFee",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 8492,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "maxFee",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 8494,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "fee",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "96"
      },
      "t_struct(BridgeLimits)8506_storage": {
        "encoding": "inplace",
        "label": "struct IMessagePassingBridge.BridgeLimits",
        "members": [
          {
            "astId": 8497,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "dailyLimit",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 8499,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "txLimit",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 8501,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "accountDailyLimit",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 8503,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "minAmount",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          },
          {
            "astId": 8505,
            "contract": "contracts/messagePassingBridge/MessagePassingBridge.sol:MessagePassingBridge",
            "label": "onlyWhitelisted",
            "offset": 0,
            "slot": "4",
            "type": "t_bool"
          }
        ],
        "numberOfBytes": "160"
      },
      "t_uint16": {
        "encoding": "inplace",
        "label": "uint16",
        "numberOfBytes": "2"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint64": {
        "encoding": "inplace",
        "label": "uint64",
        "numberOfBytes": "8"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}