{
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "previousAdmin",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "AdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "beacon",
          "type": "address"
        }
      ],
      "name": "BeaconUpgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    }
  ],
  "allSourcePaths": {
    "11": "/home/vscode/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.8.2/contracts/proxy/beacon/IBeacon.sol",
    "22": "/home/vscode/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.8.2/contracts/utils/Address.sol",
    "24": "/home/vscode/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.8.2/contracts/utils/StorageSlot.sol",
    "7": "/home/vscode/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.8.2/contracts/interfaces/draft-IERC1822.sol",
    "9": "/home/vscode/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.8.2/contracts/proxy/ERC1967/ERC1967Upgrade.sol"
  },
  "ast": {
    "absolutePath": "/home/vscode/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.8.2/contracts/proxy/ERC1967/ERC1967Upgrade.sol",
    "exportedSymbols": {
      "Address": [
        17676
      ],
      "ERC1967Upgrade": [
        18030
      ],
      "IBeacon": [
        18386
      ],
      "IERC1822Proxiable": [
        18376
      ],
      "StorageSlot": [
        18446
      ]
    },
    "id": 18031,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 17714,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".2"
        ],
        "nodeType": "PragmaDirective",
        "src": "116:23:9"
      },
      {
        "absolutePath": "/home/vscode/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.8.2/contracts/proxy/beacon/IBeacon.sol",
        "file": "../beacon/IBeacon.sol",
        "id": 17715,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 18031,
        "sourceUnit": 18387,
        "src": "141:31:9",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/home/vscode/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.8.2/contracts/interfaces/draft-IERC1822.sol",
        "file": "../../interfaces/draft-IERC1822.sol",
        "id": 17716,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 18031,
        "sourceUnit": 18377,
        "src": "173:45:9",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/home/vscode/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.8.2/contracts/utils/Address.sol",
        "file": "../../utils/Address.sol",
        "id": 17717,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 18031,
        "sourceUnit": 17677,
        "src": "219:33:9",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/home/vscode/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.8.2/contracts/utils/StorageSlot.sol",
        "file": "../../utils/StorageSlot.sol",
        "id": 17718,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 18031,
        "sourceUnit": 18447,
        "src": "253:37:9",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": true,
        "baseContracts": [],
        "canonicalName": "ERC1967Upgrade",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 17719,
          "nodeType": "StructuredDocumentation",
          "src": "292:236:9",
          "text": " @dev This abstract contract provides getters and event emitting update functions for\n https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n _Available since v4.1._\n @custom:oz-upgrades-unsafe-allow delegatecall"
        },
        "fullyImplemented": true,
        "id": 18030,
        "linearizedBaseContracts": [
          18030
        ],
        "name": "ERC1967Upgrade",
        "nameLocation": "547:14:9",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": true,
            "id": 17722,
            "mutability": "constant",
            "name": "_ROLLBACK_SLOT",
            "nameLocation": "672:14:9",
            "nodeType": "VariableDeclaration",
            "scope": 18030,
            "src": "647:108:9",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes32",
              "typeString": "bytes32"
            },
            "typeName": {
              "id": 17720,
              "name": "bytes32",
              "nodeType": "ElementaryTypeName",
              "src": "647:7:9",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            },
            "value": {
              "hexValue": "307834393130666466613136666564333236306564306537313437663763633664613131613630323038623562393430366431326136333536313466666439313433",
              "id": 17721,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "689:66:9",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_33048860383849004559742813297059419343339852917517107368639918720169455489347_by_1",
                "typeString": "int_const 3304...(69 digits omitted)...9347"
              },
              "value": "0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143"
            },
            "visibility": "private"
          },
          {
            "constant": true,
            "documentation": {
              "id": 17723,
              "nodeType": "StructuredDocumentation",
              "src": "762:214:9",
              "text": " @dev Storage slot with the address of the current implementation.\n This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n validated in the constructor."
            },
            "id": 17726,
            "mutability": "constant",
            "name": "_IMPLEMENTATION_SLOT",
            "nameLocation": "1007:20:9",
            "nodeType": "VariableDeclaration",
            "scope": 18030,
            "src": "981:115:9",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes32",
              "typeString": "bytes32"
            },
            "typeName": {
              "id": 17724,
              "name": "bytes32",
              "nodeType": "ElementaryTypeName",
              "src": "981:7:9",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            },
            "value": {
              "hexValue": "307833363038393461313362613161333231303636376338323834393264623938646361336532303736636333373335613932306133636135303564333832626263",
              "id": 17725,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "1030:66:9",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_24440054405305269366569402256811496959409073762505157381672968839269610695612_by_1",
                "typeString": "int_const 2444...(69 digits omitted)...5612"
              },
              "value": "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"
            },
            "visibility": "internal"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 17727,
              "nodeType": "StructuredDocumentation",
              "src": "1103:68:9",
              "text": " @dev Emitted when the implementation is upgraded."
            },
            "eventSelector": "bc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b",
            "id": 17731,
            "name": "Upgraded",
            "nameLocation": "1182:8:9",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 17730,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17729,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "implementation",
                  "nameLocation": "1207:14:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17731,
                  "src": "1191:30:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17728,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1191:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1190:32:9"
            },
            "src": "1176:47:9"
          },
          {
            "body": {
              "id": 17743,
              "nodeType": "Block",
              "src": "1363:78:9",
              "statements": [
                {
                  "expression": {
                    "expression": {
                      "arguments": [
                        {
                          "id": 17739,
                          "name": "_IMPLEMENTATION_SLOT",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17726,
                          "src": "1407:20:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        ],
                        "expression": {
                          "id": 17737,
                          "name": "StorageSlot",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18446,
                          "src": "1380:11:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_StorageSlot_$18446_$",
                            "typeString": "type(library StorageSlot)"
                          }
                        },
                        "id": 17738,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "1392:14:9",
                        "memberName": "getAddressSlot",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 18412,
                        "src": "1380:26:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$18392_storage_ptr_$",
                          "typeString": "function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"
                        }
                      },
                      "id": 17740,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "1380:48:9",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_AddressSlot_$18392_storage_ptr",
                        "typeString": "struct StorageSlot.AddressSlot storage pointer"
                      }
                    },
                    "id": 17741,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberLocation": "1429:5:9",
                    "memberName": "value",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 18391,
                    "src": "1380:54:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 17736,
                  "id": 17742,
                  "nodeType": "Return",
                  "src": "1373:61:9"
                }
              ]
            },
            "documentation": {
              "id": 17732,
              "nodeType": "StructuredDocumentation",
              "src": "1229:67:9",
              "text": " @dev Returns the current implementation address."
            },
            "id": 17744,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getImplementation",
            "nameLocation": "1310:18:9",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17733,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1328:2:9"
            },
            "returnParameters": {
              "id": 17736,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17735,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 17744,
                  "src": "1354:7:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17734,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1354:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1353:9:9"
            },
            "scope": 18030,
            "src": "1301:140:9",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 17767,
              "nodeType": "Block",
              "src": "1595:196:9",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 17753,
                            "name": "newImplementation",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17747,
                            "src": "1632:17:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "expression": {
                            "id": 17751,
                            "name": "Address",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17676,
                            "src": "1613:7:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_Address_$17676_$",
                              "typeString": "type(library Address)"
                            }
                          },
                          "id": 17752,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "1621:10:9",
                          "memberName": "isContract",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 17364,
                          "src": "1613:18:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 17754,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1613:37:9",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "455243313936373a206e657720696d706c656d656e746174696f6e206973206e6f74206120636f6e7472616374",
                        "id": 17755,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1652:47:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65",
                          "typeString": "literal_string \"ERC1967: new implementation is not a contract\""
                        },
                        "value": "ERC1967: new implementation is not a contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_972b7028e8de0bff0d553b3264eba2312ec98a552add05e58853b313f9f4ac65",
                          "typeString": "literal_string \"ERC1967: new implementation is not a contract\""
                        }
                      ],
                      "id": 17750,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1605:7:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17756,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1605:95:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17757,
                  "nodeType": "ExpressionStatement",
                  "src": "1605:95:9"
                },
                {
                  "expression": {
                    "id": 17765,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "arguments": [
                          {
                            "id": 17761,
                            "name": "_IMPLEMENTATION_SLOT",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17726,
                            "src": "1737:20:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          ],
                          "expression": {
                            "id": 17758,
                            "name": "StorageSlot",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18446,
                            "src": "1710:11:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_StorageSlot_$18446_$",
                              "typeString": "type(library StorageSlot)"
                            }
                          },
                          "id": 17760,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "1722:14:9",
                          "memberName": "getAddressSlot",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 18412,
                          "src": "1710:26:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$18392_storage_ptr_$",
                            "typeString": "function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"
                          }
                        },
                        "id": 17762,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1710:48:9",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSlot_$18392_storage_ptr",
                          "typeString": "struct StorageSlot.AddressSlot storage pointer"
                        }
                      },
                      "id": 17763,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "1759:5:9",
                      "memberName": "value",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 18391,
                      "src": "1710:54:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17764,
                      "name": "newImplementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17747,
                      "src": "1767:17:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1710:74:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 17766,
                  "nodeType": "ExpressionStatement",
                  "src": "1710:74:9"
                }
              ]
            },
            "documentation": {
              "id": 17745,
              "nodeType": "StructuredDocumentation",
              "src": "1447:80:9",
              "text": " @dev Stores a new address in the EIP1967 implementation slot."
            },
            "id": 17768,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setImplementation",
            "nameLocation": "1541:18:9",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17748,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17747,
                  "mutability": "mutable",
                  "name": "newImplementation",
                  "nameLocation": "1568:17:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17768,
                  "src": "1560:25:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17746,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1560:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1559:27:9"
            },
            "returnParameters": {
              "id": 17749,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1595:0:9"
            },
            "scope": 18030,
            "src": "1532:259:9",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 17782,
              "nodeType": "Block",
              "src": "1953:96:9",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17775,
                        "name": "newImplementation",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17771,
                        "src": "1982:17:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17774,
                      "name": "_setImplementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17768,
                      "src": "1963:18:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 17776,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1963:37:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17777,
                  "nodeType": "ExpressionStatement",
                  "src": "1963:37:9"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 17779,
                        "name": "newImplementation",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17771,
                        "src": "2024:17:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17778,
                      "name": "Upgraded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17731,
                      "src": "2015:8:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 17780,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2015:27:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17781,
                  "nodeType": "EmitStatement",
                  "src": "2010:32:9"
                }
              ]
            },
            "documentation": {
              "id": 17769,
              "nodeType": "StructuredDocumentation",
              "src": "1797:95:9",
              "text": " @dev Perform implementation upgrade\n Emits an {Upgraded} event."
            },
            "id": 17783,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_upgradeTo",
            "nameLocation": "1906:10:9",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17772,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17771,
                  "mutability": "mutable",
                  "name": "newImplementation",
                  "nameLocation": "1925:17:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17783,
                  "src": "1917:25:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17770,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1917:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1916:27:9"
            },
            "returnParameters": {
              "id": 17773,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1953:0:9"
            },
            "scope": 18030,
            "src": "1897:152:9",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 17812,
              "nodeType": "Block",
              "src": "2311:167:9",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17794,
                        "name": "newImplementation",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17786,
                        "src": "2332:17:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17793,
                      "name": "_upgradeTo",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17783,
                      "src": "2321:10:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 17795,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2321:29:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17796,
                  "nodeType": "ExpressionStatement",
                  "src": "2321:29:9"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 17802,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 17800,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "id": 17797,
                          "name": "data",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17788,
                          "src": "2364:4:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "id": 17798,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "2369:6:9",
                        "memberName": "length",
                        "nodeType": "MemberAccess",
                        "src": "2364:11:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">",
                      "rightExpression": {
                        "hexValue": "30",
                        "id": 17799,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2378:1:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        },
                        "value": "0"
                      },
                      "src": "2364:15:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "||",
                    "rightExpression": {
                      "id": 17801,
                      "name": "forceCall",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17790,
                      "src": "2383:9:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "2364:28:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 17811,
                  "nodeType": "IfStatement",
                  "src": "2360:112:9",
                  "trueBody": {
                    "id": 17810,
                    "nodeType": "Block",
                    "src": "2394:78:9",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 17806,
                              "name": "newImplementation",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17786,
                              "src": "2437:17:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 17807,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17788,
                              "src": "2456:4:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "id": 17803,
                              "name": "Address",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17676,
                              "src": "2408:7:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_Address_$17676_$",
                                "typeString": "type(library Address)"
                              }
                            },
                            "id": 17805,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "2416:20:9",
                            "memberName": "functionDelegateCall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 17563,
                            "src": "2408:28:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (address,bytes memory) returns (bytes memory)"
                            }
                          },
                          "id": 17808,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2408:53:9",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "id": 17809,
                        "nodeType": "ExpressionStatement",
                        "src": "2408:53:9"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 17784,
              "nodeType": "StructuredDocumentation",
              "src": "2055:123:9",
              "text": " @dev Perform implementation upgrade with additional setup call.\n Emits an {Upgraded} event."
            },
            "id": 17813,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_upgradeToAndCall",
            "nameLocation": "2192:17:9",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17791,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17786,
                  "mutability": "mutable",
                  "name": "newImplementation",
                  "nameLocation": "2227:17:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17813,
                  "src": "2219:25:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17785,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2219:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17788,
                  "mutability": "mutable",
                  "name": "data",
                  "nameLocation": "2267:4:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17813,
                  "src": "2254:17:9",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17787,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2254:5:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17790,
                  "mutability": "mutable",
                  "name": "forceCall",
                  "nameLocation": "2286:9:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17813,
                  "src": "2281:14:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 17789,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2281:4:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2209:92:9"
            },
            "returnParameters": {
              "id": 17792,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2311:0:9"
            },
            "scope": 18030,
            "src": "2183:295:9",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 17865,
              "nodeType": "Block",
              "src": "2782:820:9",
              "statements": [
                {
                  "condition": {
                    "expression": {
                      "arguments": [
                        {
                          "id": 17825,
                          "name": "_ROLLBACK_SLOT",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17722,
                          "src": "3123:14:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        ],
                        "expression": {
                          "id": 17823,
                          "name": "StorageSlot",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18446,
                          "src": "3096:11:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_StorageSlot_$18446_$",
                            "typeString": "type(library StorageSlot)"
                          }
                        },
                        "id": 17824,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "3108:14:9",
                        "memberName": "getBooleanSlot",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 18423,
                        "src": "3096:26:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_bytes32_$returns$_t_struct$_BooleanSlot_$18395_storage_ptr_$",
                          "typeString": "function (bytes32) pure returns (struct StorageSlot.BooleanSlot storage pointer)"
                        }
                      },
                      "id": 17826,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3096:42:9",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_BooleanSlot_$18395_storage_ptr",
                        "typeString": "struct StorageSlot.BooleanSlot storage pointer"
                      }
                    },
                    "id": 17827,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberLocation": "3139:5:9",
                    "memberName": "value",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 18394,
                    "src": "3096:48:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 17863,
                    "nodeType": "Block",
                    "src": "3214:382:9",
                    "statements": [
                      {
                        "clauses": [
                          {
                            "block": {
                              "id": 17848,
                              "nodeType": "Block",
                              "src": "3308:115:9",
                              "statements": [
                                {
                                  "expression": {
                                    "arguments": [
                                      {
                                        "commonType": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        },
                                        "id": 17844,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "id": 17842,
                                          "name": "slot",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 17839,
                                          "src": "3334:4:9",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "==",
                                        "rightExpression": {
                                          "id": 17843,
                                          "name": "_IMPLEMENTATION_SLOT",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 17726,
                                          "src": "3342:20:9",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        },
                                        "src": "3334:28:9",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      {
                                        "hexValue": "45524331393637557067726164653a20756e737570706f727465642070726f786961626c6555554944",
                                        "id": 17845,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "string",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "3364:43:9",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c",
                                          "typeString": "literal_string \"ERC1967Upgrade: unsupported proxiableUUID\""
                                        },
                                        "value": "ERC1967Upgrade: unsupported proxiableUUID"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        },
                                        {
                                          "typeIdentifier": "t_stringliteral_76b6b6debfc5febf101145a79ecf0b0d2e89e397dfdab2bca99888370411152c",
                                          "typeString": "literal_string \"ERC1967Upgrade: unsupported proxiableUUID\""
                                        }
                                      ],
                                      "id": 17841,
                                      "name": "require",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [
                                        -18,
                                        -18
                                      ],
                                      "referencedDeclaration": -18,
                                      "src": "3326:7:9",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                        "typeString": "function (bool,string memory) pure"
                                      }
                                    },
                                    "id": 17846,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "nameLocations": [],
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "3326:82:9",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_tuple$__$",
                                      "typeString": "tuple()"
                                    }
                                  },
                                  "id": 17847,
                                  "nodeType": "ExpressionStatement",
                                  "src": "3326:82:9"
                                }
                              ]
                            },
                            "errorName": "",
                            "id": 17849,
                            "nodeType": "TryCatchClause",
                            "parameters": {
                              "id": 17840,
                              "nodeType": "ParameterList",
                              "parameters": [
                                {
                                  "constant": false,
                                  "id": 17839,
                                  "mutability": "mutable",
                                  "name": "slot",
                                  "nameLocation": "3302:4:9",
                                  "nodeType": "VariableDeclaration",
                                  "scope": 17849,
                                  "src": "3294:12:9",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 17838,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3294:7:9",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "visibility": "internal"
                                }
                              ],
                              "src": "3293:14:9"
                            },
                            "src": "3285:138:9"
                          },
                          {
                            "block": {
                              "id": 17854,
                              "nodeType": "Block",
                              "src": "3430:89:9",
                              "statements": [
                                {
                                  "expression": {
                                    "arguments": [
                                      {
                                        "hexValue": "45524331393637557067726164653a206e657720696d706c656d656e746174696f6e206973206e6f742055555053",
                                        "id": 17851,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "string",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "3455:48:9",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24",
                                          "typeString": "literal_string \"ERC1967Upgrade: new implementation is not UUPS\""
                                        },
                                        "value": "ERC1967Upgrade: new implementation is not UUPS"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_stringliteral_8e8e2fbcb586f700b5b14e2c4a650c8d83b9773c31c5fe8962070ea544e11f24",
                                          "typeString": "literal_string \"ERC1967Upgrade: new implementation is not UUPS\""
                                        }
                                      ],
                                      "id": 17850,
                                      "name": "revert",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [
                                        -19,
                                        -19
                                      ],
                                      "referencedDeclaration": -19,
                                      "src": "3448:6:9",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                        "typeString": "function (string memory) pure"
                                      }
                                    },
                                    "id": 17852,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "nameLocations": [],
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "3448:56:9",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_tuple$__$",
                                      "typeString": "tuple()"
                                    }
                                  },
                                  "id": 17853,
                                  "nodeType": "ExpressionStatement",
                                  "src": "3448:56:9"
                                }
                              ]
                            },
                            "errorName": "",
                            "id": 17855,
                            "nodeType": "TryCatchClause",
                            "src": "3424:95:9"
                          }
                        ],
                        "externalCall": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "arguments": [
                                {
                                  "id": 17834,
                                  "name": "newImplementation",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17816,
                                  "src": "3250:17:9",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 17833,
                                "name": "IERC1822Proxiable",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 18376,
                                "src": "3232:17:9",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_IERC1822Proxiable_$18376_$",
                                  "typeString": "type(contract IERC1822Proxiable)"
                                }
                              },
                              "id": 17835,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "nameLocations": [],
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3232:36:9",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC1822Proxiable_$18376",
                                "typeString": "contract IERC1822Proxiable"
                              }
                            },
                            "id": 17836,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "3269:13:9",
                            "memberName": "proxiableUUID",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 18375,
                            "src": "3232:50:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_bytes32_$",
                              "typeString": "function () view external returns (bytes32)"
                            }
                          },
                          "id": 17837,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3232:52:9",
                          "tryCall": true,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 17856,
                        "nodeType": "TryStatement",
                        "src": "3228:291:9"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 17858,
                              "name": "newImplementation",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17816,
                              "src": "3550:17:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 17859,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17818,
                              "src": "3569:4:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "id": 17860,
                              "name": "forceCall",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17820,
                              "src": "3575:9:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 17857,
                            "name": "_upgradeToAndCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17813,
                            "src": "3532:17:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_bool_$returns$__$",
                              "typeString": "function (address,bytes memory,bool)"
                            }
                          },
                          "id": 17861,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3532:53:9",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17862,
                        "nodeType": "ExpressionStatement",
                        "src": "3532:53:9"
                      }
                    ]
                  },
                  "id": 17864,
                  "nodeType": "IfStatement",
                  "src": "3092:504:9",
                  "trueBody": {
                    "id": 17832,
                    "nodeType": "Block",
                    "src": "3146:62:9",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 17829,
                              "name": "newImplementation",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17816,
                              "src": "3179:17:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 17828,
                            "name": "_setImplementation",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17768,
                            "src": "3160:18:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 17830,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3160:37:9",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17831,
                        "nodeType": "ExpressionStatement",
                        "src": "3160:37:9"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 17814,
              "nodeType": "StructuredDocumentation",
              "src": "2484:161:9",
              "text": " @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n Emits an {Upgraded} event."
            },
            "id": 17866,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_upgradeToAndCallUUPS",
            "nameLocation": "2659:21:9",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17821,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17816,
                  "mutability": "mutable",
                  "name": "newImplementation",
                  "nameLocation": "2698:17:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17866,
                  "src": "2690:25:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17815,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2690:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17818,
                  "mutability": "mutable",
                  "name": "data",
                  "nameLocation": "2738:4:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17866,
                  "src": "2725:17:9",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17817,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2725:5:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17820,
                  "mutability": "mutable",
                  "name": "forceCall",
                  "nameLocation": "2757:9:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17866,
                  "src": "2752:14:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 17819,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2752:4:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2680:92:9"
            },
            "returnParameters": {
              "id": 17822,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2782:0:9"
            },
            "scope": 18030,
            "src": "2650:952:9",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "constant": true,
            "documentation": {
              "id": 17867,
              "nodeType": "StructuredDocumentation",
              "src": "3608:189:9",
              "text": " @dev Storage slot with the admin of the contract.\n This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n validated in the constructor."
            },
            "id": 17870,
            "mutability": "constant",
            "name": "_ADMIN_SLOT",
            "nameLocation": "3828:11:9",
            "nodeType": "VariableDeclaration",
            "scope": 18030,
            "src": "3802:106:9",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes32",
              "typeString": "bytes32"
            },
            "typeName": {
              "id": 17868,
              "name": "bytes32",
              "nodeType": "ElementaryTypeName",
              "src": "3802:7:9",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            },
            "value": {
              "hexValue": "307862353331323736383461353638623331373361653133623966386136303136653234336536336236653865653131373864366137313738353062356436313033",
              "id": 17869,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "3842:66:9",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_81955473079516046949633743016697847541294818689821282749996681496272635257091_by_1",
                "typeString": "int_const 8195...(69 digits omitted)...7091"
              },
              "value": "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"
            },
            "visibility": "internal"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 17871,
              "nodeType": "StructuredDocumentation",
              "src": "3915:67:9",
              "text": " @dev Emitted when the admin account has changed."
            },
            "eventSelector": "7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f",
            "id": 17877,
            "name": "AdminChanged",
            "nameLocation": "3993:12:9",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 17876,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17873,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "previousAdmin",
                  "nameLocation": "4014:13:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17877,
                  "src": "4006:21:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17872,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4006:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17875,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "newAdmin",
                  "nameLocation": "4037:8:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17877,
                  "src": "4029:16:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17874,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4029:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4005:41:9"
            },
            "src": "3987:60:9"
          },
          {
            "body": {
              "id": 17889,
              "nodeType": "Block",
              "src": "4161:69:9",
              "statements": [
                {
                  "expression": {
                    "expression": {
                      "arguments": [
                        {
                          "id": 17885,
                          "name": "_ADMIN_SLOT",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17870,
                          "src": "4205:11:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        ],
                        "expression": {
                          "id": 17883,
                          "name": "StorageSlot",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18446,
                          "src": "4178:11:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_StorageSlot_$18446_$",
                            "typeString": "type(library StorageSlot)"
                          }
                        },
                        "id": 17884,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "4190:14:9",
                        "memberName": "getAddressSlot",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 18412,
                        "src": "4178:26:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$18392_storage_ptr_$",
                          "typeString": "function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"
                        }
                      },
                      "id": 17886,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4178:39:9",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_AddressSlot_$18392_storage_ptr",
                        "typeString": "struct StorageSlot.AddressSlot storage pointer"
                      }
                    },
                    "id": 17887,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberLocation": "4218:5:9",
                    "memberName": "value",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 18391,
                    "src": "4178:45:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 17882,
                  "id": 17888,
                  "nodeType": "Return",
                  "src": "4171:52:9"
                }
              ]
            },
            "documentation": {
              "id": 17878,
              "nodeType": "StructuredDocumentation",
              "src": "4053:50:9",
              "text": " @dev Returns the current admin."
            },
            "id": 17890,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getAdmin",
            "nameLocation": "4117:9:9",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17879,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4126:2:9"
            },
            "returnParameters": {
              "id": 17882,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17881,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 17890,
                  "src": "4152:7:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17880,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4152:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4151:9:9"
            },
            "scope": 18030,
            "src": "4108:122:9",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 17915,
              "nodeType": "Block",
              "src": "4357:156:9",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 17902,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 17897,
                          "name": "newAdmin",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17893,
                          "src": "4375:8:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "30",
                              "id": 17900,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4395:1:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 17899,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "4387:7:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 17898,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "4387:7:9",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 17901,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4387:10:9",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "4375:22:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "455243313936373a206e65772061646d696e20697320746865207a65726f2061646472657373",
                        "id": 17903,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4399:40:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_3820e16891102c1360a787e6e648431097d92537f969d458f5c94b56f8318be5",
                          "typeString": "literal_string \"ERC1967: new admin is the zero address\""
                        },
                        "value": "ERC1967: new admin is the zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_3820e16891102c1360a787e6e648431097d92537f969d458f5c94b56f8318be5",
                          "typeString": "literal_string \"ERC1967: new admin is the zero address\""
                        }
                      ],
                      "id": 17896,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4367:7:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17904,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4367:73:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17905,
                  "nodeType": "ExpressionStatement",
                  "src": "4367:73:9"
                },
                {
                  "expression": {
                    "id": 17913,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "arguments": [
                          {
                            "id": 17909,
                            "name": "_ADMIN_SLOT",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17870,
                            "src": "4477:11:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          ],
                          "expression": {
                            "id": 17906,
                            "name": "StorageSlot",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18446,
                            "src": "4450:11:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_StorageSlot_$18446_$",
                              "typeString": "type(library StorageSlot)"
                            }
                          },
                          "id": 17908,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "4462:14:9",
                          "memberName": "getAddressSlot",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 18412,
                          "src": "4450:26:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$18392_storage_ptr_$",
                            "typeString": "function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"
                          }
                        },
                        "id": 17910,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4450:39:9",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSlot_$18392_storage_ptr",
                          "typeString": "struct StorageSlot.AddressSlot storage pointer"
                        }
                      },
                      "id": 17911,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "4490:5:9",
                      "memberName": "value",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 18391,
                      "src": "4450:45:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17912,
                      "name": "newAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17893,
                      "src": "4498:8:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "4450:56:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 17914,
                  "nodeType": "ExpressionStatement",
                  "src": "4450:56:9"
                }
              ]
            },
            "documentation": {
              "id": 17891,
              "nodeType": "StructuredDocumentation",
              "src": "4236:71:9",
              "text": " @dev Stores a new address in the EIP1967 admin slot."
            },
            "id": 17916,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setAdmin",
            "nameLocation": "4321:9:9",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17894,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17893,
                  "mutability": "mutable",
                  "name": "newAdmin",
                  "nameLocation": "4339:8:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17916,
                  "src": "4331:16:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17892,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4331:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4330:18:9"
            },
            "returnParameters": {
              "id": 17895,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4357:0:9"
            },
            "scope": 18030,
            "src": "4312:201:9",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 17932,
              "nodeType": "Block",
              "src": "4673:86:9",
              "statements": [
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 17923,
                          "name": "_getAdmin",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17890,
                          "src": "4701:9:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                            "typeString": "function () view returns (address)"
                          }
                        },
                        "id": 17924,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4701:11:9",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 17925,
                        "name": "newAdmin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17919,
                        "src": "4714:8:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17922,
                      "name": "AdminChanged",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17877,
                      "src": "4688:12:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 17926,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4688:35:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17927,
                  "nodeType": "EmitStatement",
                  "src": "4683:40:9"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 17929,
                        "name": "newAdmin",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17919,
                        "src": "4743:8:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 17928,
                      "name": "_setAdmin",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17916,
                      "src": "4733:9:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 17930,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4733:19:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17931,
                  "nodeType": "ExpressionStatement",
                  "src": "4733:19:9"
                }
              ]
            },
            "documentation": {
              "id": 17917,
              "nodeType": "StructuredDocumentation",
              "src": "4519:100:9",
              "text": " @dev Changes the admin of the proxy.\n Emits an {AdminChanged} event."
            },
            "id": 17933,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_changeAdmin",
            "nameLocation": "4633:12:9",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17920,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17919,
                  "mutability": "mutable",
                  "name": "newAdmin",
                  "nameLocation": "4654:8:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17933,
                  "src": "4646:16:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17918,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4646:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4645:18:9"
            },
            "returnParameters": {
              "id": 17921,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4673:0:9"
            },
            "scope": 18030,
            "src": "4624:135:9",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "constant": true,
            "documentation": {
              "id": 17934,
              "nodeType": "StructuredDocumentation",
              "src": "4765:232:9",
              "text": " @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor."
            },
            "id": 17937,
            "mutability": "constant",
            "name": "_BEACON_SLOT",
            "nameLocation": "5028:12:9",
            "nodeType": "VariableDeclaration",
            "scope": 18030,
            "src": "5002:107:9",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bytes32",
              "typeString": "bytes32"
            },
            "typeName": {
              "id": 17935,
              "name": "bytes32",
              "nodeType": "ElementaryTypeName",
              "src": "5002:7:9",
              "typeDescriptions": {
                "typeIdentifier": "t_bytes32",
                "typeString": "bytes32"
              }
            },
            "value": {
              "hexValue": "307861336630616437346535343233616562666438306433656634333436353738333335613961373261656165653539666636636233353832623335313333643530",
              "id": 17936,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "5043:66:9",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_74152234768234802001998023604048924213078445070507226371336425913862612794704_by_1",
                "typeString": "int_const 7415...(69 digits omitted)...4704"
              },
              "value": "0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50"
            },
            "visibility": "internal"
          },
          {
            "anonymous": false,
            "documentation": {
              "id": 17938,
              "nodeType": "StructuredDocumentation",
              "src": "5116:60:9",
              "text": " @dev Emitted when the beacon is upgraded."
            },
            "eventSelector": "1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e",
            "id": 17942,
            "name": "BeaconUpgraded",
            "nameLocation": "5187:14:9",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 17941,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17940,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "beacon",
                  "nameLocation": "5218:6:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17942,
                  "src": "5202:22:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17939,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5202:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5201:24:9"
            },
            "src": "5181:45:9"
          },
          {
            "body": {
              "id": 17954,
              "nodeType": "Block",
              "src": "5342:70:9",
              "statements": [
                {
                  "expression": {
                    "expression": {
                      "arguments": [
                        {
                          "id": 17950,
                          "name": "_BEACON_SLOT",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17937,
                          "src": "5386:12:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        ],
                        "expression": {
                          "id": 17948,
                          "name": "StorageSlot",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18446,
                          "src": "5359:11:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_StorageSlot_$18446_$",
                            "typeString": "type(library StorageSlot)"
                          }
                        },
                        "id": 17949,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "5371:14:9",
                        "memberName": "getAddressSlot",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 18412,
                        "src": "5359:26:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$18392_storage_ptr_$",
                          "typeString": "function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"
                        }
                      },
                      "id": 17951,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5359:40:9",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_AddressSlot_$18392_storage_ptr",
                        "typeString": "struct StorageSlot.AddressSlot storage pointer"
                      }
                    },
                    "id": 17952,
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberLocation": "5400:5:9",
                    "memberName": "value",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": 18391,
                    "src": "5359:46:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 17947,
                  "id": 17953,
                  "nodeType": "Return",
                  "src": "5352:53:9"
                }
              ]
            },
            "documentation": {
              "id": 17943,
              "nodeType": "StructuredDocumentation",
              "src": "5232:51:9",
              "text": " @dev Returns the current beacon."
            },
            "id": 17955,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getBeacon",
            "nameLocation": "5297:10:9",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17944,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5307:2:9"
            },
            "returnParameters": {
              "id": 17947,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17946,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 17955,
                  "src": "5333:7:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17945,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5333:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5332:9:9"
            },
            "scope": 18030,
            "src": "5288:124:9",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 17990,
              "nodeType": "Block",
              "src": "5541:324:9",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 17964,
                            "name": "newBeacon",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17958,
                            "src": "5578:9:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "expression": {
                            "id": 17962,
                            "name": "Address",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17676,
                            "src": "5559:7:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_Address_$17676_$",
                              "typeString": "type(library Address)"
                            }
                          },
                          "id": 17963,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "5567:10:9",
                          "memberName": "isContract",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 17364,
                          "src": "5559:18:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 17965,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5559:29:9",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "455243313936373a206e657720626561636f6e206973206e6f74206120636f6e7472616374",
                        "id": 17966,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5590:39:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_9589b7809634e4928033de18bb696e9af4ef71b703652af5245f2dbebf2f4470",
                          "typeString": "literal_string \"ERC1967: new beacon is not a contract\""
                        },
                        "value": "ERC1967: new beacon is not a contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_9589b7809634e4928033de18bb696e9af4ef71b703652af5245f2dbebf2f4470",
                          "typeString": "literal_string \"ERC1967: new beacon is not a contract\""
                        }
                      ],
                      "id": 17961,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "5551:7:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17967,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5551:79:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17968,
                  "nodeType": "ExpressionStatement",
                  "src": "5551:79:9"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "arguments": [
                                  {
                                    "id": 17973,
                                    "name": "newBeacon",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 17958,
                                    "src": "5688:9:9",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 17972,
                                  "name": "IBeacon",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18386,
                                  "src": "5680:7:9",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_IBeacon_$18386_$",
                                    "typeString": "type(contract IBeacon)"
                                  }
                                },
                                "id": 17974,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5680:18:9",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IBeacon_$18386",
                                  "typeString": "contract IBeacon"
                                }
                              },
                              "id": 17975,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "5699:14:9",
                              "memberName": "implementation",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 18385,
                              "src": "5680:33:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                                "typeString": "function () view external returns (address)"
                              }
                            },
                            "id": 17976,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "5680:35:9",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "expression": {
                            "id": 17970,
                            "name": "Address",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17676,
                            "src": "5661:7:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_Address_$17676_$",
                              "typeString": "type(library Address)"
                            }
                          },
                          "id": 17971,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "5669:10:9",
                          "memberName": "isContract",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 17364,
                          "src": "5661:18:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 17977,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5661:55:9",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "455243313936373a20626561636f6e20696d706c656d656e746174696f6e206973206e6f74206120636f6e7472616374",
                        "id": 17978,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5730:50:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f95fd1f5b5578816eb23f6ca0f2439b4b5e4094dc16e99c3b8e91603a83f93c8",
                          "typeString": "literal_string \"ERC1967: beacon implementation is not a contract\""
                        },
                        "value": "ERC1967: beacon implementation is not a contract"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f95fd1f5b5578816eb23f6ca0f2439b4b5e4094dc16e99c3b8e91603a83f93c8",
                          "typeString": "literal_string \"ERC1967: beacon implementation is not a contract\""
                        }
                      ],
                      "id": 17969,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "5640:7:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 17979,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5640:150:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 17980,
                  "nodeType": "ExpressionStatement",
                  "src": "5640:150:9"
                },
                {
                  "expression": {
                    "id": 17988,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "arguments": [
                          {
                            "id": 17984,
                            "name": "_BEACON_SLOT",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17937,
                            "src": "5827:12:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          ],
                          "expression": {
                            "id": 17981,
                            "name": "StorageSlot",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18446,
                            "src": "5800:11:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_StorageSlot_$18446_$",
                              "typeString": "type(library StorageSlot)"
                            }
                          },
                          "id": 17983,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "5812:14:9",
                          "memberName": "getAddressSlot",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 18412,
                          "src": "5800:26:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_pure$_t_bytes32_$returns$_t_struct$_AddressSlot_$18392_storage_ptr_$",
                            "typeString": "function (bytes32) pure returns (struct StorageSlot.AddressSlot storage pointer)"
                          }
                        },
                        "id": 17985,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5800:40:9",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSlot_$18392_storage_ptr",
                          "typeString": "struct StorageSlot.AddressSlot storage pointer"
                        }
                      },
                      "id": 17986,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "5841:5:9",
                      "memberName": "value",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 18391,
                      "src": "5800:46:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 17987,
                      "name": "newBeacon",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17958,
                      "src": "5849:9:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "5800:58:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 17989,
                  "nodeType": "ExpressionStatement",
                  "src": "5800:58:9"
                }
              ]
            },
            "documentation": {
              "id": 17956,
              "nodeType": "StructuredDocumentation",
              "src": "5418:71:9",
              "text": " @dev Stores a new beacon in the EIP1967 beacon slot."
            },
            "id": 17991,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setBeacon",
            "nameLocation": "5503:10:9",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17959,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17958,
                  "mutability": "mutable",
                  "name": "newBeacon",
                  "nameLocation": "5522:9:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 17991,
                  "src": "5514:17:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17957,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5514:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5513:19:9"
            },
            "returnParameters": {
              "id": 17960,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5541:0:9"
            },
            "scope": 18030,
            "src": "5494:371:9",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 18028,
              "nodeType": "Block",
              "src": "6294:217:9",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 18002,
                        "name": "newBeacon",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17994,
                        "src": "6315:9:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 18001,
                      "name": "_setBeacon",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17991,
                      "src": "6304:10:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18003,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6304:21:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18004,
                  "nodeType": "ExpressionStatement",
                  "src": "6304:21:9"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 18006,
                        "name": "newBeacon",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 17994,
                        "src": "6355:9:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 18005,
                      "name": "BeaconUpgraded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17942,
                      "src": "6340:14:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18007,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6340:25:9",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18008,
                  "nodeType": "EmitStatement",
                  "src": "6335:30:9"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 18014,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 18012,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "id": 18009,
                          "name": "data",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17996,
                          "src": "6379:4:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "id": 18010,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "6384:6:9",
                        "memberName": "length",
                        "nodeType": "MemberAccess",
                        "src": "6379:11:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": ">",
                      "rightExpression": {
                        "hexValue": "30",
                        "id": 18011,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6393:1:9",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_0_by_1",
                          "typeString": "int_const 0"
                        },
                        "value": "0"
                      },
                      "src": "6379:15:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "||",
                    "rightExpression": {
                      "id": 18013,
                      "name": "forceCall",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 17998,
                      "src": "6398:9:9",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "6379:28:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18027,
                  "nodeType": "IfStatement",
                  "src": "6375:130:9",
                  "trueBody": {
                    "id": 18026,
                    "nodeType": "Block",
                    "src": "6409:96:9",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "arguments": [
                                    {
                                      "id": 18019,
                                      "name": "newBeacon",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 17994,
                                      "src": "6460:9:9",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "id": 18018,
                                    "name": "IBeacon",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 18386,
                                    "src": "6452:7:9",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_IBeacon_$18386_$",
                                      "typeString": "type(contract IBeacon)"
                                    }
                                  },
                                  "id": 18020,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "nameLocations": [],
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "6452:18:9",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IBeacon_$18386",
                                    "typeString": "contract IBeacon"
                                  }
                                },
                                "id": 18021,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "6471:14:9",
                                "memberName": "implementation",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 18385,
                                "src": "6452:33:9",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                                  "typeString": "function () view external returns (address)"
                                }
                              },
                              "id": 18022,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "nameLocations": [],
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6452:35:9",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 18023,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17996,
                              "src": "6489:4:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "id": 18015,
                              "name": "Address",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 17676,
                              "src": "6423:7:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_Address_$17676_$",
                                "typeString": "type(library Address)"
                              }
                            },
                            "id": 18017,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "6431:20:9",
                            "memberName": "functionDelegateCall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 17563,
                            "src": "6423:28:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (address,bytes memory) returns (bytes memory)"
                            }
                          },
                          "id": 18024,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6423:71:9",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "id": 18025,
                        "nodeType": "ExpressionStatement",
                        "src": "6423:71:9"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 17992,
              "nodeType": "StructuredDocumentation",
              "src": "5871:292:9",
              "text": " @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n Emits a {BeaconUpgraded} event."
            },
            "id": 18029,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_upgradeBeaconToAndCall",
            "nameLocation": "6177:23:9",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 17999,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 17994,
                  "mutability": "mutable",
                  "name": "newBeacon",
                  "nameLocation": "6218:9:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 18029,
                  "src": "6210:17:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17993,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6210:7:9",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17996,
                  "mutability": "mutable",
                  "name": "data",
                  "nameLocation": "6250:4:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 18029,
                  "src": "6237:17:9",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 17995,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "6237:5:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 17998,
                  "mutability": "mutable",
                  "name": "forceCall",
                  "nameLocation": "6269:9:9",
                  "nodeType": "VariableDeclaration",
                  "scope": 18029,
                  "src": "6264:14:9",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 17997,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "6264:4:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6200:84:9"
            },
            "returnParameters": {
              "id": 18000,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6294:0:9"
            },
            "scope": 18030,
            "src": "6168:343:9",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 18031,
        "src": "529:5984:9",
        "usedErrors": []
      }
    ],
    "src": "116:6398:9"
  },
  "bytecode": "",
  "bytecodeSha1": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
  "compiler": {
    "evm_version": "istanbul",
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "version": "0.8.19+commit.7dd6d404"
  },
  "contractName": "ERC1967Upgrade",
  "coverageMap": {
    "branches": {},
    "statements": {}
  },
  "dependencies": [
    "OpenZeppelin/openzeppelin-contracts@4.8.2/Address",
    "OpenZeppelin/openzeppelin-contracts@4.8.2/IBeacon",
    "OpenZeppelin/openzeppelin-contracts@4.8.2/IERC1822Proxiable",
    "OpenZeppelin/openzeppelin-contracts@4.8.2/StorageSlot"
  ],
  "deployedBytecode": "",
  "deployedSourceMap": "",
  "language": "Solidity",
  "natspec": {
    "custom:oz-upgrades-unsafe-allow": "delegatecall",
    "details": "This abstract contract provides getters and event emitting update functions for https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. _Available since v4.1._",
    "events": {
      "AdminChanged(address,address)": {
        "details": "Emitted when the admin account has changed."
      },
      "BeaconUpgraded(address)": {
        "details": "Emitted when the beacon is upgraded."
      },
      "Upgraded(address)": {
        "details": "Emitted when the implementation is upgraded."
      }
    },
    "kind": "dev",
    "methods": {},
    "stateVariables": {
      "_ADMIN_SLOT": {
        "details": "Storage slot with the admin of the contract. This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is validated in the constructor."
      },
      "_BEACON_SLOT": {
        "details": "The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor."
      },
      "_IMPLEMENTATION_SLOT": {
        "details": "Storage slot with the address of the current implementation. This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is validated in the constructor."
      }
    },
    "version": 1
  },
  "offset": [
    529,
    6513
  ],
  "opcodes": "",
  "pcMap": {},
  "sha1": "7134c7dc6d62c58f424d4fe3bf4c3c98bdf180ba",
  "source": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n    // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n    /**\n     * @dev Storage slot with the address of the current implementation.\n     * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     */\n    event Upgraded(address indexed implementation);\n\n    /**\n     * @dev Returns the current implementation address.\n     */\n    function _getImplementation() internal view returns (address) {\n        return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 implementation slot.\n     */\n    function _setImplementation(address newImplementation) private {\n        require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n        StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n    }\n\n    /**\n     * @dev Perform implementation upgrade\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeTo(address newImplementation) internal {\n        _setImplementation(newImplementation);\n        emit Upgraded(newImplementation);\n    }\n\n    /**\n     * @dev Perform implementation upgrade with additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCall(\n        address newImplementation,\n        bytes memory data,\n        bool forceCall\n    ) internal {\n        _upgradeTo(newImplementation);\n        if (data.length > 0 || forceCall) {\n            Address.functionDelegateCall(newImplementation, data);\n        }\n    }\n\n    /**\n     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCallUUPS(\n        address newImplementation,\n        bytes memory data,\n        bool forceCall\n    ) internal {\n        // Upgrades from old implementations will perform a rollback test. This test requires the new\n        // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n        // this special case will break upgrade paths from old UUPS implementation to new ones.\n        if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n            _setImplementation(newImplementation);\n        } else {\n            try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n                require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n            } catch {\n                revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n            }\n            _upgradeToAndCall(newImplementation, data, forceCall);\n        }\n    }\n\n    /**\n     * @dev Storage slot with the admin of the contract.\n     * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /**\n     * @dev Emitted when the admin account has changed.\n     */\n    event AdminChanged(address previousAdmin, address newAdmin);\n\n    /**\n     * @dev Returns the current admin.\n     */\n    function _getAdmin() internal view returns (address) {\n        return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 admin slot.\n     */\n    function _setAdmin(address newAdmin) private {\n        require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n        StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n    }\n\n    /**\n     * @dev Changes the admin of the proxy.\n     *\n     * Emits an {AdminChanged} event.\n     */\n    function _changeAdmin(address newAdmin) internal {\n        emit AdminChanged(_getAdmin(), newAdmin);\n        _setAdmin(newAdmin);\n    }\n\n    /**\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n     */\n    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n    /**\n     * @dev Emitted when the beacon is upgraded.\n     */\n    event BeaconUpgraded(address indexed beacon);\n\n    /**\n     * @dev Returns the current beacon.\n     */\n    function _getBeacon() internal view returns (address) {\n        return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new beacon in the EIP1967 beacon slot.\n     */\n    function _setBeacon(address newBeacon) private {\n        require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n        require(\n            Address.isContract(IBeacon(newBeacon).implementation()),\n            \"ERC1967: beacon implementation is not a contract\"\n        );\n        StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n    }\n\n    /**\n     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n     *\n     * Emits a {BeaconUpgraded} event.\n     */\n    function _upgradeBeaconToAndCall(\n        address newBeacon,\n        bytes memory data,\n        bool forceCall\n    ) internal {\n        _setBeacon(newBeacon);\n        emit BeaconUpgraded(newBeacon);\n        if (data.length > 0 || forceCall) {\n            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n        }\n    }\n}\n",
  "sourceMap": "",
  "sourcePath": "/home/vscode/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.8.2/contracts/proxy/ERC1967/ERC1967Upgrade.sol",
  "type": "contract"
}