Commit b3c3a7e4 authored by XFT-dev's avatar XFT-dev
Browse files

added hardhat support

parent 6edd2b9c

Too many changes to show.

To preserve performance only 126 of 126+ files are displayed.
{
"schemaVersion": "2.0.0",
"contractName": "FlagsInterface",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "",
"type": "address[]"
}
],
"name": "lowerFlags",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "getFlag",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "setRaisingAccessController",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "",
"type": "address[]"
}
],
"name": "raiseFlags",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address[]"
}
],
"name": "getFlags",
"outputs": [
{
"name": "",
"type": "bool[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "raiseFlag",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"getFlag(address)": "357e47fe",
"getFlags(address[])": "7d723cac",
"lowerFlags(address[])": "28286596",
"raiseFlag(address)": "d74af263",
"raiseFlags(address[])": "760bc82d",
"setRaisingAccessController(address)": "517e89fe"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/FlagsInterface.sol": {
"id": 16
}
},
"sourceCodes": {
"interfaces/FlagsInterface.sol": "pragma solidity >=0.5.0;\n\ninterface FlagsInterface {\n function getFlag(address) external view returns (bool);\n function getFlags(address[] calldata) external view returns (bool[] memory);\n function raiseFlag(address) external;\n function raiseFlags(address[] calldata) external;\n function lowerFlags(address[] calldata) external;\n function setRaisingAccessController(address) external;\n}\n"
},
"sourceTreeHashHex": "0xe0394ba89d39b0241ed57fafe061b64dcd1310e07c9e3dd9f994352aba45e7bb",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "GetterSetter",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "requestId",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getBytes",
"outputs": [
{
"name": "",
"type": "bytes"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getBytes32",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "requestedUint256",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_value",
"type": "bytes"
}
],
"name": "requestedBytes",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getUint256",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_value",
"type": "bytes32"
}
],
"name": "setBytes32",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_value",
"type": "uint256"
}
],
"name": "setUint256",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_value",
"type": "bytes"
}
],
"name": "setBytes",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_value",
"type": "bytes32"
}
],
"name": "requestedBytes32",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "from",
"type": "address"
},
{
"indexed": true,
"name": "value",
"type": "bytes32"
}
],
"name": "SetBytes32",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "from",
"type": "address"
},
{
"indexed": true,
"name": "value",
"type": "uint256"
}
],
"name": "SetUint256",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "from",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "bytes"
}
],
"name": "SetBytes",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "b32",
"type": "bytes32"
},
{
"indexed": false,
"name": "u256",
"type": "uint256"
},
{
"indexed": false,
"name": "b322",
"type": "bytes32"
}
],
"name": "Output",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405234801561001057600080fd5b50610670806100206000396000f3fe6080604052600436106100a25763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416626d6cae81146100a75780630bcd3b33146100ce5780631f903037146101585780633345b4d01461016d57806346ddd1ff1461019f5780636889597914610259578063c2b12a731461026e578063d2282dc514610298578063da359dc8146102c2578063ed53e51114610375575b600080fd5b3480156100b357600080fd5b506100bc6103a5565b60408051918252519081900360200190f35b3480156100da57600080fd5b506100e36103ab565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561011d578181015183820152602001610105565b50505050905090810190601f16801561014a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561016457600080fd5b506100bc610457565b34801561017957600080fd5b5061019d6004803603604081101561019057600080fd5b508035906020013561045d565b005b3480156101ab57600080fd5b5061019d600480360360408110156101c257600080fd5b813591908101906040810160208201356401000000008111156101e457600080fd5b8201836020820111156101f657600080fd5b8035906020019184600183028401116401000000008311171561021857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061046f945050505050565b34801561026557600080fd5b506100bc61047d565b34801561027a57600080fd5b5061019d6004803603602081101561029157600080fd5b5035610483565b3480156102a457600080fd5b5061019d600480360360208110156102bb57600080fd5b50356104b6565b3480156102ce57600080fd5b5061019d600480360360208110156102e557600080fd5b81019060208101813564010000000081111561030057600080fd5b82018360208201111561031257600080fd5b8035906020019184600183028401116401000000008311171561033457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104eb945050505050565b34801561038157600080fd5b5061019d6004803603604081101561039857600080fd5b508035906020013561059b565b60025481565b6003805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044f5780601f106104245761010080835404028352916020019161044f565b820191906000526020600020905b81548152906001019060200180831161043257829003601f168201915b505050505081565b60005481565b600282905561046b816104b6565b5050565b600282905561046b816104eb565b60015481565b6000818155604051829133917fdc73ee99832252105ed74a404690c2f10ad1b294cbbeb0ff5cded48ef2aa437d9190a350565b6001819055604051819033907fd943f063acdb1c6f206cf6a3f6d1ba39687bcc07feb7f44019bdbd4773c9c28d90600090a350565b80516104fe9060039060208401906105a9565b50604080516020808252835181830152835133937ff22a519d38e59bc517532f666f8da532fdd5356e68d617191e82a8fdcc8abdcf9386939092839283019185019080838360005b8381101561055e578181015183820152602001610546565b50505050905090810190601f16801561058b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a250565b600282905561046b81610483565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106105ea57805160ff1916838001178555610617565b82800160010185558215610617579182015b828111156106175782518255916020019190600101906105fc565b50610623929150610627565b5090565b61064191905b80821115610623576000815560010161062d565b9056fea165627a7a723058202a67006537418cc67f9e953f984161ac190bf229deb08ddad5494be1e5325f3d0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x670 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA2 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH3 0x6D6CAE DUP2 EQ PUSH2 0xA7 JUMPI DUP1 PUSH4 0xBCD3B33 EQ PUSH2 0xCE JUMPI DUP1 PUSH4 0x1F903037 EQ PUSH2 0x158 JUMPI DUP1 PUSH4 0x3345B4D0 EQ PUSH2 0x16D JUMPI DUP1 PUSH4 0x46DDD1FF EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x68895979 EQ PUSH2 0x259 JUMPI DUP1 PUSH4 0xC2B12A73 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0xD2282DC5 EQ PUSH2 0x298 JUMPI DUP1 PUSH4 0xDA359DC8 EQ PUSH2 0x2C2 JUMPI DUP1 PUSH4 0xED53E511 EQ PUSH2 0x375 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBC PUSH2 0x3A5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE3 PUSH2 0x3AB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x105 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x14A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x164 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBC PUSH2 0x457 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x179 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x190 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x45D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x218 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x46F SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBC PUSH2 0x47D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x291 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x483 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x4B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x300 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x312 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x4EB SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x381 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x398 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x59B JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x44F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x424 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x44F JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x432 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x2 DUP3 SWAP1 SSTORE PUSH2 0x46B DUP2 PUSH2 0x4B6 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x2 DUP3 SWAP1 SSTORE PUSH2 0x46B DUP2 PUSH2 0x4EB JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP2 CALLER SWAP2 PUSH32 0xDC73EE99832252105ED74A404690C2F10AD1B294CBBEB0FF5CDED48EF2AA437D SWAP2 SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0x1 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 SWAP1 CALLER SWAP1 PUSH32 0xD943F063ACDB1C6F206CF6A3F6D1BA39687BCC07FEB7F44019BDBD4773C9C28D SWAP1 PUSH1 0x0 SWAP1 LOG3 POP JUMP JUMPDEST DUP1 MLOAD PUSH2 0x4FE SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH2 0x5A9 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD CALLER SWAP4 PUSH32 0xF22A519D38E59BC517532F666F8DA532FDD5356E68D617191E82A8FDCC8ABDCF SWAP4 DUP7 SWAP4 SWAP1 SWAP3 DUP4 SWAP3 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x55E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x546 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x58B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x2 DUP3 SWAP1 SSTORE PUSH2 0x46B DUP2 PUSH2 0x483 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x5EA JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x617 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x617 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x617 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x5FC JUMP JUMPDEST POP PUSH2 0x623 SWAP3 SWAP2 POP PUSH2 0x627 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x641 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x623 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x62D JUMP JUMPDEST SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0x2a PUSH8 0x6537418CC67F9E SWAP6 EXTCODEHASH SWAP9 COINBASE PUSH2 0xAC19 SIGNEXTEND CALLCODE 0x29 0xde 0xb0 DUP14 0xda 0xd5 0x49 0x4b 0xe1 0xe5 ORIGIN 0x5f RETURNDATASIZE STOP 0x29 ",
"sourceMap": "103:1122:25:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;103:1122:25;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100a25763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416626d6cae81146100a75780630bcd3b33146100ce5780631f903037146101585780633345b4d01461016d57806346ddd1ff1461019f5780636889597914610259578063c2b12a731461026e578063d2282dc514610298578063da359dc8146102c2578063ed53e51114610375575b600080fd5b3480156100b357600080fd5b506100bc6103a5565b60408051918252519081900360200190f35b3480156100da57600080fd5b506100e36103ab565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561011d578181015183820152602001610105565b50505050905090810190601f16801561014a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561016457600080fd5b506100bc610457565b34801561017957600080fd5b5061019d6004803603604081101561019057600080fd5b508035906020013561045d565b005b3480156101ab57600080fd5b5061019d600480360360408110156101c257600080fd5b813591908101906040810160208201356401000000008111156101e457600080fd5b8201836020820111156101f657600080fd5b8035906020019184600183028401116401000000008311171561021857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061046f945050505050565b34801561026557600080fd5b506100bc61047d565b34801561027a57600080fd5b5061019d6004803603602081101561029157600080fd5b5035610483565b3480156102a457600080fd5b5061019d600480360360208110156102bb57600080fd5b50356104b6565b3480156102ce57600080fd5b5061019d600480360360208110156102e557600080fd5b81019060208101813564010000000081111561030057600080fd5b82018360208201111561031257600080fd5b8035906020019184600183028401116401000000008311171561033457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104eb945050505050565b34801561038157600080fd5b5061019d6004803603604081101561039857600080fd5b508035906020013561059b565b60025481565b6003805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044f5780601f106104245761010080835404028352916020019161044f565b820191906000526020600020905b81548152906001019060200180831161043257829003601f168201915b505050505081565b60005481565b600282905561046b816104b6565b5050565b600282905561046b816104eb565b60015481565b6000818155604051829133917fdc73ee99832252105ed74a404690c2f10ad1b294cbbeb0ff5cded48ef2aa437d9190a350565b6001819055604051819033907fd943f063acdb1c6f206cf6a3f6d1ba39687bcc07feb7f44019bdbd4773c9c28d90600090a350565b80516104fe9060039060208401906105a9565b50604080516020808252835181830152835133937ff22a519d38e59bc517532f666f8da532fdd5356e68d617191e82a8fdcc8abdcf9386939092839283019185019080838360005b8381101561055e578181015183820152602001610546565b50505050905090810190601f16801561058b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a250565b600282905561046b81610483565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106105ea57805160ff1916838001178555610617565b82800160010185558215610617579182015b828111156106175782518255916020019190600101906105fc565b50610623929150610627565b5090565b61064191905b80821115610623576000815560010161062d565b9056fea165627a7a723058202a67006537418cc67f9e953f984161ac190bf229deb08ddad5494be1e5325f3d0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA2 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH3 0x6D6CAE DUP2 EQ PUSH2 0xA7 JUMPI DUP1 PUSH4 0xBCD3B33 EQ PUSH2 0xCE JUMPI DUP1 PUSH4 0x1F903037 EQ PUSH2 0x158 JUMPI DUP1 PUSH4 0x3345B4D0 EQ PUSH2 0x16D JUMPI DUP1 PUSH4 0x46DDD1FF EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x68895979 EQ PUSH2 0x259 JUMPI DUP1 PUSH4 0xC2B12A73 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0xD2282DC5 EQ PUSH2 0x298 JUMPI DUP1 PUSH4 0xDA359DC8 EQ PUSH2 0x2C2 JUMPI DUP1 PUSH4 0xED53E511 EQ PUSH2 0x375 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBC PUSH2 0x3A5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE3 PUSH2 0x3AB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x105 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x14A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x164 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBC PUSH2 0x457 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x179 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x190 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x45D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x218 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x46F SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBC PUSH2 0x47D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x291 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x483 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x4B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x300 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x312 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x334 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x4EB SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x381 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x398 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x59B JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x44F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x424 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x44F JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x432 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x2 DUP3 SWAP1 SSTORE PUSH2 0x46B DUP2 PUSH2 0x4B6 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x2 DUP3 SWAP1 SSTORE PUSH2 0x46B DUP2 PUSH2 0x4EB JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP2 CALLER SWAP2 PUSH32 0xDC73EE99832252105ED74A404690C2F10AD1B294CBBEB0FF5CDED48EF2AA437D SWAP2 SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0x1 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD DUP2 SWAP1 CALLER SWAP1 PUSH32 0xD943F063ACDB1C6F206CF6A3F6D1BA39687BCC07FEB7F44019BDBD4773C9C28D SWAP1 PUSH1 0x0 SWAP1 LOG3 POP JUMP JUMPDEST DUP1 MLOAD PUSH2 0x4FE SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH2 0x5A9 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD CALLER SWAP4 PUSH32 0xF22A519D38E59BC517532F666F8DA532FDD5356E68D617191E82A8FDCC8ABDCF SWAP4 DUP7 SWAP4 SWAP1 SWAP3 DUP4 SWAP3 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x55E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x546 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x58B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x2 DUP3 SWAP1 SSTORE PUSH2 0x46B DUP2 PUSH2 0x483 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x5EA JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x617 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x617 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x617 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x5FC JUMP JUMPDEST POP PUSH2 0x623 SWAP3 SWAP2 POP PUSH2 0x627 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x641 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x623 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x62D JUMP JUMPDEST SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0x2a PUSH8 0x6537418CC67F9E SWAP6 EXTCODEHASH SWAP9 COINBASE PUSH2 0xAC19 SIGNEXTEND CALLCODE 0x29 0xde 0xb0 DUP14 0xda 0xd5 0x49 0x4b 0xe1 0xe5 ORIGIN 0x5f RETURNDATASIZE STOP 0x29 ",
"sourceMap": "103:1122:25:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;187:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;187:24:25;;;;;;;;;;;;;;;;;;;;215:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;215:21:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;215:21:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;129:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;129:25:25;;;;1097:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1097:126:25;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1097:126:25;;;;;;;;;;848:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;848:127:25;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;848:127:25;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;848:127:25;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;848:127:25;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;848:127:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;848:127:25;;-1:-1:-1;848:127:25;;-1:-1:-1;;;;;848:127:25;158:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;158:25:25;;;;483:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;483:114:25;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;483:114:25;;;979;;8:9:-1;5:2;;;30:1;27;20:12;5:2;979:114:25;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;979:114:25;;;731:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;731:113:25;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;731:113:25;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;731:113:25;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;731:113:25;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;731:113:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;731:113:25;;-1:-1:-1;731:113:25;;-1:-1:-1;;;;;731:113:25;601:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;601:126:25;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;601:126:25;;;;;;;;187:24;;;;:::o;215:21::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;129:25::-;;;;:::o;1097:126::-;1172:9;:22;;;1200:18;1211:6;1200:10;:18::i;:::-;1097:126;;:::o;848:127::-;926:9;:22;;;954:16;963:6;954:8;:16::i;158:25::-;;;;:::o;483:114::-;532:10;:19;;;562:30;;545:6;;573:10;;562:30;;532:10;562:30;483:114;:::o;979:::-;1028:10;:19;;;1058:30;;1041:6;;1069:10;;1058:30;;;;;979:114;:::o;731:113::-;783:17;;;;:8;;:17;;;;;:::i;:::-;-1:-1:-1;811:28:25;;;;;;;;;;;;;;;820:10;;811:28;;832:6;;811:28;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;811:28:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;731:113;:::o;601:126::-;676:9;:22;;;704:18;715:6;704:10;:18::i;103:1122::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;103:1122:25;;;-1:-1:-1;103:1122:25;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o"
},
"methodIdentifiers": {
"getBytes()": "0bcd3b33",
"getBytes32()": "1f903037",
"getUint256()": "68895979",
"requestId()": "006d6cae",
"requestedBytes(bytes32,bytes)": "46ddd1ff",
"requestedBytes32(bytes32,bytes32)": "ed53e511",
"requestedUint256(bytes32,uint256)": "3345b4d0",
"setBytes(bytes)": "da359dc8",
"setBytes32(bytes32)": "c2b12a73",
"setUint256(uint256)": "d2282dc5"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"requestId\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getBytes\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getBytes32\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"requestedUint256\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_value\",\"type\":\"bytes\"}],\"name\":\"requestedBytes\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getUint256\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setBytes32\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"setUint256\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_value\",\"type\":\"bytes\"}],\"name\":\"setBytes\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"requestedBytes32\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"value\",\"type\":\"bytes32\"}],\"name\":\"SetBytes32\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SetUint256\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"bytes\"}],\"name\":\"SetBytes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"b32\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"u256\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"b322\",\"type\":\"bytes32\"}],\"name\":\"Output\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/GetterSetter.sol\":\"GetterSetter\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/GetterSetter.sol\":{\"keccak256\":\"0xb25cd13750633ad7cc7686f4025b02883643977bb5826179322221aaaf8cc396\",\"urls\":[\"bzzr://c80908b763a7ff48279680183a599097706669b63cbb2770e55ec1798659c4e6\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/GetterSetter.sol": {
"id": 25
}
},
"sourceCodes": {
"tests/GetterSetter.sol": "pragma solidity 0.5.0;\n\n// GetterSetter is a contract to aid debugging and testing during development.\ncontract GetterSetter {\n bytes32 public getBytes32;\n uint256 public getUint256;\n bytes32 public requestId;\n bytes public getBytes;\n\n event SetBytes32(address indexed from, bytes32 indexed value);\n event SetUint256(address indexed from, uint256 indexed value);\n event SetBytes(address indexed from, bytes value);\n\n event Output(bytes32 b32, uint256 u256, bytes32 b322);\n\n function setBytes32(bytes32 _value) public {\n getBytes32 = _value;\n emit SetBytes32(msg.sender, _value);\n }\n\n function requestedBytes32(bytes32 _requestId, bytes32 _value) public {\n requestId = _requestId;\n setBytes32(_value);\n }\n\n function setBytes(bytes memory _value) public {\n getBytes = _value;\n emit SetBytes(msg.sender, _value);\n }\n\n function requestedBytes(bytes32 _requestId, bytes memory _value) public {\n requestId = _requestId;\n setBytes(_value);\n }\n\n function setUint256(uint256 _value) public {\n getUint256 = _value;\n emit SetUint256(msg.sender, _value);\n }\n\n function requestedUint256(bytes32 _requestId, uint256 _value) public {\n requestId = _requestId;\n setUint256(_value);\n }\n}\n"
},
"sourceTreeHashHex": "0xb25cd13750633ad7cc7686f4025b02883643977bb5826179322221aaaf8cc396",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "LinkTokenInterface",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "name",
"outputs": [
{
"name": "tokenName",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "spender",
"type": "address"
},
{
"name": "value",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"name": "totalTokensIssued",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "from",
"type": "address"
},
{
"name": "to",
"type": "address"
},
{
"name": "value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "decimals",
"outputs": [
{
"name": "decimalPlaces",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "to",
"type": "address"
},
{
"name": "value",
"type": "uint256"
},
{
"name": "data",
"type": "bytes"
}
],
"name": "transferAndCall",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "spender",
"type": "address"
},
{
"name": "addedValue",
"type": "uint256"
}
],
"name": "decreaseApproval",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "balance",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "symbol",
"outputs": [
{
"name": "tokenSymbol",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "to",
"type": "address"
},
{
"name": "value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "spender",
"type": "address"
},
{
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "increaseApproval",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "owner",
"type": "address"
},
{
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"name": "remaining",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"allowance(address,address)": "dd62ed3e",
"approve(address,uint256)": "095ea7b3",
"balanceOf(address)": "70a08231",
"decimals()": "313ce567",
"decreaseApproval(address,uint256)": "66188463",
"increaseApproval(address,uint256)": "d73dd623",
"name()": "06fdde03",
"symbol()": "95d89b41",
"totalSupply()": "18160ddd",
"transfer(address,uint256)": "a9059cbb",
"transferAndCall(address,uint256,bytes)": "4000aea0",
"transferFrom(address,address,uint256)": "23b872dd"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/LinkTokenInterface.sol": {
"id": 17
}
},
"sourceCodes": {
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.5.0;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string memory tokenName);\n function symbol() external view returns (string memory tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n"
},
"sourceTreeHashHex": "0x592d87884106ba82cedbe79922de9cfaf28b211a09f9be243ad767d3baa1cb90",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "LinkTokenReceiver",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "getChainlinkToken",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_sender",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
},
{
"name": "_data",
"type": "bytes"
}
],
"name": "onTokenTransfer",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"methods": {
"onTokenTransfer(address,uint256,bytes)": {
"details": "The data payload's first 2 words will be overwritten by the `_sender` and `_amount` values to ensure correctness. Calls oracleRequest.",
"params": {
"_amount": "Amount of LINK sent (specified in wei)",
"_data": "Payload of the transaction",
"_sender": "Address of the sender"
}
}
}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"getChainlinkToken()": "165d35e1",
"onTokenTransfer(address,uint256,bytes)": "a4c0ed36"
}
},
"metadata": "",
"userdoc": {
"methods": {
"onTokenTransfer(address,uint256,bytes)": {
"notice": "Called when LINK is sent to the contract via `transferAndCall`"
}
}
}
},
"sources": {
"LinkTokenReceiver.sol": {
"id": 2
}
},
"sourceCodes": {
"LinkTokenReceiver.sol": "pragma solidity ^0.5.0;\n\ncontract LinkTokenReceiver {\n\n bytes4 constant private ORACLE_REQUEST_SELECTOR = 0x40429946;\n uint256 constant private SELECTOR_LENGTH = 4;\n uint256 constant private EXPECTED_REQUEST_WORDS = 2;\n uint256 constant private MINIMUM_REQUEST_LENGTH = SELECTOR_LENGTH + (32 * EXPECTED_REQUEST_WORDS);\n /**\n * @notice Called when LINK is sent to the contract via `transferAndCall`\n * @dev The data payload's first 2 words will be overwritten by the `_sender` and `_amount`\n * values to ensure correctness. Calls oracleRequest.\n * @param _sender Address of the sender\n * @param _amount Amount of LINK sent (specified in wei)\n * @param _data Payload of the transaction\n */\n function onTokenTransfer(\n address _sender,\n uint256 _amount,\n bytes memory _data\n )\n public\n onlyLINK\n validRequestLength(_data)\n permittedFunctionsForLINK(_data)\n {\n assembly {\n // solhint-disable-next-line avoid-low-level-calls\n mstore(add(_data, 36), _sender) // ensure correct sender is passed\n // solhint-disable-next-line avoid-low-level-calls\n mstore(add(_data, 68), _amount) // ensure correct amount is passed\n }\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, ) = address(this).delegatecall(_data); // calls oracleRequest\n require(success, \"Unable to create request\");\n }\n\n function getChainlinkToken() public view returns (address);\n\n /**\n * @dev Reverts if not sent from the LINK token\n */\n modifier onlyLINK() {\n require(msg.sender == getChainlinkToken(), \"Must use LINK token\");\n _;\n }\n\n /**\n * @dev Reverts if the given data does not begin with the `oracleRequest` function selector\n * @param _data The data payload of the request\n */\n modifier permittedFunctionsForLINK(bytes memory _data) {\n bytes4 funcSelector;\n assembly {\n // solhint-disable-next-line avoid-low-level-calls\n funcSelector := mload(add(_data, 32))\n }\n require(funcSelector == ORACLE_REQUEST_SELECTOR, \"Must use whitelisted functions\");\n _;\n }\n\n /**\n * @dev Reverts if the given payload is less than needed to create a request\n * @param _data The request payload\n */\n modifier validRequestLength(bytes memory _data) {\n require(_data.length >= MINIMUM_REQUEST_LENGTH, \"Invalid request length\");\n _;\n }\n}"
},
"sourceTreeHashHex": "0x7aea15111145093a05ed12403c1dc1a615abb1a629bfc32043a4f43cee1ff929",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "MaliciousChainlink",
"compilerOutput": {
"abi": [],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820929ddb658e7728947311ff0d1fd3fd975b227b22a9c04c3f1f56d3323449dc0e0029",
"opcodes": "PUSH1 0x4C PUSH1 0x2C PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x0 DUP2 EQ PUSH1 0x1C JUMPI PUSH1 0x1E JUMP JUMPDEST INVALID JUMPDEST POP ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 SWAP3 SWAP14 0xdb PUSH6 0x8E7728947311 SELFDESTRUCT 0xd 0x1f 0xd3 REVERT SWAP8 JUMPDEST 0x22 PUSH28 0x22A9C04C3F1F56D3323449DC0E002900000000000000000000000000 ",
"sourceMap": "153:1792:26:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820929ddb658e7728947311ff0d1fd3fd975b227b22a9c04c3f1f56d3323449dc0e0029",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 SWAP3 SWAP14 0xdb PUSH6 0x8E7728947311 SELFDESTRUCT 0xd 0x1f 0xd3 REVERT SWAP8 JUMPDEST 0x22 PUSH28 0x22A9C04C3F1F56D3323449DC0E002900000000000000000000000000 ",
"sourceMap": "153:1792:26:-;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MaliciousChainlink.sol\":\"MaliciousChainlink\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MaliciousChainlink.sol\":{\"keccak256\":\"0x8ceb713a1355edbb0da9866efb81b23ffc2908127fb214112b6ef8a5371c21c5\",\"urls\":[\"bzzr://cc6617dabb50c278f4ee65902d57cd871c883f9842a5617b7588d8688b330d2e\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/MaliciousChainlink.sol": {
"id": 26
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
}
},
"sourceCodes": {
"tests/MaliciousChainlink.sol": "pragma solidity 0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"../vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"../vendor/Buffer.sol\";\n\nlibrary MaliciousChainlink {\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 specId;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n struct WithdrawRequest {\n bytes32 specId;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n function initializeWithdraw(\n WithdrawRequest memory self,\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (MaliciousChainlink.WithdrawRequest memory) {\n Buffer_Chainlink.init(self.buf, 128);\n self.specId = _specId;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}"
},
"sourceTreeHashHex": "0x50be8922745cbb67b6154fc4d65fcfb4d9ab9674bab3a2b793ee3926f7fd545b",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "MaliciousChainlinkClient",
"compilerOutput": {
"abi": [
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405260016004556001600655348015601957600080fd5b5060358060276000396000f3fe6080604052600080fdfea165627a7a72305820af1c68799f7d7cd35d5d8207bee297ed0b8e086a631d80d5290e83d8523afac20029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE PUSH1 0x1 PUSH1 0x6 SSTORE CALLVALUE DUP1 ISZERO PUSH1 0x19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x35 DUP1 PUSH1 0x27 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xaf SHR PUSH9 0x799F7D7CD35D5D8207 0xbe 0xe2 SWAP8 0xed SIGNEXTEND DUP15 ADDMOD PUSH11 0x631D80D5290E83D8523AFA 0xc2 STOP 0x29 ",
"sourceMap": "135:3808:27:-;;;1131:1:1;1100:32;;435:1:27;399:37;;135:3808;8:9:-1;5:2;;;30:1;27;20:12;5:2;135:3808:27;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600080fdfea165627a7a72305820af1c68799f7d7cd35d5d8207bee297ed0b8e086a631d80d5290e83d8523afac20029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xaf SHR PUSH9 0x799F7D7CD35D5D8207 0xbe 0xe2 SWAP8 0xed SIGNEXTEND DUP15 ADDMOD PUSH11 0x631D80D5290E83D8523AFA 0xc2 STOP 0x29 ",
"sourceMap": "135:3808:27:-;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MaliciousChainlinkClient.sol\":\"MaliciousChainlinkClient\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Chainlink.sol\":{\"keccak256\":\"0x2e22ca7d3cfdca8f53ff01c25460f72c2634fd778746f9ec2e608412d0ab037c\",\"urls\":[\"bzzr://cee187a0a12f045523125e4522ddde4610ea5f000c1f92acbb7be778eaf8a4ed\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/ChainlinkClient.sol\":{\"keccak256\":\"0xf26d2fb1abfa4415c00313dded53fa99e813e06201e970b409aa444154a1c0eb\",\"urls\":[\"bzzr://9b4c84585da86567d244bf59370c53bb5e05b4be73030e86a8b0883329435564\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x8871fe810c2efc580e8173e1751df0023b362f4835e44383bd95ee375c4388b9\",\"urls\":[\"bzzr://1c0bdf40cbcbe3fe7491c673d5db4561e85f3f02bd5f3851c857c6d5f7987c45\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ENSInterface.sol\":{\"keccak256\":\"0x87607c12cc84c57afbcb38f00d96ae67c433474c1310a0c2798e2a728f41750d\",\"urls\":[\"bzzr://10a880076bf0b03ef9bd153e7f6ca18e65f15c9f7bf4b0883e93b8de67dd22c2\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x592d87884106ba82cedbe79922de9cfaf28b211a09f9be243ad767d3baa1cb90\",\"urls\":[\"bzzr://1f4a72f8b790700d839354d412df656d5a59877264c6e126a1deae6164de9e7d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/PointerInterface.sol\":{\"keccak256\":\"0xdc08ab9320d187dbaffa20dc31d331f8067fa534c9a654aab8f9ffa63df450da\",\"urls\":[\"bzzr://7e34f1d953ea72152d9daffea28117d5d31d85891f2cac5f1ded4a589cad4874\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MaliciousChainlink.sol\":{\"keccak256\":\"0x8ceb713a1355edbb0da9866efb81b23ffc2908127fb214112b6ef8a5371c21c5\",\"urls\":[\"bzzr://cc6617dabb50c278f4ee65902d57cd871c883f9842a5617b7588d8688b330d2e\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MaliciousChainlinkClient.sol\":{\"keccak256\":\"0x59d016ed9af3c3414ca30787409c989c91f29dde7a549bad3307fc340d18a8fb\",\"urls\":[\"bzzr://f0b773051bc677c21997fe932b83921494abb240dfa6aefae6ab81330edf4d58\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/ENSResolver.sol\":{\"keccak256\":\"0x64fcf7d2fc5efc87eaf7eba4a8f69af4d28986b6e4fb3590f076eb41ce40296e\",\"urls\":[\"bzzr://09e1bdee1831b5e85d3c7b5d96b7c26ad54e96d654cfaf18f58449c4c45961fc\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0x796a82f2e4ab35469224050fb62ecd2dc038474e7f9d4dfd7a1023080c009883\",\"urls\":[\"bzzr://6e0bb08f77ca150b228e70773696ea301e939c0b5542fedb05276b683b774e13\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/MaliciousChainlinkClient.sol": {
"id": 27
},
"tests/MaliciousChainlink.sol": {
"id": 26
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"ChainlinkClient.sol": {
"id": 1
},
"Chainlink.sol": {
"id": 0
},
"interfaces/ENSInterface.sol": {
"id": 15
},
"interfaces/LinkTokenInterface.sol": {
"id": 17
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 14
},
"interfaces/PointerInterface.sol": {
"id": 19
},
"vendor/ENSResolver.sol": {
"id": 35
},
"vendor/SafeMathChainlink.sol": {
"id": 37
}
},
"sourceCodes": {
"tests/MaliciousChainlinkClient.sol": "pragma solidity 0.5.0;\n\nimport \"./MaliciousChainlink.sol\";\nimport \"../ChainlinkClient.sol\";\nimport \"../vendor/SafeMathChainlink.sol\";\n\ncontract MaliciousChainlinkClient is ChainlinkClient {\n using MaliciousChainlink for MaliciousChainlink.Request;\n using MaliciousChainlink for MaliciousChainlink.WithdrawRequest;\n using Chainlink for Chainlink.Request;\n using SafeMathChainlink for uint256;\n\n uint256 private maliciousRequests = 1;\n mapping(bytes32 => address) private maliciousPendingRequests;\n\n function newWithdrawRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (MaliciousChainlink.WithdrawRequest memory) {\n MaliciousChainlink.WithdrawRequest memory req;\n return req.initializeWithdraw(_specId, _callbackAddress, _callbackFunction);\n }\n\n function chainlinkTargetRequest(address _target, Chainlink.Request memory _req, uint256 _amount)\n internal\n returns(bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(_target, maliciousRequests));\n _req.nonce = maliciousRequests;\n maliciousPendingRequests[requestId] = chainlinkOracleAddress();\n emit ChainlinkRequested(requestId);\n LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());\n require(_link.transferAndCall(chainlinkOracleAddress(), _amount, encodeTargetRequest(_req)), \"Unable to transferAndCall to oracle\");\n maliciousRequests += 1;\n\n return requestId;\n }\n\n function chainlinkPriceRequest(Chainlink.Request memory _req, uint256 _amount)\n internal\n returns(bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, maliciousRequests));\n _req.nonce = maliciousRequests;\n maliciousPendingRequests[requestId] = chainlinkOracleAddress();\n emit ChainlinkRequested(requestId);\n LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());\n require(_link.transferAndCall(chainlinkOracleAddress(), _amount, encodePriceRequest(_req)), \"Unable to transferAndCall to oracle\");\n maliciousRequests += 1;\n\n return requestId;\n }\n\n function chainlinkWithdrawRequest(MaliciousChainlink.WithdrawRequest memory _req, uint256 _wei)\n internal\n returns(bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, maliciousRequests));\n _req.nonce = maliciousRequests;\n maliciousPendingRequests[requestId] = chainlinkOracleAddress();\n emit ChainlinkRequested(requestId);\n LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());\n require(_link.transferAndCall(chainlinkOracleAddress(), _wei, encodeWithdrawRequest(_req)), \"Unable to transferAndCall to oracle\");\n maliciousRequests += 1;\n return requestId;\n }\n\n function encodeWithdrawRequest(MaliciousChainlink.WithdrawRequest memory _req)\n internal pure returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"withdraw(address,uint256)\")),\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n _req.buf.buf);\n }\n\n function encodeTargetRequest(Chainlink.Request memory _req)\n internal pure returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)\")),\n 0, // overridden by onTokenTransfer\n 0, // overridden by onTokenTransfer\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n 1,\n _req.buf.buf);\n }\n\n function encodePriceRequest(Chainlink.Request memory _req)\n internal pure returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)\")),\n 0, // overridden by onTokenTransfer\n 2000000000000000000, // overridden by onTokenTransfer\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n 1,\n _req.buf.buf);\n }\n}\n",
"tests/MaliciousChainlink.sol": "pragma solidity 0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"../vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"../vendor/Buffer.sol\";\n\nlibrary MaliciousChainlink {\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 specId;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n struct WithdrawRequest {\n bytes32 specId;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n function initializeWithdraw(\n WithdrawRequest memory self,\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (MaliciousChainlink.WithdrawRequest memory) {\n Buffer_Chainlink.init(self.buf, 128);\n self.specId = _specId;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}",
"ChainlinkClient.sol": "pragma solidity ^0.5.0;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = address(0);\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requestCount = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(address(oracle), _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requestCount));\n _req.nonce = requestCount;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requestCount += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId],\n \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes memory _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"interfaces/ENSInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address _owner) external;\n function setResolver(bytes32 node, address _resolver) external;\n function setOwner(bytes32 node, address _owner) external;\n function setTTL(bytes32 node, uint64 _ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.5.0;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string memory tokenName);\n function symbol() external view returns (string memory tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 requestPrice,\n bytes32 serviceAgreementID,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 dataVersion,\n bytes calldata data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.5.0;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity ^0.5.0;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n",
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.5.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMathChainlink {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n // Solidity only automatically asserts when dividing by 0\n require(b > 0, \"SafeMath: division by zero\");\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b != 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n}\n"
},
"sourceTreeHashHex": "0xd239e3c68502990ddf91e469bd8439813b287c4c7a11a5fed8aaf274858caf1e",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "MaliciousConsumer",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [
{
"name": "",
"type": "bytes32"
},
{
"name": "",
"type": "bytes32"
}
],
"name": "doesNothing",
"outputs": [],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "",
"type": "bytes32"
}
],
"name": "stealEthCall",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "remove",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "",
"type": "bytes32"
}
],
"name": "stealEthSend",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "",
"type": "bytes32"
}
],
"name": "cancelRequestOnFulfill",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "",
"type": "bytes32"
}
],
"name": "stealEthTransfer",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_id",
"type": "bytes32"
},
{
"name": "_callbackFunc",
"type": "bytes"
}
],
"name": "requestData",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "bytes32"
},
{
"name": "",
"type": "bytes32"
}
],
"name": "assertFail",
"outputs": [],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"name": "_link",
"type": "address"
},
{
"name": "_oracle",
"type": "address"
}
],
"payable": true,
"stateMutability": "payable",
"type": "constructor"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x60806040818152600160045580610fd68339810180604052604081101561002557600080fd5b50805160209091015161004082640100000000610059810204565b6100528164010000000061007b810204565b505061009d565b60028054600160a060020a031916600160a060020a0392909216919091179055565b60038054600160a060020a031916600160a060020a0392909216919091179055565b610f2a806100ac6000396000f3fe60806040526004361061008d5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631eb0f610811461008f578063a09d636a146100bf578063a7f43779146100ef578063acdf0ba214610104578063b40584e814610134578063c728f72014610164578063c737ecab14610194578063e7eb2b171461024e575b005b34801561009b57600080fd5b5061008d600480360360408110156100b257600080fd5b508035906020013561027e565b3480156100cb57600080fd5b5061008d600480360360408110156100e257600080fd5b5080359060200135610282565b3480156100fb57600080fd5b5061008d610457565b34801561011057600080fd5b5061008d6004803603604081101561012757600080fd5b508035906020013561045b565b34801561014057600080fd5b5061008d6004803603604081101561015757600080fd5b50803590602001356105fa565b34801561017057600080fd5b5061008d6004803603604081101561018757600080fd5b5080359060200135610636565b3480156101a057600080fd5b5061008d600480360360408110156101b757600080fd5b813591908101906040810160208201356401000000008111156101d957600080fd5b8201836020820111156101eb57600080fd5b8035906020019184600183028401116401000000008311171561020d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610774945050505050565b34801561025a57600080fd5b5061008d6004803603604081101561027157600080fd5b50803590602001356107b7565b5050565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461033c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a260405160009030906064908381818185875af1925050503d80600081146103da576040519150601f19603f3d011682016040523d82523d6000602084013e6103df565b606091505b5050905080151561045157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f43616c6c206661696c6564000000000000000000000000000000000000000000604482015290519081900360640190fd5b50505050565b6000ff5b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461051557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a26040516000903090829060649082818181858883f19350505050905080151561045157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f53656e64206661696c6564000000000000000000000000000000000000000000604482015290519081900360640190fd5b61027e82670de0b6b3a764000060010263b40584e87c0100000000000000000000000000000000000000000000000000000000026006546107b9565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146106f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051309060009060649082818181858883f19350505050158015610451573d6000803e3d6000fd5b61077c610eb1565b61078e833084805190602001206108f4565b90506107a24261012c63ffffffff61091f16565b60065561045181670de0b6b3a764000061099a565bfe5b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b1580156108d557600080fd5b505af11580156108e9573d6000803e3d6000fd5b505050505050505050565b6108fc610eb1565b610904610eb1565b6109168186868663ffffffff6109c116565b95945050505050565b60008282018381101561099357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6003546000906109939073ffffffffffffffffffffffffffffffffffffffff168484610a23565b6109c9610eb1565b6109d98560800151610100610cc5565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b60045460408051306c01000000000000000000000000026020808301919091526034808301859052835180840390910181526054909201835281519181019190912060608601939093526000838152600590915281812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610b0887610cff565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ba8578181015183820152602001610b90565b50505050905090810190601f168015610bd55780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610bf657600080fd5b505af1158015610c0a573d6000803e3d6000fd5b505050506040513d6020811015610c2057600080fd5b50511515610cb557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610ccd610ee6565b6020820615610ce25760208206602003820191505b506020828101829052604080518085526000815290920101905290565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015610df4578181015183820152602001610ddc565b50505050905090810190601f168015610e215780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101610ee1610ee6565b905290565b6040805180820190915260608152600060208201529056fea165627a7a7230582030cdbdd4a62018ec58dc832b69f4205ae55e4f0ac6c96a1af8f1c1e33f67989f0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE DUP1 PUSH2 0xFD6 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD PUSH2 0x40 DUP3 PUSH5 0x100000000 PUSH2 0x59 DUP2 MUL DIV JUMP JUMPDEST PUSH2 0x52 DUP2 PUSH5 0x100000000 PUSH2 0x7B DUP2 MUL DIV JUMP JUMPDEST POP POP PUSH2 0x9D JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xF2A DUP1 PUSH2 0xAC PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x1EB0F610 DUP2 EQ PUSH2 0x8F JUMPI DUP1 PUSH4 0xA09D636A EQ PUSH2 0xBF JUMPI DUP1 PUSH4 0xA7F43779 EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0xACDF0BA2 EQ PUSH2 0x104 JUMPI DUP1 PUSH4 0xB40584E8 EQ PUSH2 0x134 JUMPI DUP1 PUSH4 0xC728F720 EQ PUSH2 0x164 JUMPI DUP1 PUSH4 0xC737ECAB EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0xE7EB2B17 EQ PUSH2 0x24E JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x27E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x282 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH2 0x457 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x110 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x127 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x45B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x140 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x170 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x636 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x20D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x774 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x271 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x7B7 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x33C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 ADDRESS SWAP1 PUSH1 0x64 SWAP1 DUP4 DUP2 DUP2 DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3DA JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3DF JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 ISZERO ISZERO PUSH2 0x451 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xB PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43616C6C206661696C6564000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SELFDESTRUCT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x515 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 ADDRESS SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 DUP2 DUP2 DUP2 DUP6 DUP9 DUP4 CALL SWAP4 POP POP POP POP SWAP1 POP DUP1 ISZERO ISZERO PUSH2 0x451 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xB PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E64206661696C6564000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x27E DUP3 PUSH8 0xDE0B6B3A7640000 PUSH1 0x1 MUL PUSH4 0xB40584E8 PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH1 0x6 SLOAD PUSH2 0x7B9 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x6F0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD ADDRESS SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x64 SWAP1 DUP3 DUP2 DUP2 DUP2 DUP6 DUP9 DUP4 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x451 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x77C PUSH2 0xEB1 JUMP JUMPDEST PUSH2 0x78E DUP4 ADDRESS DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x8F4 JUMP JUMPDEST SWAP1 POP PUSH2 0x7A2 TIMESTAMP PUSH2 0x12C PUSH4 0xFFFFFFFF PUSH2 0x91F AND JUMP JUMPDEST PUSH1 0x6 SSTORE PUSH2 0x451 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x99A JUMP JUMPDEST INVALID JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8E9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x8FC PUSH2 0xEB1 JUMP JUMPDEST PUSH2 0x904 PUSH2 0xEB1 JUMP JUMPDEST PUSH2 0x916 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x9C1 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x993 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x993 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0xA23 JUMP JUMPDEST PUSH2 0x9C9 PUSH2 0xEB1 JUMP JUMPDEST PUSH2 0x9D9 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xCC5 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x60 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE DUP2 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xB08 DUP8 PUSH2 0xCFF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBA8 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB90 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xBD5 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC0A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xC20 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xCB5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xCCD PUSH2 0xEE6 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xCE2 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xDF4 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDDC JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE21 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0xEE1 PUSH2 0xEE6 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 ADDRESS 0xcd 0xbd 0xd4 0xa6 KECCAK256 XOR 0xec PC 0xdc DUP4 0x2b PUSH10 0xF4205AE55E4F0AC6C96A BYTE 0xf8 CALL 0xc1 0xe3 EXTCODEHASH PUSH8 0x989F002900000000 ",
"sourceMap": "100:1804:28:-;;;;;1131:1:1;1100:32;;100:1804:28;276:127;100:1804;276:127;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;276:127:28;;;;;;;341:24;276:127;341:17;;;;:24;:::i;:::-;371:27;390:7;371:18;;;;:27;:::i;:::-;276:127;;100:1804;;4782:94:1;4839:4;:32;;-1:-1:-1;;;;;;4839:32:1;-1:-1:-1;;;;;4839:32:1;;;;;;;;;;4782:94::o;4560:108::-;4620:6;:43;;-1:-1:-1;;;;;;4620:43:1;-1:-1:-1;;;;;4620:43:1;;;;;;;;;;4560:108::o;100:1804:28:-;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x60806040526004361061008d5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631eb0f610811461008f578063a09d636a146100bf578063a7f43779146100ef578063acdf0ba214610104578063b40584e814610134578063c728f72014610164578063c737ecab14610194578063e7eb2b171461024e575b005b34801561009b57600080fd5b5061008d600480360360408110156100b257600080fd5b508035906020013561027e565b3480156100cb57600080fd5b5061008d600480360360408110156100e257600080fd5b5080359060200135610282565b3480156100fb57600080fd5b5061008d610457565b34801561011057600080fd5b5061008d6004803603604081101561012757600080fd5b508035906020013561045b565b34801561014057600080fd5b5061008d6004803603604081101561015757600080fd5b50803590602001356105fa565b34801561017057600080fd5b5061008d6004803603604081101561018757600080fd5b5080359060200135610636565b3480156101a057600080fd5b5061008d600480360360408110156101b757600080fd5b813591908101906040810160208201356401000000008111156101d957600080fd5b8201836020820111156101eb57600080fd5b8035906020019184600183028401116401000000008311171561020d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610774945050505050565b34801561025a57600080fd5b5061008d6004803603604081101561027157600080fd5b50803590602001356107b7565b5050565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461033c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a260405160009030906064908381818185875af1925050503d80600081146103da576040519150601f19603f3d011682016040523d82523d6000602084013e6103df565b606091505b5050905080151561045157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f43616c6c206661696c6564000000000000000000000000000000000000000000604482015290519081900360640190fd5b50505050565b6000ff5b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461051557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a26040516000903090829060649082818181858883f19350505050905080151561045157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f53656e64206661696c6564000000000000000000000000000000000000000000604482015290519081900360640190fd5b61027e82670de0b6b3a764000060010263b40584e87c0100000000000000000000000000000000000000000000000000000000026006546107b9565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146106f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051309060009060649082818181858883f19350505050158015610451573d6000803e3d6000fd5b61077c610eb1565b61078e833084805190602001206108f4565b90506107a24261012c63ffffffff61091f16565b60065561045181670de0b6b3a764000061099a565bfe5b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b1580156108d557600080fd5b505af11580156108e9573d6000803e3d6000fd5b505050505050505050565b6108fc610eb1565b610904610eb1565b6109168186868663ffffffff6109c116565b95945050505050565b60008282018381101561099357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6003546000906109939073ffffffffffffffffffffffffffffffffffffffff168484610a23565b6109c9610eb1565b6109d98560800151610100610cc5565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b60045460408051306c01000000000000000000000000026020808301919091526034808301859052835180840390910181526054909201835281519181019190912060608601939093526000838152600590915281812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610b0887610cff565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ba8578181015183820152602001610b90565b50505050905090810190601f168015610bd55780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610bf657600080fd5b505af1158015610c0a573d6000803e3d6000fd5b505050506040513d6020811015610c2057600080fd5b50511515610cb557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610ccd610ee6565b6020820615610ce25760208206602003820191505b506020828101829052604080518085526000815290920101905290565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015610df4578181015183820152602001610ddc565b50505050905090810190601f168015610e215780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101610ee1610ee6565b905290565b6040805180820190915260608152600060208201529056fea165627a7a7230582030cdbdd4a62018ec58dc832b69f4205ae55e4f0ac6c96a1af8f1c1e33f67989f0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x1EB0F610 DUP2 EQ PUSH2 0x8F JUMPI DUP1 PUSH4 0xA09D636A EQ PUSH2 0xBF JUMPI DUP1 PUSH4 0xA7F43779 EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0xACDF0BA2 EQ PUSH2 0x104 JUMPI DUP1 PUSH4 0xB40584E8 EQ PUSH2 0x134 JUMPI DUP1 PUSH4 0xC728F720 EQ PUSH2 0x164 JUMPI DUP1 PUSH4 0xC737ECAB EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0xE7EB2B17 EQ PUSH2 0x24E JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x27E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x282 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH2 0x457 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x110 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x127 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x45B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x140 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x170 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x636 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x20D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x774 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x271 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x7B7 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x33C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 ADDRESS SWAP1 PUSH1 0x64 SWAP1 DUP4 DUP2 DUP2 DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3DA JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3DF JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 ISZERO ISZERO PUSH2 0x451 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xB PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43616C6C206661696C6564000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SELFDESTRUCT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x515 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 ADDRESS SWAP1 DUP3 SWAP1 PUSH1 0x64 SWAP1 DUP3 DUP2 DUP2 DUP2 DUP6 DUP9 DUP4 CALL SWAP4 POP POP POP POP SWAP1 POP DUP1 ISZERO ISZERO PUSH2 0x451 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xB PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x53656E64206661696C6564000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x27E DUP3 PUSH8 0xDE0B6B3A7640000 PUSH1 0x1 MUL PUSH4 0xB40584E8 PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH1 0x6 SLOAD PUSH2 0x7B9 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x6F0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD ADDRESS SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x64 SWAP1 DUP3 DUP2 DUP2 DUP2 DUP6 DUP9 DUP4 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x451 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH2 0x77C PUSH2 0xEB1 JUMP JUMPDEST PUSH2 0x78E DUP4 ADDRESS DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x8F4 JUMP JUMPDEST SWAP1 POP PUSH2 0x7A2 TIMESTAMP PUSH2 0x12C PUSH4 0xFFFFFFFF PUSH2 0x91F AND JUMP JUMPDEST PUSH1 0x6 SSTORE PUSH2 0x451 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x99A JUMP JUMPDEST INVALID JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8E9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x8FC PUSH2 0xEB1 JUMP JUMPDEST PUSH2 0x904 PUSH2 0xEB1 JUMP JUMPDEST PUSH2 0x916 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x9C1 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x993 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x993 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0xA23 JUMP JUMPDEST PUSH2 0x9C9 PUSH2 0xEB1 JUMP JUMPDEST PUSH2 0x9D9 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xCC5 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x60 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE DUP2 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xB08 DUP8 PUSH2 0xCFF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBA8 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB90 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xBD5 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC0A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xC20 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xCB5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xCCD PUSH2 0xEE6 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xCE2 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xDF4 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDDC JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE21 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0xEE1 PUSH2 0xEE6 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 ADDRESS 0xcd 0xbd 0xd4 0xa6 KECCAK256 XOR 0xec PC 0xdc DUP4 0x2b PUSH10 0xF4205AE55E4F0AC6C96A BYTE 0xf8 CALL 0xc1 0xe3 EXTCODEHASH PUSH8 0x989F002900000000 ",
"sourceMap": "100:1804:28:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1809:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1809:53:28;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1809:53:28;;;;;;;;1148:237;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1148:237:28;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1148:237:28;;;;;;;;1084:60;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1084:60:28;;;;1389:273;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1389:273:28;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1389:273:28;;;;;;;;876:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;876:204:28;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;876:204:28;;;;;;;;1666:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1666:139:28;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1666:139:28;;;;;;;;482:311;;8:9:-1;5:2;;;30:1;27;20:12;5:2;482:311:28;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;482:311:28;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;482:311:28;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;482:311:28;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;482:311:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;482:311:28;;-1:-1:-1;482:311:28;;-1:-1:-1;;;;;482:311:28;797:75;;8:9:-1;5:2;;;30:1;27;20:12;5:2;797:75:28;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;797:75:28;;;;;;;;1809:53;;;:::o;1148:237::-;8691:27:1;;;;:15;:27;;;;;;;;;;8677:10;:41;8669:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8788:27;;;;:15;:27;;;;;;8781:34;;;;;;8826:30;8804:10;;8826:30;;;1269:33:28;;1252:12;;1277:4;;1294:3;;1252:12;1269:33;1252:12;1269:33;1294:3;1277:4;1269:33;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;1251:51:28;;;1357:7;1349:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8862:1:1;1148:237:28;;;:::o;1084:60::-;1136:1;1115:24;1389:273;8691:27:1;;;;:15;:27;;;;;;;;;;8677:10;:41;8669:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8788:27;;;;:15;:27;;;;;;8781:34;;;;;;8826:30;8804:10;;8826:30;;;1558:23:28;;1543:12;;1566:4;;1543:12;;1577:3;;1543:12;1558:23;1543:12;1558:23;1577:3;1566:4;1543:12;1558:23;;;;;;1543:38;;1634:7;1626:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;876:204;950:125;980:10;578:6:1;233:1:28;:8;1020:36;;;1064:10;;950:22;:125::i;1666:139::-;8691:27:1;;;;:15;:27;;;;;;;;;;8677:10;:41;8669:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8788:27;;;;:15;:27;;;;;;8781:34;;;;;;8826:30;8804:10;;8826:30;;;1773:27:28;;1781:4;;1773:27;;1796:3;;1773:27;;;;1796:3;1781:4;1773:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;482:311:28;557:28;;:::i;:::-;588:75;610:3;623:4;647:13;637:24;;;;;;588:21;:75::i;:::-;557:106;-1:-1:-1;682:18:28;:3;690:9;682:18;:7;:18;:::i;:::-;669:10;:31;747:41;768:3;578:6:1;747:20:28;:41::i;797:75::-;853:14;4028:417:1;4182:35;4246:27;;;:15;:27;;;;;;;;4280:34;;;;;;4325:30;;4246:27;;;;;4262:10;;4325:30;;4182:35;4325:30;4361:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;:79;;;;;-1:-1:-1;;4361:79:1;;;;;;;-1:-1:-1;4361:29:1;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;4361:79:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4361:79:1;;;;4028:417;;;;;:::o;1735:295::-;1883:24;;:::i;:::-;1915:28;;:::i;:::-;1956:69;:3;1971:7;1980:16;1998:26;1956:69;:14;:69;:::i;:::-;1949:76;1735:295;-1:-1:-1;;;;;1735:295:1:o;831:162:37:-;889:7;916:5;;;935:6;;;;927:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;987:1;831:162;-1:-1:-1;;;831:162:37:o;2327:189:1:-;2487:6;;2432:7;;2456:55;;2487:6;;2496:4;2502:8;2456:22;:55::i;971:366:0:-;1120:24;;:::i;:::-;1152:50;1174:4;:8;;;335:3;1152:21;:50::i;:::-;-1:-1:-1;;1208:13:0;;;1227:39;;:20;;;:39;1272:43;;:23;;;:43;1208:13;971:366::o;3020:488:1:-;3216:12;;3193:36;;;3210:4;3193:36;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3193:36:1;;;;;;3183:47;;;;;;;;;3236:10;;;:25;;;;-1:-1:-1;3267:26:1;;;:15;:26;;;;;;:36;;;;3193;3267;;;;;3314:29;;3183:47;;3314:29;;;3357:4;;;;:20;3378:7;3387:8;3397:19;3411:4;3397:13;:19::i;:::-;3357:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3357:60:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3357:60:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3357:60:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3357:60:1;3349:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3463:12;:17;;3479:1;3463:17;;;3020:488;;;;;:::o;941:395:33:-;1011:13;;:::i;:::-;1047:2;1036:8;:13;:18;1032:71;;1093:2;1082:8;:13;1076:2;:20;1064:32;;;;1032:71;-1:-1:-1;1150:12:33;;;;:23;;;1213:4;1207:11;;1225:16;;;-1:-1:-1;1248:14:33;;1290:18;;;1282:27;1269:41;;1150:12;941:395::o;7512:527:1:-;7909:7;;7924:20;;;;;7952:23;;;;;7600:12;7983:10;;;;8021:8;;;;:12;7629:405;;7659:6;7629:405;;;;;;;;;;;;;;;;;;7659:6;7629:405;;;;;;;;;;;;;;;;;;;7659:6;7629:405;;;;;;7659:6;7629:405;;;;;;;;;;;;;;7600:12;;7659:29;;:6;;;;7909:7;;7924:20;;7952:23;;7983:10;7659:6;;8021:12;;7629:405;;;;;;;;;;7659:6;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7629:405:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7629:405:1;;;22:32:-1;26:21;;;22:32;6:49;;7629:405:1;;;49:4:-1;25:18;;61:17;;7629:405:1;182:15:-1;7629:405:1;;;;179:29:-1;;;;160:49;;;-1:-1;7629:405:1;;-1:-1:-1;;;;;;;;;;7512:527:1;;;:::o;100:1804:28:-;;;;;;;;;-1:-1:-1;100:1804:28;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;100:1804:28;;;;;:::o"
},
"methodIdentifiers": {
"assertFail(bytes32,bytes32)": "e7eb2b17",
"cancelRequestOnFulfill(bytes32,bytes32)": "b40584e8",
"doesNothing(bytes32,bytes32)": "1eb0f610",
"remove()": "a7f43779",
"requestData(bytes32,bytes)": "c737ecab",
"stealEthCall(bytes32,bytes32)": "a09d636a",
"stealEthSend(bytes32,bytes32)": "acdf0ba2",
"stealEthTransfer(bytes32,bytes32)": "c728f720"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"doesNothing\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"stealEthCall\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"remove\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"stealEthSend\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"cancelRequestOnFulfill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"stealEthTransfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_id\",\"type\":\"bytes32\"},{\"name\":\"_callbackFunc\",\"type\":\"bytes\"}],\"name\":\"requestData\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"assertFail\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_link\",\"type\":\"address\"},{\"name\":\"_oracle\",\"type\":\"address\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MaliciousConsumer.sol\":\"MaliciousConsumer\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Chainlink.sol\":{\"keccak256\":\"0x2e22ca7d3cfdca8f53ff01c25460f72c2634fd778746f9ec2e608412d0ab037c\",\"urls\":[\"bzzr://cee187a0a12f045523125e4522ddde4610ea5f000c1f92acbb7be778eaf8a4ed\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/ChainlinkClient.sol\":{\"keccak256\":\"0xf26d2fb1abfa4415c00313dded53fa99e813e06201e970b409aa444154a1c0eb\",\"urls\":[\"bzzr://9b4c84585da86567d244bf59370c53bb5e05b4be73030e86a8b0883329435564\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x8871fe810c2efc580e8173e1751df0023b362f4835e44383bd95ee375c4388b9\",\"urls\":[\"bzzr://1c0bdf40cbcbe3fe7491c673d5db4561e85f3f02bd5f3851c857c6d5f7987c45\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ENSInterface.sol\":{\"keccak256\":\"0x87607c12cc84c57afbcb38f00d96ae67c433474c1310a0c2798e2a728f41750d\",\"urls\":[\"bzzr://10a880076bf0b03ef9bd153e7f6ca18e65f15c9f7bf4b0883e93b8de67dd22c2\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x592d87884106ba82cedbe79922de9cfaf28b211a09f9be243ad767d3baa1cb90\",\"urls\":[\"bzzr://1f4a72f8b790700d839354d412df656d5a59877264c6e126a1deae6164de9e7d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/PointerInterface.sol\":{\"keccak256\":\"0xdc08ab9320d187dbaffa20dc31d331f8067fa534c9a654aab8f9ffa63df450da\",\"urls\":[\"bzzr://7e34f1d953ea72152d9daffea28117d5d31d85891f2cac5f1ded4a589cad4874\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MaliciousConsumer.sol\":{\"keccak256\":\"0x6e973b6b351ef07b3fc2c8dee5f5ff3ad7d324803488e4a0aa515499253fb650\",\"urls\":[\"bzzr://82785f317865ca1f01038007bc5641d448144c7b8d5eb6e6595f630385aad007\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/ENSResolver.sol\":{\"keccak256\":\"0x64fcf7d2fc5efc87eaf7eba4a8f69af4d28986b6e4fb3590f076eb41ce40296e\",\"urls\":[\"bzzr://09e1bdee1831b5e85d3c7b5d96b7c26ad54e96d654cfaf18f58449c4c45961fc\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0x796a82f2e4ab35469224050fb62ecd2dc038474e7f9d4dfd7a1023080c009883\",\"urls\":[\"bzzr://6e0bb08f77ca150b228e70773696ea301e939c0b5542fedb05276b683b774e13\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/MaliciousConsumer.sol": {
"id": 28
},
"ChainlinkClient.sol": {
"id": 1
},
"Chainlink.sol": {
"id": 0
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 15
},
"interfaces/LinkTokenInterface.sol": {
"id": 17
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 14
},
"interfaces/PointerInterface.sol": {
"id": 19
},
"vendor/ENSResolver.sol": {
"id": 35
},
"vendor/SafeMathChainlink.sol": {
"id": 37
}
},
"sourceCodes": {
"tests/MaliciousConsumer.sol": "pragma solidity 0.5.0;\n\nimport \"../ChainlinkClient.sol\";\nimport \"../vendor/SafeMathChainlink.sol\";\n\ncontract MaliciousConsumer is ChainlinkClient {\n using SafeMathChainlink for uint256;\n\n uint256 constant private ORACLE_PAYMENT = 1 * LINK;\n uint256 private expiration;\n\n constructor(address _link, address _oracle) public payable {\n setChainlinkToken(_link);\n setChainlinkOracle(_oracle);\n }\n\n function () external payable {} // solhint-disable-line no-empty-blocks\n\n function requestData(bytes32 _id, bytes memory _callbackFunc) public {\n Chainlink.Request memory req = buildChainlinkRequest(_id, address(this), bytes4(keccak256(_callbackFunc)));\n expiration = now.add(5 minutes); // solhint-disable-line not-rely-on-time\n sendChainlinkRequest(req, ORACLE_PAYMENT);\n }\n\n function assertFail(bytes32, bytes32) public pure {\n assert(1 == 2);\n }\n\n function cancelRequestOnFulfill(bytes32 _requestId, bytes32) public {\n cancelChainlinkRequest(\n _requestId,\n ORACLE_PAYMENT,\n this.cancelRequestOnFulfill.selector,\n expiration);\n }\n\n function remove() public {\n selfdestruct(address(0));\n }\n\n function stealEthCall(bytes32 _requestId, bytes32) public recordChainlinkFulfillment(_requestId) {\n (bool success,) = address(this).call.value(100)(\"\"); // solhint-disable-line avoid-call-value\n require(success, \"Call failed\");\n }\n\n function stealEthSend(bytes32 _requestId, bytes32) public recordChainlinkFulfillment(_requestId) {\n // solhint-disable-next-line check-send-result\n bool success = address(this).send(100); // solhint-disable-line multiple-sends\n require(success, \"Send failed\");\n }\n\n function stealEthTransfer(bytes32 _requestId, bytes32) public recordChainlinkFulfillment(_requestId) {\n address(this).transfer(100);\n }\n\n function doesNothing(bytes32, bytes32) public pure {} // solhint-disable-line no-empty-blocks\n}\n",
"ChainlinkClient.sol": "pragma solidity ^0.5.0;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = address(0);\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requestCount = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(address(oracle), _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requestCount));\n _req.nonce = requestCount;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requestCount += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId],\n \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes memory _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}",
"interfaces/ENSInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address _owner) external;\n function setResolver(bytes32 node, address _resolver) external;\n function setOwner(bytes32 node, address _owner) external;\n function setTTL(bytes32 node, uint64 _ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.5.0;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string memory tokenName);\n function symbol() external view returns (string memory tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 requestPrice,\n bytes32 serviceAgreementID,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 dataVersion,\n bytes calldata data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.5.0;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity ^0.5.0;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n",
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.5.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMathChainlink {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n // Solidity only automatically asserts when dividing by 0\n require(b > 0, \"SafeMath: division by zero\");\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b != 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n}\n"
},
"sourceTreeHashHex": "0x18984912c903f209088dc2ccf4e1d1de96e1c68b0cce8c3eb3f97941df0d6a33",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "MaliciousRequester",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_id",
"type": "bytes32"
},
{
"name": "_callbackFunc",
"type": "bytes"
}
],
"name": "maliciousRequestCancel",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "maliciousWithdraw",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "bytes32"
},
{
"name": "",
"type": "bytes32"
}
],
"name": "doesNothing",
"outputs": [],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_target",
"type": "address"
}
],
"name": "maliciousTargetConsumer",
"outputs": [
{
"name": "requestId",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_id",
"type": "bytes32"
},
{
"name": "_target",
"type": "address"
},
{
"name": "_callbackFunc",
"type": "bytes"
}
],
"name": "request",
"outputs": [
{
"name": "requestId",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_id",
"type": "bytes32"
}
],
"name": "maliciousPrice",
"outputs": [
{
"name": "requestId",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "_link",
"type": "address"
},
{
"name": "_oracle",
"type": "address"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x60806040526001600455600160065534801561001a57600080fd5b5060405160408061179c8339810180604052604081101561003a57600080fd5b5080516020909101516100558264010000000061006e810204565b61006781640100000000610090810204565b50506100b2565b60028054600160a060020a031916600160a060020a0392909216919091179055565b60038054600160a060020a031916600160a060020a0392909216919091179055565b6116db806100c16000396000f3fe6080604052600436106100775763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631188ffff811461007c5780631ea3949e146101385780631eb0f6101461014d578063cae2d8881461017d578063dac4c125146101cf578063e325a118146102a4575b600080fd5b34801561008857600080fd5b506101366004803603604081101561009f57600080fd5b813591908101906040810160208201356401000000008111156100c157600080fd5b8201836020820111156100d357600080fd5b803590602001918460018302840111640100000000831117156100f557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102ce945050505050565b005b34801561014457600080fd5b506101366103b2565b34801561015957600080fd5b506101366004803603604081101561017057600080fd5b5080359060200135610419565b34801561018957600080fd5b506101bd600480360360208110156101a057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661041d565b60408051918252519081900360200190f35b3480156101db57600080fd5b506101bd600480360360608110156101f257600080fd5b81359173ffffffffffffffffffffffffffffffffffffffff6020820135169181019060608101604082013564010000000081111561022f57600080fd5b82018360208201111561024157600080fd5b8035906020019184600183028401116401000000008311171561026357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a3945050505050565b3480156102b057600080fd5b506101bd600480360360208110156102c757600080fd5b50356104f1565b60006102d861053a565b90508073ffffffffffffffffffffffffffffffffffffffff16636ee4d5536103018530866104a3565b6008546040805163ffffffff85167c01000000000000000000000000000000000000000000000000000000000281526004810193909352670de0b6b3a764000060248401527f1188ffff000000000000000000000000000000000000000000000000000000006044840152606483019190915251608480830192600092919082900301818387803b15801561039557600080fd5b505af11580156103a9573d6000803e3d6000fd5b50505050505050565b6103ba611662565b6104057f7370656349640000000000000000000000000000000000000000000000000000307f1eb0f61000000000000000000000000000000000000000000000000000000000610556565b905061041981670de0b6b3a7640000610578565b5050565b6000610427611662565b6104877f73706563496400000000000000000000000000000000000000000000000000008460405180807f66756c66696c6c28627974657333322c6279746573333229000000000000000081525060180190506040518091039020610838565b905061049c8382670de0b6b3a764000061085a565b9392505050565b60006104ad611662565b6104bf85858580519060200120610838565b90506104d34261012c63ffffffff610b3116565b6008556104e881670de0b6b3a7640000610ba5565b95945050505050565b60006104fb611662565b61052683307f1eb0f61000000000000000000000000000000000000000000000000000000000610838565b905061049c81670de0b6b3a7640000610bcc565b60035473ffffffffffffffffffffffffffffffffffffffff1690565b61055e611662565b610566611662565b6104e88186868663ffffffff610ccf16565b600654604080516c0100000000000000000000000030026020808301919091526034808301859052835180840390910181526054909201909252805191012060608401919091526105c761053a565b60008281526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9490941693909317909255905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a2600061064b610d30565b90508073ffffffffffffffffffffffffffffffffffffffff16634000aea061067161053a565b8561067b88610d4c565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561071b578181015183820152602001610703565b50505050905090810190601f1680156107485780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561076957600080fd5b505af115801561077d573d6000803e3d6000fd5b505050506040513d602081101561079357600080fd5b5051151561082857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f556e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060068054600101905592915050565b610840611662565b610848611662565b6104e88186868663ffffffff610ede16565b600654604080516c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8716026020808301919091526034808301859052835180840390910181526054909201909252805191012060608401919091526108bf61053a565b60008281526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9490941693909317909255905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a26000610943610d30565b90508073ffffffffffffffffffffffffffffffffffffffff16634000aea061096961053a565b8561097388610ef6565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610a135781810151838201526020016109fb565b50505050905090810190601f168015610a405780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610a6157600080fd5b505af1158015610a75573d6000803e3d6000fd5b505050506040513d6020811015610a8b57600080fd5b50511515610b2057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f556e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b506006805460010190559392505050565b60008282018381101561049c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60035460009061049c9073ffffffffffffffffffffffffffffffffffffffff168484611101565b600654604080516c010000000000000000000000003002602080830191909152603480830185905283518084039091018152605490920190925280519101206060840191909152610c1b61053a565b60008281526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9490941693909317909255905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a26000610c9f610d30565b90508073ffffffffffffffffffffffffffffffffffffffff16634000aea0610cc561053a565b8561067b886113a3565b610cd7611662565b610ce685608001516080611534565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b604080517f776974686472617728616464726573732c75696e74323536290000000000000081528151908190036019018120602080850151938501516060868101516080808901515173ffffffffffffffffffffffffffffffffffffffff8916602489019081527fffffffff00000000000000000000000000000000000000000000000000000000861660448a01526064890184905260848901928352815160a48a0152815194999798959693959194909360c49092019185019080838360005b83811015610e25578181015183820152602001610e0d565b50505050905090810190601f168015610e525780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090991698909817909752509495505050505050919050565b610ee6611662565b610ce68560800151610100611534565b604080517f6f7261636c655265717565737428616464726573732c75696e743235362c627981527f74657333322c616464726573732c6279746573342c75696e743235362c75696e6020808301919091527f743235362c62797465732900000000000000000000000000000000000000000082840152825191829003604b0182208451858301519486015160608781015160808901515160006024890181815260448a0182905260648a0187905273ffffffffffffffffffffffffffffffffffffffff8b1660848b01527fffffffff00000000000000000000000000000000000000000000000000000000861660a48b015260c48a01849052600160e48b018190526101006101048c0190815284516101248d01528451969c999b939a8b9a9897929594919261014490920191908501908083838e5b8381101561104457818101518382015260200161102c565b50505050905090810190601f1680156110715780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b60045460408051306c01000000000000000000000000026020808301919091526034808301859052835180840390910181526054909201835281519181019190912060608601939093526000838152600590915281812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea085846111e68761156e565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561128657818101518382015260200161126e565b50505050905090810190601f1680156112b35780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1580156112d457600080fd5b505af11580156112e8573d6000803e3d6000fd5b505050506040513d60208110156112fe57600080fd5b5051151561139357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b606060405180807f6f7261636c655265717565737428616464726573732c75696e743235362c627981526020017f74657333322c616464726573732c6279746573342c75696e743235362c75696e81526020017f743235362c627974657329000000000000000000000000000000000000000000815250604b01905060405180910390206000671bc16d674ec8000084600001518560200151866040015187606001516001896080015160000151604051602401808960ff1681526020018867ffffffffffffffff1681526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020018481526020018360ff16815260200180602001828103825283818151815260200191508051906020019080838360008381101561104457818101518382015260200161102c565b61153c611697565b60208206156115515760208206602003820191505b506020828101829052604080518085526000815290920101905290565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e8381101561104457818101518382015260200161102c565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611692611697565b905290565b6040805180820190915260608152600060208201529056fea165627a7a72305820d332b151e2bc4910e9f8655d08f36a641def659ff184f27ae19b8cc074fafaf10029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE PUSH1 0x1 PUSH1 0x6 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x40 DUP1 PUSH2 0x179C DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD PUSH2 0x55 DUP3 PUSH5 0x100000000 PUSH2 0x6E DUP2 MUL DIV JUMP JUMPDEST PUSH2 0x67 DUP2 PUSH5 0x100000000 PUSH2 0x90 DUP2 MUL DIV JUMP JUMPDEST POP POP PUSH2 0xB2 JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x16DB DUP1 PUSH2 0xC1 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x1188FFFF DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x1EA3949E EQ PUSH2 0x138 JUMPI DUP1 PUSH4 0x1EB0F610 EQ PUSH2 0x14D JUMPI DUP1 PUSH4 0xCAE2D888 EQ PUSH2 0x17D JUMPI DUP1 PUSH4 0xDAC4C125 EQ PUSH2 0x1CF JUMPI DUP1 PUSH4 0xE325A118 EQ PUSH2 0x2A4 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x136 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x2CE SWAP5 POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x136 PUSH2 0x3B2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x159 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x136 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x170 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x419 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x189 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x41D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 DUP3 ADD CALLDATALOAD AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x22F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x241 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x4A3 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x4F1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D8 PUSH2 0x53A JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6EE4D553 PUSH2 0x301 DUP6 ADDRESS DUP7 PUSH2 0x4A3 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF DUP6 AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH8 0xDE0B6B3A7640000 PUSH1 0x24 DUP5 ADD MSTORE PUSH32 0x1188FFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x64 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x395 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3A9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3BA PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x405 PUSH32 0x7370656349640000000000000000000000000000000000000000000000000000 ADDRESS PUSH32 0x1EB0F61000000000000000000000000000000000000000000000000000000000 PUSH2 0x556 JUMP JUMPDEST SWAP1 POP PUSH2 0x419 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x578 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x427 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x487 PUSH32 0x7370656349640000000000000000000000000000000000000000000000000000 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH32 0x66756C66696C6C28627974657333322C62797465733332290000000000000000 DUP2 MSTORE POP PUSH1 0x18 ADD SWAP1 POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH2 0x838 JUMP JUMPDEST SWAP1 POP PUSH2 0x49C DUP4 DUP3 PUSH8 0xDE0B6B3A7640000 PUSH2 0x85A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4AD PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x4BF DUP6 DUP6 DUP6 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x838 JUMP JUMPDEST SWAP1 POP PUSH2 0x4D3 TIMESTAMP PUSH2 0x12C PUSH4 0xFFFFFFFF PUSH2 0xB31 AND JUMP JUMPDEST PUSH1 0x8 SSTORE PUSH2 0x4E8 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0xBA5 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4FB PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x526 DUP4 ADDRESS PUSH32 0x1EB0F61000000000000000000000000000000000000000000000000000000000 PUSH2 0x838 JUMP JUMPDEST SWAP1 POP PUSH2 0x49C DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0xBCC JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x55E PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x566 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x4E8 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xCCF AND JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH13 0x1000000000000000000000000 ADDRESS MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x5C7 PUSH2 0x53A JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x0 PUSH2 0x64B PUSH2 0xD30 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 PUSH2 0x671 PUSH2 0x53A JUMP JUMPDEST DUP6 PUSH2 0x67B DUP9 PUSH2 0xD4C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x71B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x703 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x748 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x769 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x77D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x793 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x828 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x6 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x840 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x848 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x4E8 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xEDE AND JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH13 0x1000000000000000000000000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x8BF PUSH2 0x53A JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x0 PUSH2 0x943 PUSH2 0xD30 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 PUSH2 0x969 PUSH2 0x53A JUMP JUMPDEST DUP6 PUSH2 0x973 DUP9 PUSH2 0xEF6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA13 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9FB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA40 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA75 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xB20 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x6 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x49C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x49C SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0x1101 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH13 0x1000000000000000000000000 ADDRESS MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0xC1B PUSH2 0x53A JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x0 PUSH2 0xC9F PUSH2 0xD30 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 PUSH2 0xCC5 PUSH2 0x53A JUMP JUMPDEST DUP6 PUSH2 0x67B DUP9 PUSH2 0x13A3 JUMP JUMPDEST PUSH2 0xCD7 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0xCE6 DUP6 PUSH1 0x80 ADD MLOAD PUSH1 0x80 PUSH2 0x1534 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x776974686472617728616464726573732C75696E743235362900000000000000 DUP2 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x20 DUP1 DUP6 ADD MLOAD SWAP4 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP1 DUP10 ADD MLOAD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x24 DUP10 ADD SWAP1 DUP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0x44 DUP11 ADD MSTORE PUSH1 0x64 DUP10 ADD DUP5 SWAP1 MSTORE PUSH1 0x84 DUP10 ADD SWAP3 DUP4 MSTORE DUP2 MLOAD PUSH1 0xA4 DUP11 ADD MSTORE DUP2 MLOAD SWAP5 SWAP10 SWAP8 SWAP9 SWAP6 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP1 SWAP4 PUSH1 0xC4 SWAP1 SWAP3 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE25 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE0D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE52 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP10 AND SWAP9 SWAP1 SWAP9 OR SWAP1 SWAP8 MSTORE POP SWAP5 SWAP6 POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xEE6 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0xCE6 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x1534 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F7261636C655265717565737428616464726573732C75696E743235362C6279 DUP2 MSTORE PUSH32 0x74657333322C616464726573732C6279746573342C75696E743235362C75696E PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x743235362C627974657329000000000000000000000000000000000000000000 DUP3 DUP5 ADD MSTORE DUP3 MLOAD SWAP2 DUP3 SWAP1 SUB PUSH1 0x4B ADD DUP3 KECCAK256 DUP5 MLOAD DUP6 DUP4 ADD MLOAD SWAP5 DUP7 ADD MLOAD PUSH1 0x60 DUP8 DUP2 ADD MLOAD PUSH1 0x80 DUP10 ADD MLOAD MLOAD PUSH1 0x0 PUSH1 0x24 DUP10 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP11 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP11 ADD DUP8 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND PUSH1 0x84 DUP12 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP12 ADD MSTORE PUSH1 0xC4 DUP11 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP12 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP13 ADD SWAP1 DUP2 MSTORE DUP5 MLOAD PUSH2 0x124 DUP14 ADD MSTORE DUP5 MLOAD SWAP7 SWAP13 SWAP10 SWAP12 SWAP4 SWAP11 DUP12 SWAP11 SWAP9 SWAP8 SWAP3 SWAP6 SWAP5 SWAP2 SWAP3 PUSH2 0x144 SWAP1 SWAP3 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1044 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x102C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1071 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x60 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE DUP2 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x11E6 DUP8 PUSH2 0x156E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1286 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x126E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x12B3 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x12E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x1393 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH32 0x6F7261636C655265717565737428616464726573732C75696E743235362C6279 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x74657333322C616464726573732C6279746573342C75696E743235362C75696E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x743235362C627974657329000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x4B ADD SWAP1 POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH8 0x1BC16D674EC80000 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH1 0x1 DUP10 PUSH1 0x80 ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP10 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 DUP2 LT ISZERO PUSH2 0x1044 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x102C JUMP JUMPDEST PUSH2 0x153C PUSH2 0x1697 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x1551 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 DUP4 DUP2 LT ISZERO PUSH2 0x1044 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x102C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1692 PUSH2 0x1697 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd3 ORIGIN 0xb1 MLOAD 0xe2 0xbc 0x49 LT 0xe9 0xf8 PUSH6 0x5D08F36A641D 0xef PUSH6 0x9FF184F27AE1 SWAP12 DUP13 0xc0 PUSH21 0xFAFAF1002900000000000000000000000000000000 ",
"sourceMap": "68:1848:29:-;;;1131:1:1;1100:32;;435:1:27;399:37;;214:119:29;8:9:-1;5:2;;;30:1;27;20:12;5:2;214:119:29;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;214:119:29;;;;;;;271:24;214:119;271:17;;;;:24;:::i;:::-;301:27;320:7;301:18;;;;:27;:::i;:::-;214:119;;68:1848;;4782:94:1;4839:4;:32;;-1:-1:-1;;;;;;4839:32:1;-1:-1:-1;;;;;4839:32:1;;;;;;;;;;4782:94::o;4560:108::-;4620:6;:43;;-1:-1:-1;;;;;;4620:43:1;-1:-1:-1;;;;;4620:43:1;;;;;;;;;;4560:108::o;68:1848:29:-;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100775763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631188ffff811461007c5780631ea3949e146101385780631eb0f6101461014d578063cae2d8881461017d578063dac4c125146101cf578063e325a118146102a4575b600080fd5b34801561008857600080fd5b506101366004803603604081101561009f57600080fd5b813591908101906040810160208201356401000000008111156100c157600080fd5b8201836020820111156100d357600080fd5b803590602001918460018302840111640100000000831117156100f557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506102ce945050505050565b005b34801561014457600080fd5b506101366103b2565b34801561015957600080fd5b506101366004803603604081101561017057600080fd5b5080359060200135610419565b34801561018957600080fd5b506101bd600480360360208110156101a057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661041d565b60408051918252519081900360200190f35b3480156101db57600080fd5b506101bd600480360360608110156101f257600080fd5b81359173ffffffffffffffffffffffffffffffffffffffff6020820135169181019060608101604082013564010000000081111561022f57600080fd5b82018360208201111561024157600080fd5b8035906020019184600183028401116401000000008311171561026357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a3945050505050565b3480156102b057600080fd5b506101bd600480360360208110156102c757600080fd5b50356104f1565b60006102d861053a565b90508073ffffffffffffffffffffffffffffffffffffffff16636ee4d5536103018530866104a3565b6008546040805163ffffffff85167c01000000000000000000000000000000000000000000000000000000000281526004810193909352670de0b6b3a764000060248401527f1188ffff000000000000000000000000000000000000000000000000000000006044840152606483019190915251608480830192600092919082900301818387803b15801561039557600080fd5b505af11580156103a9573d6000803e3d6000fd5b50505050505050565b6103ba611662565b6104057f7370656349640000000000000000000000000000000000000000000000000000307f1eb0f61000000000000000000000000000000000000000000000000000000000610556565b905061041981670de0b6b3a7640000610578565b5050565b6000610427611662565b6104877f73706563496400000000000000000000000000000000000000000000000000008460405180807f66756c66696c6c28627974657333322c6279746573333229000000000000000081525060180190506040518091039020610838565b905061049c8382670de0b6b3a764000061085a565b9392505050565b60006104ad611662565b6104bf85858580519060200120610838565b90506104d34261012c63ffffffff610b3116565b6008556104e881670de0b6b3a7640000610ba5565b95945050505050565b60006104fb611662565b61052683307f1eb0f61000000000000000000000000000000000000000000000000000000000610838565b905061049c81670de0b6b3a7640000610bcc565b60035473ffffffffffffffffffffffffffffffffffffffff1690565b61055e611662565b610566611662565b6104e88186868663ffffffff610ccf16565b600654604080516c0100000000000000000000000030026020808301919091526034808301859052835180840390910181526054909201909252805191012060608401919091526105c761053a565b60008281526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9490941693909317909255905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a2600061064b610d30565b90508073ffffffffffffffffffffffffffffffffffffffff16634000aea061067161053a565b8561067b88610d4c565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561071b578181015183820152602001610703565b50505050905090810190601f1680156107485780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561076957600080fd5b505af115801561077d573d6000803e3d6000fd5b505050506040513d602081101561079357600080fd5b5051151561082857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f556e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5060068054600101905592915050565b610840611662565b610848611662565b6104e88186868663ffffffff610ede16565b600654604080516c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8716026020808301919091526034808301859052835180840390910181526054909201909252805191012060608401919091526108bf61053a565b60008281526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9490941693909317909255905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a26000610943610d30565b90508073ffffffffffffffffffffffffffffffffffffffff16634000aea061096961053a565b8561097388610ef6565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610a135781810151838201526020016109fb565b50505050905090810190601f168015610a405780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610a6157600080fd5b505af1158015610a75573d6000803e3d6000fd5b505050506040513d6020811015610a8b57600080fd5b50511515610b2057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f556e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b506006805460010190559392505050565b60008282018381101561049c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60035460009061049c9073ffffffffffffffffffffffffffffffffffffffff168484611101565b600654604080516c010000000000000000000000003002602080830191909152603480830185905283518084039091018152605490920190925280519101206060840191909152610c1b61053a565b60008281526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9490941693909317909255905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a26000610c9f610d30565b90508073ffffffffffffffffffffffffffffffffffffffff16634000aea0610cc561053a565b8561067b886113a3565b610cd7611662565b610ce685608001516080611534565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b604080517f776974686472617728616464726573732c75696e74323536290000000000000081528151908190036019018120602080850151938501516060868101516080808901515173ffffffffffffffffffffffffffffffffffffffff8916602489019081527fffffffff00000000000000000000000000000000000000000000000000000000861660448a01526064890184905260848901928352815160a48a0152815194999798959693959194909360c49092019185019080838360005b83811015610e25578181015183820152602001610e0d565b50505050905090810190601f168015610e525780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090991698909817909752509495505050505050919050565b610ee6611662565b610ce68560800151610100611534565b604080517f6f7261636c655265717565737428616464726573732c75696e743235362c627981527f74657333322c616464726573732c6279746573342c75696e743235362c75696e6020808301919091527f743235362c62797465732900000000000000000000000000000000000000000082840152825191829003604b0182208451858301519486015160608781015160808901515160006024890181815260448a0182905260648a0187905273ffffffffffffffffffffffffffffffffffffffff8b1660848b01527fffffffff00000000000000000000000000000000000000000000000000000000861660a48b015260c48a01849052600160e48b018190526101006101048c0190815284516101248d01528451969c999b939a8b9a9897929594919261014490920191908501908083838e5b8381101561104457818101518382015260200161102c565b50505050905090810190601f1680156110715780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b60045460408051306c01000000000000000000000000026020808301919091526034808301859052835180840390910181526054909201835281519181019190912060608601939093526000838152600590915281812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea085846111e68761156e565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561128657818101518382015260200161126e565b50505050905090810190601f1680156112b35780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1580156112d457600080fd5b505af11580156112e8573d6000803e3d6000fd5b505050506040513d60208110156112fe57600080fd5b5051151561139357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b606060405180807f6f7261636c655265717565737428616464726573732c75696e743235362c627981526020017f74657333322c616464726573732c6279746573342c75696e743235362c75696e81526020017f743235362c627974657329000000000000000000000000000000000000000000815250604b01905060405180910390206000671bc16d674ec8000084600001518560200151866040015187606001516001896080015160000151604051602401808960ff1681526020018867ffffffffffffffff1681526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020018481526020018360ff16815260200180602001828103825283818151815260200191508051906020019080838360008381101561104457818101518382015260200161102c565b61153c611697565b60208206156115515760208206602003820191505b506020828101829052604080518085526000815290920101905290565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e8381101561104457818101518382015260200161102c565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611692611697565b905290565b6040805180820190915260608152600060208201529056fea165627a7a72305820d332b151e2bc4910e9f8655d08f36a641def659ff184f27ae19b8cc074fafaf10029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x1188FFFF DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x1EA3949E EQ PUSH2 0x138 JUMPI DUP1 PUSH4 0x1EB0F610 EQ PUSH2 0x14D JUMPI DUP1 PUSH4 0xCAE2D888 EQ PUSH2 0x17D JUMPI DUP1 PUSH4 0xDAC4C125 EQ PUSH2 0x1CF JUMPI DUP1 PUSH4 0xE325A118 EQ PUSH2 0x2A4 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x136 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x2CE SWAP5 POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x136 PUSH2 0x3B2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x159 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x136 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x170 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x419 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x189 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x41D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 DUP3 ADD CALLDATALOAD AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x22F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x241 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x4A3 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x4F1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D8 PUSH2 0x53A JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x6EE4D553 PUSH2 0x301 DUP6 ADDRESS DUP7 PUSH2 0x4A3 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF DUP6 AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH8 0xDE0B6B3A7640000 PUSH1 0x24 DUP5 ADD MSTORE PUSH32 0x1188FFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP5 ADD MSTORE PUSH1 0x64 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x395 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3A9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x3BA PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x405 PUSH32 0x7370656349640000000000000000000000000000000000000000000000000000 ADDRESS PUSH32 0x1EB0F61000000000000000000000000000000000000000000000000000000000 PUSH2 0x556 JUMP JUMPDEST SWAP1 POP PUSH2 0x419 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x578 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x427 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x487 PUSH32 0x7370656349640000000000000000000000000000000000000000000000000000 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH32 0x66756C66696C6C28627974657333322C62797465733332290000000000000000 DUP2 MSTORE POP PUSH1 0x18 ADD SWAP1 POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH2 0x838 JUMP JUMPDEST SWAP1 POP PUSH2 0x49C DUP4 DUP3 PUSH8 0xDE0B6B3A7640000 PUSH2 0x85A JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4AD PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x4BF DUP6 DUP6 DUP6 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x838 JUMP JUMPDEST SWAP1 POP PUSH2 0x4D3 TIMESTAMP PUSH2 0x12C PUSH4 0xFFFFFFFF PUSH2 0xB31 AND JUMP JUMPDEST PUSH1 0x8 SSTORE PUSH2 0x4E8 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0xBA5 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4FB PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x526 DUP4 ADDRESS PUSH32 0x1EB0F61000000000000000000000000000000000000000000000000000000000 PUSH2 0x838 JUMP JUMPDEST SWAP1 POP PUSH2 0x49C DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0xBCC JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x55E PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x566 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x4E8 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xCCF AND JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH13 0x1000000000000000000000000 ADDRESS MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x5C7 PUSH2 0x53A JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x0 PUSH2 0x64B PUSH2 0xD30 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 PUSH2 0x671 PUSH2 0x53A JUMP JUMPDEST DUP6 PUSH2 0x67B DUP9 PUSH2 0xD4C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x71B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x703 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x748 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x769 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x77D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x793 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x828 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x6 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x840 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x848 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0x4E8 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xEDE AND JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH13 0x1000000000000000000000000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0x8BF PUSH2 0x53A JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x0 PUSH2 0x943 PUSH2 0xD30 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 PUSH2 0x969 PUSH2 0x53A JUMP JUMPDEST DUP6 PUSH2 0x973 DUP9 PUSH2 0xEF6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA13 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9FB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA40 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA61 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA75 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xB20 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x6 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x49C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x49C SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0x1101 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH13 0x1000000000000000000000000 ADDRESS MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH2 0xC1B PUSH2 0x53A JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x0 PUSH2 0xC9F PUSH2 0xD30 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 PUSH2 0xCC5 PUSH2 0x53A JUMP JUMPDEST DUP6 PUSH2 0x67B DUP9 PUSH2 0x13A3 JUMP JUMPDEST PUSH2 0xCD7 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0xCE6 DUP6 PUSH1 0x80 ADD MLOAD PUSH1 0x80 PUSH2 0x1534 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x776974686472617728616464726573732C75696E743235362900000000000000 DUP2 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x20 DUP1 DUP6 ADD MLOAD SWAP4 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP1 DUP10 ADD MLOAD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND PUSH1 0x24 DUP10 ADD SWAP1 DUP2 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0x44 DUP11 ADD MSTORE PUSH1 0x64 DUP10 ADD DUP5 SWAP1 MSTORE PUSH1 0x84 DUP10 ADD SWAP3 DUP4 MSTORE DUP2 MLOAD PUSH1 0xA4 DUP11 ADD MSTORE DUP2 MLOAD SWAP5 SWAP10 SWAP8 SWAP9 SWAP6 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP1 SWAP4 PUSH1 0xC4 SWAP1 SWAP3 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE25 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE0D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE52 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP10 AND SWAP9 SWAP1 SWAP9 OR SWAP1 SWAP8 MSTORE POP SWAP5 SWAP6 POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xEE6 PUSH2 0x1662 JUMP JUMPDEST PUSH2 0xCE6 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x1534 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F7261636C655265717565737428616464726573732C75696E743235362C6279 DUP2 MSTORE PUSH32 0x74657333322C616464726573732C6279746573342C75696E743235362C75696E PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x743235362C627974657329000000000000000000000000000000000000000000 DUP3 DUP5 ADD MSTORE DUP3 MLOAD SWAP2 DUP3 SWAP1 SUB PUSH1 0x4B ADD DUP3 KECCAK256 DUP5 MLOAD DUP6 DUP4 ADD MLOAD SWAP5 DUP7 ADD MLOAD PUSH1 0x60 DUP8 DUP2 ADD MLOAD PUSH1 0x80 DUP10 ADD MLOAD MLOAD PUSH1 0x0 PUSH1 0x24 DUP10 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP11 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP11 ADD DUP8 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND PUSH1 0x84 DUP12 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP12 ADD MSTORE PUSH1 0xC4 DUP11 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP12 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP13 ADD SWAP1 DUP2 MSTORE DUP5 MLOAD PUSH2 0x124 DUP14 ADD MSTORE DUP5 MLOAD SWAP7 SWAP13 SWAP10 SWAP12 SWAP4 SWAP11 DUP12 SWAP11 SWAP9 SWAP8 SWAP3 SWAP6 SWAP5 SWAP2 SWAP3 PUSH2 0x144 SWAP1 SWAP3 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1044 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x102C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1071 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x60 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE DUP2 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x11E6 DUP8 PUSH2 0x156E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1286 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x126E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x12B3 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x12E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x1393 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH32 0x6F7261636C655265717565737428616464726573732C75696E743235362C6279 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x74657333322C616464726573732C6279746573342C75696E743235362C75696E DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x743235362C627974657329000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x4B ADD SWAP1 POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH8 0x1BC16D674EC80000 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH1 0x1 DUP10 PUSH1 0x80 ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP10 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 DUP2 LT ISZERO PUSH2 0x1044 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x102C JUMP JUMPDEST PUSH2 0x153C PUSH2 0x1697 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x1551 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 DUP4 DUP2 LT ISZERO PUSH2 0x1044 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x102C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1692 PUSH2 0x1697 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd3 ORIGIN 0xb1 MLOAD 0xe2 0xbc 0x49 LT 0xe9 0xf8 PUSH6 0x5D08F36A641D 0xef PUSH6 0x9FF184F27AE1 SWAP12 DUP13 0xc0 PUSH21 0xFAFAF1002900000000000000000000000000000000 ",
"sourceMap": "68:1848:29:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1466:351;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1466:351:29;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1466:351:29;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;1466:351:29;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1466:351:29;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;1466:351:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;1466:351:29;;-1:-1:-1;1466:351:29;;-1:-1:-1;;;;;1466:351:29;;;337:229;;8:9:-1;5:2;;;30:1;27;20:12;5:2;337:229:29;;;;1821:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1821:53:29;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1821:53:29;;;;;;;;1178:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1178:284:29;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1178:284:29;;;;;;;;;;;;;;;;;;;;;570:358;;8:9:-1;5:2;;;30:1;27;20:12;5:2;570:358:29;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;570:358:29;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;570:358:29;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;570:358:29;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;570:358:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;570:358:29;;-1:-1:-1;570:358:29;;-1:-1:-1;;;;;570:358:29;932:242;;8:9:-1;5:2;;;30:1;27;20:12;5:2;932:242:29;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;932:242:29;;;1466:351;1552:33;1614:24;:22;:24::i;:::-;1552:87;;1645:7;:27;;;1680:42;1688:3;1701:4;1708:13;1680:7;:42::i;:::-;1796:10;;1645:167;;;;;;1752:36;1645:167;;;;;;;;;;578:6:1;1645:167:29;;;;1752:36;1645:167;;;;;;;;;;;;;;;;;-1:-1:-1;;1645:167:29;;;;;;;-1:-1:-1;1645:167:29;;;;5:2:-1;;;;30:1;27;20:12;5:2;1645:167:29;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1645:167:29;;;;1466:351;;;:::o;337:229::-;385:45;;:::i;:::-;433:77;;477:4;484:25;433:18;:77::i;:::-;385:125;-1:-1:-1;516:45:29;385:125;578:6:1;516:24:29;:45::i;:::-;;337:229;:::o;1178:284::-;1244:17;1269:28;;:::i;:::-;1300:87;;1332:7;1348:37;;;;;;;;;;;;;;;;;;;1300:21;:87::i;:::-;1269:118;-1:-1:-1;1405:52:29;1428:7;1269:118;578:6:1;1405:22:29;:52::i;:::-;1393:64;1178:284;-1:-1:-1;;;1178:284:29:o;570:358::-;661:17;686:28;;:::i;:::-;717:69;739:3;744:7;770:13;760:24;;;;;;717:21;:69::i;:::-;686:100;-1:-1:-1;805:18:29;:3;813:9;805:18;:7;:18;:::i;:::-;792:10;:31;882:41;903:3;578:6:1;882:20:29;:41::i;:::-;870:53;570:358;-1:-1:-1;;;;;570:358:29:o;932:242::-;985:17;1010:28;;:::i;:::-;1041:68;1063:3;1076:4;1083:25;1041:21;:68::i;:::-;1010:99;-1:-1:-1;1127:42:29;1010:99;578:6:1;1127:21:29;:42::i;5480:113:1:-;5581:6;;;;5480:113;:::o;505:316:27:-;641:41;;:::i;:::-;690:45;;:::i;:::-;748:68;:3;771:7;780:16;798:17;748:68;:22;:68;:::i;2069:623::-;2262:17;;2239:41;;;;2256:4;2239:41;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;2239:41:27;;;;;;;2229:52;;;;;2287:10;;;:30;;;;2361:24;:22;:24::i;:::-;2323:35;;;;:24;:35;;;;;;:62;;;;;;;;;;;;;;;;2396:29;;2323:35;;2396:29;;;2431:24;2477:23;:21;:23::i;:::-;2431:70;;2515:5;:21;;;2537:24;:22;:24::i;:::-;2563:4;2569:27;2591:4;2569:21;:27::i;:::-;2515:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2515:82:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2515:82:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2515:82:27;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2515:82:27;2507:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2643:17:27;:22;;2664:1;2643:22;;;2069:623;;;;:::o;1735:295:1:-;1883:24;;:::i;:::-;1915:28;;:::i;:::-;1956:69;:3;1971:7;1980:16;1998:26;1956:69;:14;:69;:::i;825:629:27:-;1022:17;;996:44;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;996:44:27;;;;;;;986:55;;;;;1047:10;;;:30;;;;1121:24;:22;:24::i;:::-;1083:35;;;;:24;:35;;;;;;:62;;;;;;;;;;;;;;;;1156:29;;1083:35;;1156:29;;;1191:24;1237:23;:21;:23::i;:::-;1191:70;;1275:5;:21;;;1297:24;:22;:24::i;:::-;1323:7;1332:25;1352:4;1332:19;:25::i;:::-;1275:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1275:83:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1275:83:27;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1275:83:27;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1275:83:27;1267:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1404:17:27;:22;;1425:1;1404:22;;;825:629;;;;;:::o;831:162:37:-;889:7;916:5;;;935:6;;;;927:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2327:189:1;2487:6;;2432:7;;2456:55;;2487:6;;2496:4;2502:8;2456:22;:55::i;1458:607:27:-;1634:17;;1611:41;;;;1628:4;1611:41;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1611:41:27;;;;;;;1601:52;;;;;1659:10;;;:30;;;;1733:24;:22;:24::i;:::-;1695:35;;;;:24;:35;;;;;;:62;;;;;;;;;;;;;;;;1768:29;;1695:35;;1768:29;;;1803:24;1849:23;:21;:23::i;:::-;1803:70;;1887:5;:21;;;1909:24;:22;:24::i;:::-;1935:7;1944:24;1963:4;1944:18;:24::i;557:397:26:-;726:41;;:::i;:::-;775:36;797:4;:8;;;807:3;775:21;:36::i;:::-;-1:-1:-1;;817:21:26;;;844:39;;:20;;;:39;889:43;;:23;;;:43;817:21;557:397::o;5241:110:1:-;5341:4;;;;5241:110;:::o;2696:314:27:-;2868:38;;;;;;;;;;;;;;;;2915:20;;;;;2943:23;;;;2802:12;2974:10;;;;2992:8;;;;;:12;2831:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2802:12;;2868:38;;2943:23;;2974:10;;2992:12;;2831:174;;;;;;;;;;;;;2992:12;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2831:174:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2831:174:27;;;22:32:-1;26:21;;;22:32;6:49;;2831:174:27;;;49:4:-1;25:18;;61:17;;2831:174:27;182:15:-1;2831:174:27;;;;179:29:-1;;;;160:49;;;-1:-1;2831:174:27;;-1:-1:-1;;;;;;2696:314:27;;;:::o;971:366:0:-;1120:24;;:::i;:::-;1152:50;1174:4;:8;;;335:3;1152:21;:50::i;3014:453:27:-;3167:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3348:7;;3363:20;;;;3391:23;;;;3101:12;3422:10;;;;3449:8;;;;:12;-1:-1:-1;3130:332:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3440:1;3130:332;;;;;;;;;;;;;;;;;;;;;3101:12;;3167:88;;-1:-1:-1;;;;3363:20:27;3391:23;3440:1;;3449:12;3130:332;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3130:332:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3130:332:27;;;22:32:-1;26:21;;;22:32;6:49;;3130:332:27;;;49:4:-1;25:18;;61:17;;3130:332:27;182:15:-1;3130:332:27;;;;179:29:-1;;;;160:49;;;-1:-1;3130:332:27;;-1:-1:-1;;;;;;;;;;3014:453:27;;;:::o;3020:488:1:-;3216:12;;3193:36;;;3210:4;3193:36;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3193:36:1;;;;;;3183:47;;;;;;;;;3236:10;;;:25;;;;-1:-1:-1;3267:26:1;;;:15;:26;;;;;;:36;;;;3193;3267;;;;;3314:29;;3183:47;;3314:29;;;3357:4;;;;:20;3378:7;3387:8;3397:19;3411:4;3397:13;:19::i;:::-;3357:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3357:60:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3357:60:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3357:60:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3357:60:1;3349:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3463:12;:17;;3479:1;3463:17;;;3020:488;;;;;:::o;3471:470:27:-;3557:12;3623:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3720:1;3762:19;3822:4;:7;;;3837:4;:20;;;3865:4;:23;;;3896:4;:10;;;3914:1;3923:4;:8;;;:12;;;3586:350;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;941:395:33;1011:13;;:::i;:::-;1047:2;1036:8;:13;:18;1032:71;;1093:2;1082:8;:13;1076:2;:20;1064:32;;;;1032:71;-1:-1:-1;1150:12:33;;;;:23;;;1213:4;1207:11;;1225:16;;;-1:-1:-1;1248:14:33;;1290:18;;;1282:27;1269:41;;1150:12;941:395::o;7512:527:1:-;7909:7;;7924:20;;;;;7952:23;;;;;7600:12;7983:10;;;;8021:8;;;;:12;7629:405;;7659:6;7629:405;;;;;;;;;;;;;;;;;;7659:6;7629:405;;;;;;;;;;;;;;;;;;;7659:6;7629:405;;;;;;7659:6;7629:405;;;;;;;;;;;;;;7600:12;;7659:29;;:6;;;;7909:7;;7924:20;;7952:23;;7983:10;7659:6;;8021:12;;7629:405;;;;;;;;;;7659:6;33:3:-1;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68:1848:29;;;;;;;;;-1:-1:-1;68:1848:29;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;68:1848:29;;;;;:::o"
},
"methodIdentifiers": {
"doesNothing(bytes32,bytes32)": "1eb0f610",
"maliciousPrice(bytes32)": "e325a118",
"maliciousRequestCancel(bytes32,bytes)": "1188ffff",
"maliciousTargetConsumer(address)": "cae2d888",
"maliciousWithdraw()": "1ea3949e",
"request(bytes32,address,bytes)": "dac4c125"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_id\",\"type\":\"bytes32\"},{\"name\":\"_callbackFunc\",\"type\":\"bytes\"}],\"name\":\"maliciousRequestCancel\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"maliciousWithdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"},{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"doesNothing\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_target\",\"type\":\"address\"}],\"name\":\"maliciousTargetConsumer\",\"outputs\":[{\"name\":\"requestId\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_id\",\"type\":\"bytes32\"},{\"name\":\"_target\",\"type\":\"address\"},{\"name\":\"_callbackFunc\",\"type\":\"bytes\"}],\"name\":\"request\",\"outputs\":[{\"name\":\"requestId\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_id\",\"type\":\"bytes32\"}],\"name\":\"maliciousPrice\",\"outputs\":[{\"name\":\"requestId\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_link\",\"type\":\"address\"},{\"name\":\"_oracle\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MaliciousRequester.sol\":\"MaliciousRequester\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Chainlink.sol\":{\"keccak256\":\"0x2e22ca7d3cfdca8f53ff01c25460f72c2634fd778746f9ec2e608412d0ab037c\",\"urls\":[\"bzzr://cee187a0a12f045523125e4522ddde4610ea5f000c1f92acbb7be778eaf8a4ed\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/ChainlinkClient.sol\":{\"keccak256\":\"0xf26d2fb1abfa4415c00313dded53fa99e813e06201e970b409aa444154a1c0eb\",\"urls\":[\"bzzr://9b4c84585da86567d244bf59370c53bb5e05b4be73030e86a8b0883329435564\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x8871fe810c2efc580e8173e1751df0023b362f4835e44383bd95ee375c4388b9\",\"urls\":[\"bzzr://1c0bdf40cbcbe3fe7491c673d5db4561e85f3f02bd5f3851c857c6d5f7987c45\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ENSInterface.sol\":{\"keccak256\":\"0x87607c12cc84c57afbcb38f00d96ae67c433474c1310a0c2798e2a728f41750d\",\"urls\":[\"bzzr://10a880076bf0b03ef9bd153e7f6ca18e65f15c9f7bf4b0883e93b8de67dd22c2\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x592d87884106ba82cedbe79922de9cfaf28b211a09f9be243ad767d3baa1cb90\",\"urls\":[\"bzzr://1f4a72f8b790700d839354d412df656d5a59877264c6e126a1deae6164de9e7d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/PointerInterface.sol\":{\"keccak256\":\"0xdc08ab9320d187dbaffa20dc31d331f8067fa534c9a654aab8f9ffa63df450da\",\"urls\":[\"bzzr://7e34f1d953ea72152d9daffea28117d5d31d85891f2cac5f1ded4a589cad4874\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MaliciousChainlink.sol\":{\"keccak256\":\"0x8ceb713a1355edbb0da9866efb81b23ffc2908127fb214112b6ef8a5371c21c5\",\"urls\":[\"bzzr://cc6617dabb50c278f4ee65902d57cd871c883f9842a5617b7588d8688b330d2e\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MaliciousChainlinkClient.sol\":{\"keccak256\":\"0x59d016ed9af3c3414ca30787409c989c91f29dde7a549bad3307fc340d18a8fb\",\"urls\":[\"bzzr://f0b773051bc677c21997fe932b83921494abb240dfa6aefae6ab81330edf4d58\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MaliciousRequester.sol\":{\"keccak256\":\"0x40cb3f7645b5c340eb3bafc097fc244b4ab6f24146a588847517a837a995cf18\",\"urls\":[\"bzzr://221e5b93c05881b15cd26bac548321656743238ac33a1b70709c931b80042f39\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/ENSResolver.sol\":{\"keccak256\":\"0x64fcf7d2fc5efc87eaf7eba4a8f69af4d28986b6e4fb3590f076eb41ce40296e\",\"urls\":[\"bzzr://09e1bdee1831b5e85d3c7b5d96b7c26ad54e96d654cfaf18f58449c4c45961fc\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0x796a82f2e4ab35469224050fb62ecd2dc038474e7f9d4dfd7a1023080c009883\",\"urls\":[\"bzzr://6e0bb08f77ca150b228e70773696ea301e939c0b5542fedb05276b683b774e13\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/MaliciousRequester.sol": {
"id": 29
},
"tests/MaliciousChainlinkClient.sol": {
"id": 27
},
"tests/MaliciousChainlink.sol": {
"id": 26
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"ChainlinkClient.sol": {
"id": 1
},
"Chainlink.sol": {
"id": 0
},
"interfaces/ENSInterface.sol": {
"id": 15
},
"interfaces/LinkTokenInterface.sol": {
"id": 17
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 14
},
"interfaces/PointerInterface.sol": {
"id": 19
},
"vendor/ENSResolver.sol": {
"id": 35
},
"vendor/SafeMathChainlink.sol": {
"id": 37
}
},
"sourceCodes": {
"tests/MaliciousRequester.sol": "pragma solidity 0.5.0;\n\n\nimport \"./MaliciousChainlinkClient.sol\";\n\n\ncontract MaliciousRequester is MaliciousChainlinkClient {\n\n uint256 constant private ORACLE_PAYMENT = 1 * LINK;\n uint256 private expiration;\n\n constructor(address _link, address _oracle) public {\n setChainlinkToken(_link);\n setChainlinkOracle(_oracle);\n }\n\n function maliciousWithdraw()\n public\n {\n MaliciousChainlink.WithdrawRequest memory req = newWithdrawRequest(\n \"specId\", address(this), this.doesNothing.selector);\n chainlinkWithdrawRequest(req, ORACLE_PAYMENT);\n }\n\n function request(bytes32 _id, address _target, bytes memory _callbackFunc) public returns (bytes32 requestId) {\n Chainlink.Request memory req = buildChainlinkRequest(_id, _target, bytes4(keccak256(_callbackFunc)));\n expiration = now.add(5 minutes); // solhint-disable-line not-rely-on-time\n requestId = sendChainlinkRequest(req, ORACLE_PAYMENT);\n }\n\n function maliciousPrice(bytes32 _id) public returns (bytes32 requestId) {\n Chainlink.Request memory req = buildChainlinkRequest(_id, address(this), this.doesNothing.selector);\n requestId = chainlinkPriceRequest(req, ORACLE_PAYMENT);\n }\n\n function maliciousTargetConsumer(address _target) public returns (bytes32 requestId) {\n Chainlink.Request memory req = buildChainlinkRequest(\"specId\", _target, bytes4(keccak256(\"fulfill(bytes32,bytes32)\")));\n requestId = chainlinkTargetRequest(_target, req, ORACLE_PAYMENT);\n }\n\n function maliciousRequestCancel(bytes32 _id, bytes memory _callbackFunc) public {\n ChainlinkRequestInterface _oracle = ChainlinkRequestInterface(chainlinkOracleAddress());\n _oracle.cancelOracleRequest(\n request(_id, address(this), _callbackFunc),\n ORACLE_PAYMENT,\n this.maliciousRequestCancel.selector,\n expiration\n );\n }\n\n function doesNothing(bytes32, bytes32) public pure {} // solhint-disable-line no-empty-blocks\n}\n",
"tests/MaliciousChainlinkClient.sol": "pragma solidity 0.5.0;\n\nimport \"./MaliciousChainlink.sol\";\nimport \"../ChainlinkClient.sol\";\nimport \"../vendor/SafeMathChainlink.sol\";\n\ncontract MaliciousChainlinkClient is ChainlinkClient {\n using MaliciousChainlink for MaliciousChainlink.Request;\n using MaliciousChainlink for MaliciousChainlink.WithdrawRequest;\n using Chainlink for Chainlink.Request;\n using SafeMathChainlink for uint256;\n\n uint256 private maliciousRequests = 1;\n mapping(bytes32 => address) private maliciousPendingRequests;\n\n function newWithdrawRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (MaliciousChainlink.WithdrawRequest memory) {\n MaliciousChainlink.WithdrawRequest memory req;\n return req.initializeWithdraw(_specId, _callbackAddress, _callbackFunction);\n }\n\n function chainlinkTargetRequest(address _target, Chainlink.Request memory _req, uint256 _amount)\n internal\n returns(bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(_target, maliciousRequests));\n _req.nonce = maliciousRequests;\n maliciousPendingRequests[requestId] = chainlinkOracleAddress();\n emit ChainlinkRequested(requestId);\n LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());\n require(_link.transferAndCall(chainlinkOracleAddress(), _amount, encodeTargetRequest(_req)), \"Unable to transferAndCall to oracle\");\n maliciousRequests += 1;\n\n return requestId;\n }\n\n function chainlinkPriceRequest(Chainlink.Request memory _req, uint256 _amount)\n internal\n returns(bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, maliciousRequests));\n _req.nonce = maliciousRequests;\n maliciousPendingRequests[requestId] = chainlinkOracleAddress();\n emit ChainlinkRequested(requestId);\n LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());\n require(_link.transferAndCall(chainlinkOracleAddress(), _amount, encodePriceRequest(_req)), \"Unable to transferAndCall to oracle\");\n maliciousRequests += 1;\n\n return requestId;\n }\n\n function chainlinkWithdrawRequest(MaliciousChainlink.WithdrawRequest memory _req, uint256 _wei)\n internal\n returns(bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, maliciousRequests));\n _req.nonce = maliciousRequests;\n maliciousPendingRequests[requestId] = chainlinkOracleAddress();\n emit ChainlinkRequested(requestId);\n LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());\n require(_link.transferAndCall(chainlinkOracleAddress(), _wei, encodeWithdrawRequest(_req)), \"Unable to transferAndCall to oracle\");\n maliciousRequests += 1;\n return requestId;\n }\n\n function encodeWithdrawRequest(MaliciousChainlink.WithdrawRequest memory _req)\n internal pure returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"withdraw(address,uint256)\")),\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n _req.buf.buf);\n }\n\n function encodeTargetRequest(Chainlink.Request memory _req)\n internal pure returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)\")),\n 0, // overridden by onTokenTransfer\n 0, // overridden by onTokenTransfer\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n 1,\n _req.buf.buf);\n }\n\n function encodePriceRequest(Chainlink.Request memory _req)\n internal pure returns (bytes memory)\n {\n return abi.encodeWithSelector(\n bytes4(keccak256(\"oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)\")),\n 0, // overridden by onTokenTransfer\n 2000000000000000000, // overridden by onTokenTransfer\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n 1,\n _req.buf.buf);\n }\n}\n",
"tests/MaliciousChainlink.sol": "pragma solidity 0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"../vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"../vendor/Buffer.sol\";\n\nlibrary MaliciousChainlink {\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 specId;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n struct WithdrawRequest {\n bytes32 specId;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n function initializeWithdraw(\n WithdrawRequest memory self,\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (MaliciousChainlink.WithdrawRequest memory) {\n Buffer_Chainlink.init(self.buf, 128);\n self.specId = _specId;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}",
"ChainlinkClient.sol": "pragma solidity ^0.5.0;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = address(0);\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requestCount = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(address(oracle), _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requestCount));\n _req.nonce = requestCount;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requestCount += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId],\n \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes memory _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"interfaces/ENSInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address _owner) external;\n function setResolver(bytes32 node, address _resolver) external;\n function setOwner(bytes32 node, address _owner) external;\n function setTTL(bytes32 node, uint64 _ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.5.0;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string memory tokenName);\n function symbol() external view returns (string memory tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 requestPrice,\n bytes32 serviceAgreementID,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 dataVersion,\n bytes calldata data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.5.0;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity ^0.5.0;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n",
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.5.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMathChainlink {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n // Solidity only automatically asserts when dividing by 0\n require(b > 0, \"SafeMath: division by zero\");\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b != 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n}\n"
},
"sourceTreeHashHex": "0x6fafa483fe9888f79916a9d52a196f966794675804d3caf733d9559dcce1edab",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "MeanAggregator",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_sAId",
"type": "bytes32"
},
{
"name": "_oracle",
"type": "address"
},
{
"name": "_value",
"type": "bytes32"
}
],
"name": "fulfill",
"outputs": [
{
"name": "success",
"type": "bool"
},
{
"name": "complete",
"type": "bool"
},
{
"name": "response",
"type": "bytes"
},
{
"name": "paymentAmounts",
"type": "int256[]"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_sAId",
"type": "bytes32"
},
{
"name": "_serviceAgreementData",
"type": "bytes"
}
],
"name": "initiateJob",
"outputs": [
{
"name": "success",
"type": "bool"
},
{
"name": "message",
"type": "bytes"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405234801561001057600080fd5b50610ab9806100206000396000f3fe60806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416639760168f8114610050578063d43a12f614610171575b600080fd5b34801561005c57600080fd5b506100a26004803603608081101561007357600080fd5b5080359060208101359073ffffffffffffffffffffffffffffffffffffffff60408201351690606001356102ae565b6040518085151515158152602001841515151581526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156100f75781810151838201526020016100df565b50505050905090810190601f1680156101245780820380516001836020036101000a031916815260200191505b508381038252845181528451602091820191808701910280838360005b83811015610159578181015183820152602001610141565b50505050905001965050505050505060405180910390f35b34801561017d57600080fd5b5061022b6004803603604081101561019457600080fd5b813591908101906040810160208201356401000000008111156101b657600080fd5b8201836020820111156101c857600080fd5b803590602001918460018302840111640100000000831117156101ea57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061052c945050505050565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561027257818101518382015260200161025a565b50505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b600084815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120548190606090819015158061030d57506000878152600160209081526040808320548b8452600290925290912054145b156103545760408051808201909152601781527f6f7261636c6520616c7265616479207265706f727465640000000000000000006020820152600094508493509150610521565b6000878152600160205260408120548681151561036d57fe5b60008a815260016020526040812054929091049250908781151561038d57fe5b60008c8152600560209081526040808320548e8452600190925282205493909206935090830191828115156103be57fe5b60008e8152600460205260409020549190048582010191508110156103df57fe5b60008c81526004602090815260408083208490558d835260019091529020548281151561040857fe5b06600560008e8152602001908152602001600020819055506001600260008e815260200190815260200160002060008282540192505081905550600260008d815260200190815260200160002054600360008e815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060019750600160008c815260200190815260200160002080549050600260008e815260200190815260200160002054149650861561051c5760008c8152600460209081526040918290205482518083019190915282518082039092018252820190915295506105198b8d610650565b94505b505050505b945094509450949050565b60006060610538610981565b610541846107ce565b6000868152600160205260409020549091501561059757505060408051808201909152601581527f6a6f6220616c726561647920696e697469617465640000000000000000000000602082015260009150610649565b606081015151151561060c576000606060405190810160405280602281526020017f6d75737420646570656e64206f6e206174206c65617374206f6e65206f72616381526020017f6c650000000000000000000000000000000000000000000000000000000000008152509250925050610649565b606081015160008681526001602090815260409091208251610633939192909101906109c4565b5051600085815260208190526040902055600191505b9250929050565b6000828152600160209081526040918290205482518181528183028101909201909252606091801561068c578160200160208202803883390190505b506000848152600160209081526040808320549183905282205492935091905b6000868152600160205260409020548110156107c55760008581526003602090815260408083208984526001928390529083208054849190869081106106ee57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054039050600280850a908202600101840281151561073957fe5b04848481151561074557fe5b0460020203858381518110151561075857fe5b602090810290910181019190915260008781526003825260408082208a83526001909352812080548590811061078a57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001812055506001016106ac565b50505092915050565b6107d6610981565b6107de610981565b828060200190516101008110156107f457600080fd5b815160208301516040840151606085018051939592949193918301929164010000000081111561082357600080fd5b8201602081018481111561083657600080fd5b815185602082028301116401000000008211171561085357600080fd5b50509291906020018051906020019092919080519060200190929190805190602001909291908051906020019092919050505082925088600001896020018a6040018b6060018c6080018d60a0018e60c0018f60e001887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815250887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152508873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525088815250889052888152508881525088815250505050505050505080915050919050565b60408051610100810182526000808252602082018190529181018290526060808201526080810182905260a0810182905260c0810182905260e081019190915290565b828054828255906000526020600020908101928215610a3e579160200282015b82811115610a3e57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906109e4565b50610a4a929150610a4e565b5090565b610a8a91905b80821115610a4a5780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600101610a54565b9056fea165627a7a723058206655df89857acab5026c8ac94b8cf10bf3b102415e754daef9f52461d35484a30029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAB9 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x9760168F DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xD43A12F6 EQ PUSH2 0x171 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x2AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP5 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x124 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP1 DUP8 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x159 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x141 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x194 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x52C SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x272 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x25A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x29F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH1 0x60 SWAP1 DUP2 SWAP1 ISZERO ISZERO DUP1 PUSH2 0x30D JUMPI POP PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP12 DUP5 MSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD EQ JUMPDEST ISZERO PUSH2 0x354 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x6F7261636C6520616C7265616479207265706F72746564000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP5 POP DUP5 SWAP4 POP SWAP2 POP PUSH2 0x521 JUMP JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP7 DUP2 ISZERO ISZERO PUSH2 0x36D JUMPI INVALID JUMPDEST PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 DIV SWAP3 POP SWAP1 DUP8 DUP2 ISZERO ISZERO PUSH2 0x38D JUMPI INVALID JUMPDEST PUSH1 0x0 DUP13 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP15 DUP5 MSTORE PUSH1 0x1 SWAP1 SWAP3 MSTORE DUP3 KECCAK256 SLOAD SWAP4 SWAP1 SWAP3 MOD SWAP4 POP SWAP1 DUP4 ADD SWAP2 DUP3 DUP2 ISZERO ISZERO PUSH2 0x3BE JUMPI INVALID JUMPDEST PUSH1 0x0 DUP15 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 DIV DUP6 DUP3 ADD ADD SWAP2 POP DUP2 LT ISZERO PUSH2 0x3DF JUMPI INVALID JUMPDEST PUSH1 0x0 DUP13 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 SWAP1 SSTORE DUP14 DUP4 MSTORE PUSH1 0x1 SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD DUP3 DUP2 ISZERO ISZERO PUSH2 0x408 JUMPI INVALID JUMPDEST MOD PUSH1 0x5 PUSH1 0x0 DUP15 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP15 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH1 0x2 PUSH1 0x0 DUP14 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x3 PUSH1 0x0 DUP15 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 SWAP8 POP PUSH1 0x1 PUSH1 0x0 DUP13 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 POP PUSH1 0x2 PUSH1 0x0 DUP15 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD EQ SWAP7 POP DUP7 ISZERO PUSH2 0x51C JUMPI PUSH1 0x0 DUP13 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP3 SUB SWAP1 SWAP3 ADD DUP3 MSTORE DUP3 ADD SWAP1 SWAP2 MSTORE SWAP6 POP PUSH2 0x519 DUP12 DUP14 PUSH2 0x650 JUMP JUMPDEST SWAP5 POP JUMPDEST POP POP POP POP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH2 0x538 PUSH2 0x981 JUMP JUMPDEST PUSH2 0x541 DUP5 PUSH2 0x7CE JUMP JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x597 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x6A6F6220616C726561647920696E697469617465640000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 POP PUSH2 0x649 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD MLOAD MLOAD ISZERO ISZERO PUSH2 0x60C JUMPI PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D75737420646570656E64206F6E206174206C65617374206F6E65206F726163 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6C65000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP3 POP SWAP3 POP POP PUSH2 0x649 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD MLOAD PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP3 MLOAD PUSH2 0x633 SWAP4 SWAP2 SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x9C4 JUMP JUMPDEST POP MLOAD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x1 SWAP2 POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP2 DUP2 MSTORE DUP2 DUP4 MUL DUP2 ADD SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP1 ISZERO PUSH2 0x68C JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD SWAP2 DUP4 SWAP1 MSTORE DUP3 KECCAK256 SLOAD SWAP3 SWAP4 POP SWAP2 SWAP1 JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 LT ISZERO PUSH2 0x7C5 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP5 MSTORE PUSH1 0x1 SWAP3 DUP4 SWAP1 MSTORE SWAP1 DUP4 KECCAK256 DUP1 SLOAD DUP5 SWAP2 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0x6EE JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD SUB SWAP1 POP PUSH1 0x2 DUP1 DUP6 EXP SWAP1 DUP3 MUL PUSH1 0x1 ADD DUP5 MUL DUP2 ISZERO ISZERO PUSH2 0x739 JUMPI INVALID JUMPDEST DIV DUP5 DUP5 DUP2 ISZERO ISZERO PUSH2 0x745 JUMPI INVALID JUMPDEST DIV PUSH1 0x2 MUL SUB DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x758 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x3 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP11 DUP4 MSTORE PUSH1 0x1 SWAP1 SWAP4 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP6 SWAP1 DUP2 LT PUSH2 0x78A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD DUP2 KECCAK256 SSTORE POP PUSH1 0x1 ADD PUSH2 0x6AC JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x7D6 PUSH2 0x981 JUMP JUMPDEST PUSH2 0x7DE PUSH2 0x981 JUMP JUMPDEST DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x100 DUP2 LT ISZERO PUSH2 0x7F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD DUP1 MLOAD SWAP4 SWAP6 SWAP3 SWAP5 SWAP2 SWAP4 SWAP2 DUP4 ADD SWAP3 SWAP2 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x823 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH1 0x20 DUP2 ADD DUP5 DUP2 GT ISZERO PUSH2 0x836 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP6 PUSH1 0x20 DUP3 MUL DUP4 ADD GT PUSH5 0x100000000 DUP3 GT OR ISZERO PUSH2 0x853 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP SWAP3 SWAP2 SWAP1 PUSH1 0x20 ADD DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP DUP3 SWAP3 POP DUP9 PUSH1 0x0 ADD DUP10 PUSH1 0x20 ADD DUP11 PUSH1 0x40 ADD DUP12 PUSH1 0x60 ADD DUP13 PUSH1 0x80 ADD DUP14 PUSH1 0xA0 ADD DUP15 PUSH1 0xC0 ADD DUP16 PUSH1 0xE0 ADD DUP9 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE POP DUP9 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE POP DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP DUP9 DUP2 MSTORE POP DUP9 SWAP1 MSTORE DUP9 DUP2 MSTORE POP DUP9 DUP2 MSTORE POP DUP9 DUP2 MSTORE POP POP POP POP POP POP POP POP POP DUP1 SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP1 DUP3 ADD MSTORE PUSH1 0x80 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xC0 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xE0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0xA3E JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0xA3E JUMPI DUP3 MLOAD DUP3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x9E4 JUMP JUMPDEST POP PUSH2 0xA4A SWAP3 SWAP2 POP PUSH2 0xA4E JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xA8A SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xA4A JUMPI DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xA54 JUMP JUMPDEST SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH7 0x55DF89857ACAB5 MUL PUSH13 0x8AC94B8CF10BF3B102415E754D 0xae 0xf9 CREATE2 0x24 PUSH2 0xD354 DUP5 LOG3 STOP 0x29 ",
"sourceMap": "187:3249:30:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;187:3249:30;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x60806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416639760168f8114610050578063d43a12f614610171575b600080fd5b34801561005c57600080fd5b506100a26004803603608081101561007357600080fd5b5080359060208101359073ffffffffffffffffffffffffffffffffffffffff60408201351690606001356102ae565b6040518085151515158152602001841515151581526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156100f75781810151838201526020016100df565b50505050905090810190601f1680156101245780820380516001836020036101000a031916815260200191505b508381038252845181528451602091820191808701910280838360005b83811015610159578181015183820152602001610141565b50505050905001965050505050505060405180910390f35b34801561017d57600080fd5b5061022b6004803603604081101561019457600080fd5b813591908101906040810160208201356401000000008111156101b657600080fd5b8201836020820111156101c857600080fd5b803590602001918460018302840111640100000000831117156101ea57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061052c945050505050565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561027257818101518382015260200161025a565b50505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b600084815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120548190606090819015158061030d57506000878152600160209081526040808320548b8452600290925290912054145b156103545760408051808201909152601781527f6f7261636c6520616c7265616479207265706f727465640000000000000000006020820152600094508493509150610521565b6000878152600160205260408120548681151561036d57fe5b60008a815260016020526040812054929091049250908781151561038d57fe5b60008c8152600560209081526040808320548e8452600190925282205493909206935090830191828115156103be57fe5b60008e8152600460205260409020549190048582010191508110156103df57fe5b60008c81526004602090815260408083208490558d835260019091529020548281151561040857fe5b06600560008e8152602001908152602001600020819055506001600260008e815260200190815260200160002060008282540192505081905550600260008d815260200190815260200160002054600360008e815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060019750600160008c815260200190815260200160002080549050600260008e815260200190815260200160002054149650861561051c5760008c8152600460209081526040918290205482518083019190915282518082039092018252820190915295506105198b8d610650565b94505b505050505b945094509450949050565b60006060610538610981565b610541846107ce565b6000868152600160205260409020549091501561059757505060408051808201909152601581527f6a6f6220616c726561647920696e697469617465640000000000000000000000602082015260009150610649565b606081015151151561060c576000606060405190810160405280602281526020017f6d75737420646570656e64206f6e206174206c65617374206f6e65206f72616381526020017f6c650000000000000000000000000000000000000000000000000000000000008152509250925050610649565b606081015160008681526001602090815260409091208251610633939192909101906109c4565b5051600085815260208190526040902055600191505b9250929050565b6000828152600160209081526040918290205482518181528183028101909201909252606091801561068c578160200160208202803883390190505b506000848152600160209081526040808320549183905282205492935091905b6000868152600160205260409020548110156107c55760008581526003602090815260408083208984526001928390529083208054849190869081106106ee57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054039050600280850a908202600101840281151561073957fe5b04848481151561074557fe5b0460020203858381518110151561075857fe5b602090810290910181019190915260008781526003825260408082208a83526001909352812080548590811061078a57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001812055506001016106ac565b50505092915050565b6107d6610981565b6107de610981565b828060200190516101008110156107f457600080fd5b815160208301516040840151606085018051939592949193918301929164010000000081111561082357600080fd5b8201602081018481111561083657600080fd5b815185602082028301116401000000008211171561085357600080fd5b50509291906020018051906020019092919080519060200190929190805190602001909291908051906020019092919050505082925088600001896020018a6040018b6060018c6080018d60a0018e60c0018f60e001887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815250887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152508873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525088815250889052888152508881525088815250505050505050505080915050919050565b60408051610100810182526000808252602082018190529181018290526060808201526080810182905260a0810182905260c0810182905260e081019190915290565b828054828255906000526020600020908101928215610a3e579160200282015b82811115610a3e57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906109e4565b50610a4a929150610a4e565b5090565b610a8a91905b80821115610a4a5780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600101610a54565b9056fea165627a7a723058206655df89857acab5026c8ac94b8cf10bf3b102415e754daef9f52461d35484a30029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x9760168F DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xD43A12F6 EQ PUSH2 0x171 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x2AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP5 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x124 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP1 DUP8 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x159 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x141 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x194 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x52C SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x272 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x25A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x29F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH1 0x60 SWAP1 DUP2 SWAP1 ISZERO ISZERO DUP1 PUSH2 0x30D JUMPI POP PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP12 DUP5 MSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD EQ JUMPDEST ISZERO PUSH2 0x354 JUMPI PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x6F7261636C6520616C7265616479207265706F72746564000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP5 POP DUP5 SWAP4 POP SWAP2 POP PUSH2 0x521 JUMP JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP7 DUP2 ISZERO ISZERO PUSH2 0x36D JUMPI INVALID JUMPDEST PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 DIV SWAP3 POP SWAP1 DUP8 DUP2 ISZERO ISZERO PUSH2 0x38D JUMPI INVALID JUMPDEST PUSH1 0x0 DUP13 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP15 DUP5 MSTORE PUSH1 0x1 SWAP1 SWAP3 MSTORE DUP3 KECCAK256 SLOAD SWAP4 SWAP1 SWAP3 MOD SWAP4 POP SWAP1 DUP4 ADD SWAP2 DUP3 DUP2 ISZERO ISZERO PUSH2 0x3BE JUMPI INVALID JUMPDEST PUSH1 0x0 DUP15 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 DIV DUP6 DUP3 ADD ADD SWAP2 POP DUP2 LT ISZERO PUSH2 0x3DF JUMPI INVALID JUMPDEST PUSH1 0x0 DUP13 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 SWAP1 SSTORE DUP14 DUP4 MSTORE PUSH1 0x1 SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD DUP3 DUP2 ISZERO ISZERO PUSH2 0x408 JUMPI INVALID JUMPDEST MOD PUSH1 0x5 PUSH1 0x0 DUP15 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP15 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH1 0x2 PUSH1 0x0 DUP14 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x3 PUSH1 0x0 DUP15 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x1 SWAP8 POP PUSH1 0x1 PUSH1 0x0 DUP13 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD SWAP1 POP PUSH1 0x2 PUSH1 0x0 DUP15 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD EQ SWAP7 POP DUP7 ISZERO PUSH2 0x51C JUMPI PUSH1 0x0 DUP13 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP3 SUB SWAP1 SWAP3 ADD DUP3 MSTORE DUP3 ADD SWAP1 SWAP2 MSTORE SWAP6 POP PUSH2 0x519 DUP12 DUP14 PUSH2 0x650 JUMP JUMPDEST SWAP5 POP JUMPDEST POP POP POP POP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH2 0x538 PUSH2 0x981 JUMP JUMPDEST PUSH2 0x541 DUP5 PUSH2 0x7CE JUMP JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x597 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x6A6F6220616C726561647920696E697469617465640000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 POP PUSH2 0x649 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD MLOAD MLOAD ISZERO ISZERO PUSH2 0x60C JUMPI PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D75737420646570656E64206F6E206174206C65617374206F6E65206F726163 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6C65000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP3 POP SWAP3 POP POP PUSH2 0x649 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD MLOAD PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP3 MLOAD PUSH2 0x633 SWAP4 SWAP2 SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x9C4 JUMP JUMPDEST POP MLOAD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x1 SWAP2 POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP2 DUP2 MSTORE DUP2 DUP4 MUL DUP2 ADD SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP1 ISZERO PUSH2 0x68C JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD SWAP2 DUP4 SWAP1 MSTORE DUP3 KECCAK256 SLOAD SWAP3 SWAP4 POP SWAP2 SWAP1 JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 LT ISZERO PUSH2 0x7C5 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP10 DUP5 MSTORE PUSH1 0x1 SWAP3 DUP4 SWAP1 MSTORE SWAP1 DUP4 KECCAK256 DUP1 SLOAD DUP5 SWAP2 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0x6EE JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD SUB SWAP1 POP PUSH1 0x2 DUP1 DUP6 EXP SWAP1 DUP3 MUL PUSH1 0x1 ADD DUP5 MUL DUP2 ISZERO ISZERO PUSH2 0x739 JUMPI INVALID JUMPDEST DIV DUP5 DUP5 DUP2 ISZERO ISZERO PUSH2 0x745 JUMPI INVALID JUMPDEST DIV PUSH1 0x2 MUL SUB DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x758 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x3 DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP11 DUP4 MSTORE PUSH1 0x1 SWAP1 SWAP4 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP6 SWAP1 DUP2 LT PUSH2 0x78A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD DUP2 KECCAK256 SSTORE POP PUSH1 0x1 ADD PUSH2 0x6AC JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x7D6 PUSH2 0x981 JUMP JUMPDEST PUSH2 0x7DE PUSH2 0x981 JUMP JUMPDEST DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0x100 DUP2 LT ISZERO PUSH2 0x7F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD DUP1 MLOAD SWAP4 SWAP6 SWAP3 SWAP5 SWAP2 SWAP4 SWAP2 DUP4 ADD SWAP3 SWAP2 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x823 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD PUSH1 0x20 DUP2 ADD DUP5 DUP2 GT ISZERO PUSH2 0x836 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP6 PUSH1 0x20 DUP3 MUL DUP4 ADD GT PUSH5 0x100000000 DUP3 GT OR ISZERO PUSH2 0x853 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP SWAP3 SWAP2 SWAP1 PUSH1 0x20 ADD DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP DUP3 SWAP3 POP DUP9 PUSH1 0x0 ADD DUP10 PUSH1 0x20 ADD DUP11 PUSH1 0x40 ADD DUP12 PUSH1 0x60 ADD DUP13 PUSH1 0x80 ADD DUP14 PUSH1 0xA0 ADD DUP15 PUSH1 0xC0 ADD DUP16 PUSH1 0xE0 ADD DUP9 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE POP DUP9 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE POP DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP DUP9 DUP2 MSTORE POP DUP9 SWAP1 MSTORE DUP9 DUP2 MSTORE POP DUP9 DUP2 MSTORE POP DUP9 DUP2 MSTORE POP POP POP POP POP POP POP POP POP DUP1 SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x100 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP1 DUP3 ADD MSTORE PUSH1 0x80 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xC0 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xE0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0xA3E JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0xA3E JUMPI DUP3 MLOAD DUP3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x9E4 JUMP JUMPDEST POP PUSH2 0xA4A SWAP3 SWAP2 POP PUSH2 0xA4E JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xA8A SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xA4A JUMPI DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xA54 JUMP JUMPDEST SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH7 0x55DF89857ACAB5 MUL PUSH13 0x8AC94B8CF10BF3B102415E754D 0xae 0xf9 CREATE2 0x24 PUSH2 0xD354 DUP5 LOG3 STOP 0x29 ",
"sourceMap": "187:3249:30:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1508:1226;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1508:1226:30;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;1508:1226:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1508:1226:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1508:1226:30;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1508:1226:30;;;;;;;;;;;;;;;;;;;;;916:588;;8:9:-1;5:2;;;30:1;27;20:12;5:2;916:588:30;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;916:588:30;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;916:588:30;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;916:588:30;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;916:588:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;916:588:30;;-1:-1:-1;916:588:30;;-1:-1:-1;;;;;916:588:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;916:588:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1508:1226;1617:12;1717:26;;;:14;:26;;;;;;;;:35;;;;;;;;;;;1617:12;;1646:21;;;;1717:40;;;:103;;-1:-1:-1;1799:14:30;;;;:7;:14;;;;;;;;:21;1769:26;;;:14;:26;;;;;;;:51;1717:103;1713:192;;;1832:64;;;;;;;;;;;;;;;;;1840:5;;-1:-1:-1;1840:5:30;;-1:-1:-1;1832:64:30;-1:-1:-1;1832:64:30;;1713:192;1912:17;1950:14;;;:7;:14;;;;;:21;1940:6;1932:39;;;;;;;1979:18;2018:14;;;:7;:14;;;;;:21;1932:39;;;;;-1:-1:-1;1979:18:30;2008:6;2000:39;;;;;;;2047:20;2070:21;;;:9;:21;;;;;;;;;2183:14;;;:7;:14;;;;;:21;2000:39;;;;;-1:-1:-1;2070:34:30;;;;;2168:36;;;;;;;2133:19;;;;:7;:19;;;;;;2168:36;;;2133:31;;;:72;;-1:-1:-1;2220:33:30;;;2213:41;;;;2277:19;;;;:7;:19;;;;;;;;:32;;;2356:14;;;:7;:14;;;;;:21;2341:12;:36;;;;;;;;2317:9;:21;2327:10;2317:21;;;;;;;;;;;:60;;;;2415:1;2385:14;:26;2400:10;2385:26;;;;;;;;;;;;:31;;;;;;;;;;;2462:14;:26;2477:10;2462:26;;;;;;;;;;;;2424:14;:26;2439:10;2424:26;;;;;;;;;;;:35;2451:7;2424:35;;;;;;;;;;;;;;;:64;;;;2506:4;2496:14;;2560:7;:14;2568:5;2560:14;;;;;;;;;;;:21;;;;2530:14;:26;2545:10;2530:26;;;;;;;;;;;;:51;2518:64;;2594:8;2590:138;;;2636:19;;;;:7;:19;;;;;;;;;;2625:31;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;2625:31:30;;;;;;-1:-1:-1;2683:36:30;2701:5;2644:10;2683:17;:36::i;:::-;2666:53;;2590:138;1508:1226;;;;;;;;;;;;;;:::o;916:588::-;1013:12;1027:20;1057:40;;:::i;:::-;1100:45;1123:21;1100:22;:45::i;:::-;1158:14;;;;:7;:14;;;;;:21;1057:88;;-1:-1:-1;1158:26:30;1154:97;;-1:-1:-1;;1211:30:30;;;;;;;;;;;;;;;;;1204:5;;-1:-1:-1;1196:46:30;;1154:97;1262:24;;;;:31;:36;1258:120;;;1318:5;1325:43;;;;;;;;;;;;;;;;;;;;;;;1310:59;;;;;;;1258:120;1402:24;;;;1385:14;;;;:7;:14;;;;;;;;:41;;;;:14;;:41;;;;;:::i;:::-;-1:-1:-1;1451:24:30;;1434:14;;;;;;;;;;:41;1493:4;;-1:-1:-1;916:588:30;;;;;;:::o;2738:696::-;2885:14;;;;:7;:14;;;;;;;;;:21;2872:35;;;;;;;;;;;;;;;;2817:30;;2872:35;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;2872:35:30;-1:-1:-1;2913:18:30;2934:14;;;:7;:14;;;;;;;;:21;2984:14;;;;;;;2855:52;;-1:-1:-1;2934:21:30;2984:14;3004:426;3034:14;;;;:7;:14;;;;;:21;3027:28;;3004:426;;;3148:20;3171:26;;;:14;:26;;;;;;;;3198:14;;;3222:1;3198:14;;;;;;;:20;;3148;;3198:14;3213:4;;3198:20;;;;;;;;;;;;;;;;;;;;3171:48;;;;;;;;;;;;;:52;;-1:-1:-1;3356:1:30;3344:13;;;;3319:14;;3198:20;3318;3302:37;;3301:57;;;;;;;;3277:10;3264:12;:23;;;;;;;;3261:1;:27;:98;3231:14;3246:4;3231:20;;;;;;;;;;;;;;;;;;;:129;;;;3375:26;;;;:14;:26;;;;;;3402:14;;;:7;:14;;;;;:20;;3417:4;;3402:20;;;;;;;;;;;;;;;;;;;;3375:48;;;;;;;;;;;;3368:55;-1:-1:-1;3402:20:30;3057:6;3004:426;;;;2738:696;;;;;;:::o;937:670:10:-;1047:23;;:::i;:::-;1110:33;;:::i;:::-;1410:21;1390:189;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;1390:189:10;;;;;;;;;;;;;;;;;;;;;;;;;;19:11:-1;11:20;;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;0:373;;1390:189:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1150:429;;;1152:9;:17;;1177:9;:20;;1205:9;:15;;1228:9;:17;;1253:9;:23;;1284:9;:20;;1312:9;:32;;1352:9;:28;;1150:429;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1593:9;1586:16;;;937:670;;;:::o;187:3249:30:-;;;;;;;;;-1:-1:-1;187:3249:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;187:3249:30;;;;;;;-1:-1:-1;187:3249:30;;;-1:-1:-1;187:3249:30;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o"
},
"methodIdentifiers": {
"fulfill(bytes32,bytes32,address,bytes32)": "9760168f",
"initiateJob(bytes32,bytes)": "d43a12f6"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_sAId\",\"type\":\"bytes32\"},{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"fulfill\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"},{\"name\":\"complete\",\"type\":\"bool\"},{\"name\":\"response\",\"type\":\"bytes\"},{\"name\":\"paymentAmounts\",\"type\":\"int256[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_sAId\",\"type\":\"bytes32\"},{\"name\":\"_serviceAgreementData\",\"type\":\"bytes\"}],\"name\":\"initiateJob\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"},{\"name\":\"message\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{},\"notice\":\"Computes the mean of the values the oracles pass it via fulfill method\"}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MeanAggregator.sol\":\"MeanAggregator\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/dev/CoordinatorInterface.sol\":{\"keccak256\":\"0x5e47514ec65553a3cd071eb215a3b70252ac803ed2635140cda3c848265d9ef0\",\"urls\":[\"bzzr://aab94dbeb95e865cfc0f5a8808ce5bc5529e0105a53290b03ee6ccd83430d450\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/dev/ServiceAgreementDecoder.sol\":{\"keccak256\":\"0x809ce1b1bec5b16d0bf0c637fc91b46ecf0707a38f6fc28a342e3336f902006a\",\"urls\":[\"bzzr://62417d69405cc3dc4d2fcfa7322cb491be6b8a73bfa44e779e1ca8d90e4a05fe\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MeanAggregator.sol\":{\"keccak256\":\"0x7104b729f30c88ab66864d34da94bb7ea475ae3b7a2434a761ec41672a7a8365\",\"urls\":[\"bzzr://3e56acf4879bb3bafcf514a956690b308323d815e6b6060b0bc2606879d9a504\"]}},\"version\":1}",
"userdoc": {
"methods": {},
"notice": "Computes the mean of the values the oracles pass it via fulfill method"
}
},
"sources": {
"tests/MeanAggregator.sol": {
"id": 30
},
"dev/CoordinatorInterface.sol": {
"id": 7
},
"dev/ServiceAgreementDecoder.sol": {
"id": 10
}
},
"sourceCodes": {
"tests/MeanAggregator.sol": "pragma solidity 0.5.0;\n\nimport \"../dev/CoordinatorInterface.sol\";\nimport \"../dev/ServiceAgreementDecoder.sol\";\n\n/// Computes the mean of the values the oracles pass it via fulfill method\ncontract MeanAggregator is ServiceAgreementDecoder {\n\n // Relies on Coordinator's authorization of the oracles (no need to track\n // oracle authorization in this contract.)\n\n mapping(bytes32 /* service agreement ID */ => uint256) payment;\n mapping(bytes32 /* service agreement ID */ => address[]) oracles;\n mapping(bytes32 /* request ID */ => uint256) numberReported;\n mapping(bytes32 /* request ID */ => mapping(address => uint256)) reportingOrder;\n\n // Current total for given request, divided by number of oracles reporting\n mapping(bytes32 /* request ID */ => uint256) average;\n // Remainder of total for given request from division by number of oracles.\n mapping(bytes32 /* request ID */ => uint256) remainder;\n\n function initiateJob(\n bytes32 _sAId, bytes memory _serviceAgreementData)\n public returns (bool success, bytes memory message) {\n ServiceAgreement memory serviceAgreement = decodeServiceAgreement(_serviceAgreementData);\n\n if (oracles[_sAId].length != 0) {\n return (false, bytes(\"job already initiated\"));\n }\n if (serviceAgreement.oracles.length == 0) {\n return (false, bytes(\"must depend on at least one oracle\"));\n }\n oracles[_sAId] = serviceAgreement.oracles;\n payment[_sAId] = serviceAgreement.payment;\n success = true;\n }\n\n function fulfill(bytes32 _requestId, bytes32 _sAId, address _oracle,\n bytes32 _value) public\n returns (bool success, bool complete, bytes memory response,\n int256[] memory paymentAmounts) {\n if (reportingOrder[_requestId][_oracle] != 0 ||\n numberReported[_requestId] == oracles[_sAId].length) {\n return (false, false, \"oracle already reported\", paymentAmounts);\n }\n uint256 oDividend = uint256(_value) / oracles[_sAId].length;\n uint256 oRemainder = uint256(_value) % oracles[_sAId].length;\n uint256 newRemainder = remainder[_requestId] + oRemainder;\n uint256 newAverage = average[_requestId] + oDividend + (newRemainder / oracles[_sAId].length);\n assert(newAverage >= average[_requestId]); // No overflow\n average[_requestId] = newAverage;\n remainder[_requestId] = newRemainder % oracles[_sAId].length;\n numberReported[_requestId] += 1;\n reportingOrder[_requestId][_oracle] = numberReported[_requestId];\n success = true;\n complete = (numberReported[_requestId] == oracles[_sAId].length);\n if (complete) {\n response = abi.encode(average[_requestId]);\n paymentAmounts = calculatePayments(_sAId, _requestId);\n }\n }\n\n function calculatePayments(bytes32 _sAId, bytes32 _requestId) private returns (int256[] memory paymentAmounts) {\n paymentAmounts = new int256[](oracles[_sAId].length);\n uint256 numOracles = oracles[_sAId].length;\n uint256 totalPayment = payment[_sAId];\n for (uint256 oIdx = 0; oIdx < oracles[_sAId].length; oIdx++) {\n // Linearly-decaying payout determined by each oracle's reportingIdx\n uint256 reportingIdx = reportingOrder[_requestId][oracles[_sAId][oIdx]] - 1;\n paymentAmounts[oIdx] = int256(2*(totalPayment/numOracles) - (\n (totalPayment * ((2*reportingIdx) + 1)) / (numOracles**2)));\n delete reportingOrder[_requestId][oracles[_sAId][oIdx]];\n }\n }\n}\n",
"dev/CoordinatorInterface.sol": "pragma solidity 0.5.0;\n\ncontract CoordinatorInterface {\n\n function initiateServiceAgreement(\n bytes memory _serviceAgreementData,\n bytes memory _oracleSignaturesData)\n public returns (bytes32);\n\n function fulfillOracleRequest(\n bytes32 _requestId,\n bytes32 _aggregatorArgs)\n external returns (bool);\n}\n",
"dev/ServiceAgreementDecoder.sol": "pragma solidity 0.5.0;\n\ncontract ServiceAgreementDecoder {\n\n struct ServiceAgreement {\n uint256 payment;\n uint256 expiration;\n uint256 endAt;\n address[] oracles;\n // This effectively functions as an ID tag for the off-chain job of the\n // service agreement. It is calculated as the keccak256 hash of the\n // normalized JSON request to create the ServiceAgreement, but that identity\n // is unused, and its value is essentially arbitrary.\n bytes32 requestDigest;\n // Specification of aggregator interface. See ../tests/MeanAggregator.sol\n // for example\n address aggregator;\n // Selectors for the interface methods must be specified, because their\n // arguments can vary from aggregator to aggregator.\n //\n // Function selector for aggregator initiateJob method\n bytes4 aggInitiateJobSelector;\n // Function selector for aggregator fulfill method\n bytes4 aggFulfillSelector;\n }\n\n function decodeServiceAgreement(\n bytes memory _serviceAgreementData\n )\n internal\n pure\n returns(ServiceAgreement memory)\n {\n // solhint-disable indent\n ServiceAgreement memory agreement;\n\n ( agreement.payment,\n agreement.expiration,\n agreement.endAt,\n agreement.oracles,\n agreement.requestDigest,\n agreement.aggregator,\n agreement.aggInitiateJobSelector,\n agreement.aggFulfillSelector) =\n abi.decode(\n _serviceAgreementData,\n ( uint256,\n uint256,\n uint256,\n address[],\n bytes32,\n address,\n bytes4,\n bytes4 )\n );\n\n return agreement;\n }\n}\n"
},
"sourceTreeHashHex": "0x55d4ceb4b9282c9930ec47b8df6447ee8141c52b6dcf146b583103aeef4afda4",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "Median",
"compilerOutput": {
"abi": [],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a7230582073fff36124c3b7afa507ff52365ca2e102f772d021077aa5ad8c6247a53e0afb0029",
"opcodes": "PUSH1 0x4C PUSH1 0x2C PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x0 DUP2 EQ PUSH1 0x1C JUMPI PUSH1 0x1E JUMP JUMPDEST INVALID JUMPDEST POP ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH20 0xFFF36124C3B7AFA507FF52365CA2E102F772D021 SMOD PUSH27 0xA5AD8C6247A53E0AFB002900000000000000000000000000000000 ",
"sourceMap": "105:2813:3:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a7230582073fff36124c3b7afa507ff52365ca2e102f772d021077aa5ad8c6247a53e0afb0029",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH20 0xFFF36124C3B7AFA507FF52365CA2E102F772D021 SMOD PUSH27 0xA5AD8C6247A53E0AFB002900000000000000000000000000000000 ",
"sourceMap": "105:2813:3:-;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Median.sol\":\"Median\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Median.sol\":{\"keccak256\":\"0xb0b6c08d8d2d8f42f0465575cf5f9b11fd65381ae31d004b6c5e0e053d31b742\",\"urls\":[\"bzzr://fe529079ffb63f3cbb4b001bc85c95733a1c2369ce9226cbe35c93a5bf810188\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0x796a82f2e4ab35469224050fb62ecd2dc038474e7f9d4dfd7a1023080c009883\",\"urls\":[\"bzzr://6e0bb08f77ca150b228e70773696ea301e939c0b5542fedb05276b683b774e13\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/SignedSafeMath.sol\":{\"keccak256\":\"0x2695f6b8893d0333f719b12156bb8e2c2589c431fdf7241aca428bd2b5564dd4\",\"urls\":[\"bzzr://b82f0e4c561256ead4b559e2bc4585731001e99b572702849cb12b918c213fe8\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"Median.sol": {
"id": 3
},
"vendor/SafeMathChainlink.sol": {
"id": 37
},
"vendor/SignedSafeMath.sol": {
"id": 38
}
},
"sourceCodes": {
"Median.sol": "pragma solidity ^0.5.0;\n\nimport \"./vendor/SafeMathChainlink.sol\";\nimport \"./vendor/SignedSafeMath.sol\";\n\nlibrary Median {\n using SafeMathChainlink for uint256;\n using SignedSafeMath for int256;\n\n /**\n * @dev Returns the sorted middle, or the average of the two middle indexed \n * items if the array has an even number of elements\n * @param _list The list of elements to compare\n */\n function calculate(int256[] memory _list)\n internal\n pure\n returns (int256)\n {\n uint256 answerLength = _list.length;\n uint256 middleIndex = answerLength.div(2);\n if (answerLength % 2 == 0) {\n int256 median1 = quickselect(copy(_list), middleIndex);\n int256 median2 = quickselect(_list, middleIndex.add(1)); // quickselect is 1 indexed\n int256 remainder = (median1 % 2 + median2 % 2) / 2;\n return (median1 / 2).add(median2 / 2).add(remainder); // signed integers are not supported by SafeMath\n } else {\n return quickselect(_list, middleIndex.add(1)); // quickselect is 1 indexed\n }\n }\n\n /**\n * @dev Returns the kth value of the ordered array\n * See: http://www.cs.yale.edu/homes/aspnes/pinewiki/QuickSelect.html\n * @param _a The list of elements to pull from\n * @param _k The index, 1 based, of the elements you want to pull from when ordered\n */\n function quickselect(int256[] memory _a, uint256 _k)\n private\n pure\n returns (int256)\n {\n int256[] memory a = _a;\n uint256 k = _k;\n uint256 aLen = a.length;\n int256[] memory a1 = new int256[](aLen);\n int256[] memory a2 = new int256[](aLen);\n uint256 a1Len;\n uint256 a2Len;\n int256 pivot;\n uint256 i;\n\n while (true) {\n pivot = a[aLen.div(2)];\n a1Len = 0;\n a2Len = 0;\n for (i = 0; i < aLen; i++) {\n if (a[i] < pivot) {\n a1[a1Len] = a[i];\n a1Len++;\n } else if (a[i] > pivot) {\n a2[a2Len] = a[i];\n a2Len++;\n }\n }\n if (k <= a1Len) {\n aLen = a1Len;\n (a, a1) = swap(a, a1);\n } else if (k > (aLen.sub(a2Len))) {\n k = k.sub(aLen.sub(a2Len));\n aLen = a2Len;\n (a, a2) = swap(a, a2);\n } else {\n return pivot;\n }\n }\n }\n\n /**\n * @dev Swaps the pointers to two uint256 arrays in memory\n * @param _a The pointer to the first in memory array\n * @param _b The pointer to the second in memory array\n */\n function swap(int256[] memory _a, int256[] memory _b)\n private\n pure\n returns(int256[] memory, int256[] memory)\n {\n return (_b, _a);\n }\n\n /**\n * @dev Makes an in memory copy of the array passed in\n * @param _list The pointer to the array to be copied\n */\n function copy(int256[] memory _list)\n private\n pure\n returns(int256[] memory)\n {\n int256[] memory list2 = new int256[](_list.length);\n for (uint256 i = 0; i < _list.length; i++) {\n list2[i] = _list[i];\n }\n return list2;\n }\n\n}\n",
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.5.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMathChainlink {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n // Solidity only automatically asserts when dividing by 0\n require(b > 0, \"SafeMath: division by zero\");\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b != 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n}\n",
"vendor/SignedSafeMath.sol": "pragma solidity ^0.5.0;\n\nlibrary SignedSafeMath {\n\n /**\n * @dev Adds two int256s and makes sure the result doesn't overflow. Signed\n * integers aren't supported by the SafeMath library, thus this method\n * @param _a The first number to be added\n * @param _a The second number to be added\n */\n function add(int256 _a, int256 _b)\n internal\n pure\n returns (int256)\n {\n // solium-disable-next-line zeppelin/no-arithmetic-operations\n int256 c = _a + _b;\n require((_b >= 0 && c >= _a) || (_b < 0 && c < _a), \"SignedSafeMath: addition overflow\");\n\n return c;\n }\n}"
},
"sourceTreeHashHex": "0x72fade0eedb998d960365d67311e12398bf2c61ab02bb1d2aa880412bda1a427",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "MedianTestHelper",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [
{
"name": "_list",
"type": "int256[]"
}
],
"name": "publicGet",
"outputs": [
{
"name": "",
"type": "int256"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405234801561001057600080fd5b50610699806100206000396000f3fe6080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663115efb208114610045575b600080fd5b34801561005157600080fd5b506100f56004803603602081101561006857600080fd5b81019060208101813564010000000081111561008357600080fd5b82018360208201111561009557600080fd5b803590602001918460208302840111640100000000831117156100b757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610107945050505050565b60408051918252519081900360200190f35b60006101128261011a565b90505b919050565b80516000908161013182600263ffffffff6101d016565b90506002820615156101b257600061015161014b86610258565b836102d4565b9050600061016f8661016a85600163ffffffff6104bb16565b6102d4565b905060006002808407818407010590506101a68161019a60028505600287059063ffffffff61053616565b9063ffffffff61053616565b95505050505050610115565b6101c78461016a83600163ffffffff6104bb16565b92505050610115565b600080821161024057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481151561024d57fe5b049150505b92915050565b6060808251604051908082528060200260200182016040528015610286578160200160208202803883390190505b50905060005b83518110156102cd5783818151811015156102a357fe5b9060200190602002015182828151811015156102bb57fe5b6020908102909101015260010161028c565b5092915050565b8151604080518281526020808402820101909152600091849184919060609082801561030a578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015610339578160200160208202803883390190505b5090506000806000805b8861035588600263ffffffff6101d016565b8151811061035f57fe5b9060200190602002015191506000935060009250600090505b868110156104385781898281518110151561038f57fe5b9060200190602002015112156103da5788818151811015156103ad57fe5b9060200190602002015186858151811015156103c557fe5b60209081029091010152600190930192610430565b8189828151811015156103e957fe5b90602001906020020151131561043057888181518110151561040757fe5b90602001906020020151858481518110151561041f57fe5b602090810290910101526001909201915b600101610378565b8388116104565783965061044c89876105f3565b90995095506104b6565b610466878463ffffffff6105f616565b8811156104a65761048d610480888563ffffffff6105f616565b899063ffffffff6105f616565b975082965061049c89866105f3565b90995094506104b6565b5097506102529650505050505050565b610343565b60008282018381101561052f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082820181831280159061054b5750838112155b80610560575060008312801561056057508381125b151561052f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b91565b60008282111561066757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fea165627a7a7230582000d33069519236674c726c5673da55cef8f4a669de5d66dcfb5767a8354830a20029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x699 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x115EFB20 DUP2 EQ PUSH2 0x45 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x107 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0x112 DUP3 PUSH2 0x11A JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 PUSH2 0x131 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x1D0 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP3 MOD ISZERO ISZERO PUSH2 0x1B2 JUMPI PUSH1 0x0 PUSH2 0x151 PUSH2 0x14B DUP7 PUSH2 0x258 JUMP JUMPDEST DUP4 PUSH2 0x2D4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x16F DUP7 PUSH2 0x16A DUP6 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x4BB AND JUMP JUMPDEST PUSH2 0x2D4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x2 DUP1 DUP5 SMOD DUP2 DUP5 SMOD ADD SDIV SWAP1 POP PUSH2 0x1A6 DUP2 PUSH2 0x19A PUSH1 0x2 DUP6 SDIV PUSH1 0x2 DUP8 SDIV SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x536 AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x536 AND JUMP JUMPDEST SWAP6 POP POP POP POP POP POP PUSH2 0x115 JUMP JUMPDEST PUSH2 0x1C7 DUP5 PUSH2 0x16A DUP4 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x4BB AND JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x115 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x240 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x24D JUMPI INVALID JUMPDEST DIV SWAP2 POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x286 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x2CD JUMPI DUP4 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2A3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2BB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x28C JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 SWAP2 DUP5 SWAP2 DUP5 SWAP2 SWAP1 PUSH1 0x60 SWAP1 DUP3 DUP1 ISZERO PUSH2 0x30A JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x60 DUP3 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x339 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 JUMPDEST DUP9 PUSH2 0x355 DUP9 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x1D0 AND JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x35F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SWAP2 POP PUSH1 0x0 SWAP4 POP PUSH1 0x0 SWAP3 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x438 JUMPI DUP2 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x38F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SLT ISZERO PUSH2 0x3DA JUMPI DUP9 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3AD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3C5 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x430 JUMP JUMPDEST DUP2 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3E9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SGT ISZERO PUSH2 0x430 JUMPI DUP9 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x407 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x41F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 JUMPDEST PUSH1 0x1 ADD PUSH2 0x378 JUMP JUMPDEST DUP4 DUP9 GT PUSH2 0x456 JUMPI DUP4 SWAP7 POP PUSH2 0x44C DUP10 DUP8 PUSH2 0x5F3 JUMP JUMPDEST SWAP1 SWAP10 POP SWAP6 POP PUSH2 0x4B6 JUMP JUMPDEST PUSH2 0x466 DUP8 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x5F6 AND JUMP JUMPDEST DUP9 GT ISZERO PUSH2 0x4A6 JUMPI PUSH2 0x48D PUSH2 0x480 DUP9 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x5F6 AND JUMP JUMPDEST DUP10 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x5F6 AND JUMP JUMPDEST SWAP8 POP DUP3 SWAP7 POP PUSH2 0x49C DUP10 DUP7 PUSH2 0x5F3 JUMP JUMPDEST SWAP1 SWAP10 POP SWAP5 POP PUSH2 0x4B6 JUMP JUMPDEST POP SWAP8 POP PUSH2 0x252 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x343 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x52F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP2 DUP4 SLT DUP1 ISZERO SWAP1 PUSH2 0x54B JUMPI POP DUP4 DUP2 SLT ISZERO JUMPDEST DUP1 PUSH2 0x560 JUMPI POP PUSH1 0x0 DUP4 SLT DUP1 ISZERO PUSH2 0x560 JUMPI POP DUP4 DUP2 SLT JUMPDEST ISZERO ISZERO PUSH2 0x52F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5369676E6564536166654D6174683A206164646974696F6E206F766572666C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x667 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 STOP 0xd3 ADDRESS PUSH10 0x519236674C726C5673DA SSTORE 0xce 0xf8 DELEGATECALL 0xa6 PUSH10 0xDE5D66DCFB5767A83548 ADDRESS LOG2 STOP 0x29 ",
"sourceMap": "50:160:31:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50:160:31;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663115efb208114610045575b600080fd5b34801561005157600080fd5b506100f56004803603602081101561006857600080fd5b81019060208101813564010000000081111561008357600080fd5b82018360208201111561009557600080fd5b803590602001918460208302840111640100000000831117156100b757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610107945050505050565b60408051918252519081900360200190f35b60006101128261011a565b90505b919050565b80516000908161013182600263ffffffff6101d016565b90506002820615156101b257600061015161014b86610258565b836102d4565b9050600061016f8661016a85600163ffffffff6104bb16565b6102d4565b905060006002808407818407010590506101a68161019a60028505600287059063ffffffff61053616565b9063ffffffff61053616565b95505050505050610115565b6101c78461016a83600163ffffffff6104bb16565b92505050610115565b600080821161024057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481151561024d57fe5b049150505b92915050565b6060808251604051908082528060200260200182016040528015610286578160200160208202803883390190505b50905060005b83518110156102cd5783818151811015156102a357fe5b9060200190602002015182828151811015156102bb57fe5b6020908102909101015260010161028c565b5092915050565b8151604080518281526020808402820101909152600091849184919060609082801561030a578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015610339578160200160208202803883390190505b5090506000806000805b8861035588600263ffffffff6101d016565b8151811061035f57fe5b9060200190602002015191506000935060009250600090505b868110156104385781898281518110151561038f57fe5b9060200190602002015112156103da5788818151811015156103ad57fe5b9060200190602002015186858151811015156103c557fe5b60209081029091010152600190930192610430565b8189828151811015156103e957fe5b90602001906020020151131561043057888181518110151561040757fe5b90602001906020020151858481518110151561041f57fe5b602090810290910101526001909201915b600101610378565b8388116104565783965061044c89876105f3565b90995095506104b6565b610466878463ffffffff6105f616565b8811156104a65761048d610480888563ffffffff6105f616565b899063ffffffff6105f616565b975082965061049c89866105f3565b90995094506104b6565b5097506102529650505050505050565b610343565b60008282018381101561052f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082820181831280159061054b5750838112155b80610560575060008312801561056057508381125b151561052f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b91565b60008282111561066757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fea165627a7a7230582000d33069519236674c726c5673da55cef8f4a669de5d66dcfb5767a8354830a20029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x115EFB20 DUP2 EQ PUSH2 0x45 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x107 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0x112 DUP3 PUSH2 0x11A JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 PUSH2 0x131 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x1D0 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x2 DUP3 MOD ISZERO ISZERO PUSH2 0x1B2 JUMPI PUSH1 0x0 PUSH2 0x151 PUSH2 0x14B DUP7 PUSH2 0x258 JUMP JUMPDEST DUP4 PUSH2 0x2D4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x16F DUP7 PUSH2 0x16A DUP6 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x4BB AND JUMP JUMPDEST PUSH2 0x2D4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x2 DUP1 DUP5 SMOD DUP2 DUP5 SMOD ADD SDIV SWAP1 POP PUSH2 0x1A6 DUP2 PUSH2 0x19A PUSH1 0x2 DUP6 SDIV PUSH1 0x2 DUP8 SDIV SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x536 AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x536 AND JUMP JUMPDEST SWAP6 POP POP POP POP POP POP PUSH2 0x115 JUMP JUMPDEST PUSH2 0x1C7 DUP5 PUSH2 0x16A DUP4 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x4BB AND JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x115 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x240 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x24D JUMPI INVALID JUMPDEST DIV SWAP2 POP POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x286 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x2CD JUMPI DUP4 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2A3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2BB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x28C JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP5 MUL DUP3 ADD ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 SWAP2 DUP5 SWAP2 DUP5 SWAP2 SWAP1 PUSH1 0x60 SWAP1 DUP3 DUP1 ISZERO PUSH2 0x30A JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x60 DUP3 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x339 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 JUMPDEST DUP9 PUSH2 0x355 DUP9 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x1D0 AND JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x35F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SWAP2 POP PUSH1 0x0 SWAP4 POP PUSH1 0x0 SWAP3 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x438 JUMPI DUP2 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x38F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SLT ISZERO PUSH2 0x3DA JUMPI DUP9 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3AD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3C5 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x430 JUMP JUMPDEST DUP2 DUP10 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3E9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD SGT ISZERO PUSH2 0x430 JUMPI DUP9 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x407 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x41F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 JUMPDEST PUSH1 0x1 ADD PUSH2 0x378 JUMP JUMPDEST DUP4 DUP9 GT PUSH2 0x456 JUMPI DUP4 SWAP7 POP PUSH2 0x44C DUP10 DUP8 PUSH2 0x5F3 JUMP JUMPDEST SWAP1 SWAP10 POP SWAP6 POP PUSH2 0x4B6 JUMP JUMPDEST PUSH2 0x466 DUP8 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x5F6 AND JUMP JUMPDEST DUP9 GT ISZERO PUSH2 0x4A6 JUMPI PUSH2 0x48D PUSH2 0x480 DUP9 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x5F6 AND JUMP JUMPDEST DUP10 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x5F6 AND JUMP JUMPDEST SWAP8 POP DUP3 SWAP7 POP PUSH2 0x49C DUP10 DUP7 PUSH2 0x5F3 JUMP JUMPDEST SWAP1 SWAP10 POP SWAP5 POP PUSH2 0x4B6 JUMP JUMPDEST POP SWAP8 POP PUSH2 0x252 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x343 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x52F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP2 DUP4 SLT DUP1 ISZERO SWAP1 PUSH2 0x54B JUMPI POP DUP4 DUP2 SLT ISZERO JUMPDEST DUP1 PUSH2 0x560 JUMPI POP PUSH1 0x0 DUP4 SLT DUP1 ISZERO PUSH2 0x560 JUMPI POP DUP4 DUP2 SLT JUMPDEST ISZERO ISZERO PUSH2 0x52F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5369676E6564536166654D6174683A206164646974696F6E206F766572666C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x7700000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x667 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 STOP 0xd3 ADDRESS PUSH10 0x519236674C726C5673DA SSTORE 0xce 0xf8 DELEGATECALL 0xa6 PUSH10 0xDE5D66DCFB5767A83548 ADDRESS LOG2 STOP 0x29 ",
"sourceMap": "50:160:31:-;;;;;;;;;;;;;;;;;;;;;;;81:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81:126:31;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;81:126:31;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;81:126:31;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;81:126:31;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;81:126:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;81:126:31;;-1:-1:-1;81:126:31;;-1:-1:-1;;;;;81:126:31;;;;;;;;;;;;;;;;;;156:6;179:23;196:5;179:16;:23::i;:::-;172:30;;81:126;;;;:::o;395:633:3:-;511:12;;472:6;;;551:19;511:12;568:1;551:19;:16;:19;:::i;:::-;529:41;-1:-1:-1;595:1:3;580:12;:16;:21;576:448;;;611:14;628:37;640:11;645:5;640:4;:11::i;:::-;653;628;:37::i;:::-;611:54;-1:-1:-1;673:14:3;690:38;702:5;709:18;:11;725:1;709:18;:15;:18;:::i;:::-;690:11;:38::i;:::-;673:55;-1:-1:-1;764:16:3;813:1;784:11;;;798;;;784:25;783:31;;-1:-1:-1;829:45:3;783:31;829:30;857:1;847:7;:11;840:1;830:7;:11;;829:30;:17;:30;:::i;:::-;:34;:45;:34;:45;:::i;:::-;822:52;;;;;;;;;576:448;951:38;963:5;970:18;:11;986:1;970:18;:15;:18;:::i;951:38::-;944:45;;;;;;2497:304:37;2555:7;2640:5;;;2632:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2682:9;2698:1;2694;:5;;;;;;;;;-1:-1:-1;;2497:304:37;;;;;:::o;2665:250:3:-;2735:15;2760:21;2797:5;:12;2784:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;2784:26:3;-1:-1:-1;2760:50:3;-1:-1:-1;2821:9:3;2816:77;2840:5;:12;2836:1;:16;2816:77;;;2878:5;2884:1;2878:8;;;;;;;;;;;;;;;;;;2867:5;2873:1;2867:8;;;;;;;;;;;;;;;;;;:19;2854:3;;2816:77;;;-1:-1:-1;2905:5:3;2665:250;-1:-1:-1;;2665:250:3:o;1304:893::-;1470:8;;1505:18;;;;;;;;;;;;;;;;1391:6;;1427:2;;1447;;1470:8;1407:17;;1470:8;1505:18;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;1505:18:3;;1484:39;;1529:18;1563:4;1550:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;1550:18:3;;1529:39;;1574:13;1593;1612:12;1630:9;1646:547;1675:1;1677:11;:4;1686:1;1677:11;:8;:11;:::i;:::-;1675:14;;;;;;;;;;;;;;;;1667:22;;1705:1;1697:9;;1722:1;1714:9;;1740:1;1736:5;;1731:203;1747:4;1743:1;:8;1731:203;;;1779:5;1772:1;1774;1772:4;;;;;;;;;;;;;;;;;;:12;1768:158;;;1810:1;1812;1810:4;;;;;;;;;;;;;;;;;;1798:2;1801:5;1798:9;;;;;;;;;;;;;;;;;;:16;1826:7;;;;;1768:158;;;1861:5;1854:1;1856;1854:4;;;;;;;;;;;;;;;;;;:12;1850:76;;;1892:1;1894;1892:4;;;;;;;;;;;;;;;;;;1880:2;1883:5;1880:9;;;;;;;;;;;;;;;;;;:16;1908:7;;;;;1850:76;1753:3;;1731:203;;;1945:10;;;1941:246;;1974:5;1967:12;;1999:11;2004:1;2007:2;1999:4;:11::i;:::-;1989:21;;-1:-1:-1;1989:21:3;-1:-1:-1;1941:246:3;;;2034:15;:4;2043:5;2034:15;:8;:15;:::i;:::-;2029:1;:21;2025:162;;;2066:22;2072:15;:4;2081:5;2072:15;:8;:15;:::i;:::-;2066:1;;:22;:5;:22;:::i;:::-;2062:26;;2105:5;2098:12;;2130:11;2135:1;2138:2;2130:4;:11::i;:::-;2120:21;;-1:-1:-1;2120:21:3;-1:-1:-1;2025:162:3;;;-1:-1:-1;2173:5:3;-1:-1:-1;2166:12:3;;-1:-1:-1;;;;;;;2166:12:3;2025:162;1646:547;;831:162:37;889:7;916:5;;;935:6;;;;927:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;987:1;831:162;-1:-1:-1;;;831:162:37:o;305:284:38:-;375:6;468:7;;;490;;;;;;:18;;;506:2;501:1;:7;;490:18;489:42;;;;519:1;514:2;:6;:16;;;;;528:2;524:1;:6;514:16;481:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2387:149:3;2524:2;2387:149::o;1245:165:37:-;1303:7;1326:6;;;;1318:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1385:5:37;;;1245:165::o"
},
"methodIdentifiers": {
"publicGet(int256[])": "115efb20"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"_list\",\"type\":\"int256[]\"}],\"name\":\"publicGet\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MedianTestHelper.sol\":\"MedianTestHelper\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Median.sol\":{\"keccak256\":\"0xb0b6c08d8d2d8f42f0465575cf5f9b11fd65381ae31d004b6c5e0e053d31b742\",\"urls\":[\"bzzr://fe529079ffb63f3cbb4b001bc85c95733a1c2369ce9226cbe35c93a5bf810188\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/MedianTestHelper.sol\":{\"keccak256\":\"0x8c06f4f700937f967fb14c8108362a5a7af85a0f1a75742b04aa88bf41dad0ac\",\"urls\":[\"bzzr://2ed4684e27a3ddf9888a0c06bf8eb1c0de3b2582d89811436714da9a508cbd24\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0x796a82f2e4ab35469224050fb62ecd2dc038474e7f9d4dfd7a1023080c009883\",\"urls\":[\"bzzr://6e0bb08f77ca150b228e70773696ea301e939c0b5542fedb05276b683b774e13\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/SignedSafeMath.sol\":{\"keccak256\":\"0x2695f6b8893d0333f719b12156bb8e2c2589c431fdf7241aca428bd2b5564dd4\",\"urls\":[\"bzzr://b82f0e4c561256ead4b559e2bc4585731001e99b572702849cb12b918c213fe8\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/MedianTestHelper.sol": {
"id": 31
},
"Median.sol": {
"id": 3
},
"vendor/SafeMathChainlink.sol": {
"id": 37
},
"vendor/SignedSafeMath.sol": {
"id": 38
}
},
"sourceCodes": {
"tests/MedianTestHelper.sol": "pragma solidity ^0.5.0;\n\nimport \"../Median.sol\";\n\ncontract MedianTestHelper {\n\n function publicGet(int256[] memory _list)\n public\n pure\n returns (int256)\n {\n return Median.calculate(_list);\n }\n\n}\n",
"Median.sol": "pragma solidity ^0.5.0;\n\nimport \"./vendor/SafeMathChainlink.sol\";\nimport \"./vendor/SignedSafeMath.sol\";\n\nlibrary Median {\n using SafeMathChainlink for uint256;\n using SignedSafeMath for int256;\n\n /**\n * @dev Returns the sorted middle, or the average of the two middle indexed \n * items if the array has an even number of elements\n * @param _list The list of elements to compare\n */\n function calculate(int256[] memory _list)\n internal\n pure\n returns (int256)\n {\n uint256 answerLength = _list.length;\n uint256 middleIndex = answerLength.div(2);\n if (answerLength % 2 == 0) {\n int256 median1 = quickselect(copy(_list), middleIndex);\n int256 median2 = quickselect(_list, middleIndex.add(1)); // quickselect is 1 indexed\n int256 remainder = (median1 % 2 + median2 % 2) / 2;\n return (median1 / 2).add(median2 / 2).add(remainder); // signed integers are not supported by SafeMath\n } else {\n return quickselect(_list, middleIndex.add(1)); // quickselect is 1 indexed\n }\n }\n\n /**\n * @dev Returns the kth value of the ordered array\n * See: http://www.cs.yale.edu/homes/aspnes/pinewiki/QuickSelect.html\n * @param _a The list of elements to pull from\n * @param _k The index, 1 based, of the elements you want to pull from when ordered\n */\n function quickselect(int256[] memory _a, uint256 _k)\n private\n pure\n returns (int256)\n {\n int256[] memory a = _a;\n uint256 k = _k;\n uint256 aLen = a.length;\n int256[] memory a1 = new int256[](aLen);\n int256[] memory a2 = new int256[](aLen);\n uint256 a1Len;\n uint256 a2Len;\n int256 pivot;\n uint256 i;\n\n while (true) {\n pivot = a[aLen.div(2)];\n a1Len = 0;\n a2Len = 0;\n for (i = 0; i < aLen; i++) {\n if (a[i] < pivot) {\n a1[a1Len] = a[i];\n a1Len++;\n } else if (a[i] > pivot) {\n a2[a2Len] = a[i];\n a2Len++;\n }\n }\n if (k <= a1Len) {\n aLen = a1Len;\n (a, a1) = swap(a, a1);\n } else if (k > (aLen.sub(a2Len))) {\n k = k.sub(aLen.sub(a2Len));\n aLen = a2Len;\n (a, a2) = swap(a, a2);\n } else {\n return pivot;\n }\n }\n }\n\n /**\n * @dev Swaps the pointers to two uint256 arrays in memory\n * @param _a The pointer to the first in memory array\n * @param _b The pointer to the second in memory array\n */\n function swap(int256[] memory _a, int256[] memory _b)\n private\n pure\n returns(int256[] memory, int256[] memory)\n {\n return (_b, _a);\n }\n\n /**\n * @dev Makes an in memory copy of the array passed in\n * @param _list The pointer to the array to be copied\n */\n function copy(int256[] memory _list)\n private\n pure\n returns(int256[] memory)\n {\n int256[] memory list2 = new int256[](_list.length);\n for (uint256 i = 0; i < _list.length; i++) {\n list2[i] = _list[i];\n }\n return list2;\n }\n\n}\n",
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.5.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMathChainlink {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n // Solidity only automatically asserts when dividing by 0\n require(b > 0, \"SafeMath: division by zero\");\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b != 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n}\n",
"vendor/SignedSafeMath.sol": "pragma solidity ^0.5.0;\n\nlibrary SignedSafeMath {\n\n /**\n * @dev Adds two int256s and makes sure the result doesn't overflow. Signed\n * integers aren't supported by the SafeMath library, thus this method\n * @param _a The first number to be added\n * @param _a The second number to be added\n */\n function add(int256 _a, int256 _b)\n internal\n pure\n returns (int256)\n {\n // solium-disable-next-line zeppelin/no-arithmetic-operations\n int256 c = _a + _b;\n require((_b >= 0 && c >= _a) || (_b < 0 && c < _a), \"SignedSafeMath: addition overflow\");\n\n return c;\n }\n}"
},
"sourceTreeHashHex": "0xd244560350634f5df56c771cd5772601432e59bfd4d89d5563bf9e71dc3fb39e",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "Migrations",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "new_address",
"type": "address"
}
],
"name": "upgrade",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "last_completed_migration",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "completed",
"type": "uint256"
}
],
"name": "setCompleted",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405234801561001057600080fd5b5060008054600160a060020a0319163317905561025d806100326000396000f3fe6080604052600436106100615763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630900f0108114610066578063445df0ac146100a85780638da5cb5b146100cf578063fdacd5761461010d575b600080fd5b34801561007257600080fd5b506100a66004803603602081101561008957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610137565b005b3480156100b457600080fd5b506100bd6101ea565b60408051918252519081900360200190f35b3480156100db57600080fd5b506100e46101f0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561011957600080fd5b506100a66004803603602081101561013057600080fd5b503561020c565b60005473ffffffffffffffffffffffffffffffffffffffff163314156101e75760008190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b1580156101cd57600080fd5b505af11580156101e1573d6000803e3d6000fd5b50505050505b50565b60015481565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314156101e75760015556fea165627a7a72305820206de5d04f8566dfef4166d1ffd74bfc2971c038ed58d7ef5563f7ffdef50d570029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x25D DUP1 PUSH2 0x32 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x61 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x900F010 DUP2 EQ PUSH2 0x66 JUMPI DUP1 PUSH4 0x445DF0AC EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xCF JUMPI DUP1 PUSH4 0xFDACD576 EQ PUSH2 0x10D JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA6 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x137 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBD PUSH2 0x1EA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE4 PUSH2 0x1F0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x119 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA6 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x130 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x20C JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ ISZERO PUSH2 0x1E7 JUMPI PUSH1 0x0 DUP2 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xFDACD576 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ ISZERO PUSH2 0x1E7 JUMPI PUSH1 0x1 SSTORE JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 KECCAK256 PUSH14 0xE5D04F8566DFEF4166D1FFD74BFC 0x29 PUSH18 0xC038ED58D7EF5563F7FFDEF50D5700290000 ",
"sourceMap": "64:480:4:-;;;216:50;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;243:5:4;:18;;-1:-1:-1;;;;;;243:18:4;251:10;243:18;;;64:480;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100615763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630900f0108114610066578063445df0ac146100a85780638da5cb5b146100cf578063fdacd5761461010d575b600080fd5b34801561007257600080fd5b506100a66004803603602081101561008957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610137565b005b3480156100b457600080fd5b506100bd6101ea565b60408051918252519081900360200190f35b3480156100db57600080fd5b506100e46101f0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561011957600080fd5b506100a66004803603602081101561013057600080fd5b503561020c565b60005473ffffffffffffffffffffffffffffffffffffffff163314156101e75760008190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b1580156101cd57600080fd5b505af11580156101e1573d6000803e3d6000fd5b50505050505b50565b60015481565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314156101e75760015556fea165627a7a72305820206de5d04f8566dfef4166d1ffd74bfc2971c038ed58d7ef5563f7ffdef50d570029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x61 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x900F010 DUP2 EQ PUSH2 0x66 JUMPI DUP1 PUSH4 0x445DF0AC EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xCF JUMPI DUP1 PUSH4 0xFDACD576 EQ PUSH2 0x10D JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA6 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x137 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBD PUSH2 0x1EA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE4 PUSH2 0x1F0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x119 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA6 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x130 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x20C JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ ISZERO PUSH2 0x1E7 JUMPI PUSH1 0x0 DUP2 SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xFDACD576 PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ ISZERO PUSH2 0x1E7 JUMPI PUSH1 0x1 SSTORE JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 KECCAK256 PUSH14 0xE5D04F8566DFEF4166D1FFD74BFC 0x29 PUSH18 0xC038ED58D7EF5563F7FFDEF50D5700290000 ",
"sourceMap": "64:480:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;377:165;;8:9:-1;5:2;;;30:1;27;20:12;5:2;377:165:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;377:165:4;;;;;;;112:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;112:36:4;;;;;;;;;;;;;;;;;;;;88:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;88:20:4;;;;;;;;;;;;;;;;;;;;;;;270:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;270:103:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;270:103:4;;;377:165;199:5;;;;185:10;:19;181:26;;;439:19;472:11;439:45;;490:8;:21;;;512:24;;490:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;490:47:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;490:47:4;;;;206:1;181:26;377:165;:::o;112:36::-;;;;:::o;88:20::-;;;;;;:::o;270:103::-;199:5;;;;185:10;:19;181:26;;;332:24;:36;270:103::o"
},
"methodIdentifiers": {
"last_completed_migration()": "445df0ac",
"owner()": "8da5cb5b",
"setCompleted(uint256)": "fdacd576",
"upgrade(address)": "0900f010"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"new_address\",\"type\":\"address\"}],\"name\":\"upgrade\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"last_completed_migration\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"completed\",\"type\":\"uint256\"}],\"name\":\"setCompleted\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Migrations.sol\":\"Migrations\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Migrations.sol\":{\"keccak256\":\"0x0acb3ad581944723c74dd2ef42030f5b5bdd2b1cbb366f06b097824f1b1f9cf7\",\"urls\":[\"bzzr://c70237d33235867ca9e57bc71d0e2f91a8f232abd3a9103f7ce692a1608ec7c3\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"Migrations.sol": {
"id": 4
}
},
"sourceCodes": {
"Migrations.sol": "pragma solidity ^0.5.0; // solhint-disable-line compiler-fixed\n\ncontract Migrations {\n address public owner;\n uint public last_completed_migration;\n\n modifier restricted() {\n if (msg.sender == owner) _;\n }\n\n constructor() public {\n owner = msg.sender;\n }\n\n function setCompleted(uint completed) public restricted {\n last_completed_migration = completed;\n }\n\n function upgrade(address new_address) public restricted {\n Migrations upgraded = Migrations(new_address);\n upgraded.setCompleted(last_completed_migration);\n }\n}\n"
},
"sourceTreeHashHex": "0x0acb3ad581944723c74dd2ef42030f5b5bdd2b1cbb366f06b097824f1b1f9cf7",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "Oracle",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "getChainlinkToken",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_sender",
"type": "address"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_specId",
"type": "bytes32"
},
{
"name": "_callbackAddress",
"type": "address"
},
{
"name": "_callbackFunctionId",
"type": "bytes4"
},
{
"name": "_nonce",
"type": "uint256"
},
{
"name": "_dataVersion",
"type": "uint256"
},
{
"name": "_data",
"type": "bytes"
}
],
"name": "oracleRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_callbackAddress",
"type": "address"
},
{
"name": "_callbackFunctionId",
"type": "bytes4"
},
{
"name": "_expiration",
"type": "uint256"
},
{
"name": "_data",
"type": "bytes32"
}
],
"name": "fulfillOracleRequest",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "EXPIRY_TIME",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "withdrawable",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_callbackFunc",
"type": "bytes4"
},
{
"name": "_expiration",
"type": "uint256"
}
],
"name": "cancelOracleRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_node",
"type": "address"
},
{
"name": "_allowed",
"type": "bool"
}
],
"name": "setFulfillmentPermission",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "isOwner",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_sender",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
},
{
"name": "_data",
"type": "bytes"
}
],
"name": "onTokenTransfer",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_node",
"type": "address"
}
],
"name": "getAuthorizationStatus",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_recipient",
"type": "address"
},
{
"name": "_amount",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "_link",
"type": "address"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "specId",
"type": "bytes32"
},
{
"indexed": false,
"name": "requester",
"type": "address"
},
{
"indexed": false,
"name": "requestId",
"type": "bytes32"
},
{
"indexed": false,
"name": "payment",
"type": "uint256"
},
{
"indexed": false,
"name": "callbackAddr",
"type": "address"
},
{
"indexed": false,
"name": "callbackFunctionId",
"type": "bytes4"
},
{
"indexed": false,
"name": "cancelExpiration",
"type": "uint256"
},
{
"indexed": false,
"name": "dataVersion",
"type": "uint256"
},
{
"indexed": false,
"name": "data",
"type": "bytes"
}
],
"name": "OracleRequest",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "requestId",
"type": "bytes32"
}
],
"name": "CancelOracleRequest",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
],
"devdoc": {
"methods": {
"cancelOracleRequest(bytes32,uint256,bytes4,uint256)": {
"details": "Given params must hash to a commitment stored on the contract in order for the request to be valid Emits CancelOracleRequest event.",
"params": {
"_callbackFunc": "The requester's specified callback address",
"_expiration": "The time of the expiration for the request",
"_payment": "The amount of payment given (specified in wei)",
"_requestId": "The request ID"
}
},
"constructor": {
"details": "Sets the LinkToken address for the imported LinkTokenInterface",
"params": {
"_link": "The address of the LINK token"
}
},
"fulfillOracleRequest(bytes32,uint256,address,bytes4,uint256,bytes32)": {
"details": "Given params must hash back to the commitment stored from `oracleRequest`. Will call the callback address' callback function without bubbling up error checking in a `require` so that the node can get paid.",
"params": {
"_callbackAddress": "The callback address to call for fulfillment",
"_callbackFunctionId": "The callback function ID to use for fulfillment",
"_data": "The data to return to the consuming contract",
"_expiration": "The expiration that the node should respond by before the requester can cancel",
"_payment": "The payment amount that will be released for the oracle (specified in wei)",
"_requestId": "The fulfillment request ID that must match the requester's"
},
"return": "Status if the external call was successful"
},
"getAuthorizationStatus(address)": {
"params": {
"_node": "The address of the Chainlink node"
},
"return": "The authorization status of the node"
},
"getChainlinkToken()": {
"details": "This is the public implementation for chainlinkTokenAddress, which is an internal method of the ChainlinkClient contract"
},
"isOwner()": {
"details": "Returns true if the caller is the current owner."
},
"onTokenTransfer(address,uint256,bytes)": {
"details": "The data payload's first 2 words will be overwritten by the `_sender` and `_amount` values to ensure correctness. Calls oracleRequest.",
"params": {
"_amount": "Amount of LINK sent (specified in wei)",
"_data": "Payload of the transaction",
"_sender": "Address of the sender"
}
},
"oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)": {
"details": "Stores the hash of the params as the on-chain commitment for the request. Emits OracleRequest event for the Chainlink node to detect.",
"params": {
"_callbackAddress": "The callback address for the response",
"_callbackFunctionId": "The callback function ID for the response",
"_data": "The CBOR payload of the request",
"_dataVersion": "The specified data version",
"_nonce": "The nonce sent by the requester",
"_payment": "The amount of payment given (specified in wei)",
"_sender": "The sender of the request",
"_specId": "The Job Specification ID"
}
},
"owner()": {
"details": "Returns the address of the current owner."
},
"setFulfillmentPermission(address,bool)": {
"params": {
"_allowed": "Bool value to determine if the node can fulfill requests",
"_node": "The address of the Chainlink node"
}
},
"transferOwnership(address)": {
"details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
},
"withdraw(address,uint256)": {
"details": "The owner of the contract can be another wallet and does not have to be a Chainlink node",
"params": {
"_amount": "The amount to send (specified in wei)",
"_recipient": "The address to send the LINK token to"
}
},
"withdrawable()": {
"details": "We use `ONE_FOR_CONSISTENT_GAS_COST` in place of 0 in storage",
"return": "The amount of withdrawable LINK on the contract"
}
},
"title": "The Chainlink Oracle contract"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x6080604052600160045534801561001557600080fd5b50604051602080611a288339810180604052602081101561003557600080fd5b505160008054600160a060020a0319163317808255604051600160a060020a039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360018054600160a060020a031916600160a060020a0392909216919091179055611979806100af6000396000f3fe6080604052600436106100c45763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663165d35e181146100c957806340429946146101075780634ab0d190146101ec5780634b6022821461028057806350188301146102a75780636ee4d553146102bc5780637fcd56db1461031a5780638da5cb5b146103625780638f32d59b14610377578063a4c0ed361461038c578063d3e9c31414610461578063f2fde38b146104a1578063f3fef3a3146104e1575b600080fd5b3480156100d557600080fd5b506100de610527565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561011357600080fd5b506101ea600480360361010081101561012b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235811692602081013592604082013592606083013516917fffffffff000000000000000000000000000000000000000000000000000000006080820135169160a08201359160c081013591810190610100810160e08201356401000000008111156101ab57600080fd5b8201836020820111156101bd57600080fd5b803590602001918460018302840111640100000000831117156101df57600080fd5b509092509050610543565b005b3480156101f857600080fd5b5061026c600480360360c081101561020f57600080fd5b5080359060208101359073ffffffffffffffffffffffffffffffffffffffff604082013516907fffffffff000000000000000000000000000000000000000000000000000000006060820135169060808101359060a00135610969565b604080519115158252519081900360200190f35b34801561028c57600080fd5b50610295610da7565b60408051918252519081900360200190f35b3480156102b357600080fd5b50610295610dad565b3480156102c857600080fd5b506101ea600480360360808110156102df57600080fd5b508035906020810135907fffffffff000000000000000000000000000000000000000000000000000000006040820135169060600135610e3d565b34801561032657600080fd5b506101ea6004803603604081101561033d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135151561107e565b34801561036e57600080fd5b506100de611149565b34801561038357600080fd5b5061026c611165565b34801561039857600080fd5b506101ea600480360360608110156103af57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516916020810135918101906060810160408201356401000000008111156103ec57600080fd5b8201836020820111156103fe57600080fd5b8035906020019184600183028401116401000000008311171561042057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611183945050505050565b34801561046d57600080fd5b5061026c6004803603602081101561048457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661148b565b3480156104ad57600080fd5b506101ea600480360360208110156104c457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166114b6565b3480156104ed57600080fd5b506101ea6004803603604081101561050457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611537565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b61054b610527565b73ffffffffffffffffffffffffffffffffffffffff1633146105ce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4d75737420757365204c494e4b20746f6b656e00000000000000000000000000604482015290519081900360640190fd5b600154869073ffffffffffffffffffffffffffffffffffffffff8083169116141561065a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f742063616c6c6261636b20746f204c494e4b000000000000000000604482015290519081900360640190fd5b604080516c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8d16026020808301919091526034808301899052835180840390910181526054909201835281519181019190912060008181526002909252919020541561072957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4d75737420757365206120756e69717565204944000000000000000000000000604482015290519081900360640190fd5b600061073d4261012c63ffffffff61172416565b90508a898983604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600401828152602001945050505050604051602081830303815290604052805190602001206002600084815260200190815260200160002081905550897fd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c658d848e8d8d878d8d8d604051808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001858152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039c50909a5050505050505050505050a2505050505050505050505050565b3360009081526003602052604081205460ff16806109b9575061098a611149565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e6f7420616e20617574686f72697a6564206e6f646520746f2066756c66696c60448201527f6c20726571756573747300000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008781526002602052604090205487901515610aca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4d757374206861766520612076616c6964207265717565737449640000000000604482015290519081900360640190fd5b6040805160208082018a90526c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8a1602828401527fffffffff00000000000000000000000000000000000000000000000000000000881660548301526058808301889052835180840390910181526078909201835281519181019190912060008b81526002909252919020548114610bc557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f506172616d7320646f206e6f74206d6174636820726571756573742049440000604482015290519081900360640190fd5b600454610bd8908963ffffffff61172416565b60045560008981526002602052604081205562061a805a1015610c5c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4d7573742070726f7669646520636f6e73756d657220656e6f75676820676173604482015290519081900360640190fd5b60408051602481018b9052604480820187905282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000008a161781529151815160009373ffffffffffffffffffffffffffffffffffffffff8c169392918291908083835b60208310610d2f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610cf2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610d91576040519150601f19603f3d011682016040523d82523d6000602084013e610d96565b606091505b50909b9a5050505050505050505050565b61012c81565b6000610db7611165565b1515610e2457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600454610e3890600163ffffffff61179f16565b905090565b6040805160208082018690526c010000000000000000000000003302828401527fffffffff00000000000000000000000000000000000000000000000000000000851660548301526058808301859052835180840390910181526078909201835281519181019190912060008781526002909252919020548114610f2257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f506172616d7320646f206e6f74206d6174636820726571756573742049440000604482015290519081900360640190fd5b42821115610f9157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f52657175657374206973206e6f74206578706972656400000000000000000000604482015290519081900360640190fd5b6000858152600260205260408082208290555186917fa7842b9ec549398102c0d91b1b9919b2f20558aefdadf57528a95c6cd3292e9391a2600154604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101879052905173ffffffffffffffffffffffffffffffffffffffff9092169163a9059cbb916044808201926020929091908290030181600087803b15801561104357600080fd5b505af1158015611057573d6000803e3d6000fd5b505050506040513d602081101561106d57600080fd5b5051151561107757fe5b5050505050565b611086611165565b15156110f357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff16331490565b61118b610527565b73ffffffffffffffffffffffffffffffffffffffff16331461120e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4d75737420757365204c494e4b20746f6b656e00000000000000000000000000604482015290519081900360640190fd5b805181906044111561128157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c69642072657175657374206c656e67746800000000000000000000604482015290519081900360640190fd5b602082015182907fffffffff0000000000000000000000000000000000000000000000000000000081167f40429946000000000000000000000000000000000000000000000000000000001461133857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d757374207573652077686974656c69737465642066756e6374696f6e730000604482015290519081900360640190fd5b85602485015284604485015260003073ffffffffffffffffffffffffffffffffffffffff16856040518082805190602001908083835b602083106113ab57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161136e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461140b576040519150601f19603f3d011682016040523d82523d6000602084013e611410565b606091505b5050905080151561148257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e61626c6520746f2063726561746520726571756573740000000000000000604482015290519081900360640190fd5b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b6114be611165565b151561152b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61153481611816565b50565b61153f611165565b15156115ac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b806115be81600163ffffffff61172416565b600454101561165457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f416d6f756e74207265717565737465642069732067726561746572207468616e60448201527f20776974686472617761626c652062616c616e63650000000000000000000000606482015290519081900360840190fd5b600454611667908363ffffffff61179f16565b6004908155600154604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811694820194909452602481018690529051929091169163a9059cbb916044808201926020929091908290030181600087803b1580156116eb57600080fd5b505af11580156116ff573d6000803e3d6000fd5b505050506040513d602081101561171557600080fd5b5051151561171f57fe5b505050565b60008282018381101561179857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008282111561181057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b73ffffffffffffffffffffffffffffffffffffffff811615156118c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905556fea165627a7a723058202ea1d8a1566f8c4cc82a47fe0f8e4614de05eed38d2177d9c88e6b608bdd83e90029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH2 0x1A28 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR DUP1 DUP3 SSTORE PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP2 SWAP1 SWAP2 AND SWAP2 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1979 DUP1 PUSH2 0xAF PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC4 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x165D35E1 DUP2 EQ PUSH2 0xC9 JUMPI DUP1 PUSH4 0x40429946 EQ PUSH2 0x107 JUMPI DUP1 PUSH4 0x4AB0D190 EQ PUSH2 0x1EC JUMPI DUP1 PUSH4 0x4B602282 EQ PUSH2 0x280 JUMPI DUP1 PUSH4 0x50188301 EQ PUSH2 0x2A7 JUMPI DUP1 PUSH4 0x6EE4D553 EQ PUSH2 0x2BC JUMPI DUP1 PUSH4 0x7FCD56DB EQ PUSH2 0x31A JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x362 JUMPI DUP1 PUSH4 0x8F32D59B EQ PUSH2 0x377 JUMPI DUP1 PUSH4 0xA4C0ED36 EQ PUSH2 0x38C JUMPI DUP1 PUSH4 0xD3E9C314 EQ PUSH2 0x461 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x4A1 JUMPI DUP1 PUSH4 0xF3FEF3A3 EQ PUSH2 0x4E1 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x527 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x113 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x100 DUP2 LT ISZERO PUSH2 0x12B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP4 ADD CALLDATALOAD AND SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x80 DUP3 ADD CALLDATALOAD AND SWAP2 PUSH1 0xA0 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0xC0 DUP2 ADD CALLDATALOAD SWAP2 DUP2 ADD SWAP1 PUSH2 0x100 DUP2 ADD PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x543 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xC0 DUP2 LT ISZERO PUSH2 0x20F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x80 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xA0 ADD CALLDATALOAD PUSH2 0x969 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x295 PUSH2 0xDA7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x295 PUSH2 0xDAD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0xE3D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x326 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x33D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x107E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1149 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x383 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26C PUSH2 0x1165 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x398 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 CALLDATALOAD AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x3EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x1183 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x484 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x148B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x14B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x504 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x1537 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x54B PUSH2 0x527 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x5CE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D75737420757365204C494E4B20746F6B656E00000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP7 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ ISZERO PUSH2 0x65A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43616E6E6F742063616C6C6261636B20746F204C494E4B000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH13 0x1000000000000000000000000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 AND MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP10 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 KECCAK256 SLOAD ISZERO PUSH2 0x729 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D75737420757365206120756E69717565204944000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x73D TIMESTAMP PUSH2 0x12C PUSH4 0xFFFFFFFF PUSH2 0x1724 AND JUMP JUMPDEST SWAP1 POP DUP11 DUP10 DUP10 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP4 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x4 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x2 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP10 PUSH32 0xD8D7ECC4800D25FA53CE0372F13A416D98907A7EF3D8D3BDD79CF4FE75529C65 DUP14 DUP5 DUP15 DUP14 DUP14 DUP8 DUP14 DUP14 DUP14 PUSH1 0x40 MLOAD DUP1 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP13 POP SWAP1 SWAP11 POP POP POP POP POP POP POP POP POP POP POP LOG2 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH1 0xFF AND DUP1 PUSH2 0x9B9 JUMPI POP PUSH2 0x98A PUSH2 0x1149 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO ISZERO PUSH2 0xA4C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F7420616E20617574686F72697A6564206E6F646520746F2066756C66696C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C20726571756573747300000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP8 SWAP1 ISZERO ISZERO PUSH2 0xACA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D757374206861766520612076616C6964207265717565737449640000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP11 SWAP1 MSTORE PUSH13 0x1000000000000000000000000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND MUL DUP3 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP9 AND PUSH1 0x54 DUP4 ADD MSTORE PUSH1 0x58 DUP1 DUP4 ADD DUP9 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x78 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 KECCAK256 SLOAD DUP2 EQ PUSH2 0xBC5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x506172616D7320646F206E6F74206D6174636820726571756573742049440000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 SLOAD PUSH2 0xBD8 SWAP1 DUP10 PUSH4 0xFFFFFFFF PUSH2 0x1724 AND JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x0 DUP10 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE PUSH3 0x61A80 GAS LT ISZERO PUSH2 0xC5C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D7573742070726F7669646520636F6E73756D657220656E6F75676820676173 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x24 DUP2 ADD DUP12 SWAP1 MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP11 AND OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 SWAP3 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xD2F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCF2 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xD91 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x12C DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xDB7 PUSH2 0x1165 JUMP JUMPDEST ISZERO ISZERO PUSH2 0xE24 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 SLOAD PUSH2 0xE38 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x179F AND JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP7 SWAP1 MSTORE PUSH13 0x1000000000000000000000000 CALLER MUL DUP3 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x54 DUP4 ADD MSTORE PUSH1 0x58 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x78 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 KECCAK256 SLOAD DUP2 EQ PUSH2 0xF22 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x506172616D7320646F206E6F74206D6174636820726571756573742049440000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST TIMESTAMP DUP3 GT ISZERO PUSH2 0xF91 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x52657175657374206973206E6F74206578706972656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP3 SWAP1 SSTORE MLOAD DUP7 SWAP2 PUSH32 0xA7842B9EC549398102C0D91B1B9919B2F20558AEFDADF57528A95C6CD3292E93 SWAP2 LOG2 PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP8 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1043 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1057 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x106D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x1077 JUMPI INVALID JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1086 PUSH2 0x1165 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x10F3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ SWAP1 JUMP JUMPDEST PUSH2 0x118B PUSH2 0x527 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x120E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D75737420757365204C494E4B20746F6B656E00000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 MLOAD DUP2 SWAP1 PUSH1 0x44 GT ISZERO PUSH2 0x1281 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642072657175657374206C656E67746800000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x1338 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D757374207573652077686974656C69737465642066756E6374696F6E730000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP6 PUSH1 0x24 DUP6 ADD MSTORE DUP5 PUSH1 0x44 DUP6 ADD MSTORE PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x13AB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x136E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x140B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1410 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 ISZERO ISZERO PUSH2 0x1482 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F2063726561746520726571756573740000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x14BE PUSH2 0x1165 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x152B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1534 DUP2 PUSH2 0x1816 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x153F PUSH2 0x1165 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x15AC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x15BE DUP2 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1724 AND JUMP JUMPDEST PUSH1 0x4 SLOAD LT ISZERO PUSH2 0x1654 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416D6F756E74207265717565737465642069732067726561746572207468616E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x20776974686472617761626C652062616C616E63650000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 SLOAD PUSH2 0x1667 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x179F AND JUMP JUMPDEST PUSH1 0x4 SWAP1 DUP2 SSTORE PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND SWAP5 DUP3 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP1 SWAP2 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16FF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1715 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x171F JUMPI INVALID JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1798 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1810 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x18C0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0x2e LOG1 0xd8 LOG1 JUMP PUSH16 0x8C4CC82A47FE0F8E4614DE05EED38D21 PUSH24 0xD9C88E6B608BDD83E9002900000000000000000000000000 ",
"sourceMap": "453:9081:5:-;;;880:1;1030:64;;1603:141;8:9:-1;5:2;;;30:1;27;20:12;5:2;1603:141:5;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1603:141:5;718:6:36;:19;;-1:-1:-1;;;;;;718:19:36;727:10;718:19;;;;748:40;;-1:-1:-1;;;;;781:6:36;;;;;718;748:40;;718:6;;748:40;1653:9:5;:37;;-1:-1:-1;;;;;;1653:37:5;-1:-1:-1;;;;;1653:37:5;;;;;;;;;;453:9081;;;-1:-1:-1;453:9081:5;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100c45763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663165d35e181146100c957806340429946146101075780634ab0d190146101ec5780634b6022821461028057806350188301146102a75780636ee4d553146102bc5780637fcd56db1461031a5780638da5cb5b146103625780638f32d59b14610377578063a4c0ed361461038c578063d3e9c31414610461578063f2fde38b146104a1578063f3fef3a3146104e1575b600080fd5b3480156100d557600080fd5b506100de610527565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561011357600080fd5b506101ea600480360361010081101561012b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235811692602081013592604082013592606083013516917fffffffff000000000000000000000000000000000000000000000000000000006080820135169160a08201359160c081013591810190610100810160e08201356401000000008111156101ab57600080fd5b8201836020820111156101bd57600080fd5b803590602001918460018302840111640100000000831117156101df57600080fd5b509092509050610543565b005b3480156101f857600080fd5b5061026c600480360360c081101561020f57600080fd5b5080359060208101359073ffffffffffffffffffffffffffffffffffffffff604082013516907fffffffff000000000000000000000000000000000000000000000000000000006060820135169060808101359060a00135610969565b604080519115158252519081900360200190f35b34801561028c57600080fd5b50610295610da7565b60408051918252519081900360200190f35b3480156102b357600080fd5b50610295610dad565b3480156102c857600080fd5b506101ea600480360360808110156102df57600080fd5b508035906020810135907fffffffff000000000000000000000000000000000000000000000000000000006040820135169060600135610e3d565b34801561032657600080fd5b506101ea6004803603604081101561033d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135151561107e565b34801561036e57600080fd5b506100de611149565b34801561038357600080fd5b5061026c611165565b34801561039857600080fd5b506101ea600480360360608110156103af57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516916020810135918101906060810160408201356401000000008111156103ec57600080fd5b8201836020820111156103fe57600080fd5b8035906020019184600183028401116401000000008311171561042057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611183945050505050565b34801561046d57600080fd5b5061026c6004803603602081101561048457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661148b565b3480156104ad57600080fd5b506101ea600480360360208110156104c457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166114b6565b3480156104ed57600080fd5b506101ea6004803603604081101561050457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611537565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b61054b610527565b73ffffffffffffffffffffffffffffffffffffffff1633146105ce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4d75737420757365204c494e4b20746f6b656e00000000000000000000000000604482015290519081900360640190fd5b600154869073ffffffffffffffffffffffffffffffffffffffff8083169116141561065a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f742063616c6c6261636b20746f204c494e4b000000000000000000604482015290519081900360640190fd5b604080516c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8d16026020808301919091526034808301899052835180840390910181526054909201835281519181019190912060008181526002909252919020541561072957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4d75737420757365206120756e69717565204944000000000000000000000000604482015290519081900360640190fd5b600061073d4261012c63ffffffff61172416565b90508a898983604051602001808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600401828152602001945050505050604051602081830303815290604052805190602001206002600084815260200190815260200160002081905550897fd8d7ecc4800d25fa53ce0372f13a416d98907a7ef3d8d3bdd79cf4fe75529c658d848e8d8d878d8d8d604051808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001858152602001848152602001806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039c50909a5050505050505050505050a2505050505050505050505050565b3360009081526003602052604081205460ff16806109b9575061098a611149565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e6f7420616e20617574686f72697a6564206e6f646520746f2066756c66696c60448201527f6c20726571756573747300000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008781526002602052604090205487901515610aca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4d757374206861766520612076616c6964207265717565737449640000000000604482015290519081900360640190fd5b6040805160208082018a90526c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8a1602828401527fffffffff00000000000000000000000000000000000000000000000000000000881660548301526058808301889052835180840390910181526078909201835281519181019190912060008b81526002909252919020548114610bc557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f506172616d7320646f206e6f74206d6174636820726571756573742049440000604482015290519081900360640190fd5b600454610bd8908963ffffffff61172416565b60045560008981526002602052604081205562061a805a1015610c5c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4d7573742070726f7669646520636f6e73756d657220656e6f75676820676173604482015290519081900360640190fd5b60408051602481018b9052604480820187905282518083039091018152606490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000008a161781529151815160009373ffffffffffffffffffffffffffffffffffffffff8c169392918291908083835b60208310610d2f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610cf2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610d91576040519150601f19603f3d011682016040523d82523d6000602084013e610d96565b606091505b50909b9a5050505050505050505050565b61012c81565b6000610db7611165565b1515610e2457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600454610e3890600163ffffffff61179f16565b905090565b6040805160208082018690526c010000000000000000000000003302828401527fffffffff00000000000000000000000000000000000000000000000000000000851660548301526058808301859052835180840390910181526078909201835281519181019190912060008781526002909252919020548114610f2257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f506172616d7320646f206e6f74206d6174636820726571756573742049440000604482015290519081900360640190fd5b42821115610f9157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f52657175657374206973206e6f74206578706972656400000000000000000000604482015290519081900360640190fd5b6000858152600260205260408082208290555186917fa7842b9ec549398102c0d91b1b9919b2f20558aefdadf57528a95c6cd3292e9391a2600154604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101879052905173ffffffffffffffffffffffffffffffffffffffff9092169163a9059cbb916044808201926020929091908290030181600087803b15801561104357600080fd5b505af1158015611057573d6000803e3d6000fd5b505050506040513d602081101561106d57600080fd5b5051151561107757fe5b5050505050565b611086611165565b15156110f357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff16331490565b61118b610527565b73ffffffffffffffffffffffffffffffffffffffff16331461120e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4d75737420757365204c494e4b20746f6b656e00000000000000000000000000604482015290519081900360640190fd5b805181906044111561128157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c69642072657175657374206c656e67746800000000000000000000604482015290519081900360640190fd5b602082015182907fffffffff0000000000000000000000000000000000000000000000000000000081167f40429946000000000000000000000000000000000000000000000000000000001461133857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d757374207573652077686974656c69737465642066756e6374696f6e730000604482015290519081900360640190fd5b85602485015284604485015260003073ffffffffffffffffffffffffffffffffffffffff16856040518082805190602001908083835b602083106113ab57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161136e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461140b576040519150601f19603f3d011682016040523d82523d6000602084013e611410565b606091505b5050905080151561148257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e61626c6520746f2063726561746520726571756573740000000000000000604482015290519081900360640190fd5b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205460ff1690565b6114be611165565b151561152b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61153481611816565b50565b61153f611165565b15156115ac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b806115be81600163ffffffff61172416565b600454101561165457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f416d6f756e74207265717565737465642069732067726561746572207468616e60448201527f20776974686472617761626c652062616c616e63650000000000000000000000606482015290519081900360840190fd5b600454611667908363ffffffff61179f16565b6004908155600154604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811694820194909452602481018690529051929091169163a9059cbb916044808201926020929091908290030181600087803b1580156116eb57600080fd5b505af11580156116ff573d6000803e3d6000fd5b505050506040513d602081101561171557600080fd5b5051151561171f57fe5b505050565b60008282018381101561179857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008282111561181057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b73ffffffffffffffffffffffffffffffffffffffff811615156118c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905556fea165627a7a723058202ea1d8a1566f8c4cc82a47fe0f8e4614de05eed38d2177d9c88e6b608bdd83e90029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC4 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x165D35E1 DUP2 EQ PUSH2 0xC9 JUMPI DUP1 PUSH4 0x40429946 EQ PUSH2 0x107 JUMPI DUP1 PUSH4 0x4AB0D190 EQ PUSH2 0x1EC JUMPI DUP1 PUSH4 0x4B602282 EQ PUSH2 0x280 JUMPI DUP1 PUSH4 0x50188301 EQ PUSH2 0x2A7 JUMPI DUP1 PUSH4 0x6EE4D553 EQ PUSH2 0x2BC JUMPI DUP1 PUSH4 0x7FCD56DB EQ PUSH2 0x31A JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x362 JUMPI DUP1 PUSH4 0x8F32D59B EQ PUSH2 0x377 JUMPI DUP1 PUSH4 0xA4C0ED36 EQ PUSH2 0x38C JUMPI DUP1 PUSH4 0xD3E9C314 EQ PUSH2 0x461 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x4A1 JUMPI DUP1 PUSH4 0xF3FEF3A3 EQ PUSH2 0x4E1 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x527 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x113 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x100 DUP2 LT ISZERO PUSH2 0x12B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP3 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP3 PUSH1 0x60 DUP4 ADD CALLDATALOAD AND SWAP2 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x80 DUP3 ADD CALLDATALOAD AND SWAP2 PUSH1 0xA0 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0xC0 DUP2 ADD CALLDATALOAD SWAP2 DUP2 ADD SWAP1 PUSH2 0x100 DUP2 ADD PUSH1 0xE0 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x543 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xC0 DUP2 LT ISZERO PUSH2 0x20F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x80 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xA0 ADD CALLDATALOAD PUSH2 0x969 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x295 PUSH2 0xDA7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x295 PUSH2 0xDAD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0xE3D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x326 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x33D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x107E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x1149 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x383 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26C PUSH2 0x1165 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x398 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 CALLDATALOAD AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x3EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x1183 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x484 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x148B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x14B6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x504 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x1537 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x54B PUSH2 0x527 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x5CE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D75737420757365204C494E4B20746F6B656E00000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 SLOAD DUP7 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ ISZERO PUSH2 0x65A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43616E6E6F742063616C6C6261636B20746F204C494E4B000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH13 0x1000000000000000000000000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 AND MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP10 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 KECCAK256 SLOAD ISZERO PUSH2 0x729 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D75737420757365206120756E69717565204944000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x73D TIMESTAMP PUSH2 0x12C PUSH4 0xFFFFFFFF PUSH2 0x1724 AND JUMP JUMPDEST SWAP1 POP DUP11 DUP10 DUP10 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP4 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x4 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x2 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP10 PUSH32 0xD8D7ECC4800D25FA53CE0372F13A416D98907A7EF3D8D3BDD79CF4FE75529C65 DUP14 DUP5 DUP15 DUP14 DUP14 DUP8 DUP14 DUP14 DUP14 PUSH1 0x40 MLOAD DUP1 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP13 POP SWAP1 SWAP11 POP POP POP POP POP POP POP POP POP POP POP LOG2 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH1 0xFF AND DUP1 PUSH2 0x9B9 JUMPI POP PUSH2 0x98A PUSH2 0x1149 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO ISZERO PUSH2 0xA4C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4E6F7420616E20617574686F72697A6564206E6F646520746F2066756C66696C PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C20726571756573747300000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP8 SWAP1 ISZERO ISZERO PUSH2 0xACA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D757374206861766520612076616C6964207265717565737449640000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP11 SWAP1 MSTORE PUSH13 0x1000000000000000000000000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND MUL DUP3 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP9 AND PUSH1 0x54 DUP4 ADD MSTORE PUSH1 0x58 DUP1 DUP4 ADD DUP9 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x78 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 KECCAK256 SLOAD DUP2 EQ PUSH2 0xBC5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x506172616D7320646F206E6F74206D6174636820726571756573742049440000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 SLOAD PUSH2 0xBD8 SWAP1 DUP10 PUSH4 0xFFFFFFFF PUSH2 0x1724 AND JUMP JUMPDEST PUSH1 0x4 SSTORE PUSH1 0x0 DUP10 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE PUSH3 0x61A80 GAS LT ISZERO PUSH2 0xC5C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D7573742070726F7669646520636F6E73756D657220656E6F75676820676173 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x24 DUP2 ADD DUP12 SWAP1 MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP11 AND OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP4 SWAP3 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xD2F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCF2 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0xD91 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP1 SWAP12 SWAP11 POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x12C DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xDB7 PUSH2 0x1165 JUMP JUMPDEST ISZERO ISZERO PUSH2 0xE24 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 SLOAD PUSH2 0xE38 SWAP1 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x179F AND JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP7 SWAP1 MSTORE PUSH13 0x1000000000000000000000000 CALLER MUL DUP3 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x54 DUP4 ADD MSTORE PUSH1 0x58 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x78 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP3 MSTORE SWAP2 SWAP1 KECCAK256 SLOAD DUP2 EQ PUSH2 0xF22 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x506172616D7320646F206E6F74206D6174636820726571756573742049440000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST TIMESTAMP DUP3 GT ISZERO PUSH2 0xF91 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x52657175657374206973206E6F74206578706972656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP3 SWAP1 SSTORE MLOAD DUP7 SWAP2 PUSH32 0xA7842B9EC549398102C0D91B1B9919B2F20558AEFDADF57528A95C6CD3292E93 SWAP2 LOG2 PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP8 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1043 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1057 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x106D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x1077 JUMPI INVALID JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1086 PUSH2 0x1165 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x10F3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ SWAP1 JUMP JUMPDEST PUSH2 0x118B PUSH2 0x527 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x120E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D75737420757365204C494E4B20746F6B656E00000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 MLOAD DUP2 SWAP1 PUSH1 0x44 GT ISZERO PUSH2 0x1281 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642072657175657374206C656E67746800000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 EQ PUSH2 0x1338 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D757374207573652077686974656C69737465642066756E6374696F6E730000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP6 PUSH1 0x24 DUP6 ADD MSTORE DUP5 PUSH1 0x44 DUP6 ADD MSTORE PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x13AB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x136E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x140B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1410 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 ISZERO ISZERO PUSH2 0x1482 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F2063726561746520726571756573740000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH2 0x14BE PUSH2 0x1165 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x152B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1534 DUP2 PUSH2 0x1816 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x153F PUSH2 0x1165 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x15AC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x15BE DUP2 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1724 AND JUMP JUMPDEST PUSH1 0x4 SLOAD LT ISZERO PUSH2 0x1654 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x35 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416D6F756E74207265717565737465642069732067726561746572207468616E PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x20776974686472617761626C652062616C616E63650000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 SLOAD PUSH2 0x1667 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x179F AND JUMP JUMPDEST PUSH1 0x4 SWAP1 DUP2 SSTORE PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND SWAP5 DUP3 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP1 SWAP2 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16FF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1715 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x171F JUMPI INVALID JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1798 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1810 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x18C0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0x2e LOG1 0xd8 LOG1 JUMP PUSH16 0x8C4CC82A47FE0F8E4614DE05EED38D21 PUSH24 0xD9C88E6B608BDD83E9002900000000000000000000000000 ",
"sourceMap": "453:9081:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8319:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8319:95:5;;;;;;;;;;;;;;;;;;;;;;;2405:897;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2405:897:5;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;2405:897:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;2405:897:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;2405:897:5;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;2405:897:5;;-1:-1:-1;2405:897:5;-1:-1:-1;2405:897:5;;;;4160:1153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4160:1153:5;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;4160:1153:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;608:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;608:47:5;;;;;;;;;;;;;;;;;;;;6792:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6792:135:5;;;;7494:622;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7494:622:5;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;7494:622:5;;;;;;;;;;;;;;;;;;;;5877:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5877:127:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5877:127:5;;;;;;;;;;;;861:71:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;861:71:36;;;;1180:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1180:84:36;;;;709:663:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;709:663:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;709:663:2;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;709:663:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;709:663:2;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;709:663:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;709:663:2;;-1:-1:-1;709:663:2;;-1:-1:-1;;;;;709:663:2;5510:116:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5510:116:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5510:116:5;;;;;1403:101:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1403:101:36;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1403:101:36;;;;;6319:231:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6319:231:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6319:231:5;;;;;;;;;;8319:95;8399:9;;;;8319:95;:::o;2405:897::-;1549:19:2;:17;:19::i;:::-;1535:33;;:10;:33;1527:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9481:9:5;;2681:16;;9481:9;9466:25;;;9481:9;;9466:25;;9458:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2737:33;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;2737:33:5;;;;;;2727:44;;;;;;;;;2707:17;2785:22;;;:11;:22;;;;;;;:27;2777:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2893:18;2914:20;:3;646:9;2914:20;:7;:20;:::i;:::-;2893:41;;3009:8;3027:16;3053:19;3082:10;2983:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2983:117:5;;;2966:140;;;;;;2941:11;:22;2953:9;2941:22;;;;;;;;;;;:165;;;;3139:7;3118:179;3154:7;3169:9;3186:8;3202:16;3226:19;3253:10;3271:12;3291:5;;3118:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;3118:179:5;;137:4:-1;117:14;;;133:9;113:30;157:16;;;3118:179:5;;;;-1:-1:-1;3118:179:5;;-1:-1:-1;;;;;;;;;;;3118:179:5;9525:1;;1598::2;2405:897:5;;;;;;;;;:::o;4160:1153::-;9201:10;4426:4;9185:27;;;:15;:27;;;;;;;;;:52;;;9230:7;:5;:7::i;:::-;9216:21;;:10;:21;;;9185:52;9177:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8981:23;;;;:11;:23;;;;;;4401:10;;8981:28;;8973:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;4478:118:5;;;;;;4461:141;;;;;;;;;4440:18;4616:23;;;:11;:23;;;;;;;:37;;4608:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4715:18;;:32;;4738:8;4715:32;:22;:32;:::i;:::-;4694:18;:53;4760:23;;;;:11;:23;;;;;4753:30;713:6;4797:9;:39;;4789:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5179:62;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;5179:62:5;;;;;;;25:18:-1;;61:17;;5179:62:5;182:15:-1;5179:62:5;;;179:29:-1;160:49;;5157:85:5;;;;5139:12;;5157:21;;;;5179:62;5157:85;;;25:18:-1;5157:85:5;;25:18:-1;36:153;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;5157:85:5;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;5138:104:5;;4160:1153;-1:-1:-1;;;;;;;;;;;4160:1153:5:o;608:47::-;646:9;608:47;:::o;6792:135::-;6849:7;1047:9:36;:7;:9::i;:::-;1039:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6871:18:5;;:51;;880:1;6871:51;:22;:51;:::i;:::-;6864:58;;6792:135;:::o;7494:622::-;7677:99;;;;;;;;;;;7721:10;7677:99;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;7677:99:5;;;;;;7660:122;;;;;;;;;7639:18;7810:23;;;:11;:23;;;;;;;7796:37;;7788:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7947:3;7932:18;;;7924:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7991:23;;;;:11;:23;;;;;;7984:30;;;8025:31;8003:10;;8025:31;;;8070:9;;:40;;;;;;8089:10;8070:40;;;;;;;;;;;;:9;;;;;:18;;:40;;;;;;;;;;;;;;;:9;;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;8070:40:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8070:40:5;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8070:40:5;8063:48;;;;;;7494:622;;;;;:::o;5877:127::-;1047:9:36;:7;:9::i;:::-;1039:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5966:22:5;;;;;;;;;:15;:22;;;;;:33;;;;;;;;;;;;;5877:127::o;861:71:36:-;899:7;921:6;;;861:71;:::o;1180:84::-;1220:4;1253:6;;;1239:10;:20;;1180:84::o;709:663:2:-;1549:19;:17;:19::i;:::-;1535:33;;:10;:33;1527:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2261:12;;851:5;;274:47;-1:-1:-1;2261:38:2;2253:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1957:2;1946:14;;1940:21;888:5;;1980:39;;;1996:23;1980:39;1972:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1000:7;995:2;988:5;984:14;977:31;1130:7;1125:2;1118:5;1114:14;1107:31;1243:12;1269:4;1261:26;;1288:5;1261:33;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1261:33:2;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;1242:52:2;;;1331:7;1323:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2060:1;2332;;1598;709:663;;;:::o;5510:116:5:-;5599:22;;5580:4;5599:22;;;:15;:22;;;;;;;;;5510:116::o;1403:101:36:-;1047:9;:7;:9::i;:::-;1039:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1471:28;1490:8;1471:18;:28::i;:::-;1403:101;:::o;6319:231:5:-;1047:9:36;:7;:9::i;:::-;1039:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6423:7:5;8673:40;6423:7;880:1;8673:40;:11;:40;:::i;:::-;8651:18;;:62;;8643:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6461:18;;:31;;6484:7;6461:31;:22;:31;:::i;:::-;6440:18;:52;;;6505:9;;:39;;;;;;:9;:39;;;;;;;;;;;;;;;;;;:9;;;;;:18;;:39;;;;;;;;;;;;;;;:9;;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;6505:39:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6505:39:5;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6505:39:5;6498:47;;;;;;1099:1:36;6319:231:5;;:::o;831:162:37:-;889:7;916:5;;;935:6;;;;927:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;987:1;831:162;-1:-1:-1;;;831:162:37:o;1245:165::-;1303:7;1326:6;;;;1318:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1385:5:37;;;1245:165::o;1597:211:36:-;1666:22;;;;;1658:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1763:6;;;1742:38;;;;;;;1763:6;;;1742:38;;;1786:6;:17;;;;;;;;;;;;;;;1597:211::o"
},
"methodIdentifiers": {
"EXPIRY_TIME()": "4b602282",
"cancelOracleRequest(bytes32,uint256,bytes4,uint256)": "6ee4d553",
"fulfillOracleRequest(bytes32,uint256,address,bytes4,uint256,bytes32)": "4ab0d190",
"getAuthorizationStatus(address)": "d3e9c314",
"getChainlinkToken()": "165d35e1",
"isOwner()": "8f32d59b",
"onTokenTransfer(address,uint256,bytes)": "a4c0ed36",
"oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)": "40429946",
"owner()": "8da5cb5b",
"setFulfillmentPermission(address,bool)": "7fcd56db",
"transferOwnership(address)": "f2fde38b",
"withdraw(address,uint256)": "f3fef3a3",
"withdrawable()": "50188301"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"getChainlinkToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_sender\",\"type\":\"address\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_specId\",\"type\":\"bytes32\"},{\"name\":\"_callbackAddress\",\"type\":\"address\"},{\"name\":\"_callbackFunctionId\",\"type\":\"bytes4\"},{\"name\":\"_nonce\",\"type\":\"uint256\"},{\"name\":\"_dataVersion\",\"type\":\"uint256\"},{\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"oracleRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_callbackAddress\",\"type\":\"address\"},{\"name\":\"_callbackFunctionId\",\"type\":\"bytes4\"},{\"name\":\"_expiration\",\"type\":\"uint256\"},{\"name\":\"_data\",\"type\":\"bytes32\"}],\"name\":\"fulfillOracleRequest\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"EXPIRY_TIME\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"withdrawable\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_callbackFunc\",\"type\":\"bytes4\"},{\"name\":\"_expiration\",\"type\":\"uint256\"}],\"name\":\"cancelOracleRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_node\",\"type\":\"address\"},{\"name\":\"_allowed\",\"type\":\"bool\"}],\"name\":\"setFulfillmentPermission\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_sender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"},{\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_node\",\"type\":\"address\"}],\"name\":\"getAuthorizationStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_recipient\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_link\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"specId\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"requester\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"payment\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"callbackAddr\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"callbackFunctionId\",\"type\":\"bytes4\"},{\"indexed\":false,\"name\":\"cancelExpiration\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"dataVersion\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"OracleRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"requestId\",\"type\":\"bytes32\"}],\"name\":\"CancelOracleRequest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"cancelOracleRequest(bytes32,uint256,bytes4,uint256)\":{\"details\":\"Given params must hash to a commitment stored on the contract in order for the request to be valid Emits CancelOracleRequest event.\",\"params\":{\"_callbackFunc\":\"The requester's specified callback address\",\"_expiration\":\"The time of the expiration for the request\",\"_payment\":\"The amount of payment given (specified in wei)\",\"_requestId\":\"The request ID\"}},\"constructor\":{\"details\":\"Sets the LinkToken address for the imported LinkTokenInterface\",\"params\":{\"_link\":\"The address of the LINK token\"}},\"fulfillOracleRequest(bytes32,uint256,address,bytes4,uint256,bytes32)\":{\"details\":\"Given params must hash back to the commitment stored from `oracleRequest`. Will call the callback address' callback function without bubbling up error checking in a `require` so that the node can get paid.\",\"params\":{\"_callbackAddress\":\"The callback address to call for fulfillment\",\"_callbackFunctionId\":\"The callback function ID to use for fulfillment\",\"_data\":\"The data to return to the consuming contract\",\"_expiration\":\"The expiration that the node should respond by before the requester can cancel\",\"_payment\":\"The payment amount that will be released for the oracle (specified in wei)\",\"_requestId\":\"The fulfillment request ID that must match the requester's\"},\"return\":\"Status if the external call was successful\"},\"getAuthorizationStatus(address)\":{\"params\":{\"_node\":\"The address of the Chainlink node\"},\"return\":\"The authorization status of the node\"},\"getChainlinkToken()\":{\"details\":\"This is the public implementation for chainlinkTokenAddress, which is an internal method of the ChainlinkClient contract\"},\"isOwner()\":{\"details\":\"Returns true if the caller is the current owner.\"},\"onTokenTransfer(address,uint256,bytes)\":{\"details\":\"The data payload's first 2 words will be overwritten by the `_sender` and `_amount` values to ensure correctness. Calls oracleRequest.\",\"params\":{\"_amount\":\"Amount of LINK sent (specified in wei)\",\"_data\":\"Payload of the transaction\",\"_sender\":\"Address of the sender\"}},\"oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)\":{\"details\":\"Stores the hash of the params as the on-chain commitment for the request. Emits OracleRequest event for the Chainlink node to detect.\",\"params\":{\"_callbackAddress\":\"The callback address for the response\",\"_callbackFunctionId\":\"The callback function ID for the response\",\"_data\":\"The CBOR payload of the request\",\"_dataVersion\":\"The specified data version\",\"_nonce\":\"The nonce sent by the requester\",\"_payment\":\"The amount of payment given (specified in wei)\",\"_sender\":\"The sender of the request\",\"_specId\":\"The Job Specification ID\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"setFulfillmentPermission(address,bool)\":{\"params\":{\"_allowed\":\"Bool value to determine if the node can fulfill requests\",\"_node\":\"The address of the Chainlink node\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdraw(address,uint256)\":{\"details\":\"The owner of the contract can be another wallet and does not have to be a Chainlink node\",\"params\":{\"_amount\":\"The amount to send (specified in wei)\",\"_recipient\":\"The address to send the LINK token to\"}},\"withdrawable()\":{\"details\":\"We use `ONE_FOR_CONSISTENT_GAS_COST` in place of 0 in storage\",\"return\":\"The amount of withdrawable LINK on the contract\"}},\"title\":\"The Chainlink Oracle contract\"},\"userdoc\":{\"methods\":{\"cancelOracleRequest(bytes32,uint256,bytes4,uint256)\":{\"notice\":\"Allows requesters to cancel requests sent to this oracle contract. Will transfer the LINK sent for the request back to the requester's address.\"},\"constructor\":\"Deploy with the address of the LINK token\",\"fulfillOracleRequest(bytes32,uint256,address,bytes4,uint256,bytes32)\":{\"notice\":\"Called by the Chainlink node to fulfill requests\"},\"getAuthorizationStatus(address)\":{\"notice\":\"Use this to check if a node is authorized for fulfilling requests\"},\"getChainlinkToken()\":{\"notice\":\"Returns the address of the LINK token\"},\"onTokenTransfer(address,uint256,bytes)\":{\"notice\":\"Called when LINK is sent to the contract via `transferAndCall`\"},\"oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)\":{\"notice\":\"Creates the Chainlink request\"},\"setFulfillmentPermission(address,bool)\":{\"notice\":\"Sets the fulfillment permission for a given node. Use `true` to allow, `false` to disallow.\"},\"withdraw(address,uint256)\":{\"notice\":\"Allows the node operator to withdraw earned LINK to a given address\"},\"withdrawable()\":{\"notice\":\"Displays the amount of LINK that is available for the node operator to withdraw\"}},\"notice\":\"Node operators can deploy this contract to fulfill requests sent to them\"}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Oracle.sol\":\"Oracle\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/LinkTokenReceiver.sol\":{\"keccak256\":\"0x7aea15111145093a05ed12403c1dc1a615abb1a629bfc32043a4f43cee1ff929\",\"urls\":[\"bzzr://cf8a3069e266aba2163edf7d62374ab3abc1c65c7ccc6c527e1e2dbe741bad9e\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Oracle.sol\":{\"keccak256\":\"0x1f9579fe72850f25ba265a601654ae98baf8fe236fb14b62f1eaa57d8f4bd130\",\"urls\":[\"bzzr://8b37f1620eae9023ee894a3ee386de354bb21de1687dadc4adfad05305976550\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x8871fe810c2efc580e8173e1751df0023b362f4835e44383bd95ee375c4388b9\",\"urls\":[\"bzzr://1c0bdf40cbcbe3fe7491c673d5db4561e85f3f02bd5f3851c857c6d5f7987c45\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x592d87884106ba82cedbe79922de9cfaf28b211a09f9be243ad767d3baa1cb90\",\"urls\":[\"bzzr://1f4a72f8b790700d839354d412df656d5a59877264c6e126a1deae6164de9e7d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/OracleInterface.sol\":{\"keccak256\":\"0xccb79a4ab0f1f0a3c4b9e4475dedf93bf0381b78c365eceebd409186256f8412\",\"urls\":[\"bzzr://582cf21891f1888887c01f1874610846cf6e2dc37d5f5e26f969c470018f7b1c\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/WithdrawalInterface.sol\":{\"keccak256\":\"0x39d6b613dafa8377db39b9fe3a05e83652579ba60ff4609229f0b65a034d80e3\",\"urls\":[\"bzzr://29e91407cacf5d464a20d7976179b4b72c3fe49de28442e10b091abb1f924879\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Ownable.sol\":{\"keccak256\":\"0xa282b582630c29bff6b88640a32fc3ff7ff8809736aaabde55518cbe1d7bcb11\",\"urls\":[\"bzzr://e856dc34fdda5c4260b5f98d46e2a38f84bcaec640413e77b5aab5259d78461d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0x796a82f2e4ab35469224050fb62ecd2dc038474e7f9d4dfd7a1023080c009883\",\"urls\":[\"bzzr://6e0bb08f77ca150b228e70773696ea301e939c0b5542fedb05276b683b774e13\"]}},\"version\":1}",
"userdoc": {
"methods": {
"cancelOracleRequest(bytes32,uint256,bytes4,uint256)": {
"notice": "Allows requesters to cancel requests sent to this oracle contract. Will transfer the LINK sent for the request back to the requester's address."
},
"constructor": "Deploy with the address of the LINK token",
"fulfillOracleRequest(bytes32,uint256,address,bytes4,uint256,bytes32)": {
"notice": "Called by the Chainlink node to fulfill requests"
},
"getAuthorizationStatus(address)": {
"notice": "Use this to check if a node is authorized for fulfilling requests"
},
"getChainlinkToken()": {
"notice": "Returns the address of the LINK token"
},
"onTokenTransfer(address,uint256,bytes)": {
"notice": "Called when LINK is sent to the contract via `transferAndCall`"
},
"oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)": {
"notice": "Creates the Chainlink request"
},
"setFulfillmentPermission(address,bool)": {
"notice": "Sets the fulfillment permission for a given node. Use `true` to allow, `false` to disallow."
},
"withdraw(address,uint256)": {
"notice": "Allows the node operator to withdraw earned LINK to a given address"
},
"withdrawable()": {
"notice": "Displays the amount of LINK that is available for the node operator to withdraw"
}
},
"notice": "Node operators can deploy this contract to fulfill requests sent to them"
}
},
"sources": {
"Oracle.sol": {
"id": 5
},
"LinkTokenReceiver.sol": {
"id": 2
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 14
},
"interfaces/OracleInterface.sol": {
"id": 18
},
"interfaces/LinkTokenInterface.sol": {
"id": 17
},
"interfaces/WithdrawalInterface.sol": {
"id": 20
},
"vendor/Ownable.sol": {
"id": 36
},
"vendor/SafeMathChainlink.sol": {
"id": 37
}
},
"sourceCodes": {
"Oracle.sol": "pragma solidity ^0.5.0;\n\nimport \"./LinkTokenReceiver.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/OracleInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/WithdrawalInterface.sol\";\nimport \"./vendor/Ownable.sol\";\nimport \"./vendor/SafeMathChainlink.sol\";\n\n/**\n * @title The Chainlink Oracle contract\n * @notice Node operators can deploy this contract to fulfill requests sent to them\n */\ncontract Oracle is ChainlinkRequestInterface, OracleInterface, Ownable, LinkTokenReceiver, WithdrawalInterface {\n using SafeMathChainlink for uint256;\n\n uint256 constant public EXPIRY_TIME = 5 minutes;\n uint256 constant private MINIMUM_CONSUMER_GAS_LIMIT = 400000;\n // We initialize fields to 1 instead of 0 so that the first invocation\n // does not cost more gas.\n uint256 constant private ONE_FOR_CONSISTENT_GAS_COST = 1;\n\n LinkTokenInterface internal LinkToken;\n mapping(bytes32 => bytes32) private commitments;\n mapping(address => bool) private authorizedNodes;\n uint256 private withdrawableTokens = ONE_FOR_CONSISTENT_GAS_COST;\n\n event OracleRequest(\n bytes32 indexed specId,\n address requester,\n bytes32 requestId,\n uint256 payment,\n address callbackAddr,\n bytes4 callbackFunctionId,\n uint256 cancelExpiration,\n uint256 dataVersion,\n bytes data\n );\n\n event CancelOracleRequest(\n bytes32 indexed requestId\n );\n\n /**\n * @notice Deploy with the address of the LINK token\n * @dev Sets the LinkToken address for the imported LinkTokenInterface\n * @param _link The address of the LINK token\n */\n constructor(address _link) public Ownable() {\n LinkToken = LinkTokenInterface(_link); // external but already deployed and unalterable\n }\n\n /**\n * @notice Creates the Chainlink request\n * @dev Stores the hash of the params as the on-chain commitment for the request.\n * Emits OracleRequest event for the Chainlink node to detect.\n * @param _sender The sender of the request\n * @param _payment The amount of payment given (specified in wei)\n * @param _specId The Job Specification ID\n * @param _callbackAddress The callback address for the response\n * @param _callbackFunctionId The callback function ID for the response\n * @param _nonce The nonce sent by the requester\n * @param _dataVersion The specified data version\n * @param _data The CBOR payload of the request\n */\n function oracleRequest(\n address _sender,\n uint256 _payment,\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionId,\n uint256 _nonce,\n uint256 _dataVersion,\n bytes calldata _data\n )\n external\n onlyLINK\n checkCallbackAddress(_callbackAddress)\n {\n bytes32 requestId = keccak256(abi.encodePacked(_sender, _nonce));\n require(commitments[requestId] == 0, \"Must use a unique ID\");\n // solhint-disable-next-line not-rely-on-time\n uint256 expiration = now.add(EXPIRY_TIME);\n\n commitments[requestId] = keccak256(\n abi.encodePacked(\n _payment,\n _callbackAddress,\n _callbackFunctionId,\n expiration\n )\n );\n\n emit OracleRequest(\n _specId,\n _sender,\n requestId,\n _payment,\n _callbackAddress,\n _callbackFunctionId,\n expiration,\n _dataVersion,\n _data);\n }\n\n /**\n * @notice Called by the Chainlink node to fulfill requests\n * @dev Given params must hash back to the commitment stored from `oracleRequest`.\n * Will call the callback address' callback function without bubbling up error\n * checking in a `require` so that the node can get paid.\n * @param _requestId The fulfillment request ID that must match the requester's\n * @param _payment The payment amount that will be released for the oracle (specified in wei)\n * @param _callbackAddress The callback address to call for fulfillment\n * @param _callbackFunctionId The callback function ID to use for fulfillment\n * @param _expiration The expiration that the node should respond by before the requester can cancel\n * @param _data The data to return to the consuming contract\n * @return Status if the external call was successful\n */\n function fulfillOracleRequest(\n bytes32 _requestId,\n uint256 _payment,\n address _callbackAddress,\n bytes4 _callbackFunctionId,\n uint256 _expiration,\n bytes32 _data\n )\n external\n onlyAuthorizedNode\n isValidRequest(_requestId)\n returns (bool)\n {\n bytes32 paramsHash = keccak256(\n abi.encodePacked(\n _payment,\n _callbackAddress,\n _callbackFunctionId,\n _expiration\n )\n );\n require(commitments[_requestId] == paramsHash, \"Params do not match request ID\");\n withdrawableTokens = withdrawableTokens.add(_payment);\n delete commitments[_requestId];\n require(gasleft() >= MINIMUM_CONSUMER_GAS_LIMIT, \"Must provide consumer enough gas\");\n // All updates to the oracle's fulfillment should come before calling the\n // callback(addr+functionId) as it is untrusted.\n // See: https://solidity.readthedocs.io/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern\n (bool success, ) = _callbackAddress.call(abi.encodeWithSelector(_callbackFunctionId, _requestId, _data)); // solhint-disable-line avoid-low-level-calls\n return success;\n }\n\n /**\n * @notice Use this to check if a node is authorized for fulfilling requests\n * @param _node The address of the Chainlink node\n * @return The authorization status of the node\n */\n function getAuthorizationStatus(address _node) external view returns (bool) {\n return authorizedNodes[_node];\n }\n\n /**\n * @notice Sets the fulfillment permission for a given node. Use `true` to allow, `false` to disallow.\n * @param _node The address of the Chainlink node\n * @param _allowed Bool value to determine if the node can fulfill requests\n */\n function setFulfillmentPermission(address _node, bool _allowed) external onlyOwner {\n authorizedNodes[_node] = _allowed;\n }\n\n /**\n * @notice Allows the node operator to withdraw earned LINK to a given address\n * @dev The owner of the contract can be another wallet and does not have to be a Chainlink node\n * @param _recipient The address to send the LINK token to\n * @param _amount The amount to send (specified in wei)\n */\n function withdraw(address _recipient, uint256 _amount)\n external\n onlyOwner\n hasAvailableFunds(_amount)\n {\n withdrawableTokens = withdrawableTokens.sub(_amount);\n assert(LinkToken.transfer(_recipient, _amount));\n }\n\n /**\n * @notice Displays the amount of LINK that is available for the node operator to withdraw\n * @dev We use `ONE_FOR_CONSISTENT_GAS_COST` in place of 0 in storage\n * @return The amount of withdrawable LINK on the contract\n */\n function withdrawable() external view onlyOwner returns (uint256) {\n return withdrawableTokens.sub(ONE_FOR_CONSISTENT_GAS_COST);\n }\n\n /**\n * @notice Allows requesters to cancel requests sent to this oracle contract. Will transfer the LINK\n * sent for the request back to the requester's address.\n * @dev Given params must hash to a commitment stored on the contract in order for the request to be valid\n * Emits CancelOracleRequest event.\n * @param _requestId The request ID\n * @param _payment The amount of payment given (specified in wei)\n * @param _callbackFunc The requester's specified callback address\n * @param _expiration The time of the expiration for the request\n */\n function cancelOracleRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n ) external {\n bytes32 paramsHash = keccak256(\n abi.encodePacked(\n _payment,\n msg.sender,\n _callbackFunc,\n _expiration)\n );\n require(paramsHash == commitments[_requestId], \"Params do not match request ID\");\n // solhint-disable-next-line not-rely-on-time\n require(_expiration <= now, \"Request is not expired\");\n\n delete commitments[_requestId];\n emit CancelOracleRequest(_requestId);\n\n assert(LinkToken.transfer(msg.sender, _payment));\n }\n\n /**\n * @notice Returns the address of the LINK token\n * @dev This is the public implementation for chainlinkTokenAddress, which is\n * an internal method of the ChainlinkClient contract\n */\n function getChainlinkToken() public view returns (address) {\n return address(LinkToken);\n }\n\n // MODIFIERS\n\n /**\n * @dev Reverts if amount requested is greater than withdrawable balance\n * @param _amount The given amount to compare to `withdrawableTokens`\n */\n modifier hasAvailableFunds(uint256 _amount) {\n require(withdrawableTokens >= _amount.add(ONE_FOR_CONSISTENT_GAS_COST), \"Amount requested is greater than withdrawable balance\");\n _;\n }\n\n /**\n * @dev Reverts if request ID does not exist\n * @param _requestId The given request ID to check in stored `commitments`\n */\n modifier isValidRequest(bytes32 _requestId) {\n require(commitments[_requestId] != 0, \"Must have a valid requestId\");\n _;\n }\n\n /**\n * @dev Reverts if `msg.sender` is not authorized to fulfill requests\n */\n modifier onlyAuthorizedNode() {\n require(authorizedNodes[msg.sender] || msg.sender == owner(), \"Not an authorized node to fulfill requests\");\n _;\n }\n\n /**\n * @dev Reverts if the callback address is the LINK token\n * @param _to The callback address\n */\n modifier checkCallbackAddress(address _to) {\n require(_to != address(LinkToken), \"Cannot callback to LINK\");\n _;\n }\n\n}\n",
"LinkTokenReceiver.sol": "pragma solidity ^0.5.0;\n\ncontract LinkTokenReceiver {\n\n bytes4 constant private ORACLE_REQUEST_SELECTOR = 0x40429946;\n uint256 constant private SELECTOR_LENGTH = 4;\n uint256 constant private EXPECTED_REQUEST_WORDS = 2;\n uint256 constant private MINIMUM_REQUEST_LENGTH = SELECTOR_LENGTH + (32 * EXPECTED_REQUEST_WORDS);\n /**\n * @notice Called when LINK is sent to the contract via `transferAndCall`\n * @dev The data payload's first 2 words will be overwritten by the `_sender` and `_amount`\n * values to ensure correctness. Calls oracleRequest.\n * @param _sender Address of the sender\n * @param _amount Amount of LINK sent (specified in wei)\n * @param _data Payload of the transaction\n */\n function onTokenTransfer(\n address _sender,\n uint256 _amount,\n bytes memory _data\n )\n public\n onlyLINK\n validRequestLength(_data)\n permittedFunctionsForLINK(_data)\n {\n assembly {\n // solhint-disable-next-line avoid-low-level-calls\n mstore(add(_data, 36), _sender) // ensure correct sender is passed\n // solhint-disable-next-line avoid-low-level-calls\n mstore(add(_data, 68), _amount) // ensure correct amount is passed\n }\n // solhint-disable-next-line avoid-low-level-calls\n (bool success, ) = address(this).delegatecall(_data); // calls oracleRequest\n require(success, \"Unable to create request\");\n }\n\n function getChainlinkToken() public view returns (address);\n\n /**\n * @dev Reverts if not sent from the LINK token\n */\n modifier onlyLINK() {\n require(msg.sender == getChainlinkToken(), \"Must use LINK token\");\n _;\n }\n\n /**\n * @dev Reverts if the given data does not begin with the `oracleRequest` function selector\n * @param _data The data payload of the request\n */\n modifier permittedFunctionsForLINK(bytes memory _data) {\n bytes4 funcSelector;\n assembly {\n // solhint-disable-next-line avoid-low-level-calls\n funcSelector := mload(add(_data, 32))\n }\n require(funcSelector == ORACLE_REQUEST_SELECTOR, \"Must use whitelisted functions\");\n _;\n }\n\n /**\n * @dev Reverts if the given payload is less than needed to create a request\n * @param _data The request payload\n */\n modifier validRequestLength(bytes memory _data) {\n require(_data.length >= MINIMUM_REQUEST_LENGTH, \"Invalid request length\");\n _;\n }\n}",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 requestPrice,\n bytes32 serviceAgreementID,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 dataVersion,\n bytes calldata data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/OracleInterface.sol": "pragma solidity ^0.5.0;\n\ninterface OracleInterface {\n function fulfillOracleRequest(\n bytes32 requestId,\n uint256 payment,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 expiration,\n bytes32 data\n ) external returns (bool);\n function getAuthorizationStatus(address node) external view returns (bool);\n function setFulfillmentPermission(address node, bool allowed) external;\n function withdraw(address recipient, uint256 amount) external;\n function withdrawable() external view returns (uint256);\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.5.0;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string memory tokenName);\n function symbol() external view returns (string memory tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/WithdrawalInterface.sol": "pragma solidity ^0.5.0;\n\ninterface WithdrawalInterface {\n /**\n * @notice transfer LINK held by the contract belonging to msg.sender to\n * another address\n * @param recipient is the address to send the LINK to\n * @param amount is the amount of LINK to send\n */\n function withdraw(address recipient, uint256 amount) external;\n\n /**\n * @notice query the available amount of LINK to withdraw by msg.sender\n */\n function withdrawable() external view returns (uint256);\n}\n",
"vendor/Ownable.sol": "pragma solidity ^0.5.0;\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be aplied to your functions to restrict their use to\n * the owner.\n *\n * This contract has been modified to remove the revokeOwnership function\n */\ncontract Ownable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () internal {\n _owner = msg.sender;\n emit OwnershipTransferred(address(0), _owner);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(isOwner(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Returns true if the caller is the current owner.\n */\n function isOwner() public view returns (bool) {\n return msg.sender == _owner;\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public onlyOwner {\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n */\n function _transferOwnership(address newOwner) internal {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}\n",
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.5.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMathChainlink {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n // Solidity only automatically asserts when dividing by 0\n require(b > 0, \"SafeMath: division by zero\");\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b != 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n}\n"
},
"sourceTreeHashHex": "0xc6e6ea9ce7d30d966599155e3ffd922fcb2a7798c6857d989b6645e7438c62b0",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "OracleInterface",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "requestId",
"type": "bytes32"
},
{
"name": "payment",
"type": "uint256"
},
{
"name": "callbackAddress",
"type": "address"
},
{
"name": "callbackFunctionId",
"type": "bytes4"
},
{
"name": "expiration",
"type": "uint256"
},
{
"name": "data",
"type": "bytes32"
}
],
"name": "fulfillOracleRequest",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "withdrawable",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "address"
},
{
"name": "allowed",
"type": "bool"
}
],
"name": "setFulfillmentPermission",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "address"
}
],
"name": "getAuthorizationStatus",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "recipient",
"type": "address"
},
{
"name": "amount",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"fulfillOracleRequest(bytes32,uint256,address,bytes4,uint256,bytes32)": "4ab0d190",
"getAuthorizationStatus(address)": "d3e9c314",
"setFulfillmentPermission(address,bool)": "7fcd56db",
"withdraw(address,uint256)": "f3fef3a3",
"withdrawable()": "50188301"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/OracleInterface.sol": {
"id": 18
}
},
"sourceCodes": {
"interfaces/OracleInterface.sol": "pragma solidity ^0.5.0;\n\ninterface OracleInterface {\n function fulfillOracleRequest(\n bytes32 requestId,\n uint256 payment,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 expiration,\n bytes32 data\n ) external returns (bool);\n function getAuthorizationStatus(address node) external view returns (bool);\n function setFulfillmentPermission(address node, bool allowed) external;\n function withdraw(address recipient, uint256 amount) external;\n function withdrawable() external view returns (uint256);\n}\n"
},
"sourceTreeHashHex": "0xccb79a4ab0f1f0a3c4b9e4475dedf93bf0381b78c365eceebd409186256f8412",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "OracleSignaturesDecoder",
"compilerOutput": {
"abi": [],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x6080604052348015600f57600080fd5b50603580601d6000396000f3fe6080604052600080fdfea165627a7a72305820fab2af88db2db4b0a9b85f7caad17d5f453635876e5b37d537a0071bc29a94eb0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x35 DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 STATICCALL 0xb2 0xaf DUP9 0xdb 0x2d 0xb4 0xb0 0xa9 0xb8 0x5f PUSH29 0xAAD17D5F453635876E5B37D537A0071BC29A94EB002900000000000000 ",
"sourceMap": "24:489:8:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24:489:8;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600080fdfea165627a7a72305820fab2af88db2db4b0a9b85f7caad17d5f453635876e5b37d537a0071bc29a94eb0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 STATICCALL 0xb2 0xaf DUP9 0xdb 0x2d 0xb4 0xb0 0xa9 0xb8 0x5f PUSH29 0xAAD17D5F453635876E5B37D537A0071BC29A94EB002900000000000000 ",
"sourceMap": "24:489:8:-;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/dev/OracleSignaturesDecoder.sol\":\"OracleSignaturesDecoder\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/dev/OracleSignaturesDecoder.sol\":{\"keccak256\":\"0xbfadafdb8329e1022ad617e071ccfe330897bc044983998f1de8dae266affb63\",\"urls\":[\"bzzr://7260171bb3cc1ed67d2f5bf6a08ca3e9fe1fc97ffeb57c3a2255021f41d7609f\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"dev/OracleSignaturesDecoder.sol": {
"id": 8
}
},
"sourceCodes": {
"dev/OracleSignaturesDecoder.sol": "pragma solidity 0.5.0;\n\ncontract OracleSignaturesDecoder {\n\n struct OracleSignatures {\n uint8[] vs;\n bytes32[] rs;\n bytes32[] ss;\n }\n\n function decodeOracleSignatures(\n bytes memory _oracleSignaturesData\n )\n internal\n pure\n returns(OracleSignatures memory)\n {\n // solhint-disable indent\n OracleSignatures memory signatures;\n ( signatures.vs, signatures.rs, signatures.ss) =\n abi.decode(_oracleSignaturesData, ( uint8[], bytes32[], bytes32[] ));\n return signatures;\n }\n}\n"
},
"sourceTreeHashHex": "0xbfadafdb8329e1022ad617e071ccfe330897bc044983998f1de8dae266affb63",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "Ownable",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "isOwner",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
}
],
"devdoc": {
"details": "Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. * This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be aplied to your functions to restrict their use to the owner. * This contract has been modified to remove the revokeOwnership function",
"methods": {
"constructor": {
"details": "Initializes the contract setting the deployer as the initial owner."
},
"isOwner()": {
"details": "Returns true if the caller is the current owner."
},
"owner()": {
"details": "Returns the address of the current owner."
},
"transferOwnership(address)": {
"details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
}
}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"isOwner()": "8f32d59b",
"owner()": "8da5cb5b",
"transferOwnership(address)": "f2fde38b"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/Ownable.sol": {
"id": 36
}
},
"sourceCodes": {
"vendor/Ownable.sol": "pragma solidity ^0.5.0;\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be aplied to your functions to restrict their use to\n * the owner.\n *\n * This contract has been modified to remove the revokeOwnership function\n */\ncontract Ownable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () internal {\n _owner = msg.sender;\n emit OwnershipTransferred(address(0), _owner);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(isOwner(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Returns true if the caller is the current owner.\n */\n function isOwner() public view returns (bool) {\n return msg.sender == _owner;\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public onlyOwner {\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n */\n function _transferOwnership(address newOwner) internal {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}\n"
},
"sourceTreeHashHex": "0xa282b582630c29bff6b88640a32fc3ff7ff8809736aaabde55518cbe1d7bcb11",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "PointerInterface",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "getAddress",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"getAddress()": "38cc4831"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/PointerInterface.sol": {
"id": 19
}
},
"sourceCodes": {
"interfaces/PointerInterface.sol": "pragma solidity ^0.5.0;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n"
},
"sourceTreeHashHex": "0xdc08ab9320d187dbaffa20dc31d331f8067fa534c9a654aab8f9ffa63df450da",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "SafeMathChainlink",
"compilerOutput": {
"abi": [],
"devdoc": {
"details": "Wrappers over Solidity's arithmetic operations with added overflow checks. * Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. * Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.",
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820725d0d017d4b361b5debc41243ccb258987b6c7a4c01858bfb8b2a5368a105dc0029",
"opcodes": "PUSH1 0x4C PUSH1 0x2C PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x0 DUP2 EQ PUSH1 0x1C JUMPI PUSH1 0x1E JUMP JUMPDEST INVALID JUMPDEST POP ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH19 0x5D0D017D4B361B5DEBC41243CCB258987B6C7A 0x4c ADD DUP6 DUP12 0xfb DUP12 0x2a MSTORE8 PUSH9 0xA105DC002900000000 ",
"sourceMap": "589:2783:37:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820725d0d017d4b361b5debc41243ccb258987b6c7a4c01858bfb8b2a5368a105dc0029",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH19 0x5D0D017D4B361B5DEBC41243CCB258987B6C7A 0x4c ADD DUP6 DUP12 0xfb DUP12 0x2a MSTORE8 PUSH9 0xA105DC002900000000 ",
"sourceMap": "589:2783:37:-;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Wrappers over Solidity's arithmetic operations with added overflow checks. * Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. * Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.\",\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/SafeMathChainlink.sol\":\"SafeMathChainlink\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0x796a82f2e4ab35469224050fb62ecd2dc038474e7f9d4dfd7a1023080c009883\",\"urls\":[\"bzzr://6e0bb08f77ca150b228e70773696ea301e939c0b5542fedb05276b683b774e13\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/SafeMathChainlink.sol": {
"id": 37
}
},
"sourceCodes": {
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.5.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMathChainlink {\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n uint256 c = a + b;\n require(c >= a, \"SafeMath: addition overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b <= a, \"SafeMath: subtraction overflow\");\n uint256 c = a - b;\n\n return c;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (a == 0) {\n return 0;\n }\n\n uint256 c = a * b;\n require(c / a == b, \"SafeMath: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n // Solidity only automatically asserts when dividing by 0\n require(b > 0, \"SafeMath: division by zero\");\n uint256 c = a / b;\n // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n return c;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * Reverts when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n require(b != 0, \"SafeMath: modulo by zero\");\n return a % b;\n }\n}\n"
},
"sourceTreeHashHex": "0x796a82f2e4ab35469224050fb62ecd2dc038474e7f9d4dfd7a1023080c009883",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "SchnorrSECP256K1",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "HALF_Q",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "Q",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "signingPubKeyX",
"type": "uint256"
},
{
"name": "pubKeyYParity",
"type": "uint8"
},
{
"name": "signature",
"type": "uint256"
},
{
"name": "msgHash",
"type": "uint256"
},
{
"name": "nonceTimesGeneratorAddress",
"type": "address"
}
],
"name": "verifySignature",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
}
],
"devdoc": {
"methods": {
"verifySignature(uint256,uint8,uint256,uint256,address)": {
"details": "See https://en.wikipedia.org/wiki/Schnorr_signature for reference.In what follows, let d be your secret key, PK be your public key, PKx be the x ordinate of your public key, and PKyp be the parity bit for the y ordinate (i.e., 0 if PKy is even, 1 if odd.)**************************************************************************TO CREATE A VALID SIGNATURE FOR THIS METHODFirst PKx must be less than HALF_Q. Then follow these instructions (see evm/test/schnorr_test.js, for an example of carrying them out):1. Hash the target message to a uint256, called msgHash here, using keccak2562. Pick k uniformly and cryptographically securely randomly from {0,...,Q-1}. It is critical that k remains confidential, as your private key can be reconstructed from k and the signature.3. Compute k*g in the secp256k1 group, where g is the group generator. (This is the same as computing the public key from the secret key k. But it's OK if k*g's x ordinate is greater than HALF_Q.)4. Compute the ethereum address for k*g. This is the lower 160 bits of the keccak hash of the concatenated affine coordinates of k*g, as 32-byte big-endians. (For instance, you could pass k to ethereumjs-utils's privateToAddress to compute this, though that should be strictly a development convenience, not for handling live secrets, unless you've locked your javascript environment down very carefully.) Call this address nonceTimesGeneratorAddress.5. Compute e=uint256(keccak256(PKx as a 32-byte big-endian ‖ PKyp as a single byte ‖ msgHash ‖ nonceTimesGeneratorAddress)) This value e is called \"msgChallenge\" in verifySignature's source code below. Here \"\" means concatenation of the listed byte arrays.6. Let x be your secret key. Compute s = (k - d * e) % Q. Add Q to it, if it's negative. This is your signature. (d is your secret key.)**************************************************************************TO VERIFY A SIGNATUREGiven a signature (s, e) of msgHash, constructed as above, compute S=e*PK+s*generator in the secp256k1 group law, and then the ethereum address of S, as described in step 4. Call that nonceTimesGeneratorAddress. Then call the verifySignature method as:verifySignature(PKx, PKyp, s, msgHash, nonceTimesGeneratorAddress)**************************************************************************This signging scheme deviates slightly from the classical Schnorr signature, in that the address of k*g is used in place of k*g itself, both when calculating e and when verifying sum S as described in the verification paragraph above. This reduces the difficulty of brute-forcing a signature by trying random secp256k1 points in place of k*g in the signature verification process from 256 bits to 160 bits. However, the difficulty of cracking the public key using \"baby-step, giant-step\" is only 128 bits, so this weakening constitutes no compromise in the security of the signatures or the key.The constraint signingPubKeyX < HALF_Q comes from Eq. (281), p. 24 of Yellow Paper version 78d7b9a. ecrecover only accepts \"s\" inputs less than HALF_Q, to protect against a signature- malleability vulnerability in ECDSA. Schnorr does not have this vulnerability, but we must account for ecrecover's defense anyway. And since we are abusing ecrecover by putting signingPubKeyX in ecrecover's \"s\" argument the constraint applies to signingPubKeyX, even though it represents a value in the base field, and has no natural relationship to the order of the curve's cyclic group.**************************************************************************",
"params": {
"msgHash": "is a 256-bit hash of the message being signed.",
"nonceTimesGeneratorAddress": "is the ethereum address of k*g in the above instructions**************************************************************************",
"pubKeyYParity": "is 0 if the y ordinate of the public key is even, 1 if it's odd.",
"signature": "is the actual signature, described as s in the above instructions.",
"signingPubKeyX": "is the x ordinate of the public key. This must be less than HALF_Q. "
},
"return": "True if passed a valid signature, false otherwise. "
}
}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405234801561001057600080fd5b50610514806100206000396000f3fe6080604052600436106100565763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416638efb3bb2811461005b578063e493ef8c14610082578063ff51dff214610097575b600080fd5b34801561006757600080fd5b50610070610106565b60408051918252519081900360200190f35b34801561008e57600080fd5b5061007061012a565b3480156100a357600080fd5b506100f2600480360360a08110156100ba57600080fd5b50803590602081013560ff16906040810135906060810135906080013573ffffffffffffffffffffffffffffffffffffffff1661014e565b604080519115158252519081900360200190f35b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a181565b7ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414181565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a186106101de57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5075626c69632d6b65792078203e3d2048414c465f5100000000000000000000604482015290519081900360640190fd5b7ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141841061029257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f7369676e6174757265206d7573742062652072656475636564206d6f64756c6f60448201527f2051000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b73ffffffffffffffffffffffffffffffffffffffff8216158015906102b75750600086115b80156102c35750600084115b80156102cf5750600083115b151561033c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6f207a65726f20696e7075747320616c6c6f77656400000000000000000000604482015290519081900360640190fd5b6040805160208082018990527f010000000000000000000000000000000000000000000000000000000000000060ff89160282840152604182018690526c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff86160260618301528251605581840301815260759092019092528051910120600060017ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141878a097ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410360ff89161561041557601c610418565b601b5b8a7ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641418c870960010260405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610497573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff86811691161493505050509594505050505056fea165627a7a723058205fb3a22aa6fc4e080b6d9203287ac69a8d16f365f1b9ed3dc0f3e91b5920b3300029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x514 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x56 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x8EFB3BB2 DUP2 EQ PUSH2 0x5B JUMPI DUP1 PUSH4 0xE493EF8C EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0xFF51DFF2 EQ PUSH2 0x97 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x106 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x12A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xA0 DUP2 LT ISZERO PUSH2 0xBA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x80 ADD CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x14E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A1 DUP2 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A1 DUP7 LT PUSH2 0x1DE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5075626C69632D6B65792078203E3D2048414C465F5100000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 DUP5 LT PUSH2 0x292 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7369676E6174757265206D7573742062652072656475636564206D6F64756C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2051000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x2B7 JUMPI POP PUSH1 0x0 DUP7 GT JUMPDEST DUP1 ISZERO PUSH2 0x2C3 JUMPI POP PUSH1 0x0 DUP5 GT JUMPDEST DUP1 ISZERO PUSH2 0x2CF JUMPI POP PUSH1 0x0 DUP4 GT JUMPDEST ISZERO ISZERO PUSH2 0x33C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6E6F207A65726F20696E7075747320616C6C6F77656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP10 SWAP1 MSTORE PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 PUSH1 0xFF DUP10 AND MUL DUP3 DUP5 ADD MSTORE PUSH1 0x41 DUP3 ADD DUP7 SWAP1 MSTORE PUSH13 0x1000000000000000000000000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND MUL PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x55 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x75 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x0 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 DUP8 DUP11 MULMOD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 SUB PUSH1 0xFF DUP10 AND ISZERO PUSH2 0x415 JUMPI PUSH1 0x1C PUSH2 0x418 JUMP JUMPDEST PUSH1 0x1B JUMPDEST DUP11 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 DUP13 DUP8 MULMOD PUSH1 0x1 MUL PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x497 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND SWAP2 AND EQ SWAP4 POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0x5f 0xb3 LOG2 0x2a 0xa6 0xfc 0x4e ADDMOD SIGNEXTEND PUSH14 0x9203287AC69A8D16F365F1B9ED3D 0xc0 RETURN 0xe9 SHL MSIZE KECCAK256 0xb3 ADDRESS STOP 0x29 ",
"sourceMap": "261:7589:9:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;261:7589:9;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100565763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416638efb3bb2811461005b578063e493ef8c14610082578063ff51dff214610097575b600080fd5b34801561006757600080fd5b50610070610106565b60408051918252519081900360200190f35b34801561008e57600080fd5b5061007061012a565b3480156100a357600080fd5b506100f2600480360360a08110156100ba57600080fd5b50803590602081013560ff16906040810135906060810135906080013573ffffffffffffffffffffffffffffffffffffffff1661014e565b604080519115158252519081900360200190f35b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a181565b7ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414181565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a186106101de57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5075626c69632d6b65792078203e3d2048414c465f5100000000000000000000604482015290519081900360640190fd5b7ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141841061029257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f7369676e6174757265206d7573742062652072656475636564206d6f64756c6f60448201527f2051000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b73ffffffffffffffffffffffffffffffffffffffff8216158015906102b75750600086115b80156102c35750600084115b80156102cf5750600083115b151561033c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6f207a65726f20696e7075747320616c6c6f77656400000000000000000000604482015290519081900360640190fd5b6040805160208082018990527f010000000000000000000000000000000000000000000000000000000000000060ff89160282840152604182018690526c0100000000000000000000000073ffffffffffffffffffffffffffffffffffffffff86160260618301528251605581840301815260759092019092528051910120600060017ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141878a097ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410360ff89161561041557601c610418565b601b5b8a7ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641418c870960010260405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610497573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff86811691161493505050509594505050505056fea165627a7a723058205fb3a22aa6fc4e080b6d9203287ac69a8d16f365f1b9ed3dc0f3e91b5920b3300029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x56 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x8EFB3BB2 DUP2 EQ PUSH2 0x5B JUMPI DUP1 PUSH4 0xE493EF8C EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0xFF51DFF2 EQ PUSH2 0x97 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x106 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x12A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xA0 DUP2 LT ISZERO PUSH2 0xBA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x80 ADD CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x14E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A1 DUP2 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A1 DUP7 LT PUSH2 0x1DE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5075626C69632D6B65792078203E3D2048414C465F5100000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 DUP5 LT PUSH2 0x292 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x7369676E6174757265206D7573742062652072656475636564206D6F64756C6F PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2051000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x2B7 JUMPI POP PUSH1 0x0 DUP7 GT JUMPDEST DUP1 ISZERO PUSH2 0x2C3 JUMPI POP PUSH1 0x0 DUP5 GT JUMPDEST DUP1 ISZERO PUSH2 0x2CF JUMPI POP PUSH1 0x0 DUP4 GT JUMPDEST ISZERO ISZERO PUSH2 0x33C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x6E6F207A65726F20696E7075747320616C6C6F77656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP10 SWAP1 MSTORE PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 PUSH1 0xFF DUP10 AND MUL DUP3 DUP5 ADD MSTORE PUSH1 0x41 DUP3 ADD DUP7 SWAP1 MSTORE PUSH13 0x1000000000000000000000000 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND MUL PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x55 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x75 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x0 PUSH1 0x1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 DUP8 DUP11 MULMOD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 SUB PUSH1 0xFF DUP10 AND ISZERO PUSH2 0x415 JUMPI PUSH1 0x1C PUSH2 0x418 JUMP JUMPDEST PUSH1 0x1B JUMPDEST DUP11 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 DUP13 DUP8 MULMOD PUSH1 0x1 MUL PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x497 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 DUP2 AND SWAP2 AND EQ SWAP4 POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0x5f 0xb3 LOG2 0x2a 0xa6 0xfc 0x4e ADDMOD SIGNEXTEND PUSH14 0x9203287AC69A8D16F365F1B9ED3D 0xc0 RETURN 0xe9 SHL MSIZE KECCAK256 0xb3 ADDRESS STOP 0x29 ",
"sourceMap": "261:7589:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;594:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;594:45:9;;;;;;;;;;;;;;;;;;;;356:170;;8:9:-1;5:2;;;30:1;27;20:12;5:2;356:170:9;;;;5755:2093;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5755:2093:9;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;5755:2093:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;594:45;627:12;594:45;:::o;356:170::-;460:66;356:170;:::o;5755:2093::-;5941:4;627:12;5961:23;;5953:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;460:66;6109:13;;6101:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6483:40;;;;;;;:62;;;6544:1;6527:14;:18;6483:62;:85;;;;;6567:1;6555:9;:13;6483:85;:100;;;;;6582:1;6572:7;:11;6483:100;6475:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6761:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;6761:92:9;;;;;;;6751:103;;;;;6661:20;6761:92;460:66;7485:9;7469:14;7462:36;460:66;7458:40;7667:18;;;;7666:30;;7694:2;7666:30;;;7689:2;7666:30;7712:14;460:66;7764:14;7750:12;7743:39;7735:48;;7365:419;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;7365:419:9;;;;;7797:46;;;;;;;;-1:-1:-1;;;;5755:2093:9;;;;;;;:::o"
},
"methodIdentifiers": {
"HALF_Q()": "8efb3bb2",
"Q()": "e493ef8c",
"verifySignature(uint256,uint8,uint256,uint256,address)": "ff51dff2"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"HALF_Q\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"Q\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"signingPubKeyX\",\"type\":\"uint256\"},{\"name\":\"pubKeyYParity\",\"type\":\"uint8\"},{\"name\":\"signature\",\"type\":\"uint256\"},{\"name\":\"msgHash\",\"type\":\"uint256\"},{\"name\":\"nonceTimesGeneratorAddress\",\"type\":\"address\"}],\"name\":\"verifySignature\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"methods\":{\"verifySignature(uint256,uint8,uint256,uint256,address)\":{\"details\":\"See https://en.wikipedia.org/wiki/Schnorr_signature for reference.In what follows, let d be your secret key, PK be your public key, PKx be the x ordinate of your public key, and PKyp be the parity bit for the y ordinate (i.e., 0 if PKy is even, 1 if odd.)**************************************************************************TO CREATE A VALID SIGNATURE FOR THIS METHODFirst PKx must be less than HALF_Q. Then follow these instructions (see evm/test/schnorr_test.js, for an example of carrying them out):1. Hash the target message to a uint256, called msgHash here, using keccak2562. Pick k uniformly and cryptographically securely randomly from {0,...,Q-1}. It is critical that k remains confidential, as your private key can be reconstructed from k and the signature.3. Compute k*g in the secp256k1 group, where g is the group generator. (This is the same as computing the public key from the secret key k. But it's OK if k*g's x ordinate is greater than HALF_Q.)4. Compute the ethereum address for k*g. This is the lower 160 bits of the keccak hash of the concatenated affine coordinates of k*g, as 32-byte big-endians. (For instance, you could pass k to ethereumjs-utils's privateToAddress to compute this, though that should be strictly a development convenience, not for handling live secrets, unless you've locked your javascript environment down very carefully.) Call this address nonceTimesGeneratorAddress.5. Compute e=uint256(keccak256(PKx as a 32-byte big-endian \\u2016 PKyp as a single byte \\u2016 msgHash \\u2016 nonceTimesGeneratorAddress)) This value e is called \\\"msgChallenge\\\" in verifySignature's source code below. Here \\\"\\u2016\\\" means concatenation of the listed byte arrays.6. Let x be your secret key. Compute s = (k - d * e) % Q. Add Q to it, if it's negative. This is your signature. (d is your secret key.)**************************************************************************TO VERIFY A SIGNATUREGiven a signature (s, e) of msgHash, constructed as above, compute S=e*PK+s*generator in the secp256k1 group law, and then the ethereum address of S, as described in step 4. Call that nonceTimesGeneratorAddress. Then call the verifySignature method as:verifySignature(PKx, PKyp, s, msgHash, nonceTimesGeneratorAddress)**************************************************************************This signging scheme deviates slightly from the classical Schnorr signature, in that the address of k*g is used in place of k*g itself, both when calculating e and when verifying sum S as described in the verification paragraph above. This reduces the difficulty of brute-forcing a signature by trying random secp256k1 points in place of k*g in the signature verification process from 256 bits to 160 bits. However, the difficulty of cracking the public key using \\\"baby-step, giant-step\\\" is only 128 bits, so this weakening constitutes no compromise in the security of the signatures or the key.The constraint signingPubKeyX < HALF_Q comes from Eq. (281), p. 24 of Yellow Paper version 78d7b9a. ecrecover only accepts \\\"s\\\" inputs less than HALF_Q, to protect against a signature- malleability vulnerability in ECDSA. Schnorr does not have this vulnerability, but we must account for ecrecover's defense anyway. And since we are abusing ecrecover by putting signingPubKeyX in ecrecover's \\\"s\\\" argument the constraint applies to signingPubKeyX, even though it represents a value in the base field, and has no natural relationship to the order of the curve's cyclic group.**************************************************************************\",\"params\":{\"msgHash\":\"is a 256-bit hash of the message being signed.\",\"nonceTimesGeneratorAddress\":\"is the ethereum address of k*g in the above instructions**************************************************************************\",\"pubKeyYParity\":\"is 0 if the y ordinate of the public key is even, 1 if it's odd.\",\"signature\":\"is the actual signature, described as s in the above instructions.\",\"signingPubKeyX\":\"is the x ordinate of the public key. This must be less than HALF_Q. \"},\"return\":\"True if passed a valid signature, false otherwise. \"}}},\"userdoc\":{\"methods\":{\"verifySignature(uint256,uint8,uint256,uint256,address)\":{\"notice\":\"**************************************************************************verifySignature returns true iff passed a valid Schnorr signature.\"}},\"notice\":\"/////////////////////////////////////////////////////////////////////////////\"}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/dev/SchnorrSECP256K1.sol\":\"SchnorrSECP256K1\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/dev/SchnorrSECP256K1.sol\":{\"keccak256\":\"0x5c82b83c6aca50fa2ab07bc0b31bac6ee33c7ade303102ecc688087c351f5317\",\"urls\":[\"bzzr://e4d63d170c40da3609bfe0e10fa679bc4318083e6f9d42dbee72ba5e91312d8d\"]}},\"version\":1}",
"userdoc": {
"methods": {
"verifySignature(uint256,uint8,uint256,uint256,address)": {
"notice": "**************************************************************************verifySignature returns true iff passed a valid Schnorr signature."
}
},
"notice": "/////////////////////////////////////////////////////////////////////////////"
}
},
"sources": {
"dev/SchnorrSECP256K1.sol": {
"id": 9
}
},
"sourceCodes": {
"dev/SchnorrSECP256K1.sol": "pragma solidity ^0.5.0;\n\n////////////////////////////////////////////////////////////////////////////////\n// XXX: Do not use in production until this code has been audited.\n////////////////////////////////////////////////////////////////////////////////\n\ncontract SchnorrSECP256K1 {\n // See https://en.bitcoin.it/wiki/Secp256k1 for this constant.\n uint256 constant public Q = // Group order of secp256k1\n // solium-disable-next-line indentation\n 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141;\n // solium-disable-next-line zeppelin/no-arithmetic-operations\n uint256 constant public HALF_Q = (Q >> 1) + 1;\n\n /** **************************************************************************\n @notice verifySignature returns true iff passed a valid Schnorr signature.\n\n @dev See https://en.wikipedia.org/wiki/Schnorr_signature for reference.\n\n @dev In what follows, let d be your secret key, PK be your public key,\n PKx be the x ordinate of your public key, and PKyp be the parity bit for\n the y ordinate (i.e., 0 if PKy is even, 1 if odd.)\n **************************************************************************\n @dev TO CREATE A VALID SIGNATURE FOR THIS METHOD\n\n @dev First PKx must be less than HALF_Q. Then follow these instructions\n (see evm/test/schnorr_test.js, for an example of carrying them out):\n @dev 1. Hash the target message to a uint256, called msgHash here, using\n keccak256\n\n @dev 2. Pick k uniformly and cryptographically securely randomly from\n {0,...,Q-1}. It is critical that k remains confidential, as your\n private key can be reconstructed from k and the signature.\n\n @dev 3. Compute k*g in the secp256k1 group, where g is the group\n generator. (This is the same as computing the public key from the\n secret key k. But it's OK if k*g's x ordinate is greater than\n HALF_Q.)\n\n @dev 4. Compute the ethereum address for k*g. This is the lower 160 bits\n of the keccak hash of the concatenated affine coordinates of k*g,\n as 32-byte big-endians. (For instance, you could pass k to\n ethereumjs-utils's privateToAddress to compute this, though that\n should be strictly a development convenience, not for handling\n live secrets, unless you've locked your javascript environment\n down very carefully.) Call this address\n nonceTimesGeneratorAddress.\n\n @dev 5. Compute e=uint256(keccak256(PKx as a 32-byte big-endian\n ‖ PKyp as a single byte\n ‖ msgHash\n ‖ nonceTimesGeneratorAddress))\n This value e is called \"msgChallenge\" in verifySignature's source\n code below. Here \"\" means concatenation of the listed byte\n arrays.\n\n @dev 6. Let x be your secret key. Compute s = (k - d * e) % Q. Add Q to\n it, if it's negative. This is your signature. (d is your secret\n key.)\n **************************************************************************\n @dev TO VERIFY A SIGNATURE\n\n @dev Given a signature (s, e) of msgHash, constructed as above, compute\n S=e*PK+s*generator in the secp256k1 group law, and then the ethereum\n address of S, as described in step 4. Call that\n nonceTimesGeneratorAddress. Then call the verifySignature method as:\n\n @dev verifySignature(PKx, PKyp, s, msgHash,\n nonceTimesGeneratorAddress)\n **************************************************************************\n @dev This signging scheme deviates slightly from the classical Schnorr\n signature, in that the address of k*g is used in place of k*g itself,\n both when calculating e and when verifying sum S as described in the\n verification paragraph above. This reduces the difficulty of\n brute-forcing a signature by trying random secp256k1 points in place of\n k*g in the signature verification process from 256 bits to 160 bits.\n However, the difficulty of cracking the public key using \"baby-step,\n giant-step\" is only 128 bits, so this weakening constitutes no compromise\n in the security of the signatures or the key.\n\n @dev The constraint signingPubKeyX < HALF_Q comes from Eq. (281), p. 24\n of Yellow Paper version 78d7b9a. ecrecover only accepts \"s\" inputs less\n than HALF_Q, to protect against a signature- malleability vulnerability in\n ECDSA. Schnorr does not have this vulnerability, but we must account for\n ecrecover's defense anyway. And since we are abusing ecrecover by putting\n signingPubKeyX in ecrecover's \"s\" argument the constraint applies to\n signingPubKeyX, even though it represents a value in the base field, and\n has no natural relationship to the order of the curve's cyclic group.\n **************************************************************************\n @param signingPubKeyX is the x ordinate of the public key. This must be\n less than HALF_Q. \n @param pubKeyYParity is 0 if the y ordinate of the public key is even, 1 \n if it's odd.\n @param signature is the actual signature, described as s in the above\n instructions.\n @param msgHash is a 256-bit hash of the message being signed.\n @param nonceTimesGeneratorAddress is the ethereum address of k*g in the\n above instructions\n **************************************************************************\n @return True if passed a valid signature, false otherwise. */\n function verifySignature(\n uint256 signingPubKeyX,\n uint8 pubKeyYParity,\n uint256 signature,\n uint256 msgHash,\n address nonceTimesGeneratorAddress) external pure returns (bool) {\n require(signingPubKeyX < HALF_Q, \"Public-key x >= HALF_Q\");\n // Avoid signature malleability from multiple representations for ℤ/Qℤ elts\n require(signature < Q, \"signature must be reduced modulo Q\");\n\n // Forbid trivial inputs, to avoid ecrecover edge cases. The main thing to\n // avoid is something which causes ecrecover to return 0x0: then trivial\n // signatures could be constructed with the nonceTimesGeneratorAddress input\n // set to 0x0.\n //\n // solium-disable-next-line indentation\n require(nonceTimesGeneratorAddress != address(0) && signingPubKeyX > 0 &&\n signature > 0 && msgHash > 0, \"no zero inputs allowed\");\n\n // solium-disable-next-line indentation\n uint256 msgChallenge = // \"e\"\n // solium-disable-next-line indentation\n uint256(keccak256(abi.encodePacked(signingPubKeyX, pubKeyYParity,\n msgHash, nonceTimesGeneratorAddress))\n );\n\n // Verify msgChallenge * signingPubKey + signature * generator ==\n // nonce * generator\n //\n // https://ethresear.ch/t/you-can-kinda-abuse-ecrecover-to-do-ecmul-in-secp256k1-today/2384/9\n // The point corresponding to the address returned by\n // ecrecover(-s*r,v,r,e*r) is (r⁻¹ mod Q)*(e*r*R-(-s)*r*g)=e*R+s*g, where R\n // is the (v,r) point. See https://crypto.stackexchange.com/a/18106\n //\n // solium-disable-next-line indentation\n address recoveredAddress = ecrecover(\n // solium-disable-next-line zeppelin/no-arithmetic-operations\n bytes32(Q - mulmod(signingPubKeyX, signature, Q)),\n // https://ethereum.github.io/yellowpaper/paper.pdf p. 24, \"The\n // value 27 represents an even y value and 28 represents an odd\n // y value.\"\n (pubKeyYParity == 0) ? 27 : 28,\n bytes32(signingPubKeyX),\n bytes32(mulmod(msgChallenge, signingPubKeyX, Q)));\n return nonceTimesGeneratorAddress == recoveredAddress;\n }\n}\n"
},
"sourceTreeHashHex": "0x5c82b83c6aca50fa2ab07bc0b31bac6ee33c7ade303102ecc688087c351f5317",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ServiceAgreementConsumer",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_price",
"type": "bytes32"
}
],
"name": "fulfill",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_currency",
"type": "string"
}
],
"name": "requestEthereumPrice",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "currentPrice",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"name": "_link",
"type": "address"
},
{
"name": "_coordinator",
"type": "address"
},
{
"name": "_sAId",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x6080604052600160045534801561001557600080fd5b50604051606080610dd28339810180604052606081101561003557600080fd5b508051602082015160409092015190919061005883640100000000610075810204565b61006a82640100000000610097810204565b600655506100b99050565b60028054600160a060020a031916600160a060020a0392909216919091179055565b60038054600160a060020a031916600160a060020a0392909216919091179055565b610d0a806100c86000396000f3fe6080604052600436106100565763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b65811461005b5780636c0cae681461008d5780639d1b464a14610140575b600080fd5b34801561006757600080fd5b5061008b6004803603604081101561007e57600080fd5b5080359060200135610167565b005b34801561009957600080fd5b5061008b600480360360208110156100b057600080fd5b8101906020810181356401000000008111156100cb57600080fd5b8201836020820111156100dd57600080fd5b803590602001918460018302840111640100000000831117156100ff57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610283945050505050565b34801561014c57600080fd5b506101556103e4565b60408051918252519081900360200190f35b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461022157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a25060075550565b61028b610c91565b6006546102b990307f042f2b65000000000000000000000000000000000000000000000000000000006103ea565b90506103876040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a505900000000000000000000000000000000000000000000000000815250836104159092919063ffffffff16565b60408051808201909152600481527f706174680000000000000000000000000000000000000000000000000000000060208201526103cd9082908463ffffffff61041516565b6103df81670de0b6b3a764000061043f565b505050565b60075481565b6103f2610c91565b6103fa610c91565b61040c8186868663ffffffff61046f16565b95945050505050565b608083015161042a908363ffffffff6104d116565b60808301516103df908263ffffffff6104d116565b6003546000906104669073ffffffffffffffffffffffffffffffffffffffff1684846104ee565b90505b92915050565b610477610c91565b6104878560800151610100610790565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b6104de82600383516107ca565b6103df828263ffffffff6108cd16565b60045460408051306c01000000000000000000000000026020808301919091526034808301859052835180840390910181526054909201835281519181019190912060608601939093526000838152600590915281812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea085846105d3876108e7565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561067357818101518382015260200161065b565b50505050905090810190601f1680156106a05780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1580156106c157600080fd5b505af11580156106d5573d6000803e3d6000fd5b505050506040513d60208110156106eb57600080fd5b5051151561078057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610798610cc6565b60208206156107ad5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b601781116107ec576107e68360ff848116602002168317610a99565b506103df565b60ff81116108205761080d836018602060ff8616021763ffffffff610a9916565b506107e68382600163ffffffff610ab116565b61ffff811161085557610842836019602060ff8616021763ffffffff610a9916565b506107e68382600263ffffffff610ab116565b63ffffffff811161088c5761087983601a602060ff8616021763ffffffff610a9916565b506107e68382600463ffffffff610ab116565b67ffffffffffffffff81116103df576108b483601b602060ff8616021763ffffffff610a9916565b506108c78382600863ffffffff610ab116565b50505050565b6108d5610cc6565b61046683846000015151848551610ad2565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b838110156109dc5781810151838201526020016109c4565b50505050905090810190601f168015610a095780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b610aa1610cc6565b6104668384600001515184610bba565b610ab9610cc6565b610aca848560000151518585610c05565b949350505050565b610ada610cc6565b8251821115610ae857600080fd5b84602001518285011115610b1257610b1285610b0a8760200151878601610c63565b600202610c7a565b600080865180518760208301019350808887011115610b315787860182525b505050602084015b60208410610b7657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09093019260209182019101610b39565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b610bc2610cc6565b60208401518310610bde57610bde848560200151600202610c7a565b8351805160208583010184815381861415610bfa576001820183525b509495945050505050565b610c0d610cc6565b84602001518483011115610c2a57610c2a85858401600202610c7a565b60006001836101000a0390508551838682010185831982511617815281518588011115610c575784870182525b50959695505050505050565b600081831115610c74575081610469565b50919050565b8151610c868383610790565b506108c783826108cd565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101610cc1610cc6565b905290565b6040805180820190915260608152600060208201529056fea165627a7a72305820c7879360baf60261623eca46bfa7f9ad267588e94b39521909d91a412b7864a00029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x60 DUP1 PUSH2 0xDD2 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 MLOAD PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 SWAP1 SWAP3 ADD MLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x58 DUP4 PUSH5 0x100000000 PUSH2 0x75 DUP2 MUL DIV JUMP JUMPDEST PUSH2 0x6A DUP3 PUSH5 0x100000000 PUSH2 0x97 DUP2 MUL DIV JUMP JUMPDEST PUSH1 0x6 SSTORE POP PUSH2 0xB9 SWAP1 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xD0A DUP1 PUSH2 0xC8 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x56 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x5B JUMPI DUP1 PUSH4 0x6C0CAE68 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0x140 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x167 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x283 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155 PUSH2 0x3E4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x221 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH2 0x28B PUSH2 0xC91 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH2 0x2B9 SWAP1 ADDRESS PUSH32 0x42F2B6500000000000000000000000000000000000000000000000000000000 PUSH2 0x3EA JUMP JUMPDEST SWAP1 POP PUSH2 0x387 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP4 PUSH2 0x415 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x3CD SWAP1 DUP3 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x415 AND JUMP JUMPDEST PUSH2 0x3DF DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x43F JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x3F2 PUSH2 0xC91 JUMP JUMPDEST PUSH2 0x3FA PUSH2 0xC91 JUMP JUMPDEST PUSH2 0x40C DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x46F AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x42A SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x4D1 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x3DF SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x4D1 AND JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x466 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0x4EE JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x477 PUSH2 0xC91 JUMP JUMPDEST PUSH2 0x487 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x790 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x4DE DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x7CA JUMP JUMPDEST PUSH2 0x3DF DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x8CD AND JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x60 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE DUP2 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x5D3 DUP8 PUSH2 0x8E7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x673 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x65B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x6A0 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6D5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x780 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x798 PUSH2 0xCC6 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x7AD JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x7EC JUMPI PUSH2 0x7E6 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0xA99 JUMP JUMPDEST POP PUSH2 0x3DF JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x820 JUMPI PUSH2 0x80D DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xA99 AND JUMP JUMPDEST POP PUSH2 0x7E6 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xAB1 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x855 JUMPI PUSH2 0x842 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xA99 AND JUMP JUMPDEST POP PUSH2 0x7E6 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0xAB1 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x88C JUMPI PUSH2 0x879 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xA99 AND JUMP JUMPDEST POP PUSH2 0x7E6 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0xAB1 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3DF JUMPI PUSH2 0x8B4 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xA99 AND JUMP JUMPDEST POP PUSH2 0x8C7 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0xAB1 AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x8D5 PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x466 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0xAD2 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9DC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9C4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA09 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xAA1 PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x466 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0xBBA JUMP JUMPDEST PUSH2 0xAB9 PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0xACA DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0xC05 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xADA PUSH2 0xCC6 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0xAE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0xB12 JUMPI PUSH2 0xB12 DUP6 PUSH2 0xB0A DUP8 PUSH1 0x20 ADD MLOAD DUP8 DUP7 ADD PUSH2 0xC63 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0xC7A JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0xB31 JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST POP POP POP PUSH1 0x20 DUP5 ADD JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0xB76 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xB39 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 DUP7 SWAP1 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE POP DUP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xBC2 PUSH2 0xCC6 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0xBDE JUMPI PUSH2 0xBDE DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0xC7A JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0xBFA JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xC0D PUSH2 0xCC6 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0xC2A JUMPI PUSH2 0xC2A DUP6 DUP6 DUP5 ADD PUSH1 0x2 MUL PUSH2 0xC7A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0xC57 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0xC74 JUMPI POP DUP2 PUSH2 0x469 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0xC86 DUP4 DUP4 PUSH2 0x790 JUMP JUMPDEST POP PUSH2 0x8C7 DUP4 DUP3 PUSH2 0x8CD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0xCC1 PUSH2 0xCC6 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc7 DUP8 SWAP4 PUSH1 0xBA 0xf6 MUL PUSH2 0x623E 0xca 0x46 0xbf 0xa7 0xf9 0xad 0x26 PUSH22 0x88E94B39521909D91A412B7864A00029000000000000 ",
"sourceMap": "58:825:32:-;;;1131:1:1;1100:32;;227:162:32;8:9:-1;5:2;;;30:1;27;20:12;5:2;227:162:32;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;227:162:32;;;;;;;;;;;;;;304:24;227:162;304:17;;;;:24;:::i;:::-;334:32;353:12;334:18;;;;:32;:::i;:::-;372:4;:12;-1:-1:-1;58:825:32;;-1:-1:-1;58:825:32;4782:94:1;4839:4;:32;;-1:-1:-1;;;;;;4839:32:1;-1:-1:-1;;;;;4839:32:1;;;;;;;;;;4782:94::o;4560:108::-;4620:6;:43;;-1:-1:-1;;;;;;4620:43:1;-1:-1:-1;;;;;4620:43:1;;;;;;;;;;4560:108::o;58:825:32:-;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100565763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b65811461005b5780636c0cae681461008d5780639d1b464a14610140575b600080fd5b34801561006757600080fd5b5061008b6004803603604081101561007e57600080fd5b5080359060200135610167565b005b34801561009957600080fd5b5061008b600480360360208110156100b057600080fd5b8101906020810181356401000000008111156100cb57600080fd5b8201836020820111156100dd57600080fd5b803590602001918460018302840111640100000000831117156100ff57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610283945050505050565b34801561014c57600080fd5b506101556103e4565b60408051918252519081900360200190f35b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff16331461022157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a25060075550565b61028b610c91565b6006546102b990307f042f2b65000000000000000000000000000000000000000000000000000000006103ea565b90506103876040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a505900000000000000000000000000000000000000000000000000815250836104159092919063ffffffff16565b60408051808201909152600481527f706174680000000000000000000000000000000000000000000000000000000060208201526103cd9082908463ffffffff61041516565b6103df81670de0b6b3a764000061043f565b505050565b60075481565b6103f2610c91565b6103fa610c91565b61040c8186868663ffffffff61046f16565b95945050505050565b608083015161042a908363ffffffff6104d116565b60808301516103df908263ffffffff6104d116565b6003546000906104669073ffffffffffffffffffffffffffffffffffffffff1684846104ee565b90505b92915050565b610477610c91565b6104878560800151610100610790565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b6104de82600383516107ca565b6103df828263ffffffff6108cd16565b60045460408051306c01000000000000000000000000026020808301919091526034808301859052835180840390910181526054909201835281519181019190912060608601939093526000838152600590915281812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea085846105d3876108e7565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561067357818101518382015260200161065b565b50505050905090810190601f1680156106a05780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1580156106c157600080fd5b505af11580156106d5573d6000803e3d6000fd5b505050506040513d60208110156106eb57600080fd5b5051151561078057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610798610cc6565b60208206156107ad5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b601781116107ec576107e68360ff848116602002168317610a99565b506103df565b60ff81116108205761080d836018602060ff8616021763ffffffff610a9916565b506107e68382600163ffffffff610ab116565b61ffff811161085557610842836019602060ff8616021763ffffffff610a9916565b506107e68382600263ffffffff610ab116565b63ffffffff811161088c5761087983601a602060ff8616021763ffffffff610a9916565b506107e68382600463ffffffff610ab116565b67ffffffffffffffff81116103df576108b483601b602060ff8616021763ffffffff610a9916565b506108c78382600863ffffffff610ab116565b50505050565b6108d5610cc6565b61046683846000015151848551610ad2565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b838110156109dc5781810151838201526020016109c4565b50505050905090810190601f168015610a095780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b610aa1610cc6565b6104668384600001515184610bba565b610ab9610cc6565b610aca848560000151518585610c05565b949350505050565b610ada610cc6565b8251821115610ae857600080fd5b84602001518285011115610b1257610b1285610b0a8760200151878601610c63565b600202610c7a565b600080865180518760208301019350808887011115610b315787860182525b505050602084015b60208410610b7657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09093019260209182019101610b39565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b610bc2610cc6565b60208401518310610bde57610bde848560200151600202610c7a565b8351805160208583010184815381861415610bfa576001820183525b509495945050505050565b610c0d610cc6565b84602001518483011115610c2a57610c2a85858401600202610c7a565b60006001836101000a0390508551838682010185831982511617815281518588011115610c575784870182525b50959695505050505050565b600081831115610c74575081610469565b50919050565b8151610c868383610790565b506108c783826108cd565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101610cc1610cc6565b905290565b6040805180820190915260608152600060208201529056fea165627a7a72305820c7879360baf60261623eca46bfa7f9ad267588e94b39521909d91a412b7864a00029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x56 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x5B JUMPI DUP1 PUSH4 0x6C0CAE68 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0x140 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x167 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x283 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x155 PUSH2 0x3E4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x221 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH2 0x28B PUSH2 0xC91 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH2 0x2B9 SWAP1 ADDRESS PUSH32 0x42F2B6500000000000000000000000000000000000000000000000000000000 PUSH2 0x3EA JUMP JUMPDEST SWAP1 POP PUSH2 0x387 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP4 PUSH2 0x415 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x3CD SWAP1 DUP3 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x415 AND JUMP JUMPDEST PUSH2 0x3DF DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x43F JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x3F2 PUSH2 0xC91 JUMP JUMPDEST PUSH2 0x3FA PUSH2 0xC91 JUMP JUMPDEST PUSH2 0x40C DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x46F AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x42A SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x4D1 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x3DF SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x4D1 AND JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x466 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0x4EE JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x477 PUSH2 0xC91 JUMP JUMPDEST PUSH2 0x487 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x790 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x4DE DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x7CA JUMP JUMPDEST PUSH2 0x3DF DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x8CD AND JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x60 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE DUP2 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x5D3 DUP8 PUSH2 0x8E7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x673 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x65B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x6A0 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6D5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x780 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x798 PUSH2 0xCC6 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x7AD JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x7EC JUMPI PUSH2 0x7E6 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0xA99 JUMP JUMPDEST POP PUSH2 0x3DF JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x820 JUMPI PUSH2 0x80D DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xA99 AND JUMP JUMPDEST POP PUSH2 0x7E6 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0xAB1 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x855 JUMPI PUSH2 0x842 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xA99 AND JUMP JUMPDEST POP PUSH2 0x7E6 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0xAB1 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x88C JUMPI PUSH2 0x879 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xA99 AND JUMP JUMPDEST POP PUSH2 0x7E6 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0xAB1 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x3DF JUMPI PUSH2 0x8B4 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0xA99 AND JUMP JUMPDEST POP PUSH2 0x8C7 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0xAB1 AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x8D5 PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x466 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0xAD2 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9DC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9C4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA09 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xAA1 PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0x466 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0xBBA JUMP JUMPDEST PUSH2 0xAB9 PUSH2 0xCC6 JUMP JUMPDEST PUSH2 0xACA DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0xC05 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xADA PUSH2 0xCC6 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0xAE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0xB12 JUMPI PUSH2 0xB12 DUP6 PUSH2 0xB0A DUP8 PUSH1 0x20 ADD MLOAD DUP8 DUP7 ADD PUSH2 0xC63 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0xC7A JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0xB31 JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST POP POP POP PUSH1 0x20 DUP5 ADD JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0xB76 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xB39 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 DUP7 SWAP1 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE POP DUP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xBC2 PUSH2 0xCC6 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0xBDE JUMPI PUSH2 0xBDE DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0xC7A JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0xBFA JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xC0D PUSH2 0xCC6 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0xC2A JUMPI PUSH2 0xC2A DUP6 DUP6 DUP5 ADD PUSH1 0x2 MUL PUSH2 0xC7A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0xC57 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0xC74 JUMPI POP DUP2 PUSH2 0x469 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0xC86 DUP4 DUP4 PUSH2 0x790 JUMP JUMPDEST POP PUSH2 0x8C7 DUP4 DUP3 PUSH2 0x8CD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0xCC1 PUSH2 0xCC6 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc7 DUP8 SWAP4 PUSH1 0xBA 0xf6 MUL PUSH2 0x623E 0xca 0x46 0xbf 0xa7 0xf9 0xad 0x26 PUSH22 0x88E94B39521909D91A412B7864A00029000000000000 ",
"sourceMap": "58:825:32:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;740:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;740:141:32;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;740:141:32;;;;;;;;;;393:343;;8:9:-1;5:2;;;30:1;27;20:12;5:2;393:343:32;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;393:343:32;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;393:343:32;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;393:343:32;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;393:343:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;393:343:32;;-1:-1:-1;393:343:32;;-1:-1:-1;;;;;393:343:32;195:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;195:27:32;;;;;;;;;;;;;;;;;;;;740:141;8691:27:1;;;;:15;:27;;;;;;;;;;8677:10;:41;8669:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8788:27;;;;:15;:27;;;;;;8781:34;;;;;;8826:30;8804:10;;8826:30;;;-1:-1:-1;855:12:32;:21;-1:-1:-1;740:141:32:o;393:343::-;461:28;;:::i;:::-;514:4;;492:65;;528:4;535:21;492;:65::i;:::-;461:96;;563:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:3;:7;;:89;;;;;:::i;:::-;658:26;;;;;;;;;;;;;;;;;;;:3;;674:9;658:26;:7;:26;:::i;:::-;690:41;711:3;578:6:1;690:20:32;:41::i;:::-;;393:343;;:::o;195:27::-;;;;:::o;1735:295:1:-;1883:24;;:::i;:::-;1915:28;;:::i;:::-;1956:69;:3;1971:7;1980:16;1998:26;1956:69;:14;:69;:::i;:::-;1949:76;1735:295;-1:-1:-1;;;;;1735:295:1:o;1964:169:0:-;2066:8;;;;:27;;2088:4;2066:27;:21;:27;:::i;:::-;2099:8;;;;:29;;2121:6;2099:29;:21;:29;:::i;2327:189:1:-;2487:6;;2432:7;;2456:55;;2487:6;;2496:4;2502:8;2456:22;:55::i;:::-;2449:62;;2327:189;;;;;:::o;971:366:0:-;1120:24;;:::i;:::-;1152:50;1174:4;:8;;;335:3;1152:21;:50::i;:::-;-1:-1:-1;;1208:13:0;;;1227:39;;:20;;;:39;1272:43;;:23;;;:43;1208:13;971:366::o;2833:198:34:-;2935:55;2946:3;396:1;2976:5;2970:19;2935:10;:55::i;:::-;3000:24;:3;3017:5;3000:24;:10;:24;:::i;3020:488:1:-;3216:12;;3193:36;;;3210:4;3193:36;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3193:36:1;;;;;;3183:47;;;;;;;;;3236:10;;;:25;;;;-1:-1:-1;3267:26:1;;;:15;:26;;;;;;:36;;;;3193;3267;;;;;3314:29;;3183:47;;3314:29;;;3357:4;;;;:20;3378:7;3387:8;3397:19;3411:4;3397:13;:19::i;:::-;3357:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3357:60:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3357:60:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3357:60:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3357:60:1;3349:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3463:12;:17;;3479:1;3463:17;;;3020:488;;;;;:::o;941:395:33:-;1011:13;;:::i;:::-;1047:2;1036:8;:13;:18;1032:71;;1093:2;1082:8;:13;1076:2;:20;1064:32;;;;1032:71;-1:-1:-1;1150:12:33;;;;:23;;;1213:4;1207:11;;1225:16;;;-1:-1:-1;1248:14:33;;1290:18;;;1282:27;1269:41;;1150:12;941:395::o;709:724:34:-;824:2;815:11;;812:615;;842:44;:3;865:10;;;;;;864:20;;;842:15;:44::i;:::-;;812:615;;;915:4;906:13;;903:524;;935:41;:3;972:2;958:10;;;;;957:17;935:41;:15;:41;:::i;:::-;-1:-1:-1;990:23:34;:3;1004:5;1011:1;990:23;:13;:23;:::i;903:524::-;1042:6;1033:15;;1030:397;;1064:41;:3;1101:2;1087:10;;;;;1086:17;1064:41;:15;:41;:::i;:::-;-1:-1:-1;1119:23:34;:3;1133:5;1140:1;1119:23;:13;:23;:::i;1030:397::-;1171:10;1162:19;;1159:268;;1197:41;:3;1234:2;1220:10;;;;;1219:17;1197:41;:15;:41;:::i;:::-;-1:-1:-1;1252:23:34;:3;1266:5;1273:1;1252:23;:13;:23;:::i;1159:268::-;1304:18;1295:27;;1292:135;;1338:41;:3;1375:2;1361:10;;;;;1360:17;1338:41;:15;:41;:::i;:::-;-1:-1:-1;1393:23:34;:3;1407:5;1414:1;1393:23;:13;:23;:::i;:::-;;709:724;;;:::o;4495:155:33:-;4572:13;;:::i;:::-;4600:45;4606:3;4611;:7;;;:14;4627:4;4633;:11;4600:5;:45::i;7512:527:1:-;7909:7;;7924:20;;;;;7952:23;;;;;7600:12;7983:10;;;;8021:8;;;;:12;7629:405;;7659:6;7629:405;;;;;;;;;;;;;;;;;;7659:6;7629:405;;;;;;;;;;;;;;;;;;;7659:6;7629:405;;;;;;7659:6;7629:405;;;;;;;;;;;;;;7600:12;;7659:29;;:6;;;;7909:7;;7924:20;;7952:23;;7983:10;7659:6;;8021:12;;7629:405;;;;;;;;;;7659:6;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7629:405:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7629:405:1;;;22:32:-1;26:21;;;22:32;6:49;;7629:405:1;;;49:4:-1;25:18;;61:17;;7629:405:1;182:15:-1;7629:405:1;;;;179:29:-1;;;;160:49;;;-1:-1;7629:405:1;;-1:-1:-1;;;;;;;;;;7512:527:1;;;:::o;5810:144:33:-;5884:13;;:::i;:::-;5912:37;5923:3;5928;:7;;;:14;5944:4;5912:10;:37::i;9502:154::-;9583:13;;:::i;:::-;9611:40;9620:3;9625;:7;;;:14;9641:4;9647:3;9611:8;:40::i;:::-;9604:47;9502:154;-1:-1:-1;;;;9502:154:33:o;2650:1140::-;2745:13;;:::i;:::-;2781:11;;2774:18;;;2766:27;;;;;;2816:3;:12;;;2810:3;2804;:9;:24;2800:90;;;2838:45;2845:3;2850:28;2854:3;:12;;;2874:3;2868;:9;2850:3;:28::i;:::-;2881:1;2850:32;2838:6;:45::i;:::-;2896:9;2911:8;3005:3;2999:10;3076:6;3070:13;3192:3;3187:2;3179:6;3175:15;3171:25;3163:33;;3276:6;3270:3;3265;3261:13;3258:25;3255:2;;;3318:3;3313;3309:13;3301:6;3294:29;3255:2;-1:-1:-1;;;3355:2:33;3345:13;;3416:129;3430:2;3423:9;;3416:129;;3485:10;;3472:24;;3434:9;;;;;3519:2;3511:10;;;;3529:9;3416:129;;;3654:10;3703:11;;3591:21;3599:2;:8;;;3591:3;:17;:21;3699:22;;;3666:9;;3650:26;;;;3741:21;3728:35;;-1:-1:-1;3782:3:33;2650:1140;;;;;;:::o;4944:619::-;5027:13;;:::i;:::-;5059:12;;;;5052:19;;5048:69;;5081:29;5088:3;5093;:12;;;5108:1;5093:16;5081:6;:29::i;:::-;5203:3;5197:10;5274:6;5268:13;5386:2;5380:3;5372:6;5368:16;5364:25;5410:4;5404;5396:19;5481:6;5476:3;5473:15;5470:2;;;5526:1;5518:6;5514:14;5506:6;5499:30;5470:2;-1:-1:-1;5555:3:33;;4944:619;-1:-1:-1;;;;;4944:619:33:o;8609:642::-;8698:13;;:::i;:::-;8735:3;:12;;;8729:3;8723;:9;:24;8719:73;;;8757:28;8764:3;8776;8770;:9;8783:1;8769:15;8757:6;:28::i;:::-;8798:9;8823:1;8817:3;8810;:10;:14;8798:26;;8910:3;8904:10;9025:3;9019;9011:6;9007:16;9003:26;9081:4;9073;9069:9;9062:4;9056:11;9052:27;9049:37;9043:4;9036:51;9169:6;9163:13;9157:3;9152;9148:13;9145:32;9142:2;;;9212:3;9207;9203:13;9195:6;9188:29;9142:2;-1:-1:-1;9243:3:33;;8609:642;-1:-1:-1;;;;;;8609:642:33:o;1888:114::-;1938:4;1958:1;1954;:5;1950:34;;;-1:-1:-1;1976:1:33;1969:8;;1950:34;-1:-1:-1;1996:1:33;1888:114;-1:-1:-1;1888:114:33:o;1731:153::-;1822:7;;1835:19;1822:3;1845:8;1835:4;:19::i;:::-;;1860;1867:3;1872:6;1860;:19::i;58:825:32:-;;;;;;;;;-1:-1:-1;58:825:32;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;58:825:32;;;;;:::o"
},
"methodIdentifiers": {
"currentPrice()": "9d1b464a",
"fulfill(bytes32,bytes32)": "042f2b65",
"requestEthereumPrice(string)": "6c0cae68"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_price\",\"type\":\"bytes32\"}],\"name\":\"fulfill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_currency\",\"type\":\"string\"}],\"name\":\"requestEthereumPrice\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"currentPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_link\",\"type\":\"address\"},{\"name\":\"_coordinator\",\"type\":\"address\"},{\"name\":\"_sAId\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/ServiceAgreementConsumer.sol\":\"ServiceAgreementConsumer\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Chainlink.sol\":{\"keccak256\":\"0x2e22ca7d3cfdca8f53ff01c25460f72c2634fd778746f9ec2e608412d0ab037c\",\"urls\":[\"bzzr://cee187a0a12f045523125e4522ddde4610ea5f000c1f92acbb7be778eaf8a4ed\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/ChainlinkClient.sol\":{\"keccak256\":\"0xf26d2fb1abfa4415c00313dded53fa99e813e06201e970b409aa444154a1c0eb\",\"urls\":[\"bzzr://9b4c84585da86567d244bf59370c53bb5e05b4be73030e86a8b0883329435564\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x8871fe810c2efc580e8173e1751df0023b362f4835e44383bd95ee375c4388b9\",\"urls\":[\"bzzr://1c0bdf40cbcbe3fe7491c673d5db4561e85f3f02bd5f3851c857c6d5f7987c45\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ENSInterface.sol\":{\"keccak256\":\"0x87607c12cc84c57afbcb38f00d96ae67c433474c1310a0c2798e2a728f41750d\",\"urls\":[\"bzzr://10a880076bf0b03ef9bd153e7f6ca18e65f15c9f7bf4b0883e93b8de67dd22c2\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x592d87884106ba82cedbe79922de9cfaf28b211a09f9be243ad767d3baa1cb90\",\"urls\":[\"bzzr://1f4a72f8b790700d839354d412df656d5a59877264c6e126a1deae6164de9e7d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/PointerInterface.sol\":{\"keccak256\":\"0xdc08ab9320d187dbaffa20dc31d331f8067fa534c9a654aab8f9ffa63df450da\",\"urls\":[\"bzzr://7e34f1d953ea72152d9daffea28117d5d31d85891f2cac5f1ded4a589cad4874\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/ServiceAgreementConsumer.sol\":{\"keccak256\":\"0xfdbd521b525db7cb87d255a8b9cb34c43582a017489b6f5943c87724d0e0d943\",\"urls\":[\"bzzr://e65e52ad7bbb32f2db2656aac0b764301f13f0f24f6baca4cbdc385264cefc29\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/ENSResolver.sol\":{\"keccak256\":\"0x64fcf7d2fc5efc87eaf7eba4a8f69af4d28986b6e4fb3590f076eb41ce40296e\",\"urls\":[\"bzzr://09e1bdee1831b5e85d3c7b5d96b7c26ad54e96d654cfaf18f58449c4c45961fc\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/ServiceAgreementConsumer.sol": {
"id": 32
},
"ChainlinkClient.sol": {
"id": 1
},
"Chainlink.sol": {
"id": 0
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 15
},
"interfaces/LinkTokenInterface.sol": {
"id": 17
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 14
},
"interfaces/PointerInterface.sol": {
"id": 19
},
"vendor/ENSResolver.sol": {
"id": 35
}
},
"sourceCodes": {
"tests/ServiceAgreementConsumer.sol": "pragma solidity 0.5.0;\n\nimport \"../ChainlinkClient.sol\";\n\ncontract ServiceAgreementConsumer is ChainlinkClient {\n uint256 constant private ORACLE_PAYMENT = 1 * LINK;\n\n bytes32 internal sAId;\n bytes32 public currentPrice;\n\n constructor(address _link, address _coordinator, bytes32 _sAId) public {\n setChainlinkToken(_link);\n setChainlinkOracle(_coordinator);\n sAId = _sAId;\n }\n\n function requestEthereumPrice(string memory _currency) public {\n Chainlink.Request memory req = buildChainlinkRequest(sAId, address(this), this.fulfill.selector);\n req.add(\"get\", \"https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD,EUR,JPY\");\n req.add(\"path\", _currency);\n sendChainlinkRequest(req, ORACLE_PAYMENT);\n }\n\n function fulfill(bytes32 _requestId, bytes32 _price)\n public\n recordChainlinkFulfillment(_requestId)\n {\n currentPrice = _price;\n }\n}\n",
"ChainlinkClient.sol": "pragma solidity ^0.5.0;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = address(0);\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requestCount = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(address(oracle), _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requestCount));\n _req.nonce = requestCount;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requestCount += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId],\n \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes memory _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}",
"interfaces/ENSInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address _owner) external;\n function setResolver(bytes32 node, address _resolver) external;\n function setOwner(bytes32 node, address _owner) external;\n function setTTL(bytes32 node, uint64 _ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.5.0;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string memory tokenName);\n function symbol() external view returns (string memory tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 requestPrice,\n bytes32 serviceAgreementID,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 dataVersion,\n bytes calldata data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.5.0;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity ^0.5.0;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n"
},
"sourceTreeHashHex": "0xd6d139883358b58785e9b78732c603488ca481e2d8bad37eb52ee93008d72b15",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment