{
    "contractName": "TestUtil",
    "abi": [
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": false,
                    "internalType": "bool",
                    "name": "success",
                    "type": "bool"
                },
                {
                    "indexed": false,
                    "internalType": "bytes",
                    "name": "error",
                    "type": "bytes"
                }
            ],
            "name": "Called",
            "type": "event"
        },
        {
            "inputs": [],
            "name": "libRelayRequestName",
            "outputs": [
                {
                    "internalType": "string",
                    "name": "",
                    "type": "string"
                }
            ],
            "stateMutability": "pure",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "libRelayRequestType",
            "outputs": [
                {
                    "internalType": "string",
                    "name": "",
                    "type": "string"
                }
            ],
            "stateMutability": "pure",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "libRelayRequestTypeHash",
            "outputs": [
                {
                    "internalType": "bytes32",
                    "name": "",
                    "type": "bytes32"
                }
            ],
            "stateMutability": "pure",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "libRelayRequestSuffix",
            "outputs": [
                {
                    "internalType": "string",
                    "name": "",
                    "type": "string"
                }
            ],
            "stateMutability": "pure",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "components": [
                                {
                                    "internalType": "address",
                                    "name": "from",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "to",
                                    "type": "address"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "value",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "gas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "nonce",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "bytes",
                                    "name": "data",
                                    "type": "bytes"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "validUntilTime",
                                    "type": "uint256"
                                }
                            ],
                            "internalType": "struct IForwarder.ForwardRequest",
                            "name": "request",
                            "type": "tuple"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256",
                                    "name": "maxFeePerGas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "maxPriorityFeePerGas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "transactionCalldataGasUsed",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "address",
                                    "name": "relayWorker",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "paymaster",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "forwarder",
                                    "type": "address"
                                },
                                {
                                    "internalType": "bytes",
                                    "name": "paymasterData",
                                    "type": "bytes"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "clientId",
                                    "type": "uint256"
                                }
                            ],
                            "internalType": "struct GsnTypes.RelayData",
                            "name": "relayData",
                            "type": "tuple"
                        }
                    ],
                    "internalType": "struct GsnTypes.RelayRequest",
                    "name": "relayRequest",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes",
                    "name": "signature",
                    "type": "bytes"
                }
            ],
            "name": "callForwarderVerify",
            "outputs": [],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "components": [
                                {
                                    "internalType": "address",
                                    "name": "from",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "to",
                                    "type": "address"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "value",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "gas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "nonce",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "bytes",
                                    "name": "data",
                                    "type": "bytes"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "validUntilTime",
                                    "type": "uint256"
                                }
                            ],
                            "internalType": "struct IForwarder.ForwardRequest",
                            "name": "request",
                            "type": "tuple"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256",
                                    "name": "maxFeePerGas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "maxPriorityFeePerGas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "transactionCalldataGasUsed",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "address",
                                    "name": "relayWorker",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "paymaster",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "forwarder",
                                    "type": "address"
                                },
                                {
                                    "internalType": "bytes",
                                    "name": "paymasterData",
                                    "type": "bytes"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "clientId",
                                    "type": "uint256"
                                }
                            ],
                            "internalType": "struct GsnTypes.RelayData",
                            "name": "relayData",
                            "type": "tuple"
                        }
                    ],
                    "internalType": "struct GsnTypes.RelayRequest",
                    "name": "relayRequest",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes",
                    "name": "signature",
                    "type": "bytes"
                }
            ],
            "name": "callForwarderVerifyAndCall",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "success",
                    "type": "bool"
                },
                {
                    "internalType": "bytes",
                    "name": "ret",
                    "type": "bytes"
                }
            ],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "components": [
                                {
                                    "internalType": "address",
                                    "name": "from",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "to",
                                    "type": "address"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "value",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "gas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "nonce",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "bytes",
                                    "name": "data",
                                    "type": "bytes"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "validUntilTime",
                                    "type": "uint256"
                                }
                            ],
                            "internalType": "struct IForwarder.ForwardRequest",
                            "name": "request",
                            "type": "tuple"
                        },
                        {
                            "components": [
                                {
                                    "internalType": "uint256",
                                    "name": "maxFeePerGas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "maxPriorityFeePerGas",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "transactionCalldataGasUsed",
                                    "type": "uint256"
                                },
                                {
                                    "internalType": "address",
                                    "name": "relayWorker",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "paymaster",
                                    "type": "address"
                                },
                                {
                                    "internalType": "address",
                                    "name": "forwarder",
                                    "type": "address"
                                },
                                {
                                    "internalType": "bytes",
                                    "name": "paymasterData",
                                    "type": "bytes"
                                },
                                {
                                    "internalType": "uint256",
                                    "name": "clientId",
                                    "type": "uint256"
                                }
                            ],
                            "internalType": "struct GsnTypes.RelayData",
                            "name": "relayData",
                            "type": "tuple"
                        }
                    ],
                    "internalType": "struct GsnTypes.RelayRequest",
                    "name": "relayRequest",
                    "type": "tuple"
                }
            ],
            "name": "splitRequest",
            "outputs": [
                {
                    "internalType": "bytes32",
                    "name": "typeHash",
                    "type": "bytes32"
                },
                {
                    "internalType": "bytes",
                    "name": "suffixData",
                    "type": "bytes"
                }
            ],
            "stateMutability": "pure",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "forwarder",
                    "type": "address"
                }
            ],
            "name": "libDomainSeparator",
            "outputs": [
                {
                    "internalType": "bytes32",
                    "name": "",
                    "type": "bytes32"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "libGetChainID",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "string",
                    "name": "message",
                    "type": "string"
                },
                {
                    "internalType": "bytes",
                    "name": "signature",
                    "type": "bytes"
                }
            ],
            "name": "_ecrecover",
            "outputs": [
                {
                    "internalType": "address",
                    "name": "",
                    "type": "address"
                }
            ],
            "stateMutability": "pure",
            "type": "function"
        }
    ],
    "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"Called\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"_ecrecover\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validUntilTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IForwarder.ForwardRequest\",\"name\":\"request\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transactionCalldataGasUsed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"relayWorker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"clientId\",\"type\":\"uint256\"}],\"internalType\":\"struct GsnTypes.RelayData\",\"name\":\"relayData\",\"type\":\"tuple\"}],\"internalType\":\"struct GsnTypes.RelayRequest\",\"name\":\"relayRequest\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"callForwarderVerify\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validUntilTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IForwarder.ForwardRequest\",\"name\":\"request\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transactionCalldataGasUsed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"relayWorker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"clientId\",\"type\":\"uint256\"}],\"internalType\":\"struct GsnTypes.RelayData\",\"name\":\"relayData\",\"type\":\"tuple\"}],\"internalType\":\"struct GsnTypes.RelayRequest\",\"name\":\"relayRequest\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"callForwarderVerifyAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"ret\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"}],\"name\":\"libDomainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libGetChainID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libRelayRequestName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libRelayRequestSuffix\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libRelayRequestType\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"libRelayRequestTypeHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validUntilTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IForwarder.ForwardRequest\",\"name\":\"request\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"maxFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxPriorityFeePerGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transactionCalldataGasUsed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"relayWorker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymaster\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"forwarder\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"paymasterData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"clientId\",\"type\":\"uint256\"}],\"internalType\":\"struct GsnTypes.RelayData\",\"name\":\"relayData\",\"type\":\"tuple\"}],\"internalType\":\"struct GsnTypes.RelayRequest\",\"name\":\"relayRequest\",\"type\":\"tuple\"}],\"name\":\"splitRequest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"typeHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"suffixData\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/alexf/gsn2/packages/contracts/solpp/test/TestUtil.sol\":\"TestUtil\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol\":{\"keccak256\":\"0xef3d770001c3245db4408cdd0afdfc622695ccfe31f28b74571d05158bbf83f8\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://08949174ed05b596d89c8f1eeedfeb254993b84054bbc1ff6081ad926f5db406\",\"dweb:/ipfs/QmNQtKzHpie4Esocxuc9YrPtGQyA928a1a5TWbVc7cPoqk\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/interfaces/IERC2771Recipient.sol\":{\"keccak256\":\"0x92a3665ec2fc3d2ab78cf8a08451b2ab6466dc7fae3c215150be2132500406fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://364eee344363535733b4cc1a7748e1fc8b10786f6df6c0e2bc0082bcb2477e0e\",\"dweb:/ipfs/QmfCwWAxFqU4woSqu3g5BFPASEA7eCSwcwUSHM9EoYhYdu\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/test/TestUtil.sol\":{\"keccak256\":\"0xad65a41c0fae22937cf4f22e6dce8048f3241d187fdbbc5f25bdd946e6693c45\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://13a421e5ebbec09fd5fb613a4468be55b05f4b15358d4c6c62e0ea7cf7e1d37a\",\"dweb:/ipfs/Qmeo9ukyrcWXTNeyDVfnVC83m34yufk8zJmHcbGkpnzswi\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnEip712Library.sol\":{\"keccak256\":\"0xc35980f371cab5d9af3e1ead06f82b2afb705a8dbb2a5f53793f0179c485c274\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://dd7732d690c7959df567ee3e4863b0045583506fbae3c87b684b6173fd126968\",\"dweb:/ipfs/QmUbcUAqxKZTQS5ZwwPVnfNAtCmas4pPWQhRWXXwWQEeef\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnTypes.sol\":{\"keccak256\":\"0xfc3ed2bbd925e24facf0c3bb96d57dd7fc5bcc4a684b5473f04e8d209b758805\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://cb57b5b38d3e588f119ae45174891f2049d1d0de160a12b81a20335cd8bf731b\",\"dweb:/ipfs/Qmf6xfbdLbTKEpnzxwnSaRy1YZJtLYTZh8URqry86oyoSU\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnUtils.sol\":{\"keccak256\":\"0x8616968305b6127f4cb43209502e074c3964230a66c703e6b8623b03e5ec6442\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://2b1f1163fee75613024b38c25e17649933919f4a47a5ba5e8c3ea046023eb1ad\",\"dweb:/ipfs/QmNWReZE8BQ82eXahdKjnNjQWHuH9L9wcTcnKgyV5ypKCa\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/utils/MinLibBytes.sol\":{\"keccak256\":\"0xa61a3d8fcd89182975d0bd17b86c22b6affd2f7bf26db66b1ddb2ee396f122ab\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2e0bc21e2c8c2f483aee9d5bc003fa77dc7afddbaa7cc99560581a416cfdef11\",\"dweb:/ipfs/QmbwLE7AJpoH2LVeeHxewq3tf1vXhLNUdYsubWxzDGKfTr\"]},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0xd04b0f06e0666f29cf7cccc82894de541e19bb30a765b107b1e40bb7fe5f7d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7b652499d098e88d8d878374616bb58434301061cae2253298b3f374044e0ddb\",\"dweb:/ipfs/QmbhAzctqo5jrSKU6idHdVyqfmzCcDbNUPvmx4GiXxfA6q\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6f2cf1c531122bc7ca96b8c8db6a60deae60441e5223065e792553d4849b5638\",\"dweb:/ipfs/QmPBdJmBBABMDCfyDjCbdxgiqRavgiSL88SYPGibgbPas9\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bf52bdf22a33263f5ca6227a35faeac3b81e7d2c692fbcc6a079d488710c5900\",\"dweb:/ipfs/QmcmsjkP4yq3UhiJbvyzwufaY2EKh1zhHaRK8ATag2cpD2\"]},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]}},\"version\":1}",
    "bytecode": "0x608060405234801561001057600080fd5b5061194a806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063ae1c18e811610066578063ae1c18e814610160578063b8e6f47a14610168578063d5de06781461017d578063e2cc257614610185578063f69cd3751461018b57600080fd5b806326be0f08146100a357806337d899ce146100cd57806344fa3ccf146100fe5780639182713014610114578063ab469e0d1461013f575b600080fd5b6100b66100b136600461128b565b61019e565b6040516100c49291906114e9565b60405180910390f35b60408051808201909152600c81526b14995b185e54995c5d595cdd60a21b60208201525b6040516100c49190611502565b610106610250565b6040519081526020016100c4565b6101276101223660046111fc565b6102f3565b6040516001600160a01b0390911681526020016100c4565b61015261014d3660046112c0565b61030f565b6040516100c49291906114ce565b6100f16103c3565b61017b6101763660046112c0565b61045f565b005b6100f161049f565b46610106565b61010661019936600461113c565b6104ca565b600060606101ab8361050b565b90506040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a00160405280606181526020016117f8606191396040518060e0016040528060bc815260200161185960bc91396040516020016102149190611437565b60408051601f19818403018152908290526102339392916020016113d8565b604051602081830303815290604052805190602001209150915091565b60006040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a00160405280606181526020016117f8606191396040518060e0016040528060bc815260200161185960bc91396040516020016102b99190611437565b60408051601f19818403018152908290526102d89392916020016113d8565b60405160208183030381529060405280519060200120905090565b6000610308826103028561054a565b90610585565b9392505050565b6000606060006103506040518060400160405280601781526020017623a9a7102932b630bcb2b2102a3930b739b0b1ba34b7b760491b8152508787876105a9565b9094509250905080610365576103658261078f565b7f85cbacf8f422a541772e13127e76d92356b61818e21495c252b257429f3f438c8380156103a257604051806020016040528060008152506103a4565b835b6040516103b29291906114ce565b60405180910390a150935093915050565b60606040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a00160405280606181526020016117f8606191396040518060e0016040528060bc815260200161185960bc913960405160200161042c9190611437565b60408051601f198184030181529082905261044b9392916020016113d8565b604051602081830303815290604052905090565b61049a6040518060400160405280601781526020017623a9a7102932b630bcb2b2102a3930b739b0b1ba34b7b760491b815250848484610797565b505050565b60606040518060e0016040528060bc815260200161185960bc913960405160200161044b9190611437565b60006105056040518060400160405280601781526020017623a9a7102932b630bcb2b2102a3930b739b0b1ba34b7b760491b815250836107b2565b92915050565b606061052261051d6020840184611636565b610805565b60405160200161053491815260200190565b6040516020818303038152906040529050919050565b600061055682516108e6565b82604051602001610568929190611473565b604051602081830303815290604052805190602001209050919050565b600080600061059485856109ec565b915091506105a181610a32565b509392505050565b600080606060006105b98761050b565b905060006105e4896105ce60208b018b611636565b6105df9060c081019060a00161113c565b6107b2565b90506105f36020890189611636565b6106049060c081019060a00161113c565b6001600160a01b031663e024dc7f60e01b61061f8a80611620565b836040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a00160405280606181526020016117f8606191396040518060e0016040528060bc815260200161185960bc91396040516020016106879190611437565b60408051601f19818403018152908290526106a69392916020016113d8565b60405160208183030381529060405280519060200120868c8c6040516024016106d496959493929190611515565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161071291906113bc565b6000604051808303816000865af19150503d806000811461074f576040519150601f19603f3d011682016040523d82523d6000602084013e610754565b606091505b509095509250841561077a57828060200190518101906107749190611172565b90945092505b61078383610bf5565b50509450945094915050565b805160208201fd5b6107a083610c01565b6107ac84848484610de5565b50505050565b60006103086040518060800160405280858152602001604051806040016040528060018152602001603360f81b81525081526020016107ee4690565b8152602001846001600160a01b0316815250610f3c565b60006040518060e0016040528060bc815260200161185960bc91398051602091820120908335908401356040850135610844608087016060880161113c565b61085460a088016080890161113c565b61086460c0890160a08a0161113c565b61087160c08a018a6115d9565b60405161087f9291906113ac565b604051908190038120610568989796959493929160e08c0135906020019889526020890197909752604088019590955260608701939093526001600160a01b039182166080870152811660a08601521660c084015260e08301526101008201526101200190565b60608161090a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610934578061091e8161175a565b915061092d9050600a83611703565b915061090e565b60008167ffffffffffffffff81111561094f5761094f6117e1565b6040519080825280601f01601f191660200182016040528015610979576020820181803683370190505b5090505b84156109e45761098e600183611717565b915061099b600a86611775565b6109a69060306116eb565b60f81b8183815181106109bb576109bb6117cb565b60200101906001600160f81b031916908160001a9053506109dd600a86611703565b945061097d565b949350505050565b600080825160411415610a235760208301516040840151606085015160001a610a1787828585610fbc565b94509450505050610a2b565b506000905060025b9250929050565b6000816004811115610a4657610a466117b5565b1415610a4f5750565b6001816004811115610a6357610a636117b5565b1415610ab65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b6002816004811115610aca57610aca6117b5565b1415610b185760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610aad565b6003816004811115610b2c57610b2c6117b5565b1415610b855760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610aad565b6004816004811115610b9957610b996117b5565b1415610bf25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610aad565b50565b610bf2816104006110a9565b600080610c0e8380611620565b610c1f90604081019060200161113c565b6001600160a01b031663572b6c0560e01b610c3d6020860186611636565b610c4e9060c081019060a00161113c565b6040516001600160a01b03909116602482015260440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610ca291906113bc565b600060405180830381855afa9150503d8060008114610cdd576040519150601f19603f3d011682016040523d82523d6000602084013e610ce2565b606091505b509150915081610d345760405162461bcd60e51b815260206004820152601c60248201527f697354727573746564466f727761726465723a207265766572746564000000006044820152606401610aad565b8051602014610d855760405162461bcd60e51b815260206004820181905260248201527f697354727573746564466f727761726465723a2062616420726573706f6e73656044820152606401610aad565b80806020019051810190610d999190611157565b61049a5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c696420666f7277617264657220666f7220726563697069656e74006044820152606401610aad565b6000610df08461050b565b90506000610e05866105ce6020880188611636565b90506000610e166020870187611636565b610e279060c081019060a00161113c565b90506001600160a01b03811663ad9f99c7610e428880611620565b846040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a00160405280606181526020016117f8606191396040518060e0016040528060bc815260200161185960bc9139604051602001610eaa9190611437565b60408051601f1981840301815290829052610ec99392916020016113d8565b60405160208183030381529060405280519060200120878a8a6040518763ffffffff1660e01b8152600401610f0396959493929190611515565b60006040518083038186803b158015610f1b57600080fd5b505afa158015610f2f573d6000803e3d6000fd5b5050505050505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f826000015180519060200120836020015180519060200120846040015185606001516040516020016105689594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610ff357506000905060036110a0565b8460ff16601b1415801561100b57508460ff16601c14155b1561101c57506000905060046110a0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611070573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611099576000600192509250506110a0565b9150600090505b94509492505050565b80825111156110b6578082525b5050565b60006110cd6110c88461167d565b61164c565b90508281528383830111156110e157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461110f57600080fd5b919050565b8051801515811461110f57600080fd5b60006040828403121561113657600080fd5b50919050565b60006020828403121561114e57600080fd5b610308826110f8565b60006020828403121561116957600080fd5b61030882611114565b6000806040838503121561118557600080fd5b61118e83611114565b9150602083015167ffffffffffffffff8111156111aa57600080fd5b8301601f810185136111bb57600080fd5b80516111c96110c88261167d565b8181528660208385010111156111de57600080fd5b6111ef82602083016020860161172e565b8093505050509250929050565b6000806040838503121561120f57600080fd5b823567ffffffffffffffff8082111561122757600080fd5b818501915085601f83011261123b57600080fd5b61124a868335602085016110ba565b9350602085013591508082111561126057600080fd5b508301601f8101851361127257600080fd5b611281858235602084016110ba565b9150509250929050565b60006020828403121561129d57600080fd5b813567ffffffffffffffff8111156112b457600080fd5b6109e484828501611124565b6000806000604084860312156112d557600080fd5b833567ffffffffffffffff808211156112ed57600080fd5b6112f987838801611124565b9450602086013591508082111561130f57600080fd5b818601915086601f83011261132357600080fd5b81358181111561133257600080fd5b87602082850101111561134457600080fd5b6020830194508093505050509250925092565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845261139881602086016020860161172e565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b600082516113ce81846020870161172e565b9190910192915050565b600084516113ea81846020890161172e565b600560fb1b908301908152845161140881600184016020890161172e565b600b60fa1b60019290910191820152835161142a81600284016020880161172e565b0160020195945050505050565b7352656c6179446174612072656c6179446174612960601b81526000825161146681601485016020870161172e565b9190910160140192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152600083516114ab81601a85016020880161172e565b8351908301906114c281601a84016020880161172e565b01601a01949350505050565b82151581526040602082015260006109e46040830184611380565b8281526040602082015260006109e46040830184611380565b6020815260006103086020830184611380565b60a0815260006001600160a01b038061152d8a6110f8565b1660a08401528061154060208b016110f8565b1660c084015250604088013560e08301526060880135610100830152608088013561012083015261157460a08901896116a5565b60e061014085015261158b61018085018284611357565b91505060c089013561016084015287602084015286604084015282810360608401526115b78187611380565b905082810360808401526115cc818587611357565b9998505050505050505050565b6000808335601e198436030181126115f057600080fd5b83018035915067ffffffffffffffff82111561160b57600080fd5b602001915036819003821315610a2b57600080fd5b6000823560de198336030181126113ce57600080fd5b6000823560fe198336030181126113ce57600080fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611675576116756117e1565b604052919050565b600067ffffffffffffffff821115611697576116976117e1565b50601f01601f191660200190565b6000808335601e198436030181126116bc57600080fd5b830160208101925035905067ffffffffffffffff8111156116dc57600080fd5b803603831315610a2b57600080fd5b600082198211156116fe576116fe611789565b500190565b6000826117125761171261179f565b500490565b60008282101561172957611729611789565b500390565b60005b83811015611749578181015183820152602001611731565b838111156107ac5750506000910152565b600060001982141561176e5761176e611789565b5060010190565b6000826117845761178461179f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe616464726573732066726f6d2c6164647265737320746f2c75696e743235362076616c75652c75696e74323536206761732c75696e74323536206e6f6e63652c627974657320646174612c75696e743235362076616c6964556e74696c54696d6552656c6179446174612875696e74323536206d61784665655065724761732c75696e74323536206d61785072696f726974794665655065724761732c75696e74323536207472616e73616374696f6e43616c6c64617461476173557365642c616464726573732072656c6179576f726b65722c61646472657373207061796d61737465722c6164647265737320666f727761726465722c6279746573207061796d6173746572446174612c75696e7432353620636c69656e74496429a26469706673582212208d587ba1447d571c01e6289f1cb8262af1303ada6639708266f24aeab261c73064736f6c63430008070033",
    "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063ae1c18e811610066578063ae1c18e814610160578063b8e6f47a14610168578063d5de06781461017d578063e2cc257614610185578063f69cd3751461018b57600080fd5b806326be0f08146100a357806337d899ce146100cd57806344fa3ccf146100fe5780639182713014610114578063ab469e0d1461013f575b600080fd5b6100b66100b136600461128b565b61019e565b6040516100c49291906114e9565b60405180910390f35b60408051808201909152600c81526b14995b185e54995c5d595cdd60a21b60208201525b6040516100c49190611502565b610106610250565b6040519081526020016100c4565b6101276101223660046111fc565b6102f3565b6040516001600160a01b0390911681526020016100c4565b61015261014d3660046112c0565b61030f565b6040516100c49291906114ce565b6100f16103c3565b61017b6101763660046112c0565b61045f565b005b6100f161049f565b46610106565b61010661019936600461113c565b6104ca565b600060606101ab8361050b565b90506040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a00160405280606181526020016117f8606191396040518060e0016040528060bc815260200161185960bc91396040516020016102149190611437565b60408051601f19818403018152908290526102339392916020016113d8565b604051602081830303815290604052805190602001209150915091565b60006040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a00160405280606181526020016117f8606191396040518060e0016040528060bc815260200161185960bc91396040516020016102b99190611437565b60408051601f19818403018152908290526102d89392916020016113d8565b60405160208183030381529060405280519060200120905090565b6000610308826103028561054a565b90610585565b9392505050565b6000606060006103506040518060400160405280601781526020017623a9a7102932b630bcb2b2102a3930b739b0b1ba34b7b760491b8152508787876105a9565b9094509250905080610365576103658261078f565b7f85cbacf8f422a541772e13127e76d92356b61818e21495c252b257429f3f438c8380156103a257604051806020016040528060008152506103a4565b835b6040516103b29291906114ce565b60405180910390a150935093915050565b60606040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a00160405280606181526020016117f8606191396040518060e0016040528060bc815260200161185960bc913960405160200161042c9190611437565b60408051601f198184030181529082905261044b9392916020016113d8565b604051602081830303815290604052905090565b61049a6040518060400160405280601781526020017623a9a7102932b630bcb2b2102a3930b739b0b1ba34b7b760491b815250848484610797565b505050565b60606040518060e0016040528060bc815260200161185960bc913960405160200161044b9190611437565b60006105056040518060400160405280601781526020017623a9a7102932b630bcb2b2102a3930b739b0b1ba34b7b760491b815250836107b2565b92915050565b606061052261051d6020840184611636565b610805565b60405160200161053491815260200190565b6040516020818303038152906040529050919050565b600061055682516108e6565b82604051602001610568929190611473565b604051602081830303815290604052805190602001209050919050565b600080600061059485856109ec565b915091506105a181610a32565b509392505050565b600080606060006105b98761050b565b905060006105e4896105ce60208b018b611636565b6105df9060c081019060a00161113c565b6107b2565b90506105f36020890189611636565b6106049060c081019060a00161113c565b6001600160a01b031663e024dc7f60e01b61061f8a80611620565b836040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a00160405280606181526020016117f8606191396040518060e0016040528060bc815260200161185960bc91396040516020016106879190611437565b60408051601f19818403018152908290526106a69392916020016113d8565b60405160208183030381529060405280519060200120868c8c6040516024016106d496959493929190611515565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161071291906113bc565b6000604051808303816000865af19150503d806000811461074f576040519150601f19603f3d011682016040523d82523d6000602084013e610754565b606091505b509095509250841561077a57828060200190518101906107749190611172565b90945092505b61078383610bf5565b50509450945094915050565b805160208201fd5b6107a083610c01565b6107ac84848484610de5565b50505050565b60006103086040518060800160405280858152602001604051806040016040528060018152602001603360f81b81525081526020016107ee4690565b8152602001846001600160a01b0316815250610f3c565b60006040518060e0016040528060bc815260200161185960bc91398051602091820120908335908401356040850135610844608087016060880161113c565b61085460a088016080890161113c565b61086460c0890160a08a0161113c565b61087160c08a018a6115d9565b60405161087f9291906113ac565b604051908190038120610568989796959493929160e08c0135906020019889526020890197909752604088019590955260608701939093526001600160a01b039182166080870152811660a08601521660c084015260e08301526101008201526101200190565b60608161090a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610934578061091e8161175a565b915061092d9050600a83611703565b915061090e565b60008167ffffffffffffffff81111561094f5761094f6117e1565b6040519080825280601f01601f191660200182016040528015610979576020820181803683370190505b5090505b84156109e45761098e600183611717565b915061099b600a86611775565b6109a69060306116eb565b60f81b8183815181106109bb576109bb6117cb565b60200101906001600160f81b031916908160001a9053506109dd600a86611703565b945061097d565b949350505050565b600080825160411415610a235760208301516040840151606085015160001a610a1787828585610fbc565b94509450505050610a2b565b506000905060025b9250929050565b6000816004811115610a4657610a466117b5565b1415610a4f5750565b6001816004811115610a6357610a636117b5565b1415610ab65760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064015b60405180910390fd5b6002816004811115610aca57610aca6117b5565b1415610b185760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610aad565b6003816004811115610b2c57610b2c6117b5565b1415610b855760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610aad565b6004816004811115610b9957610b996117b5565b1415610bf25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610aad565b50565b610bf2816104006110a9565b600080610c0e8380611620565b610c1f90604081019060200161113c565b6001600160a01b031663572b6c0560e01b610c3d6020860186611636565b610c4e9060c081019060a00161113c565b6040516001600160a01b03909116602482015260440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610ca291906113bc565b600060405180830381855afa9150503d8060008114610cdd576040519150601f19603f3d011682016040523d82523d6000602084013e610ce2565b606091505b509150915081610d345760405162461bcd60e51b815260206004820152601c60248201527f697354727573746564466f727761726465723a207265766572746564000000006044820152606401610aad565b8051602014610d855760405162461bcd60e51b815260206004820181905260248201527f697354727573746564466f727761726465723a2062616420726573706f6e73656044820152606401610aad565b80806020019051810190610d999190611157565b61049a5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c696420666f7277617264657220666f7220726563697069656e74006044820152606401610aad565b6000610df08461050b565b90506000610e05866105ce6020880188611636565b90506000610e166020870187611636565b610e279060c081019060a00161113c565b90506001600160a01b03811663ad9f99c7610e428880611620565b846040518060400160405280600c81526020016b14995b185e54995c5d595cdd60a21b8152506040518060a00160405280606181526020016117f8606191396040518060e0016040528060bc815260200161185960bc9139604051602001610eaa9190611437565b60408051601f1981840301815290829052610ec99392916020016113d8565b60405160208183030381529060405280519060200120878a8a6040518763ffffffff1660e01b8152600401610f0396959493929190611515565b60006040518083038186803b158015610f1b57600080fd5b505afa158015610f2f573d6000803e3d6000fd5b5050505050505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f826000015180519060200120836020015180519060200120846040015185606001516040516020016105689594939291909485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610ff357506000905060036110a0565b8460ff16601b1415801561100b57508460ff16601c14155b1561101c57506000905060046110a0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611070573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611099576000600192509250506110a0565b9150600090505b94509492505050565b80825111156110b6578082525b5050565b60006110cd6110c88461167d565b61164c565b90508281528383830111156110e157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461110f57600080fd5b919050565b8051801515811461110f57600080fd5b60006040828403121561113657600080fd5b50919050565b60006020828403121561114e57600080fd5b610308826110f8565b60006020828403121561116957600080fd5b61030882611114565b6000806040838503121561118557600080fd5b61118e83611114565b9150602083015167ffffffffffffffff8111156111aa57600080fd5b8301601f810185136111bb57600080fd5b80516111c96110c88261167d565b8181528660208385010111156111de57600080fd5b6111ef82602083016020860161172e565b8093505050509250929050565b6000806040838503121561120f57600080fd5b823567ffffffffffffffff8082111561122757600080fd5b818501915085601f83011261123b57600080fd5b61124a868335602085016110ba565b9350602085013591508082111561126057600080fd5b508301601f8101851361127257600080fd5b611281858235602084016110ba565b9150509250929050565b60006020828403121561129d57600080fd5b813567ffffffffffffffff8111156112b457600080fd5b6109e484828501611124565b6000806000604084860312156112d557600080fd5b833567ffffffffffffffff808211156112ed57600080fd5b6112f987838801611124565b9450602086013591508082111561130f57600080fd5b818601915086601f83011261132357600080fd5b81358181111561133257600080fd5b87602082850101111561134457600080fd5b6020830194508093505050509250925092565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845261139881602086016020860161172e565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b600082516113ce81846020870161172e565b9190910192915050565b600084516113ea81846020890161172e565b600560fb1b908301908152845161140881600184016020890161172e565b600b60fa1b60019290910191820152835161142a81600284016020880161172e565b0160020195945050505050565b7352656c6179446174612072656c6179446174612960601b81526000825161146681601485016020870161172e565b9190910160140192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152600083516114ab81601a85016020880161172e565b8351908301906114c281601a84016020880161172e565b01601a01949350505050565b82151581526040602082015260006109e46040830184611380565b8281526040602082015260006109e46040830184611380565b6020815260006103086020830184611380565b60a0815260006001600160a01b038061152d8a6110f8565b1660a08401528061154060208b016110f8565b1660c084015250604088013560e08301526060880135610100830152608088013561012083015261157460a08901896116a5565b60e061014085015261158b61018085018284611357565b91505060c089013561016084015287602084015286604084015282810360608401526115b78187611380565b905082810360808401526115cc818587611357565b9998505050505050505050565b6000808335601e198436030181126115f057600080fd5b83018035915067ffffffffffffffff82111561160b57600080fd5b602001915036819003821315610a2b57600080fd5b6000823560de198336030181126113ce57600080fd5b6000823560fe198336030181126113ce57600080fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611675576116756117e1565b604052919050565b600067ffffffffffffffff821115611697576116976117e1565b50601f01601f191660200190565b6000808335601e198436030181126116bc57600080fd5b830160208101925035905067ffffffffffffffff8111156116dc57600080fd5b803603831315610a2b57600080fd5b600082198211156116fe576116fe611789565b500190565b6000826117125761171261179f565b500490565b60008282101561172957611729611789565b500390565b60005b83811015611749578181015183820152602001611731565b838111156107ac5750506000910152565b600060001982141561176e5761176e611789565b5060010190565b6000826117845761178461179f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe616464726573732066726f6d2c6164647265737320746f2c75696e743235362076616c75652c75696e74323536206761732c75696e74323536206e6f6e63652c627974657320646174612c75696e743235362076616c6964556e74696c54696d6552656c6179446174612875696e74323536206d61784665655065724761732c75696e74323536206d61785072696f726974794665655065724761732c75696e74323536207472616e73616374696f6e43616c6c64617461476173557365642c616464726573732072656c6179576f726b65722c61646472657373207061796d61737465722c6164647265737320666f727761726465722c6279746573207061796d6173746572446174612c75696e7432353620636c69656e74496429a26469706673582212208d587ba1447d571c01e6289f1cb8262af1303ada6639708266f24aeab261c73064736f6c63430008070033",
    "immutableReferences": {},
    "sourceMap": "256:2280:36:-:0;;;;;;;;;;;;;;;;;;;",
    "deployedSourceMap": "256:2280:36:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1742:316;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;337:126;421:35;;;;;;;;;;;;-1:-1:-1;;;421:35:36;;;;337:126;;;;;;;:::i;609:128::-;;;:::i;:::-;;;7815:25:63;;;7803:2;7788:18;609:128:36;7669:177:63;2355:179:36;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7322:32:63;;;7304:51;;7292:2;7277:18;2355:179:36;7158:203:63;1171:519:36;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;469:134::-;;;:::i;929:236::-;;;;;;:::i;:::-;;:::i;:::-;;743:130;;;:::i;2241:108::-;5286:9:38;2241:108:36;;2064:171;;;;;;:::i;:::-;;:::i;1742:316::-;1867:16;1893:23;1948:43;1978:12;1948:29;:43::i;:::-;1933:58;;1295:18:38;;;;;;;;;;;;;-1:-1:-1;;;1295:18:38;;;1318:14;;;;;;;;;;;;;;;;;1203;;;;;;;;;;;;;;;;;1162:56;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1162:56:38;;;;;;;;;;1269:90;;;;1162:56;1269:90;;:::i;:::-;;;;;;;;;;;;;1491:29;;;;;;2001:50:36;;1742:316;;;:::o;609:128::-;665:7;1295:18:38;;;;;;;;;;;;;-1:-1:-1;;;1295:18:38;;;1318:14;;;;;;;;;;;;;;;;;1203;;;;;;;;;;;;;;;;;1162:56;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1162:56:38;;;;;;;;;;1269:90;;;;1162:56;1269:90;;:::i;:::-;;;;;;;;;;;;;1491:29;;;;;;684:46:36;;609:128;:::o;2355:179::-;2443:7;2469:58;2517:9;2469:39;2475:7;2469:37;:39::i;:::-;:47;;:58::i;:::-;2462:65;2355:179;-1:-1:-1;;;2355:179:36:o;1171:519::-;1335:12;1357:16;1390:21;1456:76;;;;;;;;;;;;;;-1:-1:-1;;;1456:76:36;;;1508:12;1522:9;;1456:24;:76::i;:::-;1421:111;;-1:-1:-1;1421:111:36;-1:-1:-1;1421:111:36;-1:-1:-1;1421:111:36;1542:76;;1579:28;1603:3;1579:23;:28::i;:::-;1632:51;1639:7;1648:16;;:34;;1673:9;;;;;;;;;;;;1648:34;;;1667:3;1648:34;1632:51;;;;;;;:::i;:::-;;;;;;;;1380:310;1171:519;;;;;;:::o;469:134::-;521:13;1295:18:38;;;;;;;;;;;;;-1:-1:-1;;;1295:18:38;;;1318:14;;;;;;;;;;;;;;;;;1203;;;;;;;;;;;;;;;;;1162:56;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1162:56:38;;;;;;;;;;1269:90;;;;1162:56;1269:90;;:::i;:::-;;;;;;;;;;;;;546:50:36;;469:134;:::o;929:236::-;1083:75;;;;;;;;;;;;;;-1:-1:-1;;;1083:75:36;;;1134:12;1148:9;;1083:23;:75::i;:::-;929:236;;;:::o;743:130::-;797:13;1203:14:38;;;;;;;;;;;;;;;;;1162:56;;;;;;;;:::i;2064:171:36:-;2132:7;2158:70;;;;;;;;;;;;;;-1:-1:-1;;;2158:70:36;;;2218:9;2158:32;:70::i;:::-;2151:77;2064:171;-1:-1:-1;;2064:171:36:o;1829:229:38:-;1945:23;2022:28;2036:13;;;;:3;:13;:::i;:::-;2022;:28::i;:::-;1998:53;;;;;;7815:25:63;;7803:2;7788:18;;7669:177;1998:53:38;;;;;;;;;;;;;1985:66;;1829:229;;;:::o;8013:196:57:-;8084:7;8171:26;8188:1;:8;8171:16;:26::i;:::-;8199:1;8120:81;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8110:92;;;;;;8103:99;;8013:196;;;:::o;3759:227::-;3837:7;3857:17;3876:18;3898:27;3909:4;3915:9;3898:10;:27::i;:::-;3856:69;;;;3935:18;3947:5;3935:11;:18::i;:::-;-1:-1:-1;3970:9:57;3759:227;-1:-1:-1;;;3759:227:57:o;3558:929:38:-;3738:21;3769:16;3795;3829:23;3856:26;3869:12;3856;:26::i;:::-;3828:54;-1:-1:-1;3892:24:38;3919:70;3935:19;3956:22;;;;:12;:22;:::i;:::-;:32;;;;;;;;;:::i;:::-;3919:15;:70::i;:::-;3892:97;-1:-1:-1;4087:22:38;;;;:12;:22;:::i;:::-;:32;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4087:37:38;-1:-1:-1;;;4202:20:38;:12;;:20;:::i;:::-;4224:16;1295:18;;;;;;;;;;;;;-1:-1:-1;;;1295:18:38;;;1318:14;;;;;;;;;;;;;;;;;1203;;;;;;;;;;;;;;;;;1162:56;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1162:56:38;;;;;;;;;;1269:90;;;;1162:56;1269:90;;:::i;:::-;;;;;;;;;;;;;1491:29;;;;;;4266:10;4278:9;;4138:159;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4138:159:38;;;;;;;;;;;;;;-1:-1:-1;;;;;4138:159:38;-1:-1:-1;;;;;;4138:159:38;;;;;;;;;;4087:211;;;;4138:159;4087:211;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4061:237:38;;-1:-1:-1;4061:237:38;-1:-1:-1;4308:143:38;;;;4421:3;4410:30;;;;;;;;;;;;:::i;:::-;4389:51;;-1:-1:-1;4389:51:38;-1:-1:-1;4308:143:38;4460:20;4476:3;4460:15;:20::i;:::-;3818:669;;3558:929;;;;;;;;:::o;2143:139:40:-;2260:4;2254:11;2249:2;2244:4;2240:12;2233:33;3262:290:38;3438:36;3461:12;3438:22;:36::i;:::-;3484:61;3500:19;3521:12;3535:9;;3484:15;:61::i;:::-;3262:290;;;;:::o;4844:291::-;4931:7;4957:171;4968:159;;;;;;;;5002:4;4968:159;;;;;;;;;;;;;;;;;-1:-1:-1;;;4968:159:38;;;;;;;5057:12;5286:9;;5141:170;5057:12;4968:159;;;;5103:9;-1:-1:-1;;;;;4968:159:38;;;;4957:10;:171::i;5644:478::-;5723:7;1421:14;;;;;;;;;;;;;;;;;1411:25;;;;;;;;5823:16;;;5857:24;;;5899:30;;;;5947:15;;;;;;;;:::i;:::-;5980:13;;;;;;;;:::i;:::-;6011;;;;;;;;:::i;:::-;6052:17;;;;:3;:17;:::i;:::-;6042:28;;;;;;;:::i;:::-;;;;;;;;;5759:355;;;;;;;;;6088:12;;;;;5759:355;;9009:25:63;;;9065:2;9050:18;;9043:34;;;;9108:2;9093:18;;9086:34;;;;9151:2;9136:18;;9129:34;;;;-1:-1:-1;;;;;9238:15:63;;;9232:3;9217:19;;9210:44;9291:15;;9190:3;9270:19;;9263:44;9344:15;9338:3;9323:19;;9316:44;9391:3;9376:19;;9369:35;9435:3;9420:19;;9413:35;8996:3;8981:19;;8638:816;392:703:56;448:13;665:10;661:51;;-1:-1:-1;;691:10:56;;;;;;;;;;;;-1:-1:-1;;;691:10:56;;;;;392:703::o;661:51::-;736:5;721:12;775:75;782:9;;775:75;;807:8;;;;:::i;:::-;;-1:-1:-1;829:10:56;;-1:-1:-1;837:2:56;829:10;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:17:56;;859:39;;908:150;915:10;;908:150;;941:11;951:1;941:11;;:::i;:::-;;-1:-1:-1;1009:10:56;1017:2;1009:5;:10;:::i;:::-;996:24;;:2;:24;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;966:56:56;;;;;;;;-1:-1:-1;1036:11:56;1045:2;1036:11;;:::i;:::-;;;908:150;;;1081:6;392:703;-1:-1:-1;;;;392:703:56:o;2243:730:57:-;2324:7;2333:12;2361:9;:16;2381:2;2361:22;2357:610;;;2697:4;2682:20;;2676:27;2746:4;2731:20;;2725:27;2803:4;2788:20;;2782:27;2399:9;2774:36;2844:25;2855:4;2774:36;2676:27;2725;2844:10;:25::i;:::-;2837:32;;;;;;;;;2357:610;-1:-1:-1;2916:1:57;;-1:-1:-1;2920:35:57;2357:610;2243:730;;;;;:::o;548:631::-;625:20;616:5;:29;;;;;;;;:::i;:::-;;612:561;;;548:631;:::o;612:561::-;721:29;712:5;:38;;;;;;;;:::i;:::-;;708:465;;;766:34;;-1:-1:-1;;;766:34:57;;10288:2:63;766:34:57;;;10270:21:63;10327:2;10307:18;;;10300:30;10366:26;10346:18;;;10339:54;10410:18;;766:34:57;;;;;;;;708:465;830:35;821:5;:44;;;;;;;;:::i;:::-;;817:356;;;881:41;;-1:-1:-1;;;881:41:57;;10641:2:63;881:41:57;;;10623:21:63;10680:2;10660:18;;;10653:30;10719:33;10699:18;;;10692:61;10770:18;;881:41:57;10439:355:63;817:356:57;952:30;943:5;:39;;;;;;;;:::i;:::-;;939:234;;;998:44;;-1:-1:-1;;;998:44:57;;11718:2:63;998:44:57;;;11700:21:63;11757:2;11737:18;;;11730:30;11796:34;11776:18;;;11769:62;-1:-1:-1;;;11847:18:63;;;11840:32;11889:19;;998:44:57;11516:398:63;939:234:57;1072:30;1063:5;:39;;;;;;;;:::i;:::-;;1059:114;;;1118:44;;-1:-1:-1;;;1118:44:57;;12121:2:63;1118:44:57;;;12103:21:63;12160:2;12140:18;;;12133:30;12199:34;12179:18;;;12172:62;-1:-1:-1;;;12250:18:63;;;12243:32;12292:19;;1118:44:57;11919:398:63;1059:114:57;548:631;:::o;4713:125:38:-;4781:50;4809:4;563;4781:27;:50::i;2158:540::-;2260:12;;2294:20;:12;;:20;:::i;:::-;:23;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2294:34:38;-1:-1:-1;;;2429:22:38;;;;:12;:22;:::i;:::-;:32;;;;;;;;;:::i;:::-;2342:133;;-1:-1:-1;;;;;7322:32:63;;;2342:133:38;;;7304:51:63;7277:18;;2342:133:38;;;-1:-1:-1;;2342:133:38;;;;;;;;;;;;;;-1:-1:-1;;;;;2342:133:38;-1:-1:-1;;;;;;2342:133:38;;;;;;;;;;2294:191;;;;2342:133;2294:191;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2259:226;;;;2503:7;2495:48;;;;-1:-1:-1;;;2495:48:38;;11361:2:63;2495:48:38;;;11343:21:63;11400:2;11380:18;;;11373:30;11439;11419:18;;;11412:58;11487:18;;2495:48:38;11159:352:63;2495:48:38;2561:3;:10;2575:2;2561:16;2553:61;;;;-1:-1:-1;;;2553:61:38;;12524:2:63;2553:61:38;;;12506:21:63;;;12543:18;;;12536:30;12602:34;12582:18;;;12575:62;12654:18;;2553:61:38;12322:356:63;2553:61:38;2643:3;2632:23;;;;;;;;;;;;:::i;:::-;2624:67;;;;-1:-1:-1;;;2624:67:38;;11001:2:63;2624:67:38;;;10983:21:63;11040:2;11020:18;;;11013:30;11079:33;11059:18;;;11052:61;11130:18;;2624:67:38;10799:355:63;2704:552:38;2890:23;2917:26;2930:12;2917;:26::i;:::-;2889:54;-1:-1:-1;2953:24:38;2980:70;2996:19;3017:22;;;;:12;:22;:::i;2980:70::-;2953:97;-1:-1:-1;3060:20:38;3102:22;;;;:12;:22;:::i;:::-;:32;;;;;;;;;:::i;:::-;3060:76;-1:-1:-1;;;;;;3146:16:38;;;3163:20;:12;;:20;:::i;:::-;3185:16;1295:18;;;;;;;;;;;;;-1:-1:-1;;;1295:18:38;;;1318:14;;;;;;;;;;;;;;;;;1203;;;;;;;;;;;;;;;;;1162:56;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1162:56:38;;;;;;;;;;1269:90;;;;1162:56;1269:90;;:::i;:::-;;;;;;;;;;;;;1491:29;;;;;;3227:10;3239:9;;3146:103;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2879:377;;;2704:552;;;;:::o;5317:321::-;5385:7;1713:109;5504:3;:8;;;5488:26;;;;;;5548:3;:11;;;5532:29;;;;;;5579:3;:11;;;5608:3;:21;;;5421:209;;;;;;;;;;;8110:25:63;;;8166:2;8151:18;;8144:34;;;;8209:2;8194:18;;8187:34;;;;8252:2;8237:18;;8230:34;-1:-1:-1;;;;;8301:32:63;8295:3;8280:19;;8273:61;8097:3;8082:19;;7851:489;5167:1603:57;5293:7;;6217:66;6204:79;;6200:161;;;-1:-1:-1;6315:1:57;;-1:-1:-1;6319:30:57;6299:51;;6200:161;6374:1;:7;;6379:2;6374:7;;:18;;;;;6385:1;:7;;6390:2;6385:7;;6374:18;6370:100;;;-1:-1:-1;6424:1:57;;-1:-1:-1;6428:30:57;6408:51;;6370:100;6581:24;;;6564:14;6581:24;;;;;;;;;9686:25:63;;;9759:4;9747:17;;9727:18;;;9720:45;;;;9781:18;;;9774:34;;;9824:18;;;9817:34;;;6581:24:57;;9658:19:63;;6581:24:57;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6581:24:57;;-1:-1:-1;;6581:24:57;;;-1:-1:-1;;;;;;;6619:20:57;;6615:101;;6671:1;6675:29;6655:50;;;;;;;6615:101;6734:6;-1:-1:-1;6742:20:57;;-1:-1:-1;5167:1603:57;;;;;;;;:::o;429:173:41:-;531:6;517:4;:11;:20;513:83;;;577:6;571:4;564:20;513:83;429:173;;:::o;14:336:63:-;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:45;;;239:1;236;229:12;198:45;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;14:336;;;;;:::o;355:173::-;423:20;;-1:-1:-1;;;;;472:31:63;;462:42;;452:70;;518:1;515;508:12;452:70;355:173;;;:::o;533:164::-;609:13;;658;;651:21;641:32;;631:60;;687:1;684;677:12;702:160;767:5;812:2;803:6;798:3;794:16;790:25;787:45;;;828:1;825;818:12;787:45;-1:-1:-1;850:6:63;702:160;-1:-1:-1;702:160:63:o;867:186::-;926:6;979:2;967:9;958:7;954:23;950:32;947:52;;;995:1;992;985:12;947:52;1018:29;1037:9;1018:29;:::i;1058:202::-;1125:6;1178:2;1166:9;1157:7;1153:23;1149:32;1146:52;;;1194:1;1191;1184:12;1146:52;1217:37;1244:9;1217:37;:::i;1265:713::-;1350:6;1358;1411:2;1399:9;1390:7;1386:23;1382:32;1379:52;;;1427:1;1424;1417:12;1379:52;1450:37;1477:9;1450:37;:::i;:::-;1440:47;;1531:2;1520:9;1516:18;1510:25;1558:18;1550:6;1547:30;1544:50;;;1590:1;1587;1580:12;1544:50;1613:22;;1666:4;1658:13;;1654:27;-1:-1:-1;1644:55:63;;1695:1;1692;1685:12;1644:55;1724:2;1718:9;1749:48;1765:31;1793:2;1765:31;:::i;1749:48::-;1820:2;1813:5;1806:17;1860:7;1855:2;1850;1846;1842:11;1838:20;1835:33;1832:53;;;1881:1;1878;1871:12;1832:53;1894:54;1945:2;1940;1933:5;1929:14;1924:2;1920;1916:11;1894:54;:::i;:::-;1967:5;1957:15;;;;;1265:713;;;;;:::o;1983:804::-;2070:6;2078;2131:2;2119:9;2110:7;2106:23;2102:32;2099:52;;;2147:1;2144;2137:12;2099:52;2187:9;2174:23;2216:18;2257:2;2249:6;2246:14;2243:34;;;2273:1;2270;2263:12;2243:34;2311:6;2300:9;2296:22;2286:32;;2356:7;2349:4;2345:2;2341:13;2337:27;2327:55;;2378:1;2375;2368:12;2327:55;2401:75;2468:7;2463:2;2450:16;2443:4;2439:2;2435:13;2401:75;:::i;:::-;2391:85;;2529:4;2518:9;2514:20;2501:34;2485:50;;2560:2;2550:8;2547:16;2544:36;;;2576:1;2573;2566:12;2544:36;-1:-1:-1;2599:24:63;;2654:4;2646:13;;2642:27;-1:-1:-1;2632:55:63;;2683:1;2680;2673:12;2632:55;2706:75;2773:7;2768:2;2755:16;2748:4;2744:2;2740:13;2706:75;:::i;:::-;2696:85;;;1983:804;;;;;:::o;2792:366::-;2883:6;2936:2;2924:9;2915:7;2911:23;2907:32;2904:52;;;2952:1;2949;2942:12;2904:52;2992:9;2979:23;3025:18;3017:6;3014:30;3011:50;;;3057:1;3054;3047:12;3011:50;3080:72;3144:7;3135:6;3124:9;3120:22;3080:72;:::i;3163:835::-;3274:6;3282;3290;3343:2;3331:9;3322:7;3318:23;3314:32;3311:52;;;3359:1;3356;3349:12;3311:52;3399:9;3386:23;3428:18;3469:2;3461:6;3458:14;3455:34;;;3485:1;3482;3475:12;3455:34;3508:72;3572:7;3563:6;3552:9;3548:22;3508:72;:::i;:::-;3498:82;;3633:2;3622:9;3618:18;3605:32;3589:48;;3662:2;3652:8;3649:16;3646:36;;;3678:1;3675;3668:12;3646:36;3716:8;3705:9;3701:24;3691:34;;3763:7;3756:4;3752:2;3748:13;3744:27;3734:55;;3785:1;3782;3775:12;3734:55;3825:2;3812:16;3851:2;3843:6;3840:14;3837:34;;;3867:1;3864;3857:12;3837:34;3912:7;3907:2;3898:6;3894:2;3890:15;3886:24;3883:37;3880:57;;;3933:1;3930;3923:12;3880:57;3964:2;3960;3956:11;3946:21;;3986:6;3976:16;;;;;3163:835;;;;;:::o;4003:266::-;4091:6;4086:3;4079:19;4143:6;4136:5;4129:4;4124:3;4120:14;4107:43;-1:-1:-1;4195:1:63;4170:16;;;4188:4;4166:27;;;4159:38;;;;4251:2;4230:15;;;-1:-1:-1;;4226:29:63;4217:39;;;4213:50;;4003:266::o;4274:257::-;4315:3;4353:5;4347:12;4380:6;4375:3;4368:19;4396:63;4452:6;4445:4;4440:3;4436:14;4429:4;4422:5;4418:16;4396:63;:::i;:::-;4513:2;4492:15;-1:-1:-1;;4488:29:63;4479:39;;;;4520:4;4475:50;;4274:257;-1:-1:-1;;4274:257:63:o;4536:271::-;4719:6;4711;4706:3;4693:33;4675:3;4745:16;;4770:13;;;4745:16;4536:271;-1:-1:-1;4536:271:63:o;4812:274::-;4941:3;4979:6;4973:13;4995:53;5041:6;5036:3;5029:4;5021:6;5017:17;4995:53;:::i;:::-;5064:16;;;;;4812:274;-1:-1:-1;;4812:274:63:o;5091:940::-;5520:3;5558:6;5552:13;5574:53;5620:6;5615:3;5608:4;5600:6;5596:17;5574:53;:::i;:::-;-1:-1:-1;;;5649:16:63;;;5674:18;;;5717:13;;5739:65;5717:13;5791:1;5780:13;;5773:4;5761:17;;5739:65;:::i;:::-;-1:-1:-1;;;5867:1:63;5823:20;;;;5859:10;;;5852:23;5900:13;;5922:62;5900:13;5971:1;5963:10;;5956:4;5944:17;;5922:62;:::i;:::-;6004:17;6023:1;6000:25;;5091:940;-1:-1:-1;;;;;5091:940:63:o;6036:437::-;-1:-1:-1;;;6291:3:63;6284:35;6266:3;6348:6;6342:13;6364:62;6419:6;6414:2;6409:3;6405:12;6398:4;6390:6;6386:17;6364:62;:::i;:::-;6446:16;;;;6464:2;6442:25;;6036:437;-1:-1:-1;;6036:437:63:o;6478:675::-;6786:66;6781:3;6774:79;6756:3;6882:6;6876:13;6898:62;6953:6;6948:2;6943:3;6939:12;6932:4;6924:6;6920:17;6898:62;:::i;:::-;7020:13;;6979:16;;;;7042:63;7020:13;7091:2;7083:11;;7076:4;7064:17;;7042:63;:::i;:::-;7125:17;7144:2;7121:26;;6478:675;-1:-1:-1;;;;6478:675:63:o;7366:298::-;7549:6;7542:14;7535:22;7524:9;7517:41;7594:2;7589;7578:9;7574:18;7567:30;7498:4;7614:44;7654:2;7643:9;7639:18;7631:6;7614:44;:::i;8345:288::-;8520:6;8509:9;8502:25;8563:2;8558;8547:9;8543:18;8536:30;8483:4;8583:44;8623:2;8612:9;8608:18;8600:6;8583:44;:::i;9862:219::-;10011:2;10000:9;9993:21;9974:4;10031:44;10071:2;10060:9;10056:18;10048:6;10031:44;:::i;12683:1405::-;13036:3;13018:22;;12999:4;-1:-1:-1;;;;;13059:19:63;13119:26;13138:6;13119:26;:::i;:::-;13115:35;13109:3;13098:9;13094:19;13087:64;13231:2;13192:37;13223:4;13215:6;13211:17;13192:37;:::i;:::-;13188:46;13182:3;13171:9;13167:19;13160:75;;13298:4;13290:6;13286:17;13273:31;13266:4;13255:9;13251:20;13244:61;13367:4;13359:6;13355:17;13342:31;13336:3;13325:9;13321:19;13314:60;13436:4;13428:6;13424:17;13411:31;13405:3;13394:9;13390:19;13383:60;13486:56;13537:3;13529:6;13525:16;13517:6;13486:56;:::i;:::-;13579:4;13573:3;13562:9;13558:19;13551:33;13607:74;13676:3;13665:9;13661:19;13647:12;13633;13607:74;:::i;:::-;13593:88;;;13743:3;13735:6;13731:16;13718:30;13712:3;13701:9;13697:19;13690:59;13787:6;13780:4;13769:9;13765:20;13758:36;13832:6;13825:4;13814:9;13810:20;13803:36;13889:9;13881:6;13877:22;13870:4;13859:9;13855:20;13848:52;13923:32;13948:6;13940;13923:32;:::i;:::-;13909:46;;14005:9;13997:6;13993:22;13986:4;13975:9;13971:20;13964:52;14033:49;14075:6;14067;14059;14033:49;:::i;:::-;14025:57;12683:1405;-1:-1:-1;;;;;;;;;12683:1405:63:o;14275:521::-;14352:4;14358:6;14418:11;14405:25;14512:2;14508:7;14497:8;14481:14;14477:29;14473:43;14453:18;14449:68;14439:96;;14531:1;14528;14521:12;14439:96;14558:33;;14610:20;;;-1:-1:-1;14653:18:63;14642:30;;14639:50;;;14685:1;14682;14675:12;14639:50;14718:4;14706:17;;-1:-1:-1;14749:14:63;14745:27;;;14735:38;;14732:58;;;14786:1;14783;14776:12;14801:332;14901:4;14959:11;14946:25;15053:3;15049:8;15038;15022:14;15018:29;15014:44;14994:18;14990:69;14980:97;;15073:1;15070;15063:12;15138:327;15233:4;15291:11;15278:25;15385:3;15381:8;15370;15354:14;15350:29;15346:44;15326:18;15322:69;15312:97;;15405:1;15402;15395:12;15470:275;15541:2;15535:9;15606:2;15587:13;;-1:-1:-1;;15583:27:63;15571:40;;15641:18;15626:34;;15662:22;;;15623:62;15620:88;;;15688:18;;:::i;:::-;15724:2;15717:22;15470:275;;-1:-1:-1;15470:275:63:o;15750:186::-;15798:4;15831:18;15823:6;15820:30;15817:56;;;15853:18;;:::i;:::-;-1:-1:-1;15919:2:63;15898:15;-1:-1:-1;;15894:29:63;15925:4;15890:40;;15750:186::o;15941:503::-;15999:5;16006:6;16066:3;16053:17;16152:2;16148:7;16137:8;16121:14;16117:29;16113:43;16093:18;16089:68;16079:96;;16171:1;16168;16161:12;16079:96;16199:33;;16303:4;16290:18;;;-1:-1:-1;16251:21:63;;-1:-1:-1;16331:18:63;16320:30;;16317:50;;;16363:1;16360;16353:12;16317:50;16413:6;16397:14;16393:27;16383:8;16379:42;16376:62;;;16434:1;16431;16424:12;16449:128;16489:3;16520:1;16516:6;16513:1;16510:13;16507:39;;;16526:18;;:::i;:::-;-1:-1:-1;16562:9:63;;16449:128::o;16582:120::-;16622:1;16648;16638:35;;16653:18;;:::i;:::-;-1:-1:-1;16687:9:63;;16582:120::o;16707:125::-;16747:4;16775:1;16772;16769:8;16766:34;;;16780:18;;:::i;:::-;-1:-1:-1;16817:9:63;;16707:125::o;16837:258::-;16909:1;16919:113;16933:6;16930:1;16927:13;16919:113;;;17009:11;;;17003:18;16990:11;;;16983:39;16955:2;16948:10;16919:113;;;17050:6;17047:1;17044:13;17041:48;;;-1:-1:-1;;17085:1:63;17067:16;;17060:27;16837:258::o;17100:135::-;17139:3;-1:-1:-1;;17160:17:63;;17157:43;;;17180:18;;:::i;:::-;-1:-1:-1;17227:1:63;17216:13;;17100:135::o;17240:112::-;17272:1;17298;17288:35;;17303:18;;:::i;:::-;-1:-1:-1;17337:9:63;;17240:112::o;17357:127::-;17418:10;17413:3;17409:20;17406:1;17399:31;17449:4;17446:1;17439:15;17473:4;17470:1;17463:15;17489:127;17550:10;17545:3;17541:20;17538:1;17531:31;17581:4;17578:1;17571:15;17605:4;17602:1;17595:15;17621:127;17682:10;17677:3;17673:20;17670:1;17663:31;17713:4;17710:1;17703:15;17737:4;17734:1;17727:15;17753:127;17814:10;17809:3;17805:20;17802:1;17795:31;17845:4;17842:1;17835:15;17869:4;17866:1;17859:15;17885:127;17946:10;17941:3;17937:20;17934:1;17927:31;17977:4;17974:1;17967:15;18001:4;17998:1;17991:15",
    "source": "pragma solidity ^0.8.0;\npragma abicoder v2;\n\n// SPDX-License-Identifier: GPL-3.0-only\n\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\n\nimport \"../utils/GsnTypes.sol\";\nimport \"../utils/GsnEip712Library.sol\";\nimport \"../utils/GsnUtils.sol\";\n\ncontract TestUtil {\n    using ECDSA for bytes;\n    using ECDSA for bytes32;\n\n    function libRelayRequestName() public pure returns (string memory) {\n        return GsnEip712Library.RELAY_REQUEST_NAME;\n    }\n\n    function libRelayRequestType() public pure returns (string memory) {\n        return string(GsnEip712Library.RELAY_REQUEST_TYPE);\n    }\n\n    function libRelayRequestTypeHash() public pure returns (bytes32) {\n        return GsnEip712Library.RELAY_REQUEST_TYPEHASH;\n    }\n\n    function libRelayRequestSuffix() public pure returns (string memory) {\n        return GsnEip712Library.RELAY_REQUEST_SUFFIX;\n    }\n\n    //helpers for test to call the library funcs:\n    function callForwarderVerify(\n        GsnTypes.RelayRequest calldata relayRequest,\n        bytes calldata signature\n    )\n    external\n    view {\n        GsnEip712Library.verify(\"GSN Relayed Transaction\", relayRequest, signature);\n    }\n\n    function callForwarderVerifyAndCall(\n        GsnTypes.RelayRequest calldata relayRequest,\n        bytes calldata signature\n    )\n    external\n    returns (\n        bool success,\n        bytes memory ret\n    ) {\n        bool forwarderSuccess;\n        (forwarderSuccess, success, ret) = GsnEip712Library.execute(\"GSN Relayed Transaction\", relayRequest, signature);\n        if (!forwarderSuccess) {\n            GsnUtils.revertWithData(ret);\n        }\n        emit Called(success, success == false ? ret : bytes(\"\"));\n    }\n\n    event Called(bool success, bytes error);\n\n    function splitRequest(\n        GsnTypes.RelayRequest calldata relayRequest\n    )\n    external\n    pure\n    returns (\n        bytes32 typeHash,\n        bytes memory suffixData\n    ) {\n        (suffixData) = GsnEip712Library.splitRequest(relayRequest);\n        typeHash = GsnEip712Library.RELAY_REQUEST_TYPEHASH;\n    }\n\n    function libDomainSeparator(address forwarder) public view returns (bytes32) {\n        return GsnEip712Library.domainSeparator(\"GSN Relayed Transaction\", forwarder);\n    }\n\n    function libGetChainID() public view returns (uint256) {\n        return GsnEip712Library.getChainID();\n    }\n\n    function _ecrecover(string memory message, bytes memory signature) public pure returns (address) {\n        return bytes(message).toEthSignedMessageHash().recover(signature);\n    }\n}",
    "sourcePath": "/Users/alexf/gsn2/packages/contracts/solpp/test/TestUtil.sol",
    "ast": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/test/TestUtil.sol",
        "exportedSymbols": {
            "ECDSA": [
                12122
            ],
            "GsnEip712Library": [
                8464
            ],
            "GsnTypes": [
                8492
            ],
            "GsnUtils": [
                8572
            ],
            "IERC165": [
                12352
            ],
            "IERC2771Recipient": [
                5374
            ],
            "IForwarder": [
                5129
            ],
            "MinLibBytes": [
                8687
            ],
            "Strings": [
                11734
            ],
            "TestUtil": [
                8012
            ]
        },
        "id": 8013,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 7819,
                "literals": [
                    "solidity",
                    "^",
                    "0.8",
                    ".0"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:23:36"
            },
            {
                "id": 7820,
                "literals": [
                    "abicoder",
                    "v2"
                ],
                "nodeType": "PragmaDirective",
                "src": "24:19:36"
            },
            {
                "absolutePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
                "file": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
                "id": 7821,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8013,
                "sourceUnit": 12123,
                "src": "87:62:36",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnTypes.sol",
                "file": "../utils/GsnTypes.sol",
                "id": 7822,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8013,
                "sourceUnit": 8493,
                "src": "151:31:36",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnEip712Library.sol",
                "file": "../utils/GsnEip712Library.sol",
                "id": 7823,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8013,
                "sourceUnit": 8465,
                "src": "183:39:36",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnUtils.sol",
                "file": "../utils/GsnUtils.sol",
                "id": 7824,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8013,
                "sourceUnit": 8573,
                "src": "223:31:36",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [],
                "contractDependencies": [],
                "contractKind": "contract",
                "fullyImplemented": true,
                "id": 8012,
                "linearizedBaseContracts": [
                    8012
                ],
                "name": "TestUtil",
                "nameLocation": "265:8:36",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "id": 7827,
                        "libraryName": {
                            "id": 7825,
                            "name": "ECDSA",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 12122,
                            "src": "286:5:36"
                        },
                        "nodeType": "UsingForDirective",
                        "src": "280:22:36",
                        "typeName": {
                            "id": 7826,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "296:5:36",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                            }
                        }
                    },
                    {
                        "id": 7830,
                        "libraryName": {
                            "id": 7828,
                            "name": "ECDSA",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 12122,
                            "src": "313:5:36"
                        },
                        "nodeType": "UsingForDirective",
                        "src": "307:24:36",
                        "typeName": {
                            "id": 7829,
                            "name": "bytes32",
                            "nodeType": "ElementaryTypeName",
                            "src": "323:7:36",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        }
                    },
                    {
                        "body": {
                            "id": 7838,
                            "nodeType": "Block",
                            "src": "404:59:36",
                            "statements": [
                                {
                                    "expression": {
                                        "expression": {
                                            "id": 7835,
                                            "name": "GsnEip712Library",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8464,
                                            "src": "421:16:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                "typeString": "type(library GsnEip712Library)"
                                            }
                                        },
                                        "id": 7836,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "RELAY_REQUEST_NAME",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 8097,
                                        "src": "421:35:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                        }
                                    },
                                    "functionReturnParameters": 7834,
                                    "id": 7837,
                                    "nodeType": "Return",
                                    "src": "414:42:36"
                                }
                            ]
                        },
                        "functionSelector": "37d899ce",
                        "id": 7839,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libRelayRequestName",
                        "nameLocation": "346:19:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7831,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "365:2:36"
                        },
                        "returnParameters": {
                            "id": 7834,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7833,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7839,
                                    "src": "389:13:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 7832,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "389:6:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "388:15:36"
                        },
                        "scope": 8012,
                        "src": "337:126:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7850,
                            "nodeType": "Block",
                            "src": "536:67:36",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "expression": {
                                                    "id": 7846,
                                                    "name": "GsnEip712Library",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8464,
                                                    "src": "560:16:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                        "typeString": "type(library GsnEip712Library)"
                                                    }
                                                },
                                                "id": 7847,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "RELAY_REQUEST_TYPE",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8117,
                                                "src": "560:35:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "id": 7845,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "553:6:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                                "typeString": "type(string storage pointer)"
                                            },
                                            "typeName": {
                                                "id": 7844,
                                                "name": "string",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "553:6:36",
                                                "typeDescriptions": {}
                                            }
                                        },
                                        "id": 7848,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "553:43:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                        }
                                    },
                                    "functionReturnParameters": 7843,
                                    "id": 7849,
                                    "nodeType": "Return",
                                    "src": "546:50:36"
                                }
                            ]
                        },
                        "functionSelector": "ae1c18e8",
                        "id": 7851,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libRelayRequestType",
                        "nameLocation": "478:19:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7840,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "497:2:36"
                        },
                        "returnParameters": {
                            "id": 7843,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7842,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7851,
                                    "src": "521:13:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 7841,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "521:6:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "520:15:36"
                        },
                        "scope": 8012,
                        "src": "469:134:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7859,
                            "nodeType": "Block",
                            "src": "674:63:36",
                            "statements": [
                                {
                                    "expression": {
                                        "expression": {
                                            "id": 7856,
                                            "name": "GsnEip712Library",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8464,
                                            "src": "691:16:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                "typeString": "type(library GsnEip712Library)"
                                            }
                                        },
                                        "id": 7857,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "RELAY_REQUEST_TYPEHASH",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 8127,
                                        "src": "691:39:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "functionReturnParameters": 7855,
                                    "id": 7858,
                                    "nodeType": "Return",
                                    "src": "684:46:36"
                                }
                            ]
                        },
                        "functionSelector": "44fa3ccf",
                        "id": 7860,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libRelayRequestTypeHash",
                        "nameLocation": "618:23:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7852,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "641:2:36"
                        },
                        "returnParameters": {
                            "id": 7855,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7854,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7860,
                                    "src": "665:7:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 7853,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "665:7:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "664:9:36"
                        },
                        "scope": 8012,
                        "src": "609:128:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7868,
                            "nodeType": "Block",
                            "src": "812:61:36",
                            "statements": [
                                {
                                    "expression": {
                                        "expression": {
                                            "id": 7865,
                                            "name": "GsnEip712Library",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8464,
                                            "src": "829:16:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                "typeString": "type(library GsnEip712Library)"
                                            }
                                        },
                                        "id": 7866,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "RELAY_REQUEST_SUFFIX",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 8107,
                                        "src": "829:37:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                        }
                                    },
                                    "functionReturnParameters": 7864,
                                    "id": 7867,
                                    "nodeType": "Return",
                                    "src": "822:44:36"
                                }
                            ]
                        },
                        "functionSelector": "d5de0678",
                        "id": 7869,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libRelayRequestSuffix",
                        "nameLocation": "752:21:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7861,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "773:2:36"
                        },
                        "returnParameters": {
                            "id": 7864,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7863,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7869,
                                    "src": "797:13:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 7862,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "797:6:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "796:15:36"
                        },
                        "scope": 8012,
                        "src": "743:130:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7885,
                            "nodeType": "Block",
                            "src": "1073:92:36",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "hexValue": "47534e2052656c61796564205472616e73616374696f6e",
                                                "id": 7880,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "1107:25:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                    "typeString": "literal_string \"GSN Relayed Transaction\""
                                                },
                                                "value": "GSN Relayed Transaction"
                                            },
                                            {
                                                "id": 7881,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7872,
                                                "src": "1134:12:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            },
                                            {
                                                "id": 7882,
                                                "name": "signature",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7874,
                                                "src": "1148:9:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                    "typeString": "literal_string \"GSN Relayed Transaction\""
                                                },
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            ],
                                            "expression": {
                                                "id": 7877,
                                                "name": "GsnEip712Library",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8464,
                                                "src": "1083:16:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                    "typeString": "type(library GsnEip712Library)"
                                                }
                                            },
                                            "id": 7879,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "verify",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8280,
                                            "src": "1083:23:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_struct$_RelayRequest_$8491_calldata_ptr_$_t_bytes_calldata_ptr_$returns$__$",
                                                "typeString": "function (string memory,struct GsnTypes.RelayRequest calldata,bytes calldata) view"
                                            }
                                        },
                                        "id": 7883,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1083:75:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 7884,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1083:75:36"
                                }
                            ]
                        },
                        "functionSelector": "b8e6f47a",
                        "id": 7886,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "callForwarderVerify",
                        "nameLocation": "938:19:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7875,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7872,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "998:12:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7886,
                                    "src": "967:43:36",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 7871,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 7870,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "967:21:36"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "967:21:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7874,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "1035:9:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7886,
                                    "src": "1020:24:36",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7873,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1020:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "957:93:36"
                        },
                        "returnParameters": {
                            "id": 7876,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1073:0:36"
                        },
                        "scope": 8012,
                        "src": "929:236:36",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "body": {
                            "id": 7936,
                            "nodeType": "Block",
                            "src": "1380:310:36",
                            "statements": [
                                {
                                    "assignments": [
                                        7899
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 7899,
                                            "mutability": "mutable",
                                            "name": "forwarderSuccess",
                                            "nameLocation": "1395:16:36",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 7936,
                                            "src": "1390:21:36",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            },
                                            "typeName": {
                                                "id": 7898,
                                                "name": "bool",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "1390:4:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 7900,
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "1390:21:36"
                                },
                                {
                                    "expression": {
                                        "id": 7911,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "components": [
                                                {
                                                    "id": 7901,
                                                    "name": "forwarderSuccess",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7899,
                                                    "src": "1422:16:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                    }
                                                },
                                                {
                                                    "id": 7902,
                                                    "name": "success",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7894,
                                                    "src": "1440:7:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                    }
                                                },
                                                {
                                                    "id": 7903,
                                                    "name": "ret",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7896,
                                                    "src": "1449:3:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                }
                                            ],
                                            "id": 7904,
                                            "isConstant": false,
                                            "isInlineArray": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": true,
                                            "nodeType": "TupleExpression",
                                            "src": "1421:32:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$_t_bool_$_t_bool_$_t_bytes_memory_ptr_$",
                                                "typeString": "tuple(bool,bool,bytes memory)"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "arguments": [
                                                {
                                                    "hexValue": "47534e2052656c61796564205472616e73616374696f6e",
                                                    "id": 7907,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "string",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "1481:25:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                        "typeString": "literal_string \"GSN Relayed Transaction\""
                                                    },
                                                    "value": "GSN Relayed Transaction"
                                                },
                                                {
                                                    "id": 7908,
                                                    "name": "relayRequest",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7889,
                                                    "src": "1508:12:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayRequest calldata"
                                                    }
                                                },
                                                {
                                                    "id": 7909,
                                                    "name": "signature",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7891,
                                                    "src": "1522:9:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                        "typeString": "literal_string \"GSN Relayed Transaction\""
                                                    },
                                                    {
                                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayRequest calldata"
                                                    },
                                                    {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                ],
                                                "expression": {
                                                    "id": 7905,
                                                    "name": "GsnEip712Library",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8464,
                                                    "src": "1456:16:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                        "typeString": "type(library GsnEip712Library)"
                                                    }
                                                },
                                                "id": 7906,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "execute",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8355,
                                                "src": "1456:24:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_struct$_RelayRequest_$8491_calldata_ptr_$_t_bytes_calldata_ptr_$returns$_t_bool_$_t_bool_$_t_bytes_memory_ptr_$",
                                                    "typeString": "function (string memory,struct GsnTypes.RelayRequest calldata,bytes calldata) returns (bool,bool,bytes memory)"
                                                }
                                            },
                                            "id": 7910,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "1456:76:36",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$_t_bool_$_t_bool_$_t_bytes_memory_ptr_$",
                                                "typeString": "tuple(bool,bool,bytes memory)"
                                            }
                                        },
                                        "src": "1421:111:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 7912,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1421:111:36"
                                },
                                {
                                    "condition": {
                                        "id": 7914,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "UnaryOperation",
                                        "operator": "!",
                                        "prefix": true,
                                        "src": "1546:17:36",
                                        "subExpression": {
                                            "id": 7913,
                                            "name": "forwarderSuccess",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7899,
                                            "src": "1547:16:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "id": 7922,
                                    "nodeType": "IfStatement",
                                    "src": "1542:76:36",
                                    "trueBody": {
                                        "id": 7921,
                                        "nodeType": "Block",
                                        "src": "1565:53:36",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "arguments": [
                                                        {
                                                            "id": 7918,
                                                            "name": "ret",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 7896,
                                                            "src": "1603:3:36",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                                "typeString": "bytes memory"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                                "typeString": "bytes memory"
                                                            }
                                                        ],
                                                        "expression": {
                                                            "id": 7915,
                                                            "name": "GsnUtils",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8572,
                                                            "src": "1579:8:36",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_type$_t_contract$_GsnUtils_$8572_$",
                                                                "typeString": "type(library GsnUtils)"
                                                            }
                                                        },
                                                        "id": 7917,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "revertWithData",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8571,
                                                        "src": "1579:23:36",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$",
                                                            "typeString": "function (bytes memory) pure"
                                                        }
                                                    },
                                                    "id": 7919,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "1579:28:36",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_tuple$__$",
                                                        "typeString": "tuple()"
                                                    }
                                                },
                                                "id": 7920,
                                                "nodeType": "ExpressionStatement",
                                                "src": "1579:28:36"
                                            }
                                        ]
                                    }
                                },
                                {
                                    "eventCall": {
                                        "arguments": [
                                            {
                                                "id": 7924,
                                                "name": "success",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7894,
                                                "src": "1639:7:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "condition": {
                                                    "commonType": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                    },
                                                    "id": 7927,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "leftExpression": {
                                                        "id": 7925,
                                                        "name": "success",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 7894,
                                                        "src": "1648:7:36",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bool",
                                                            "typeString": "bool"
                                                        }
                                                    },
                                                    "nodeType": "BinaryOperation",
                                                    "operator": "==",
                                                    "rightExpression": {
                                                        "hexValue": "66616c7365",
                                                        "id": 7926,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "kind": "bool",
                                                        "lValueRequested": false,
                                                        "nodeType": "Literal",
                                                        "src": "1659:5:36",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bool",
                                                            "typeString": "bool"
                                                        },
                                                        "value": "false"
                                                    },
                                                    "src": "1648:16:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                    }
                                                },
                                                "falseExpression": {
                                                    "arguments": [
                                                        {
                                                            "hexValue": "",
                                                            "id": 7931,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "string",
                                                            "lValueRequested": false,
                                                            "nodeType": "Literal",
                                                            "src": "1679:2:36",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                                                "typeString": "literal_string \"\""
                                                            },
                                                            "value": ""
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                                                "typeString": "literal_string \"\""
                                                            }
                                                        ],
                                                        "id": 7930,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "1673:5:36",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                                            "typeString": "type(bytes storage pointer)"
                                                        },
                                                        "typeName": {
                                                            "id": 7929,
                                                            "name": "bytes",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "1673:5:36",
                                                            "typeDescriptions": {}
                                                        }
                                                    },
                                                    "id": 7932,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "typeConversion",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "1673:9:36",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                },
                                                "id": 7933,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "Conditional",
                                                "src": "1648:34:36",
                                                "trueExpression": {
                                                    "id": 7928,
                                                    "name": "ret",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7896,
                                                    "src": "1667:3:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                },
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "id": 7923,
                                            "name": "Called",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7943,
                                            "src": "1632:6:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_event_nonpayable$_t_bool_$_t_bytes_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,bytes memory)"
                                            }
                                        },
                                        "id": 7934,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1632:51:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 7935,
                                    "nodeType": "EmitStatement",
                                    "src": "1627:56:36"
                                }
                            ]
                        },
                        "functionSelector": "ab469e0d",
                        "id": 7937,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "callForwarderVerifyAndCall",
                        "nameLocation": "1180:26:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7892,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7889,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "1247:12:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7937,
                                    "src": "1216:43:36",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 7888,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 7887,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "1216:21:36"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "1216:21:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7891,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "1284:9:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7937,
                                    "src": "1269:24:36",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7890,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1269:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1206:93:36"
                        },
                        "returnParameters": {
                            "id": 7897,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7894,
                                    "mutability": "mutable",
                                    "name": "success",
                                    "nameLocation": "1340:7:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7937,
                                    "src": "1335:12:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 7893,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1335:4:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7896,
                                    "mutability": "mutable",
                                    "name": "ret",
                                    "nameLocation": "1370:3:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7937,
                                    "src": "1357:16:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7895,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1357:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1325:54:36"
                        },
                        "scope": 8012,
                        "src": "1171:519:36",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "anonymous": false,
                        "id": 7943,
                        "name": "Called",
                        "nameLocation": "1702:6:36",
                        "nodeType": "EventDefinition",
                        "parameters": {
                            "id": 7942,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7939,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "success",
                                    "nameLocation": "1714:7:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7943,
                                    "src": "1709:12:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 7938,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1709:4:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7941,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "error",
                                    "nameLocation": "1729:5:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7943,
                                    "src": "1723:11:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7940,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1723:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1708:27:36"
                        },
                        "src": "1696:40:36"
                    },
                    {
                        "body": {
                            "id": 7966,
                            "nodeType": "Block",
                            "src": "1923:135:36",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 7959,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "components": [
                                                {
                                                    "id": 7953,
                                                    "name": "suffixData",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7951,
                                                    "src": "1934:10:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                }
                                            ],
                                            "id": 7954,
                                            "isConstant": false,
                                            "isInlineArray": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": true,
                                            "nodeType": "TupleExpression",
                                            "src": "1933:12:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "arguments": [
                                                {
                                                    "id": 7957,
                                                    "name": "relayRequest",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7946,
                                                    "src": "1978:12:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayRequest calldata"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayRequest calldata"
                                                    }
                                                ],
                                                "expression": {
                                                    "id": 7955,
                                                    "name": "GsnEip712Library",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8464,
                                                    "src": "1948:16:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                        "typeString": "type(library GsnEip712Library)"
                                                    }
                                                },
                                                "id": 7956,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "splitRequest",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8160,
                                                "src": "1948:29:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_internal_pure$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$_t_bytes_memory_ptr_$",
                                                    "typeString": "function (struct GsnTypes.RelayRequest calldata) pure returns (bytes memory)"
                                                }
                                            },
                                            "id": 7958,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "1948:43:36",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        },
                                        "src": "1933:58:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                        }
                                    },
                                    "id": 7960,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1933:58:36"
                                },
                                {
                                    "expression": {
                                        "id": 7964,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 7961,
                                            "name": "typeHash",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7949,
                                            "src": "2001:8:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "expression": {
                                                "id": 7962,
                                                "name": "GsnEip712Library",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8464,
                                                "src": "2012:16:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                    "typeString": "type(library GsnEip712Library)"
                                                }
                                            },
                                            "id": 7963,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "RELAY_REQUEST_TYPEHASH",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8127,
                                            "src": "2012:39:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                            }
                                        },
                                        "src": "2001:50:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "id": 7965,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2001:50:36"
                                }
                            ]
                        },
                        "functionSelector": "26be0f08",
                        "id": 7967,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "splitRequest",
                        "nameLocation": "1751:12:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7947,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7946,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "1804:12:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7967,
                                    "src": "1773:43:36",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 7945,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 7944,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "1773:21:36"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "1773:21:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1763:59:36"
                        },
                        "returnParameters": {
                            "id": 7952,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7949,
                                    "mutability": "mutable",
                                    "name": "typeHash",
                                    "nameLocation": "1875:8:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7967,
                                    "src": "1867:16:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 7948,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1867:7:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7951,
                                    "mutability": "mutable",
                                    "name": "suffixData",
                                    "nameLocation": "1906:10:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7967,
                                    "src": "1893:23:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7950,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1893:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1857:65:36"
                        },
                        "scope": 8012,
                        "src": "1742:316:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "body": {
                            "id": 7980,
                            "nodeType": "Block",
                            "src": "2141:94:36",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "hexValue": "47534e2052656c61796564205472616e73616374696f6e",
                                                "id": 7976,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2191:25:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                    "typeString": "literal_string \"GSN Relayed Transaction\""
                                                },
                                                "value": "GSN Relayed Transaction"
                                            },
                                            {
                                                "id": 7977,
                                                "name": "forwarder",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7969,
                                                "src": "2218:9:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                    "typeString": "literal_string \"GSN Relayed Transaction\""
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "expression": {
                                                "id": 7974,
                                                "name": "GsnEip712Library",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8464,
                                                "src": "2158:16:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                    "typeString": "type(library GsnEip712Library)"
                                                }
                                            },
                                            "id": 7975,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "domainSeparator",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8388,
                                            "src": "2158:32:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_address_$returns$_t_bytes32_$",
                                                "typeString": "function (string memory,address) view returns (bytes32)"
                                            }
                                        },
                                        "id": 7978,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2158:70:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "functionReturnParameters": 7973,
                                    "id": 7979,
                                    "nodeType": "Return",
                                    "src": "2151:77:36"
                                }
                            ]
                        },
                        "functionSelector": "f69cd375",
                        "id": 7981,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libDomainSeparator",
                        "nameLocation": "2073:18:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7970,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7969,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "2100:9:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7981,
                                    "src": "2092:17:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 7968,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2092:7:36",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2091:19:36"
                        },
                        "returnParameters": {
                            "id": 7973,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7972,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7981,
                                    "src": "2132:7:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 7971,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2132:7:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2131:9:36"
                        },
                        "scope": 8012,
                        "src": "2064:171:36",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7990,
                            "nodeType": "Block",
                            "src": "2296:53:36",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [],
                                        "expression": {
                                            "argumentTypes": [],
                                            "expression": {
                                                "id": 7986,
                                                "name": "GsnEip712Library",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8464,
                                                "src": "2313:16:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                    "typeString": "type(library GsnEip712Library)"
                                                }
                                            },
                                            "id": 7987,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "getChainID",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8395,
                                            "src": "2313:27:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                                "typeString": "function () view returns (uint256)"
                                            }
                                        },
                                        "id": 7988,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2313:29:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "functionReturnParameters": 7985,
                                    "id": 7989,
                                    "nodeType": "Return",
                                    "src": "2306:36:36"
                                }
                            ]
                        },
                        "functionSelector": "e2cc2576",
                        "id": 7991,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libGetChainID",
                        "nameLocation": "2250:13:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7982,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2263:2:36"
                        },
                        "returnParameters": {
                            "id": 7985,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7984,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7991,
                                    "src": "2287:7:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 7983,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2287:7:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2286:9:36"
                        },
                        "scope": 8012,
                        "src": "2241:108:36",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 8010,
                            "nodeType": "Block",
                            "src": "2452:82:36",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8007,
                                                "name": "signature",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7995,
                                                "src": "2517:9:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "expression": {
                                                "arguments": [],
                                                "expression": {
                                                    "argumentTypes": [],
                                                    "expression": {
                                                        "arguments": [
                                                            {
                                                                "id": 8002,
                                                                "name": "message",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 7993,
                                                                "src": "2475:7:36",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_string_memory_ptr",
                                                                    "typeString": "string memory"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_string_memory_ptr",
                                                                    "typeString": "string memory"
                                                                }
                                                            ],
                                                            "id": 8001,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "nodeType": "ElementaryTypeNameExpression",
                                                            "src": "2469:5:36",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                                                "typeString": "type(bytes storage pointer)"
                                                            },
                                                            "typeName": {
                                                                "id": 8000,
                                                                "name": "bytes",
                                                                "nodeType": "ElementaryTypeName",
                                                                "src": "2469:5:36",
                                                                "typeDescriptions": {}
                                                            }
                                                        },
                                                        "id": 8003,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "typeConversion",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "2469:14:36",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_memory_ptr",
                                                            "typeString": "bytes memory"
                                                        }
                                                    },
                                                    "id": 8004,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "toEthSignedMessageHash",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 12101,
                                                    "src": "2469:37:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$bound_to$_t_bytes_memory_ptr_$",
                                                        "typeString": "function (bytes memory) pure returns (bytes32)"
                                                    }
                                                },
                                                "id": 8005,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "2469:39:36",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                }
                                            },
                                            "id": 8006,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "recover",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 11871,
                                            "src": "2469:47:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$bound_to$_t_bytes32_$",
                                                "typeString": "function (bytes32,bytes memory) pure returns (address)"
                                            }
                                        },
                                        "id": 8008,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2469:58:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "functionReturnParameters": 7999,
                                    "id": 8009,
                                    "nodeType": "Return",
                                    "src": "2462:65:36"
                                }
                            ]
                        },
                        "functionSelector": "91827130",
                        "id": 8011,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_ecrecover",
                        "nameLocation": "2364:10:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7996,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7993,
                                    "mutability": "mutable",
                                    "name": "message",
                                    "nameLocation": "2389:7:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8011,
                                    "src": "2375:21:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 7992,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2375:6:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7995,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "2411:9:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8011,
                                    "src": "2398:22:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7994,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2398:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2374:47:36"
                        },
                        "returnParameters": {
                            "id": 7999,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7998,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8011,
                                    "src": "2443:7:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 7997,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2443:7:36",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2442:9:36"
                        },
                        "scope": 8012,
                        "src": "2355:179:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "public"
                    }
                ],
                "scope": 8013,
                "src": "256:2280:36",
                "usedErrors": []
            }
        ],
        "src": "0:2536:36"
    },
    "legacyAST": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/test/TestUtil.sol",
        "exportedSymbols": {
            "ECDSA": [
                12122
            ],
            "GsnEip712Library": [
                8464
            ],
            "GsnTypes": [
                8492
            ],
            "GsnUtils": [
                8572
            ],
            "IERC165": [
                12352
            ],
            "IERC2771Recipient": [
                5374
            ],
            "IForwarder": [
                5129
            ],
            "MinLibBytes": [
                8687
            ],
            "Strings": [
                11734
            ],
            "TestUtil": [
                8012
            ]
        },
        "id": 8013,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 7819,
                "literals": [
                    "solidity",
                    "^",
                    "0.8",
                    ".0"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:23:36"
            },
            {
                "id": 7820,
                "literals": [
                    "abicoder",
                    "v2"
                ],
                "nodeType": "PragmaDirective",
                "src": "24:19:36"
            },
            {
                "absolutePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
                "file": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
                "id": 7821,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8013,
                "sourceUnit": 12123,
                "src": "87:62:36",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnTypes.sol",
                "file": "../utils/GsnTypes.sol",
                "id": 7822,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8013,
                "sourceUnit": 8493,
                "src": "151:31:36",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnEip712Library.sol",
                "file": "../utils/GsnEip712Library.sol",
                "id": 7823,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8013,
                "sourceUnit": 8465,
                "src": "183:39:36",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/utils/GsnUtils.sol",
                "file": "../utils/GsnUtils.sol",
                "id": 7824,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 8013,
                "sourceUnit": 8573,
                "src": "223:31:36",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [],
                "contractDependencies": [],
                "contractKind": "contract",
                "fullyImplemented": true,
                "id": 8012,
                "linearizedBaseContracts": [
                    8012
                ],
                "name": "TestUtil",
                "nameLocation": "265:8:36",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "id": 7827,
                        "libraryName": {
                            "id": 7825,
                            "name": "ECDSA",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 12122,
                            "src": "286:5:36"
                        },
                        "nodeType": "UsingForDirective",
                        "src": "280:22:36",
                        "typeName": {
                            "id": 7826,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "296:5:36",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                            }
                        }
                    },
                    {
                        "id": 7830,
                        "libraryName": {
                            "id": 7828,
                            "name": "ECDSA",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 12122,
                            "src": "313:5:36"
                        },
                        "nodeType": "UsingForDirective",
                        "src": "307:24:36",
                        "typeName": {
                            "id": 7829,
                            "name": "bytes32",
                            "nodeType": "ElementaryTypeName",
                            "src": "323:7:36",
                            "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                            }
                        }
                    },
                    {
                        "body": {
                            "id": 7838,
                            "nodeType": "Block",
                            "src": "404:59:36",
                            "statements": [
                                {
                                    "expression": {
                                        "expression": {
                                            "id": 7835,
                                            "name": "GsnEip712Library",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8464,
                                            "src": "421:16:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                "typeString": "type(library GsnEip712Library)"
                                            }
                                        },
                                        "id": 7836,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "RELAY_REQUEST_NAME",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 8097,
                                        "src": "421:35:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                        }
                                    },
                                    "functionReturnParameters": 7834,
                                    "id": 7837,
                                    "nodeType": "Return",
                                    "src": "414:42:36"
                                }
                            ]
                        },
                        "functionSelector": "37d899ce",
                        "id": 7839,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libRelayRequestName",
                        "nameLocation": "346:19:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7831,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "365:2:36"
                        },
                        "returnParameters": {
                            "id": 7834,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7833,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7839,
                                    "src": "389:13:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 7832,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "389:6:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "388:15:36"
                        },
                        "scope": 8012,
                        "src": "337:126:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7850,
                            "nodeType": "Block",
                            "src": "536:67:36",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "expression": {
                                                    "id": 7846,
                                                    "name": "GsnEip712Library",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8464,
                                                    "src": "560:16:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                        "typeString": "type(library GsnEip712Library)"
                                                    }
                                                },
                                                "id": 7847,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "RELAY_REQUEST_TYPE",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8117,
                                                "src": "560:35:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "id": 7845,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "553:6:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                                "typeString": "type(string storage pointer)"
                                            },
                                            "typeName": {
                                                "id": 7844,
                                                "name": "string",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "553:6:36",
                                                "typeDescriptions": {}
                                            }
                                        },
                                        "id": 7848,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "553:43:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                        }
                                    },
                                    "functionReturnParameters": 7843,
                                    "id": 7849,
                                    "nodeType": "Return",
                                    "src": "546:50:36"
                                }
                            ]
                        },
                        "functionSelector": "ae1c18e8",
                        "id": 7851,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libRelayRequestType",
                        "nameLocation": "478:19:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7840,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "497:2:36"
                        },
                        "returnParameters": {
                            "id": 7843,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7842,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7851,
                                    "src": "521:13:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 7841,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "521:6:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "520:15:36"
                        },
                        "scope": 8012,
                        "src": "469:134:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7859,
                            "nodeType": "Block",
                            "src": "674:63:36",
                            "statements": [
                                {
                                    "expression": {
                                        "expression": {
                                            "id": 7856,
                                            "name": "GsnEip712Library",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8464,
                                            "src": "691:16:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                "typeString": "type(library GsnEip712Library)"
                                            }
                                        },
                                        "id": 7857,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "RELAY_REQUEST_TYPEHASH",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 8127,
                                        "src": "691:39:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "functionReturnParameters": 7855,
                                    "id": 7858,
                                    "nodeType": "Return",
                                    "src": "684:46:36"
                                }
                            ]
                        },
                        "functionSelector": "44fa3ccf",
                        "id": 7860,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libRelayRequestTypeHash",
                        "nameLocation": "618:23:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7852,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "641:2:36"
                        },
                        "returnParameters": {
                            "id": 7855,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7854,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7860,
                                    "src": "665:7:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 7853,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "665:7:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "664:9:36"
                        },
                        "scope": 8012,
                        "src": "609:128:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7868,
                            "nodeType": "Block",
                            "src": "812:61:36",
                            "statements": [
                                {
                                    "expression": {
                                        "expression": {
                                            "id": 7865,
                                            "name": "GsnEip712Library",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 8464,
                                            "src": "829:16:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                "typeString": "type(library GsnEip712Library)"
                                            }
                                        },
                                        "id": 7866,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "RELAY_REQUEST_SUFFIX",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 8107,
                                        "src": "829:37:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                        }
                                    },
                                    "functionReturnParameters": 7864,
                                    "id": 7867,
                                    "nodeType": "Return",
                                    "src": "822:44:36"
                                }
                            ]
                        },
                        "functionSelector": "d5de0678",
                        "id": 7869,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libRelayRequestSuffix",
                        "nameLocation": "752:21:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7861,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "773:2:36"
                        },
                        "returnParameters": {
                            "id": 7864,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7863,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7869,
                                    "src": "797:13:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 7862,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "797:6:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "796:15:36"
                        },
                        "scope": 8012,
                        "src": "743:130:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7885,
                            "nodeType": "Block",
                            "src": "1073:92:36",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "hexValue": "47534e2052656c61796564205472616e73616374696f6e",
                                                "id": 7880,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "1107:25:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                    "typeString": "literal_string \"GSN Relayed Transaction\""
                                                },
                                                "value": "GSN Relayed Transaction"
                                            },
                                            {
                                                "id": 7881,
                                                "name": "relayRequest",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7872,
                                                "src": "1134:12:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                }
                                            },
                                            {
                                                "id": 7882,
                                                "name": "signature",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7874,
                                                "src": "1148:9:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                    "typeString": "literal_string \"GSN Relayed Transaction\""
                                                },
                                                {
                                                    "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                    "typeString": "struct GsnTypes.RelayRequest calldata"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_calldata_ptr",
                                                    "typeString": "bytes calldata"
                                                }
                                            ],
                                            "expression": {
                                                "id": 7877,
                                                "name": "GsnEip712Library",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8464,
                                                "src": "1083:16:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                    "typeString": "type(library GsnEip712Library)"
                                                }
                                            },
                                            "id": 7879,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "verify",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8280,
                                            "src": "1083:23:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_struct$_RelayRequest_$8491_calldata_ptr_$_t_bytes_calldata_ptr_$returns$__$",
                                                "typeString": "function (string memory,struct GsnTypes.RelayRequest calldata,bytes calldata) view"
                                            }
                                        },
                                        "id": 7883,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1083:75:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 7884,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1083:75:36"
                                }
                            ]
                        },
                        "functionSelector": "b8e6f47a",
                        "id": 7886,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "callForwarderVerify",
                        "nameLocation": "938:19:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7875,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7872,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "998:12:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7886,
                                    "src": "967:43:36",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 7871,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 7870,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "967:21:36"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "967:21:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7874,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "1035:9:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7886,
                                    "src": "1020:24:36",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7873,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1020:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "957:93:36"
                        },
                        "returnParameters": {
                            "id": 7876,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "1073:0:36"
                        },
                        "scope": 8012,
                        "src": "929:236:36",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "body": {
                            "id": 7936,
                            "nodeType": "Block",
                            "src": "1380:310:36",
                            "statements": [
                                {
                                    "assignments": [
                                        7899
                                    ],
                                    "declarations": [
                                        {
                                            "constant": false,
                                            "id": 7899,
                                            "mutability": "mutable",
                                            "name": "forwarderSuccess",
                                            "nameLocation": "1395:16:36",
                                            "nodeType": "VariableDeclaration",
                                            "scope": 7936,
                                            "src": "1390:21:36",
                                            "stateVariable": false,
                                            "storageLocation": "default",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            },
                                            "typeName": {
                                                "id": 7898,
                                                "name": "bool",
                                                "nodeType": "ElementaryTypeName",
                                                "src": "1390:4:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            "visibility": "internal"
                                        }
                                    ],
                                    "id": 7900,
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "1390:21:36"
                                },
                                {
                                    "expression": {
                                        "id": 7911,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "components": [
                                                {
                                                    "id": 7901,
                                                    "name": "forwarderSuccess",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7899,
                                                    "src": "1422:16:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                    }
                                                },
                                                {
                                                    "id": 7902,
                                                    "name": "success",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7894,
                                                    "src": "1440:7:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                    }
                                                },
                                                {
                                                    "id": 7903,
                                                    "name": "ret",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7896,
                                                    "src": "1449:3:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                }
                                            ],
                                            "id": 7904,
                                            "isConstant": false,
                                            "isInlineArray": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": true,
                                            "nodeType": "TupleExpression",
                                            "src": "1421:32:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$_t_bool_$_t_bool_$_t_bytes_memory_ptr_$",
                                                "typeString": "tuple(bool,bool,bytes memory)"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "arguments": [
                                                {
                                                    "hexValue": "47534e2052656c61796564205472616e73616374696f6e",
                                                    "id": 7907,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "string",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "1481:25:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                        "typeString": "literal_string \"GSN Relayed Transaction\""
                                                    },
                                                    "value": "GSN Relayed Transaction"
                                                },
                                                {
                                                    "id": 7908,
                                                    "name": "relayRequest",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7889,
                                                    "src": "1508:12:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayRequest calldata"
                                                    }
                                                },
                                                {
                                                    "id": 7909,
                                                    "name": "signature",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7891,
                                                    "src": "1522:9:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                        "typeString": "literal_string \"GSN Relayed Transaction\""
                                                    },
                                                    {
                                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayRequest calldata"
                                                    },
                                                    {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                ],
                                                "expression": {
                                                    "id": 7905,
                                                    "name": "GsnEip712Library",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8464,
                                                    "src": "1456:16:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                        "typeString": "type(library GsnEip712Library)"
                                                    }
                                                },
                                                "id": 7906,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "execute",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8355,
                                                "src": "1456:24:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_struct$_RelayRequest_$8491_calldata_ptr_$_t_bytes_calldata_ptr_$returns$_t_bool_$_t_bool_$_t_bytes_memory_ptr_$",
                                                    "typeString": "function (string memory,struct GsnTypes.RelayRequest calldata,bytes calldata) returns (bool,bool,bytes memory)"
                                                }
                                            },
                                            "id": 7910,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "1456:76:36",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$_t_bool_$_t_bool_$_t_bytes_memory_ptr_$",
                                                "typeString": "tuple(bool,bool,bytes memory)"
                                            }
                                        },
                                        "src": "1421:111:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 7912,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1421:111:36"
                                },
                                {
                                    "condition": {
                                        "id": 7914,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "UnaryOperation",
                                        "operator": "!",
                                        "prefix": true,
                                        "src": "1546:17:36",
                                        "subExpression": {
                                            "id": 7913,
                                            "name": "forwarderSuccess",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7899,
                                            "src": "1547:16:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "id": 7922,
                                    "nodeType": "IfStatement",
                                    "src": "1542:76:36",
                                    "trueBody": {
                                        "id": 7921,
                                        "nodeType": "Block",
                                        "src": "1565:53:36",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "arguments": [
                                                        {
                                                            "id": 7918,
                                                            "name": "ret",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 7896,
                                                            "src": "1603:3:36",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                                "typeString": "bytes memory"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                                "typeString": "bytes memory"
                                                            }
                                                        ],
                                                        "expression": {
                                                            "id": 7915,
                                                            "name": "GsnUtils",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 8572,
                                                            "src": "1579:8:36",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_type$_t_contract$_GsnUtils_$8572_$",
                                                                "typeString": "type(library GsnUtils)"
                                                            }
                                                        },
                                                        "id": 7917,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "revertWithData",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 8571,
                                                        "src": "1579:23:36",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$__$",
                                                            "typeString": "function (bytes memory) pure"
                                                        }
                                                    },
                                                    "id": 7919,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "1579:28:36",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_tuple$__$",
                                                        "typeString": "tuple()"
                                                    }
                                                },
                                                "id": 7920,
                                                "nodeType": "ExpressionStatement",
                                                "src": "1579:28:36"
                                            }
                                        ]
                                    }
                                },
                                {
                                    "eventCall": {
                                        "arguments": [
                                            {
                                                "id": 7924,
                                                "name": "success",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7894,
                                                "src": "1639:7:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                }
                                            },
                                            {
                                                "condition": {
                                                    "commonType": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                    },
                                                    "id": 7927,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "leftExpression": {
                                                        "id": 7925,
                                                        "name": "success",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 7894,
                                                        "src": "1648:7:36",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bool",
                                                            "typeString": "bool"
                                                        }
                                                    },
                                                    "nodeType": "BinaryOperation",
                                                    "operator": "==",
                                                    "rightExpression": {
                                                        "hexValue": "66616c7365",
                                                        "id": 7926,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "kind": "bool",
                                                        "lValueRequested": false,
                                                        "nodeType": "Literal",
                                                        "src": "1659:5:36",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bool",
                                                            "typeString": "bool"
                                                        },
                                                        "value": "false"
                                                    },
                                                    "src": "1648:16:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bool",
                                                        "typeString": "bool"
                                                    }
                                                },
                                                "falseExpression": {
                                                    "arguments": [
                                                        {
                                                            "hexValue": "",
                                                            "id": 7931,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "kind": "string",
                                                            "lValueRequested": false,
                                                            "nodeType": "Literal",
                                                            "src": "1679:2:36",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                                                "typeString": "literal_string \"\""
                                                            },
                                                            "value": ""
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                                                "typeString": "literal_string \"\""
                                                            }
                                                        ],
                                                        "id": 7930,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "lValueRequested": false,
                                                        "nodeType": "ElementaryTypeNameExpression",
                                                        "src": "1673:5:36",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                                            "typeString": "type(bytes storage pointer)"
                                                        },
                                                        "typeName": {
                                                            "id": 7929,
                                                            "name": "bytes",
                                                            "nodeType": "ElementaryTypeName",
                                                            "src": "1673:5:36",
                                                            "typeDescriptions": {}
                                                        }
                                                    },
                                                    "id": 7932,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "typeConversion",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "1673:9:36",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                },
                                                "id": 7933,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "Conditional",
                                                "src": "1648:34:36",
                                                "trueExpression": {
                                                    "id": 7928,
                                                    "name": "ret",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7896,
                                                    "src": "1667:3:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                },
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bool",
                                                    "typeString": "bool"
                                                },
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "id": 7923,
                                            "name": "Called",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7943,
                                            "src": "1632:6:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_event_nonpayable$_t_bool_$_t_bytes_memory_ptr_$returns$__$",
                                                "typeString": "function (bool,bytes memory)"
                                            }
                                        },
                                        "id": 7934,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1632:51:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                        }
                                    },
                                    "id": 7935,
                                    "nodeType": "EmitStatement",
                                    "src": "1627:56:36"
                                }
                            ]
                        },
                        "functionSelector": "ab469e0d",
                        "id": 7937,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "callForwarderVerifyAndCall",
                        "nameLocation": "1180:26:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7892,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7889,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "1247:12:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7937,
                                    "src": "1216:43:36",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 7888,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 7887,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "1216:21:36"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "1216:21:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7891,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "1284:9:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7937,
                                    "src": "1269:24:36",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7890,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1269:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1206:93:36"
                        },
                        "returnParameters": {
                            "id": 7897,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7894,
                                    "mutability": "mutable",
                                    "name": "success",
                                    "nameLocation": "1340:7:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7937,
                                    "src": "1335:12:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 7893,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1335:4:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7896,
                                    "mutability": "mutable",
                                    "name": "ret",
                                    "nameLocation": "1370:3:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7937,
                                    "src": "1357:16:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7895,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1357:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1325:54:36"
                        },
                        "scope": 8012,
                        "src": "1171:519:36",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "anonymous": false,
                        "id": 7943,
                        "name": "Called",
                        "nameLocation": "1702:6:36",
                        "nodeType": "EventDefinition",
                        "parameters": {
                            "id": 7942,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7939,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "success",
                                    "nameLocation": "1714:7:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7943,
                                    "src": "1709:12:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                    },
                                    "typeName": {
                                        "id": 7938,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1709:4:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7941,
                                    "indexed": false,
                                    "mutability": "mutable",
                                    "name": "error",
                                    "nameLocation": "1729:5:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7943,
                                    "src": "1723:11:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7940,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1723:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1708:27:36"
                        },
                        "src": "1696:40:36"
                    },
                    {
                        "body": {
                            "id": 7966,
                            "nodeType": "Block",
                            "src": "1923:135:36",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 7959,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "components": [
                                                {
                                                    "id": 7953,
                                                    "name": "suffixData",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7951,
                                                    "src": "1934:10:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_memory_ptr",
                                                        "typeString": "bytes memory"
                                                    }
                                                }
                                            ],
                                            "id": 7954,
                                            "isConstant": false,
                                            "isInlineArray": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": true,
                                            "nodeType": "TupleExpression",
                                            "src": "1933:12:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "arguments": [
                                                {
                                                    "id": 7957,
                                                    "name": "relayRequest",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7946,
                                                    "src": "1978:12:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayRequest calldata"
                                                    }
                                                }
                                            ],
                                            "expression": {
                                                "argumentTypes": [
                                                    {
                                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                                        "typeString": "struct GsnTypes.RelayRequest calldata"
                                                    }
                                                ],
                                                "expression": {
                                                    "id": 7955,
                                                    "name": "GsnEip712Library",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 8464,
                                                    "src": "1948:16:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                        "typeString": "type(library GsnEip712Library)"
                                                    }
                                                },
                                                "id": 7956,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "splitRequest",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 8160,
                                                "src": "1948:29:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_function_internal_pure$_t_struct$_RelayRequest_$8491_calldata_ptr_$returns$_t_bytes_memory_ptr_$",
                                                    "typeString": "function (struct GsnTypes.RelayRequest calldata) pure returns (bytes memory)"
                                                }
                                            },
                                            "id": 7958,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "1948:43:36",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                            }
                                        },
                                        "src": "1933:58:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                        }
                                    },
                                    "id": 7960,
                                    "nodeType": "ExpressionStatement",
                                    "src": "1933:58:36"
                                },
                                {
                                    "expression": {
                                        "id": 7964,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 7961,
                                            "name": "typeHash",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7949,
                                            "src": "2001:8:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "expression": {
                                                "id": 7962,
                                                "name": "GsnEip712Library",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8464,
                                                "src": "2012:16:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                    "typeString": "type(library GsnEip712Library)"
                                                }
                                            },
                                            "id": 7963,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "RELAY_REQUEST_TYPEHASH",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8127,
                                            "src": "2012:39:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                            }
                                        },
                                        "src": "2001:50:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "id": 7965,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2001:50:36"
                                }
                            ]
                        },
                        "functionSelector": "26be0f08",
                        "id": 7967,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "splitRequest",
                        "nameLocation": "1751:12:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7947,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7946,
                                    "mutability": "mutable",
                                    "name": "relayRequest",
                                    "nameLocation": "1804:12:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7967,
                                    "src": "1773:43:36",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_RelayRequest_$8491_calldata_ptr",
                                        "typeString": "struct GsnTypes.RelayRequest"
                                    },
                                    "typeName": {
                                        "id": 7945,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 7944,
                                            "name": "GsnTypes.RelayRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 8491,
                                            "src": "1773:21:36"
                                        },
                                        "referencedDeclaration": 8491,
                                        "src": "1773:21:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_RelayRequest_$8491_storage_ptr",
                                            "typeString": "struct GsnTypes.RelayRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1763:59:36"
                        },
                        "returnParameters": {
                            "id": 7952,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7949,
                                    "mutability": "mutable",
                                    "name": "typeHash",
                                    "nameLocation": "1875:8:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7967,
                                    "src": "1867:16:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 7948,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1867:7:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7951,
                                    "mutability": "mutable",
                                    "name": "suffixData",
                                    "nameLocation": "1906:10:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7967,
                                    "src": "1893:23:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7950,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1893:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "1857:65:36"
                        },
                        "scope": 8012,
                        "src": "1742:316:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "body": {
                            "id": 7980,
                            "nodeType": "Block",
                            "src": "2141:94:36",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "hexValue": "47534e2052656c61796564205472616e73616374696f6e",
                                                "id": 7976,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "string",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2191:25:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                    "typeString": "literal_string \"GSN Relayed Transaction\""
                                                },
                                                "value": "GSN Relayed Transaction"
                                            },
                                            {
                                                "id": 7977,
                                                "name": "forwarder",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7969,
                                                "src": "2218:9:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_stringliteral_9647bda542dcf6621898cb1d03b22adb04c620d77e0bc6e67edb695f5f57777e",
                                                    "typeString": "literal_string \"GSN Relayed Transaction\""
                                                },
                                                {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            ],
                                            "expression": {
                                                "id": 7974,
                                                "name": "GsnEip712Library",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8464,
                                                "src": "2158:16:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                    "typeString": "type(library GsnEip712Library)"
                                                }
                                            },
                                            "id": 7975,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "domainSeparator",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8388,
                                            "src": "2158:32:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$_t_string_memory_ptr_$_t_address_$returns$_t_bytes32_$",
                                                "typeString": "function (string memory,address) view returns (bytes32)"
                                            }
                                        },
                                        "id": 7978,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2158:70:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "functionReturnParameters": 7973,
                                    "id": 7979,
                                    "nodeType": "Return",
                                    "src": "2151:77:36"
                                }
                            ]
                        },
                        "functionSelector": "f69cd375",
                        "id": 7981,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libDomainSeparator",
                        "nameLocation": "2073:18:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7970,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7969,
                                    "mutability": "mutable",
                                    "name": "forwarder",
                                    "nameLocation": "2100:9:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7981,
                                    "src": "2092:17:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 7968,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2092:7:36",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2091:19:36"
                        },
                        "returnParameters": {
                            "id": 7973,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7972,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7981,
                                    "src": "2132:7:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 7971,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2132:7:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2131:9:36"
                        },
                        "scope": 8012,
                        "src": "2064:171:36",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 7990,
                            "nodeType": "Block",
                            "src": "2296:53:36",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [],
                                        "expression": {
                                            "argumentTypes": [],
                                            "expression": {
                                                "id": 7986,
                                                "name": "GsnEip712Library",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8464,
                                                "src": "2313:16:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_type$_t_contract$_GsnEip712Library_$8464_$",
                                                    "typeString": "type(library GsnEip712Library)"
                                                }
                                            },
                                            "id": 7987,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "getChainID",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 8395,
                                            "src": "2313:27:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                                "typeString": "function () view returns (uint256)"
                                            }
                                        },
                                        "id": 7988,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2313:29:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "functionReturnParameters": 7985,
                                    "id": 7989,
                                    "nodeType": "Return",
                                    "src": "2306:36:36"
                                }
                            ]
                        },
                        "functionSelector": "e2cc2576",
                        "id": 7991,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "libGetChainID",
                        "nameLocation": "2250:13:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7982,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "2263:2:36"
                        },
                        "returnParameters": {
                            "id": 7985,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7984,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 7991,
                                    "src": "2287:7:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                    },
                                    "typeName": {
                                        "id": 7983,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2287:7:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2286:9:36"
                        },
                        "scope": 8012,
                        "src": "2241:108:36",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 8010,
                            "nodeType": "Block",
                            "src": "2452:82:36",
                            "statements": [
                                {
                                    "expression": {
                                        "arguments": [
                                            {
                                                "id": 8007,
                                                "name": "signature",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7995,
                                                "src": "2517:9:36",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            }
                                        ],
                                        "expression": {
                                            "argumentTypes": [
                                                {
                                                    "typeIdentifier": "t_bytes_memory_ptr",
                                                    "typeString": "bytes memory"
                                                }
                                            ],
                                            "expression": {
                                                "arguments": [],
                                                "expression": {
                                                    "argumentTypes": [],
                                                    "expression": {
                                                        "arguments": [
                                                            {
                                                                "id": 8002,
                                                                "name": "message",
                                                                "nodeType": "Identifier",
                                                                "overloadedDeclarations": [],
                                                                "referencedDeclaration": 7993,
                                                                "src": "2475:7:36",
                                                                "typeDescriptions": {
                                                                    "typeIdentifier": "t_string_memory_ptr",
                                                                    "typeString": "string memory"
                                                                }
                                                            }
                                                        ],
                                                        "expression": {
                                                            "argumentTypes": [
                                                                {
                                                                    "typeIdentifier": "t_string_memory_ptr",
                                                                    "typeString": "string memory"
                                                                }
                                                            ],
                                                            "id": 8001,
                                                            "isConstant": false,
                                                            "isLValue": false,
                                                            "isPure": true,
                                                            "lValueRequested": false,
                                                            "nodeType": "ElementaryTypeNameExpression",
                                                            "src": "2469:5:36",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                                                "typeString": "type(bytes storage pointer)"
                                                            },
                                                            "typeName": {
                                                                "id": 8000,
                                                                "name": "bytes",
                                                                "nodeType": "ElementaryTypeName",
                                                                "src": "2469:5:36",
                                                                "typeDescriptions": {}
                                                            }
                                                        },
                                                        "id": 8003,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "kind": "typeConversion",
                                                        "lValueRequested": false,
                                                        "names": [],
                                                        "nodeType": "FunctionCall",
                                                        "src": "2469:14:36",
                                                        "tryCall": false,
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_bytes_memory_ptr",
                                                            "typeString": "bytes memory"
                                                        }
                                                    },
                                                    "id": 8004,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "toEthSignedMessageHash",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 12101,
                                                    "src": "2469:37:36",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$bound_to$_t_bytes_memory_ptr_$",
                                                        "typeString": "function (bytes memory) pure returns (bytes32)"
                                                    }
                                                },
                                                "id": 8005,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "kind": "functionCall",
                                                "lValueRequested": false,
                                                "names": [],
                                                "nodeType": "FunctionCall",
                                                "src": "2469:39:36",
                                                "tryCall": false,
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                }
                                            },
                                            "id": 8006,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "recover",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 11871,
                                            "src": "2469:47:36",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$bound_to$_t_bytes32_$",
                                                "typeString": "function (bytes32,bytes memory) pure returns (address)"
                                            }
                                        },
                                        "id": 8008,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2469:58:36",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "functionReturnParameters": 7999,
                                    "id": 8009,
                                    "nodeType": "Return",
                                    "src": "2462:65:36"
                                }
                            ]
                        },
                        "functionSelector": "91827130",
                        "id": 8011,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_ecrecover",
                        "nameLocation": "2364:10:36",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 7996,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7993,
                                    "mutability": "mutable",
                                    "name": "message",
                                    "nameLocation": "2389:7:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8011,
                                    "src": "2375:21:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_string_memory_ptr",
                                        "typeString": "string"
                                    },
                                    "typeName": {
                                        "id": 7992,
                                        "name": "string",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2375:6:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_string_storage_ptr",
                                            "typeString": "string"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 7995,
                                    "mutability": "mutable",
                                    "name": "signature",
                                    "nameLocation": "2411:9:36",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8011,
                                    "src": "2398:22:36",
                                    "stateVariable": false,
                                    "storageLocation": "memory",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 7994,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2398:5:36",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2374:47:36"
                        },
                        "returnParameters": {
                            "id": 7999,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 7998,
                                    "mutability": "mutable",
                                    "name": "",
                                    "nameLocation": "-1:-1:-1",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 8011,
                                    "src": "2443:7:36",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 7997,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "2443:7:36",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "2442:9:36"
                        },
                        "scope": 8012,
                        "src": "2355:179:36",
                        "stateMutability": "pure",
                        "virtual": false,
                        "visibility": "public"
                    }
                ],
                "scope": 8013,
                "src": "256:2280:36",
                "usedErrors": []
            }
        ],
        "src": "0:2536:36"
    },
    "compiler": {
        "name": "solc",
        "version": "0.8.7+commit.e28d00a7.Emscripten.clang"
    },
    "networks": {},
    "schemaVersion": "3.1.0",
    "updatedAt": "2023-03-16T16:54:15.239Z",
    "devdoc": {
        "kind": "dev",
        "methods": {},
        "version": 1
    },
    "userdoc": {
        "kind": "user",
        "methods": {},
        "version": 1
    }
}
