{
  "fileName": "GSNRecipientERC20Fee.sol",
  "contractName": "GSNRecipientERC20Fee",
  "source": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\nimport \"./GSNRecipient.sol\";\nimport \"../math/SafeMath.sol\";\nimport \"../access/Ownable.sol\";\nimport \"../token/ERC20/SafeERC20.sol\";\nimport \"../token/ERC20/ERC20.sol\";\n\n/**\n * @dev A xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategy] that charges transaction fees in a special purpose ERC20\n * token, which we refer to as the gas payment token. The amount charged is exactly the amount of Ether charged to the\n * recipient. This means that the token is essentially pegged to the value of Ether.\n *\n * The distribution strategy of the gas payment token to users is not defined by this contract. It's a mintable token\n * whose only minter is the recipient, so the strategy must be implemented in a derived contract, making use of the\n * internal {_mint} function.\n */\ncontract GSNRecipientERC20Fee is GSNRecipient {\n    using SafeERC20 for __unstable__ERC20Owned;\n    using SafeMath for uint256;\n\n    enum GSNRecipientERC20FeeErrorCodes {\n        INSUFFICIENT_BALANCE\n    }\n\n    __unstable__ERC20Owned private _token;\n\n    /**\n     * @dev The arguments to the constructor are the details that the gas payment token will have: `name` and `symbol`. `decimals` is hard-coded to 18.\n     */\n    constructor(string memory name, string memory symbol) {\n        _token = new __unstable__ERC20Owned(name, symbol);\n    }\n\n    /**\n     * @dev Returns the gas payment token.\n     */\n    function token() public view returns (IERC20) {\n        return IERC20(_token);\n    }\n\n    /**\n     * @dev Internal function that mints the gas payment token. Derived contracts should expose this function in their public API, with proper access control mechanisms.\n     */\n    function _mint(address account, uint256 amount) internal virtual {\n        _token.mint(account, amount);\n    }\n\n    /**\n     * @dev Ensures that only users with enough gas payment token balance can have transactions relayed through the GSN.\n     */\n    function acceptRelayedCall(\n        address,\n        address from,\n        bytes memory,\n        uint256 transactionFee,\n        uint256 gasPrice,\n        uint256,\n        uint256,\n        bytes memory,\n        uint256 maxPossibleCharge\n    )\n        public\n        view\n        virtual\n        override\n        returns (uint256, bytes memory)\n    {\n        if (_token.balanceOf(from) < maxPossibleCharge) {\n            return _rejectRelayedCall(uint256(GSNRecipientERC20FeeErrorCodes.INSUFFICIENT_BALANCE));\n        }\n\n        return _approveRelayedCall(abi.encode(from, maxPossibleCharge, transactionFee, gasPrice));\n    }\n\n    /**\n     * @dev Implements the precharge to the user. The maximum possible charge (depending on gas limit, gas price, and\n     * fee) will be deducted from the user balance of gas payment token. Note that this is an overestimation of the\n     * actual charge, necessary because we cannot predict how much gas the execution will actually need. The remainder\n     * is returned to the user in {_postRelayedCall}.\n     */\n    function _preRelayedCall(bytes memory context) internal virtual override returns (bytes32) {\n        (address from, uint256 maxPossibleCharge) = abi.decode(context, (address, uint256));\n\n        // The maximum token charge is pre-charged from the user\n        _token.safeTransferFrom(from, address(this), maxPossibleCharge);\n    }\n\n    /**\n     * @dev Returns to the user the extra amount that was previously charged, once the actual execution cost is known.\n     */\n    function _postRelayedCall(bytes memory context, bool, uint256 actualCharge, bytes32) internal virtual override {\n        (address from, uint256 maxPossibleCharge, uint256 transactionFee, uint256 gasPrice) =\n            abi.decode(context, (address, uint256, uint256, uint256));\n\n        // actualCharge is an _estimated_ charge, which assumes postRelayedCall will use all available gas.\n        // This implementation's gas cost can be roughly estimated as 10k gas, for the two SSTORE operations in an\n        // ERC20 transfer.\n        uint256 overestimation = _computeCharge(_POST_RELAYED_CALL_MAX_GAS.sub(10000), gasPrice, transactionFee);\n        actualCharge = actualCharge.sub(overestimation);\n\n        // After the relayed call has been executed and the actual charge estimated, the excess pre-charge is returned\n        _token.safeTransfer(from, maxPossibleCharge.sub(actualCharge));\n    }\n}\n\n/**\n * @title __unstable__ERC20Owned\n * @dev An ERC20 token owned by another contract, which has minting permissions and can use transferFrom to receive\n * anyone's tokens. This contract is an internal helper for GSNRecipientERC20Fee, and should not be used\n * outside of this context.\n */\n// solhint-disable-next-line contract-name-camelcase\ncontract __unstable__ERC20Owned is ERC20, Ownable {\n    uint256 private constant _UINT256_MAX = 2**256 - 1;\n\n    constructor(string memory name, string memory symbol) ERC20(name, symbol) { }\n\n    // The owner (GSNRecipientERC20Fee) can mint tokens\n    function mint(address account, uint256 amount) public onlyOwner {\n        _mint(account, amount);\n    }\n\n    // The owner has 'infinite' allowance for all token holders\n    function allowance(address tokenOwner, address spender) public view override returns (uint256) {\n        if (spender == owner()) {\n            return _UINT256_MAX;\n        } else {\n            return super.allowance(tokenOwner, spender);\n        }\n    }\n\n    // Allowance for the owner cannot be changed (it is always 'infinite')\n    function _approve(address tokenOwner, address spender, uint256 value) internal override {\n        if (spender == owner()) {\n            return;\n        } else {\n            super._approve(tokenOwner, spender, value);\n        }\n    }\n\n    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {\n        if (recipient == owner()) {\n            _transfer(sender, recipient, amount);\n            return true;\n        } else {\n            return super.transferFrom(sender, recipient, amount);\n        }\n    }\n}\n",
  "sourcePath": "contracts/GSN/GSNRecipientERC20Fee.sol",
  "sourceMap": "830:3560:2:-:0;;;885:42:1;857:70;;;;;;;;;;;;;;;;;;;;1253:120:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1353:4;1359:6;1326:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1317:6;;:49;;;;;;;;;;;;;;;;;;1253:120;;830:3560;;;;;;;;;;:::o;:::-;;;;;;;",
  "deployedSourceMap": "830:3560:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1451:94:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5087:221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1967:624:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2699:227:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5945:287;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1438:84:2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1451:94:1;1503:7;1529:9;;;;;;;;;;;1522:16;;1451:94;:::o;5087:221::-;5166:7;5207:12;:10;:12::i;:::-;5193:26;;:10;:26;;;5185:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5277:24;5293:7;5277:15;:24::i;:::-;5270:31;;5087:221;;;:::o;1967:624:2:-;2288:7;2297:12;2354:17;2329:6;;;;;;;;;;;:16;;;2346:4;2329:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;2325:160;;;2394:80;2421:51;2413:60;;;;;;;;2394:18;:80::i;:::-;2387:87;;;;;;2325:160;2502:82;2533:4;2539:17;2558:14;2574:8;2522:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2502:19;:82::i;:::-;2495:89;;;;1967:624;;;;;;;;;;;;;:::o;2699:227:1:-;2747:13;2905:14;;;;;;;;;;;;;;;;;;;2699:227;:::o;5945:287::-;6103:12;:10;:12::i;:::-;6089:26;;:10;:26;;;6081:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6166:59;6183:7;6192;6201:12;6215:9;6166:16;:59::i;:::-;5945:287;;;;:::o;1438:84:2:-;1476:6;1508;;;;;;;;;;;1494:21;;1438:84;:::o;3020:330::-;3102:7;3122:12;3136:25;3176:7;3165:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3121:83;;;;3280:63;3304:4;3318;3325:17;3280:6;;;;;;;;;;;:23;;;;:63;;;;;;:::i;:::-;3020:330;;;;;:::o;7405:157:1:-;7475:7;7484:12;7541:9;1041:2;7516:34;7508:47;;;;;;;;;;;;;;;;7405:157;;;:::o;7120:154::-;7194:7;7203:12;984:1;7259:7;7227:40;;;;7120:154;;;:::o;3491:897:2:-;3613:12;3627:25;3654:22;3678:16;3721:7;3710:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3612:155;;;;;;;;4028:22;4053:79;4068:37;4099:5;1157:6:1;4068:30:2;;:37;;;;:::i;:::-;4107:8;4117:14;4053;:79::i;:::-;4028:104;;4157:32;4174:14;4157:12;:16;;:32;;;;:::i;:::-;4142:47;;4319:62;4339:4;4345:35;4367:12;4345:17;:21;;:35;;;;:::i;:::-;4319:6;;;;;;;;;;;:19;;;;:62;;;;;:::i;:::-;3491:897;;;;;;;;;:::o;877:203:90:-;977:96;997:5;1027:27;;;1056:4;1062:2;1066:5;1004:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;977:19;:96::i;:::-;877:203;;;;:::o;1321:134:17:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1398:50;;1321:134;;;;:::o;7720:340:1:-;7818:7;8050:3;8035:10;8029:3;:16;8017:8;8011:3;:14;:35;8010:43;;;;;;8003:50;;7720:340;;;;;:::o;696:175:90:-;778:86;798:5;828:23;;;853:2;857:5;805:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;778:19;:86::i;:::-;696:175;;;:::o;2959:751::-;3378:23;3404:69;3432:4;3404:69;;;;;;;;;;;;;;;;;3412:5;3404:27;;;;:69;;;;;:::i;:::-;3378:95;;3507:1;3487:10;:17;:21;3483:221;;;3627:10;3616:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3608:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3483:221;2959:751;;;:::o;1746:187:17:-;1832:7;1864:1;1859;:6;;1867:12;1851:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1890:9;1906:1;1902;:5;1890:17;;1925:1;1918:8;;;1746:187;;;;;:::o;3573:194:104:-;3676:12;3707:53;3730:6;3738:4;3744:1;3747:12;3707:22;:53::i;:::-;3700:60;;3573:194;;;;;:::o;4920:958::-;5050:12;5082:18;5093:6;5082:10;:18::i;:::-;5074:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5205:12;5219:23;5246:6;:11;;5266:8;5277:4;5246:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5204:78;;;;5296:7;5292:580;;;5326:10;5319:17;;;;;;5292:580;5457:1;5437:10;:17;:21;5433:429;;;5695:10;5689:17;5755:15;5742:10;5738:2;5734:19;5727:44;5644:145;5834:12;5827:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4920:958;;;;;;;:::o;718:413::-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol",
          "type": "string"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldRelayHub",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newRelayHub",
          "type": "address"
        }
      ],
      "name": "RelayHubChanged",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "transactionFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "gasPrice",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        },
        {
          "internalType": "uint256",
          "name": "maxPossibleCharge",
          "type": "uint256"
        }
      ],
      "name": "acceptRelayedCall",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getHubAddr",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "context",
          "type": "bytes"
        },
        {
          "internalType": "bool",
          "name": "success",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "actualCharge",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "preRetVal",
          "type": "bytes32"
        }
      ],
      "name": "postRelayedCall",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "context",
          "type": "bytes"
        }
      ],
      "name": "preRelayedCall",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "relayHubVersion",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "ast": {
    "absolutePath": "contracts/GSN/GSNRecipientERC20Fee.sol",
    "exportedSymbols": {
      "GSNRecipientERC20Fee": [
        593
      ],
      "__unstable__ERC20Owned": [
        721
      ]
    },
    "id": 722,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 377,
        "literals": [
          "solidity",
          "^",
          "0.7",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "33:23:2"
      },
      {
        "absolutePath": "contracts/GSN/GSNRecipient.sol",
        "file": "./GSNRecipient.sol",
        "id": 378,
        "nodeType": "ImportDirective",
        "scope": 722,
        "sourceUnit": 376,
        "src": "58:28:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/math/SafeMath.sol",
        "file": "../math/SafeMath.sol",
        "id": 379,
        "nodeType": "ImportDirective",
        "scope": 722,
        "sourceUnit": 2422,
        "src": "87:30:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/access/Ownable.sol",
        "file": "../access/Ownable.sol",
        "id": 380,
        "nodeType": "ImportDirective",
        "scope": 722,
        "sourceUnit": 1577,
        "src": "118:31:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/token/ERC20/SafeERC20.sol",
        "file": "../token/ERC20/SafeERC20.sol",
        "id": 381,
        "nodeType": "ImportDirective",
        "scope": 722,
        "sourceUnit": 9993,
        "src": "150:38:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/token/ERC20/ERC20.sol",
        "file": "../token/ERC20/ERC20.sol",
        "id": 382,
        "nodeType": "ImportDirective",
        "scope": 722,
        "sourceUnit": 9195,
        "src": "189:34:2",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 384,
              "name": "GSNRecipient",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 375,
              "src": "863:12:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_GSNRecipient_$375",
                "typeString": "contract GSNRecipient"
              }
            },
            "id": 385,
            "nodeType": "InheritanceSpecifier",
            "src": "863:12:2"
          }
        ],
        "contractDependencies": [
          22,
          375,
          721,
          1184
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 383,
          "nodeType": "StructuredDocumentation",
          "src": "225:604:2",
          "text": " @dev A xref:ROOT:gsn-strategies.adoc#gsn-strategies[GSN strategy] that charges transaction fees in a special purpose ERC20\n token, which we refer to as the gas payment token. The amount charged is exactly the amount of Ether charged to the\n recipient. This means that the token is essentially pegged to the value of Ether.\n The distribution strategy of the gas payment token to users is not defined by this contract. It's a mintable token\n whose only minter is the recipient, so the strategy must be implemented in a derived contract, making use of the\n internal {_mint} function."
        },
        "fullyImplemented": true,
        "id": 593,
        "linearizedBaseContracts": [
          593,
          375,
          22,
          1184
        ],
        "name": "GSNRecipientERC20Fee",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 388,
            "libraryName": {
              "contractScope": null,
              "id": 386,
              "name": "SafeERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 9992,
              "src": "888:9:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeERC20_$9992",
                "typeString": "library SafeERC20"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "882:43:2",
            "typeName": {
              "contractScope": null,
              "id": 387,
              "name": "__unstable__ERC20Owned",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 721,
              "src": "902:22:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                "typeString": "contract __unstable__ERC20Owned"
              }
            }
          },
          {
            "id": 391,
            "libraryName": {
              "contractScope": null,
              "id": 389,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2421,
              "src": "936:8:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$2421",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "930:27:2",
            "typeName": {
              "id": 390,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "949:7:2",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "canonicalName": "GSNRecipientERC20Fee.GSNRecipientERC20FeeErrorCodes",
            "id": 393,
            "members": [
              {
                "id": 392,
                "name": "INSUFFICIENT_BALANCE",
                "nodeType": "EnumValue",
                "src": "1009:20:2"
              }
            ],
            "name": "GSNRecipientERC20FeeErrorCodes",
            "nodeType": "EnumDefinition",
            "src": "963:72:2"
          },
          {
            "constant": false,
            "id": 395,
            "mutability": "mutable",
            "name": "_token",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 593,
            "src": "1041:37:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
              "typeString": "contract __unstable__ERC20Owned"
            },
            "typeName": {
              "contractScope": null,
              "id": 394,
              "name": "__unstable__ERC20Owned",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 721,
              "src": "1041:22:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                "typeString": "contract __unstable__ERC20Owned"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 411,
              "nodeType": "Block",
              "src": "1307:66:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 409,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 403,
                      "name": "_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 395,
                      "src": "1317:6:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                        "typeString": "contract __unstable__ERC20Owned"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 406,
                          "name": "name",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 398,
                          "src": "1353:4:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 407,
                          "name": "symbol",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 400,
                          "src": "1359:6:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          },
                          {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        ],
                        "id": 405,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "NewExpression",
                        "src": "1326:26:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_creation_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_contract$___unstable__ERC20Owned_$721_$",
                          "typeString": "function (string memory,string memory) returns (contract __unstable__ERC20Owned)"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 404,
                          "name": "__unstable__ERC20Owned",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 721,
                          "src": "1330:22:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                            "typeString": "contract __unstable__ERC20Owned"
                          }
                        }
                      },
                      "id": 408,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1326:40:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                        "typeString": "contract __unstable__ERC20Owned"
                      }
                    },
                    "src": "1317:49:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                      "typeString": "contract __unstable__ERC20Owned"
                    }
                  },
                  "id": 410,
                  "nodeType": "ExpressionStatement",
                  "src": "1317:49:2"
                }
              ]
            },
            "documentation": {
              "id": 396,
              "nodeType": "StructuredDocumentation",
              "src": "1085:163:2",
              "text": " @dev The arguments to the constructor are the details that the gas payment token will have: `name` and `symbol`. `decimals` is hard-coded to 18."
            },
            "id": 412,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 401,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 398,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 412,
                  "src": "1265:18:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 397,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1265:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 400,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 412,
                  "src": "1285:20:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 399,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1285:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1264:42:2"
            },
            "returnParameters": {
              "id": 402,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1307:0:2"
            },
            "scope": 593,
            "src": "1253:120:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 422,
              "nodeType": "Block",
              "src": "1484:38:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 419,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 395,
                        "src": "1508:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                          "typeString": "contract __unstable__ERC20Owned"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                          "typeString": "contract __unstable__ERC20Owned"
                        }
                      ],
                      "id": 418,
                      "name": "IERC20",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 9779,
                      "src": "1501:6:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_IERC20_$9779_$",
                        "typeString": "type(contract IERC20)"
                      }
                    },
                    "id": 420,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1501:14:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$9779",
                      "typeString": "contract IERC20"
                    }
                  },
                  "functionReturnParameters": 417,
                  "id": 421,
                  "nodeType": "Return",
                  "src": "1494:21:2"
                }
              ]
            },
            "documentation": {
              "id": 413,
              "nodeType": "StructuredDocumentation",
              "src": "1379:54:2",
              "text": " @dev Returns the gas payment token."
            },
            "functionSelector": "fc0c546a",
            "id": 423,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "token",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 414,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1452:2:2"
            },
            "returnParameters": {
              "id": 417,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 416,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 423,
                  "src": "1476:6:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$9779",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 415,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9779,
                    "src": "1476:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$9779",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1475:8:2"
            },
            "scope": 593,
            "src": "1438:84:2",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 438,
              "nodeType": "Block",
              "src": "1779:45:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 434,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 426,
                        "src": "1801:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 435,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 428,
                        "src": "1810:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 431,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 395,
                        "src": "1789:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                          "typeString": "contract __unstable__ERC20Owned"
                        }
                      },
                      "id": 433,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "mint",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 632,
                      "src": "1789:11:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256) external"
                      }
                    },
                    "id": 436,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1789:28:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 437,
                  "nodeType": "ExpressionStatement",
                  "src": "1789:28:2"
                }
              ]
            },
            "documentation": {
              "id": 424,
              "nodeType": "StructuredDocumentation",
              "src": "1528:181:2",
              "text": " @dev Internal function that mints the gas payment token. Derived contracts should expose this function in their public API, with proper access control mechanisms."
            },
            "id": 439,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_mint",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 429,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 426,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 439,
                  "src": "1729:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 425,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1729:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 428,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 439,
                  "src": "1746:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 427,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1746:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1728:33:2"
            },
            "returnParameters": {
              "id": 430,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1779:0:2"
            },
            "scope": 593,
            "src": "1714:110:2",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              1163
            ],
            "body": {
              "id": 492,
              "nodeType": "Block",
              "src": "2315:276:2",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 471,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 468,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 444,
                          "src": "2346:4:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 466,
                          "name": "_token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 395,
                          "src": "2329:6:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                            "typeString": "contract __unstable__ERC20Owned"
                          }
                        },
                        "id": 467,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 8794,
                        "src": "2329:16:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 469,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "2329:22:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 470,
                      "name": "maxPossibleCharge",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 458,
                      "src": "2354:17:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2329:42:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 481,
                  "nodeType": "IfStatement",
                  "src": "2325:160:2",
                  "trueBody": {
                    "id": 480,
                    "nodeType": "Block",
                    "src": "2373:112:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 475,
                                    "name": "GSNRecipientERC20FeeErrorCodes",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 393,
                                    "src": "2421:30:2",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_enum$_GSNRecipientERC20FeeErrorCodes_$393_$",
                                      "typeString": "type(enum GSNRecipientERC20Fee.GSNRecipientERC20FeeErrorCodes)"
                                    }
                                  },
                                  "id": 476,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "memberName": "INSUFFICIENT_BALANCE",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2421:51:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_enum$_GSNRecipientERC20FeeErrorCodes_$393",
                                    "typeString": "enum GSNRecipientERC20Fee.GSNRecipientERC20FeeErrorCodes"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_enum$_GSNRecipientERC20FeeErrorCodes_$393",
                                    "typeString": "enum GSNRecipientERC20Fee.GSNRecipientERC20FeeErrorCodes"
                                  }
                                ],
                                "id": 474,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2413:7:2",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint256_$",
                                  "typeString": "type(uint256)"
                                },
                                "typeName": {
                                  "id": 473,
                                  "name": "uint256",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2413:7:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 477,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2413:60:2",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 472,
                            "name": "_rejectRelayedCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 286,
                            "src": "2394:18:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$_t_bytes_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (uint256,bytes memory)"
                            }
                          },
                          "id": 478,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2394:80:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(uint256,bytes memory)"
                          }
                        },
                        "functionReturnParameters": 465,
                        "id": 479,
                        "nodeType": "Return",
                        "src": "2387:87:2"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 485,
                            "name": "from",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 444,
                            "src": "2533:4:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 486,
                            "name": "maxPossibleCharge",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 458,
                            "src": "2539:17:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 487,
                            "name": "transactionFee",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 448,
                            "src": "2558:14:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 488,
                            "name": "gasPrice",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 450,
                            "src": "2574:8:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 483,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -1,
                            "src": "2522:3:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 484,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encode",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "2522:10:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function () pure returns (bytes memory)"
                          }
                        },
                        "id": 489,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2522:61:2",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 482,
                      "name": "_approveRelayedCall",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        254,
                        269
                      ],
                      "referencedDeclaration": 269,
                      "src": "2502:19:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_uint256_$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes memory) pure returns (uint256,bytes memory)"
                      }
                    },
                    "id": 490,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2502:82:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes_memory_ptr_$",
                      "typeString": "tuple(uint256,bytes memory)"
                    }
                  },
                  "functionReturnParameters": 465,
                  "id": 491,
                  "nodeType": "Return",
                  "src": "2495:89:2"
                }
              ]
            },
            "documentation": {
              "id": 440,
              "nodeType": "StructuredDocumentation",
              "src": "1830:132:2",
              "text": " @dev Ensures that only users with enough gas payment token balance can have transactions relayed through the GSN."
            },
            "functionSelector": "83947ea0",
            "id": 493,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "acceptRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 460,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2262:8:2"
            },
            "parameters": {
              "id": 459,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 442,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 493,
                  "src": "2003:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 441,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2003:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 444,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 493,
                  "src": "2020:12:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 443,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2020:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 446,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 493,
                  "src": "2042:12:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 445,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2042:5:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 448,
                  "mutability": "mutable",
                  "name": "transactionFee",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 493,
                  "src": "2064:22:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 447,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2064:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 450,
                  "mutability": "mutable",
                  "name": "gasPrice",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 493,
                  "src": "2096:16:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 449,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2096:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 452,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 493,
                  "src": "2122:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 451,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2122:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 454,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 493,
                  "src": "2139:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 453,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2139:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 456,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 493,
                  "src": "2156:12:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 455,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2156:5:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 458,
                  "mutability": "mutable",
                  "name": "maxPossibleCharge",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 493,
                  "src": "2178:25:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 457,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2178:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1993:216:2"
            },
            "returnParameters": {
              "id": 465,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 462,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 493,
                  "src": "2288:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 461,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2288:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 464,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 493,
                  "src": "2297:12:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 463,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2297:5:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2287:23:2"
            },
            "scope": 593,
            "src": "1967:624:2",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              199
            ],
            "body": {
              "id": 527,
              "nodeType": "Block",
              "src": "3111:239:2",
              "statements": [
                {
                  "assignments": [
                    503,
                    505
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 503,
                      "mutability": "mutable",
                      "name": "from",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 527,
                      "src": "3122:12:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 502,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "3122:7:2",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 505,
                      "mutability": "mutable",
                      "name": "maxPossibleCharge",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 527,
                      "src": "3136:25:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 504,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3136:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 515,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 508,
                        "name": "context",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 496,
                        "src": "3176:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "id": 510,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3186:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 509,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "3186:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 512,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3195:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 511,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3195:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          }
                        ],
                        "id": 513,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "3185:18:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$",
                          "typeString": "tuple(type(address),type(uint256))"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$",
                          "typeString": "tuple(type(address),type(uint256))"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 506,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -1,
                        "src": "3165:3:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 507,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "decode",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3165:10:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                        "typeString": "function () pure"
                      }
                    },
                    "id": 514,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3165:39:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_payable_$_t_uint256_$",
                      "typeString": "tuple(address payable,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3121:83:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 519,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 503,
                        "src": "3304:4:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 522,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "3318:4:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_GSNRecipientERC20Fee_$593",
                              "typeString": "contract GSNRecipientERC20Fee"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_GSNRecipientERC20Fee_$593",
                              "typeString": "contract GSNRecipientERC20Fee"
                            }
                          ],
                          "id": 521,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3310:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 520,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "3310:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 523,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3310:13:2",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 524,
                        "name": "maxPossibleCharge",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 505,
                        "src": "3325:17:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 516,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 395,
                        "src": "3280:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                          "typeString": "contract __unstable__ERC20Owned"
                        }
                      },
                      "id": 518,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 9838,
                      "src": "3280:23:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$9779_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$9779_$",
                        "typeString": "function (contract IERC20,address,address,uint256)"
                      }
                    },
                    "id": 525,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3280:63:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 526,
                  "nodeType": "ExpressionStatement",
                  "src": "3280:63:2"
                }
              ]
            },
            "documentation": {
              "id": 494,
              "nodeType": "StructuredDocumentation",
              "src": "2597:418:2",
              "text": " @dev Implements the precharge to the user. The maximum possible charge (depending on gas limit, gas price, and\n fee) will be deducted from the user balance of gas payment token. Note that this is an overestimation of the\n actual charge, necessary because we cannot predict how much gas the execution will actually need. The remainder\n is returned to the user in {_postRelayedCall}."
            },
            "id": 528,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_preRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 498,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3084:8:2"
            },
            "parameters": {
              "id": 497,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 496,
                  "mutability": "mutable",
                  "name": "context",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 528,
                  "src": "3045:20:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 495,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "3045:5:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3044:22:2"
            },
            "returnParameters": {
              "id": 501,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 500,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 528,
                  "src": "3102:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 499,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3102:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3101:9:2"
            },
            "scope": 593,
            "src": "3020:330:2",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              241
            ],
            "body": {
              "id": 591,
              "nodeType": "Block",
              "src": "3602:786:2",
              "statements": [
                {
                  "assignments": [
                    542,
                    544,
                    546,
                    548
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 542,
                      "mutability": "mutable",
                      "name": "from",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 591,
                      "src": "3613:12:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 541,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "3613:7:2",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 544,
                      "mutability": "mutable",
                      "name": "maxPossibleCharge",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 591,
                      "src": "3627:25:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 543,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3627:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 546,
                      "mutability": "mutable",
                      "name": "transactionFee",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 591,
                      "src": "3654:22:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 545,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3654:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 548,
                      "mutability": "mutable",
                      "name": "gasPrice",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 591,
                      "src": "3678:16:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 547,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "3678:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 562,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 551,
                        "name": "context",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 531,
                        "src": "3721:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "components": [
                          {
                            "argumentTypes": null,
                            "id": 553,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3731:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 552,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "3731:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 555,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3740:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 554,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3740:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 557,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3749:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 556,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3749:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 559,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3758:7:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 558,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3758:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          }
                        ],
                        "id": 560,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "3730:36:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$",
                          "typeString": "tuple(type(address),type(uint256),type(uint256),type(uint256))"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        },
                        {
                          "typeIdentifier": "t_tuple$_t_type$_t_address_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$_t_type$_t_uint256_$_$",
                          "typeString": "tuple(type(address),type(uint256),type(uint256),type(uint256))"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 549,
                        "name": "abi",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -1,
                        "src": "3710:3:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_abi",
                          "typeString": "abi"
                        }
                      },
                      "id": 550,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "decode",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "3710:10:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                        "typeString": "function () pure"
                      }
                    },
                    "id": 561,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3710:57:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_payable_$_t_uint256_$_t_uint256_$_t_uint256_$",
                      "typeString": "tuple(address payable,uint256,uint256,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "3612:155:2"
                },
                {
                  "assignments": [
                    564
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 564,
                      "mutability": "mutable",
                      "name": "overestimation",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 591,
                      "src": "4028:22:2",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 563,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4028:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 573,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "hexValue": "3130303030",
                            "id": 568,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4099:5:2",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_10000_by_1",
                              "typeString": "int_const 10000"
                            },
                            "value": "10000"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_10000_by_1",
                              "typeString": "int_const 10000"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 566,
                            "name": "_POST_RELAYED_CALL_MAX_GAS",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 44,
                            "src": "4068:26:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 567,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sub",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 2271,
                          "src": "4068:30:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                          }
                        },
                        "id": 569,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4068:37:2",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 570,
                        "name": "gasPrice",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 548,
                        "src": "4107:8:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 571,
                        "name": "transactionFee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 546,
                        "src": "4117:14:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 565,
                      "name": "_computeCharge",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 310,
                      "src": "4053:14:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 572,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4053:79:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4028:104:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 579,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 574,
                      "name": "actualCharge",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 535,
                      "src": "4142:12:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 577,
                          "name": "overestimation",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 564,
                          "src": "4174:14:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 575,
                          "name": "actualCharge",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 535,
                          "src": "4157:12:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 576,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sub",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2271,
                        "src": "4157:16:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 578,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4157:32:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4142:47:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 580,
                  "nodeType": "ExpressionStatement",
                  "src": "4142:47:2"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 584,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 542,
                        "src": "4339:4:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 587,
                            "name": "actualCharge",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 535,
                            "src": "4367:12:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 585,
                            "name": "maxPossibleCharge",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 544,
                            "src": "4345:17:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 586,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sub",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 2271,
                          "src": "4345:21:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                          }
                        },
                        "id": 588,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4345:35:2",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 581,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 395,
                        "src": "4319:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$___unstable__ERC20Owned_$721",
                          "typeString": "contract __unstable__ERC20Owned"
                        }
                      },
                      "id": 583,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 9813,
                      "src": "4319:19:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$9779_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$9779_$",
                        "typeString": "function (contract IERC20,address,uint256)"
                      }
                    },
                    "id": 589,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4319:62:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 590,
                  "nodeType": "ExpressionStatement",
                  "src": "4319:62:2"
                }
              ]
            },
            "documentation": {
              "id": 529,
              "nodeType": "StructuredDocumentation",
              "src": "3356:130:2",
              "text": " @dev Returns to the user the extra amount that was previously charged, once the actual execution cost is known."
            },
            "id": 592,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_postRelayedCall",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 539,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3593:8:2"
            },
            "parameters": {
              "id": 538,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 531,
                  "mutability": "mutable",
                  "name": "context",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 592,
                  "src": "3517:20:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 530,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "3517:5:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 533,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 592,
                  "src": "3539:4:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 532,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3539:4:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 535,
                  "mutability": "mutable",
                  "name": "actualCharge",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 592,
                  "src": "3545:20:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 534,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3545:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 537,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 592,
                  "src": "3567:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 536,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "3567:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3516:59:2"
            },
            "returnParameters": {
              "id": 540,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3602:0:2"
            },
            "scope": 593,
            "src": "3491:897:2",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "internal"
          }
        ],
        "scope": 722,
        "src": "830:3560:2"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 595,
              "name": "ERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 9194,
              "src": "4770:5:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ERC20_$9194",
                "typeString": "contract ERC20"
              }
            },
            "id": 596,
            "nodeType": "InheritanceSpecifier",
            "src": "4770:5:2"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 597,
              "name": "Ownable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1576,
              "src": "4777:7:2",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Ownable_$1576",
                "typeString": "contract Ownable"
              }
            },
            "id": 598,
            "nodeType": "InheritanceSpecifier",
            "src": "4777:7:2"
          }
        ],
        "contractDependencies": [
          22,
          1576,
          9194,
          9779
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 594,
          "nodeType": "StructuredDocumentation",
          "src": "4392:289:2",
          "text": " @title __unstable__ERC20Owned\n @dev An ERC20 token owned by another contract, which has minting permissions and can use transferFrom to receive\n anyone's tokens. This contract is an internal helper for GSNRecipientERC20Fee, and should not be used\n outside of this context."
        },
        "fullyImplemented": true,
        "id": 721,
        "linearizedBaseContracts": [
          721,
          1576,
          9194,
          9779,
          22
        ],
        "name": "__unstable__ERC20Owned",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": true,
            "id": 605,
            "mutability": "constant",
            "name": "_UINT256_MAX",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 721,
            "src": "4791:50:2",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 599,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "4791:7:2",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "argumentTypes": null,
              "commonType": {
                "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
                "typeString": "int_const 1157...(70 digits omitted)...9935"
              },
              "id": 604,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "lValueRequested": false,
              "leftExpression": {
                "argumentTypes": null,
                "commonType": {
                  "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
                  "typeString": "int_const 1157...(70 digits omitted)...9936"
                },
                "id": 602,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "lValueRequested": false,
                "leftExpression": {
                  "argumentTypes": null,
                  "hexValue": "32",
                  "id": 600,
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "kind": "number",
                  "lValueRequested": false,
                  "nodeType": "Literal",
                  "src": "4831:1:2",
                  "subdenomination": null,
                  "typeDescriptions": {
                    "typeIdentifier": "t_rational_2_by_1",
                    "typeString": "int_const 2"
                  },
                  "value": "2"
                },
                "nodeType": "BinaryOperation",
                "operator": "**",
                "rightExpression": {
                  "argumentTypes": null,
                  "hexValue": "323536",
                  "id": 601,
                  "isConstant": false,
                  "isLValue": false,
                  "isPure": true,
                  "kind": "number",
                  "lValueRequested": false,
                  "nodeType": "Literal",
                  "src": "4834:3:2",
                  "subdenomination": null,
                  "typeDescriptions": {
                    "typeIdentifier": "t_rational_256_by_1",
                    "typeString": "int_const 256"
                  },
                  "value": "256"
                },
                "src": "4831:6:2",
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639936_by_1",
                  "typeString": "int_const 1157...(70 digits omitted)...9936"
                }
              },
              "nodeType": "BinaryOperation",
              "operator": "-",
              "rightExpression": {
                "argumentTypes": null,
                "hexValue": "31",
                "id": 603,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "4840:1:2",
                "subdenomination": null,
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_1_by_1",
                  "typeString": "int_const 1"
                },
                "value": "1"
              },
              "src": "4831:10:2",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1",
                "typeString": "int_const 1157...(70 digits omitted)...9935"
              }
            },
            "visibility": "private"
          },
          {
            "body": {
              "id": 616,
              "nodeType": "Block",
              "src": "4922:3:2",
              "statements": []
            },
            "documentation": null,
            "id": 617,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "id": 612,
                    "name": "name",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 607,
                    "src": "4908:4:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 613,
                    "name": "symbol",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 609,
                    "src": "4914:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  }
                ],
                "id": 614,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 611,
                  "name": "ERC20",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 9194,
                  "src": "4902:5:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_ERC20_$9194_$",
                    "typeString": "type(contract ERC20)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "4902:19:2"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 610,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 607,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 617,
                  "src": "4860:18:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 606,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "4860:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 609,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 617,
                  "src": "4880:20:2",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 608,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "4880:6:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4859:42:2"
            },
            "returnParameters": {
              "id": 615,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4922:0:2"
            },
            "scope": 721,
            "src": "4848:77:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 631,
              "nodeType": "Block",
              "src": "5051:39:2",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 627,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 619,
                        "src": "5067:7:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 628,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 621,
                        "src": "5076:6:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 626,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 9070,
                      "src": "5061:5:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 629,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5061:22:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 630,
                  "nodeType": "ExpressionStatement",
                  "src": "5061:22:2"
                }
              ]
            },
            "documentation": null,
            "functionSelector": "40c10f19",
            "id": 632,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 624,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 623,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1525,
                  "src": "5041:9:2",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "5041:9:2"
              }
            ],
            "name": "mint",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 622,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 619,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 632,
                  "src": "5001:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 618,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5001:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 621,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 632,
                  "src": "5018:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 620,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5018:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5000:33:2"
            },
            "returnParameters": {
              "id": 625,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5051:0:2"
            },
            "scope": 721,
            "src": "4987:103:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              8833
            ],
            "body": {
              "id": 657,
              "nodeType": "Block",
              "src": "5255:158:2",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 645,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 642,
                      "name": "spender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 636,
                      "src": "5269:7:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 643,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1512,
                        "src": "5280:5:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                          "typeString": "function () view returns (address)"
                        }
                      },
                      "id": 644,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5280:7:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "5269:18:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 655,
                    "nodeType": "Block",
                    "src": "5339:68:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 651,
                              "name": "tokenOwner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 634,
                              "src": "5376:10:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 652,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 636,
                              "src": "5388:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 649,
                              "name": "super",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -25,
                              "src": "5360:5:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_super$___unstable__ERC20Owned_$721",
                                "typeString": "contract super __unstable__ERC20Owned"
                              }
                            },
                            "id": 650,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "allowance",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 8833,
                            "src": "5360:15:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address,address) view returns (uint256)"
                            }
                          },
                          "id": 653,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5360:36:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 641,
                        "id": 654,
                        "nodeType": "Return",
                        "src": "5353:43:2"
                      }
                    ]
                  },
                  "id": 656,
                  "nodeType": "IfStatement",
                  "src": "5265:142:2",
                  "trueBody": {
                    "id": 648,
                    "nodeType": "Block",
                    "src": "5289:44:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 646,
                          "name": "_UINT256_MAX",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 605,
                          "src": "5310:12:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 641,
                        "id": 647,
                        "nodeType": "Return",
                        "src": "5303:19:2"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "functionSelector": "dd62ed3e",
            "id": 658,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "allowance",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 638,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "5228:8:2"
            },
            "parameters": {
              "id": 637,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 634,
                  "mutability": "mutable",
                  "name": "tokenOwner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 658,
                  "src": "5179:18:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 633,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5179:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 636,
                  "mutability": "mutable",
                  "name": "spender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 658,
                  "src": "5199:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 635,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5199:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5178:37:2"
            },
            "returnParameters": {
              "id": 641,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 640,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 658,
                  "src": "5246:7:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 639,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5246:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5245:9:2"
            },
            "scope": 721,
            "src": "5160:253:2",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              9171
            ],
            "body": {
              "id": 684,
              "nodeType": "Block",
              "src": "5582:144:2",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 671,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 668,
                      "name": "spender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 662,
                      "src": "5596:7:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 669,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1512,
                        "src": "5607:5:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                          "typeString": "function () view returns (address)"
                        }
                      },
                      "id": 670,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5607:7:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "5596:18:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 682,
                    "nodeType": "Block",
                    "src": "5653:67:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 677,
                              "name": "tokenOwner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 660,
                              "src": "5682:10:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 678,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 662,
                              "src": "5694:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 679,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 664,
                              "src": "5703:5:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 674,
                              "name": "super",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -25,
                              "src": "5667:5:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_super$___unstable__ERC20Owned_$721",
                                "typeString": "contract super __unstable__ERC20Owned"
                              }
                            },
                            "id": 676,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_approve",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9171,
                            "src": "5667:14:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 680,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5667:42:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 681,
                        "nodeType": "ExpressionStatement",
                        "src": "5667:42:2"
                      }
                    ]
                  },
                  "id": 683,
                  "nodeType": "IfStatement",
                  "src": "5592:128:2",
                  "trueBody": {
                    "id": 673,
                    "nodeType": "Block",
                    "src": "5616:31:2",
                    "statements": [
                      {
                        "expression": null,
                        "functionReturnParameters": 667,
                        "id": 672,
                        "nodeType": "Return",
                        "src": "5630:7:2"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "id": 685,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_approve",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 666,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "5573:8:2"
            },
            "parameters": {
              "id": 665,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 660,
                  "mutability": "mutable",
                  "name": "tokenOwner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 685,
                  "src": "5512:18:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 659,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5512:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 662,
                  "mutability": "mutable",
                  "name": "spender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 685,
                  "src": "5532:15:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 661,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5532:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 664,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 685,
                  "src": "5549:13:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 663,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5549:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5511:52:2"
            },
            "returnParameters": {
              "id": 667,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5582:0:2"
            },
            "scope": 721,
            "src": "5494:232:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              8892
            ],
            "body": {
              "id": 719,
              "nodeType": "Block",
              "src": "5836:211:2",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 700,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 697,
                      "name": "recipient",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 689,
                      "src": "5850:9:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 698,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1512,
                        "src": "5863:5:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                          "typeString": "function () view returns (address)"
                        }
                      },
                      "id": 699,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5863:7:2",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "5850:20:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 717,
                    "nodeType": "Block",
                    "src": "5964:77:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 712,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 687,
                              "src": "6004:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 713,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 689,
                              "src": "6012:9:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 714,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 691,
                              "src": "6023:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 710,
                              "name": "super",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -25,
                              "src": "5985:5:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_super$___unstable__ERC20Owned_$721",
                                "typeString": "contract super __unstable__ERC20Owned"
                              }
                            },
                            "id": 711,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transferFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 8892,
                            "src": "5985:18:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,address,uint256) returns (bool)"
                            }
                          },
                          "id": 715,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5985:45:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 696,
                        "id": 716,
                        "nodeType": "Return",
                        "src": "5978:52:2"
                      }
                    ]
                  },
                  "id": 718,
                  "nodeType": "IfStatement",
                  "src": "5846:195:2",
                  "trueBody": {
                    "id": 709,
                    "nodeType": "Block",
                    "src": "5872:86:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 702,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 687,
                              "src": "5896:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 703,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 689,
                              "src": "5904:9:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 704,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 691,
                              "src": "5915:6:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 701,
                            "name": "_transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9015,
                            "src": "5886:9:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 705,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5886:36:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 706,
                        "nodeType": "ExpressionStatement",
                        "src": "5886:36:2"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 707,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "5943:4:2",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 696,
                        "id": 708,
                        "nodeType": "Return",
                        "src": "5936:11:2"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": null,
            "functionSelector": "23b872dd",
            "id": 720,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "transferFrom",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 693,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "5812:8:2"
            },
            "parameters": {
              "id": 692,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 687,
                  "mutability": "mutable",
                  "name": "sender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 720,
                  "src": "5754:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 686,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5754:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 689,
                  "mutability": "mutable",
                  "name": "recipient",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 720,
                  "src": "5770:17:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 688,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5770:7:2",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 691,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 720,
                  "src": "5789:14:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 690,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5789:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5753:51:2"
            },
            "returnParameters": {
              "id": 696,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 695,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 720,
                  "src": "5830:4:2",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 694,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "5830:4:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5829:6:2"
            },
            "scope": 721,
            "src": "5732:315:2",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 722,
        "src": "4735:1314:2"
      }
    ],
    "src": "33:6017:2"
  },
  "bytecode": "0x608060405273d216153c06e857cd7f72665e0af1d7d82172f4946000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006557600080fd5b50604051620030fa380380620030fa833981810160405260408110156200008b57600080fd5b8101908080516040519392919084640100000000821115620000ac57600080fd5b83820191506020820185811115620000c357600080fd5b8251866001820283011164010000000082111715620000e157600080fd5b8083526020830192505050908051906020019080838360005b8381101562000117578082015181840152602081019050620000fa565b50505050905090810190601f168015620001455780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200016957600080fd5b838201915060208201858111156200018057600080fd5b82518660018202830111640100000000821117156200019e57600080fd5b8083526020830192505050908051906020019080838360005b83811015620001d4578082015181840152602081019050620001b7565b50505050905090810190601f168015620002025780820380516001836020036101000a031916815260200191505b506040525050508181604051620002199062000360565b808060200180602001838103835285818151815260200191508051906020019080838360005b838110156200025c5780820151818401526020810190506200023f565b50505050905090810190601f1680156200028a5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015620002c5578082015181840152602081019050620002a8565b50505050905090810190601f168015620002f35780820380516001836020036101000a031916815260200191505b50945050505050604051809103906000f08015801562000317573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200036e565b611d3780620013c383390190565b611045806200037e6000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806374e861d61461006757806380274db71461009b57806383947ea01461016a578063ad61ccd5146103af578063e06e0e2214610432578063fc0c546a1461050d575b600080fd5b61006f610541565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610154600480360360208110156100b157600080fd5b81019080803590602001906401000000008111156100ce57600080fd5b8201836020820111156100e057600080fd5b8035906020019184600183028401116401000000008311171561010257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061056a565b6040518082815260200191505060405180910390f35b61032d600480360361012081101561018157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101de57600080fd5b8201836020820111156101f057600080fd5b8035906020019184600183028401116401000000008311171561021257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561029d57600080fd5b8201836020820111156102af57600080fd5b803590602001918460018302840111640100000000831117156102d157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050610607565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610373578082015181840152602081019050610358565b50505050905090810190601f1680156103a05780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6103b761075c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f75780820151818401526020810190506103dc565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61050b6004803603608081101561044857600080fd5b810190808035906020019064010000000081111561046557600080fd5b82018360208201111561047757600080fd5b8035906020019184600183028401116401000000008311171561049957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035151590602001909291908035906020019092919080359060200190929190505050610799565b005b610515610836565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610574610541565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610fc26024913960400191505060405180910390fd5b61060082610860565b9050919050565b6000606082600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318c6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561069557600080fd5b505afa1580156106a9573d6000803e3d6000fd5b505050506040513d60208110156106bf57600080fd5b810190808051906020019092919050505010156106f3576106ea6000808111156106e557fe5b6108ef565b9150915061074e565b6107498a848a8a604051602001808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050604051602081830303815290604052610910565b915091505b995099975050505050505050565b60606040518060400160405280600581526020017f312e302e30000000000000000000000000000000000000000000000000000000815250905090565b6107a1610541565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610824576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610fc26024913960400191505060405180910390fd5b61083084848484610920565b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600083806020019051604081101561087a57600080fd5b810190808051906020019092919080519060200190929190505050915091506108e8823083600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610a17909392919063ffffffff16565b5050919050565b6000606082600b016040518060200160405280600081525091509150915091565b6000606060008391509150915091565b60008060008087806020019051608081101561093b57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050509350935093509350600061099661098f612710620186a0610ad890919063ffffffff16565b8385610b22565b90506109ab8188610ad890919063ffffffff16565b9650610a0c856109c48987610ad890919063ffffffff16565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610b3f9092919063ffffffff16565b505050505050505050565b610ad2846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610be1565b50505050565b6000610b1a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610cd0565b905092915050565b60006064826064018486020281610b3557fe5b0490509392505050565b610bdc8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610be1565b505050565b6060610c43826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610d909092919063ffffffff16565b9050600081511115610ccb57808060200190516020811015610c6457600080fd5b8101908080519060200190929190505050610cca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180610fe6602a913960400191505060405180910390fd5b5b505050565b6000838311158290610d7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d42578082015181840152602081019050610d27565b50505050905090810190601f168015610d6f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060610d9f8484600085610da8565b90509392505050565b6060610db385610fae565b610e25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310610e755780518252602082019150602081019050602083039250610e52565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610ed7576040519150601f19603f3d011682016040523d82523d6000602084013e610edc565b606091505b50915091508115610ef1578092505050610fa6565b600081511115610f045780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610f6b578082015181840152602081019050610f50565b50505050905090810190601f168015610f985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe47534e526563697069656e743a2063616c6c6572206973206e6f742052656c61794875625361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212203068bede32e8f2cd1c7ac4df7b9dd020949ae498cb909c35c5a897b1b98a874464736f6c6343000700003360806040523480156200001157600080fd5b5060405162001d3738038062001d37833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b838201915060208201858111156200006f57600080fd5b82518660018202830111640100000000821117156200008d57600080fd5b8083526020830192505050908051906020019080838360005b83811015620000c3578082015181840152602081019050620000a6565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b838201915060208201858111156200012c57600080fd5b82518660018202830111640100000000821117156200014a57600080fd5b8083526020830192505050908051906020019080838360005b838110156200018057808201518184015260208101905062000163565b50505050905090810190601f168015620001ae5780820380516001836020036101000a031916815260200191505b5060405250505081818160039080519060200190620001cf929190620002c8565b508060049080519060200190620001e8929190620002c8565b506012600560006101000a81548160ff021916908360ff1602179055505050600062000219620002c060201b60201c565b905080600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050506200036e565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200030b57805160ff19168380011785556200033c565b828001600101855582156200033c579182015b828111156200033b5782518255916020019190600101906200031e565b5b5090506200034b91906200034f565b5090565b5b808211156200036a57600081600090555060010162000350565b5090565b6119b9806200037e6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a0823111610097578063a457c2d711610066578063a457c2d71461046f578063a9059cbb146104d3578063dd62ed3e14610537578063f2fde38b146105af576100f5565b806370a0823114610356578063715018a6146103ae5780638da5cb5b146103b857806395d89b41146103ec576100f5565b806323b872dd116100d357806323b872dd146101ff578063313ce5671461028357806339509351146102a457806340c10f1914610308576100f5565b806306fdde03146100fa578063095ea7b31461017d57806318160ddd146101e1575b600080fd5b6101026105f3565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610142578082015181840152602081019050610127565b50505050905090810190601f16801561016f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c96004803603604081101561019357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610695565b60405180821515815260200191505060405180910390f35b6101e96106b3565b6040518082815260200191505060405180910390f35b61026b6004803603606081101561021557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106bd565b60405180821515815260200191505060405180910390f35b61028b610723565b604051808260ff16815260200191505060405180910390f35b6102f0600480360360408110156102ba57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061073a565b60405180821515815260200191505060405180910390f35b6103546004803603604081101561031e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107ed565b005b6103986004803603602081101561036c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108c5565b6040518082815260200191505060405180910390f35b6103b661090d565b005b6103c0610a98565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103f4610ac2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610434578082015181840152602081019050610419565b50505050905090810190601f1680156104615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104bb6004803603604081101561048557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b64565b60405180821515815260200191505060405180910390f35b61051f600480360360408110156104e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c31565b60405180821515815260200191505060405180910390f35b6105996004803603604081101561054d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c4f565b6040518082815260200191505060405180910390f35b6105f1600480360360208110156105c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610cc7565b005b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561068b5780601f106106605761010080835404028352916020019161068b565b820191906000526020600020905b81548152906001019060200180831161066e57829003601f168201915b5050505050905090565b60006106a96106a2610ed7565b8484610edf565b6001905092915050565b6000600254905090565b60006106c7610a98565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561070e57610705848484610f30565b6001905061071c565b6107198484846111f1565b90505b9392505050565b6000600560009054906101000a900460ff16905090565b60006107e3610747610ed7565b846107de8560016000610758610ed7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112ca90919063ffffffff16565b610edf565b6001905092915050565b6107f5610ed7565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6108c18282611352565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610915610ed7565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b5a5780601f10610b2f57610100808354040283529160200191610b5a565b820191906000526020600020905b815481529060010190602001808311610b3d57829003601f168201915b5050505050905090565b6000610c27610b71610ed7565b84610c228560405180606001604052806025815260200161195f6025913960016000610b9b610ed7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115199092919063ffffffff16565b610edf565b6001905092915050565b6000610c45610c3e610ed7565b8484610f30565b6001905092915050565b6000610c59610a98565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cb4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050610cc1565b610cbe83836115d9565b90505b92915050565b610ccf610ed7565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e17576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118806026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b610ee7610a98565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f1f57610f2b565b610f2a838383611660565b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fb6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806119166025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061185d6023913960400191505060405180910390fd5b611047838383611857565b6110b2816040518060600160405280602681526020016118c8602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115199092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611145816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112ca90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60006111fe848484610f30565b6112bf8461120a610ed7565b6112ba856040518060600160405280602881526020016118ee60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611270610ed7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115199092919063ffffffff16565b610edf565b600190509392505050565b600080828401905083811015611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b61140160008383611857565b611416816002546112ca90919063ffffffff16565b60028190555061146d816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112ca90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008383111582906115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561158b578082015181840152602081019050611570565b50505050905090810190601f1680156115b85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061193b6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561176c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806118a66022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cd1f081235c2f16b19d0ac74834e4823c68efec8144a2b01f3e8b9f0270b556a64736f6c63430007000033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c806374e861d61461006757806380274db71461009b57806383947ea01461016a578063ad61ccd5146103af578063e06e0e2214610432578063fc0c546a1461050d575b600080fd5b61006f610541565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610154600480360360208110156100b157600080fd5b81019080803590602001906401000000008111156100ce57600080fd5b8201836020820111156100e057600080fd5b8035906020019184600183028401116401000000008311171561010257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061056a565b6040518082815260200191505060405180910390f35b61032d600480360361012081101561018157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101de57600080fd5b8201836020820111156101f057600080fd5b8035906020019184600183028401116401000000008311171561021257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561029d57600080fd5b8201836020820111156102af57600080fd5b803590602001918460018302840111640100000000831117156102d157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050610607565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610373578082015181840152602081019050610358565b50505050905090810190601f1680156103a05780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6103b761075c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f75780820151818401526020810190506103dc565b50505050905090810190601f1680156104245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61050b6004803603608081101561044857600080fd5b810190808035906020019064010000000081111561046557600080fd5b82018360208201111561047757600080fd5b8035906020019184600183028401116401000000008311171561049957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035151590602001909291908035906020019092919080359060200190929190505050610799565b005b610515610836565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610574610541565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610fc26024913960400191505060405180910390fd5b61060082610860565b9050919050565b6000606082600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318c6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561069557600080fd5b505afa1580156106a9573d6000803e3d6000fd5b505050506040513d60208110156106bf57600080fd5b810190808051906020019092919050505010156106f3576106ea6000808111156106e557fe5b6108ef565b9150915061074e565b6107498a848a8a604051602001808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001828152602001945050505050604051602081830303815290604052610910565b915091505b995099975050505050505050565b60606040518060400160405280600581526020017f312e302e30000000000000000000000000000000000000000000000000000000815250905090565b6107a1610541565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610824576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610fc26024913960400191505060405180910390fd5b61083084848484610920565b50505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600083806020019051604081101561087a57600080fd5b810190808051906020019092919080519060200190929190505050915091506108e8823083600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610a17909392919063ffffffff16565b5050919050565b6000606082600b016040518060200160405280600081525091509150915091565b6000606060008391509150915091565b60008060008087806020019051608081101561093b57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050509350935093509350600061099661098f612710620186a0610ad890919063ffffffff16565b8385610b22565b90506109ab8188610ad890919063ffffffff16565b9650610a0c856109c48987610ad890919063ffffffff16565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610b3f9092919063ffffffff16565b505050505050505050565b610ad2846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610be1565b50505050565b6000610b1a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610cd0565b905092915050565b60006064826064018486020281610b3557fe5b0490509392505050565b610bdc8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610be1565b505050565b6060610c43826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610d909092919063ffffffff16565b9050600081511115610ccb57808060200190516020811015610c6457600080fd5b8101908080519060200190929190505050610cca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180610fe6602a913960400191505060405180910390fd5b5b505050565b6000838311158290610d7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610d42578082015181840152602081019050610d27565b50505050905090810190601f168015610d6f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060610d9f8484600085610da8565b90509392505050565b6060610db385610fae565b610e25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310610e755780518252602082019150602081019050602083039250610e52565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610ed7576040519150601f19603f3d011682016040523d82523d6000602084013e610edc565b606091505b50915091508115610ef1578092505050610fa6565b600081511115610f045780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610f6b578082015181840152602081019050610f50565b50505050905090810190601f168015610f985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe47534e526563697069656e743a2063616c6c6572206973206e6f742052656c61794875625361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212203068bede32e8f2cd1c7ac4df7b9dd020949ae498cb909c35c5a897b1b98a874464736f6c63430007000033",
  "compiler": {
    "name": "solc",
    "version": "0.7.0+commit.9e61f92b.Emscripten.clang",
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "evmVersion": "petersburg"
  }
}
