{
"schemaVersion": "2.0.0",
"contractName": "TestAssetDataDecoders",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "target",
"type": "address"
}
],
"name": "addAuthorizedAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "uint256"
}
],
"name": "authorities",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "assetData",
"type": "bytes[]"
},
{
"name": "from",
"type": "address[]"
},
{
"name": "to",
"type": "address[]"
},
{
"name": "amounts",
"type": "uint256[]"
}
],
"name": "batchTransferFrom",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "target",
"type": "address"
}
],
"name": "removeAuthorizedAddress",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "assetData",
"type": "bytes"
}
],
"name": "publicDecodeERC721Data",
"outputs": [
{
"name": "proxyId",
"type": "uint8"
},
{
"name": "token",
"type": "address"
},
{
"name": "tokenId",
"type": "uint256"
},
{
"name": "receiverData",
"type": "bytes"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "target",
"type": "address"
},
{
"name": "index",
"type": "uint256"
}
],
"name": "removeAuthorizedAddressAtIndex",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "assetData",
"type": "bytes"
},
{
"name": "from",
"type": "address"
},
{
"name": "to",
"type": "address"
},
{
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getProxyId",
"outputs": [
{
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
}
],
"name": "authorized",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "assetData",
"type": "bytes"
}
],
"name": "publicDecodeERC20Data",
"outputs": [
{
"name": "proxyId",
"type": "uint8"
},
{
"name": "token",
"type": "address"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getAuthorizedAddresses",
"outputs": [
{
"name": "",
"type": "address[]"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "target",
"type": "address"
},
{
"indexed": true,
"name": "caller",
"type": "address"
}
],
"name": "AuthorizedAddressAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "target",
"type": "address"
},
{
"indexed": true,
"name": "caller",
"type": "address"
}
],
"name": "AuthorizedAddressRemoved",
"type": "event"
}
],
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405260008054600160a060020a0319163317905561181a806100256000396000f3006080604052600436106100c45763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100c9578063494503d4146100eb578063563c875d14610121578063707129391461014157806372c2f527146101615780638da5cb5b146101915780639ad26744146101a6578063a85e59e4146101c6578063ae25532e146101e6578063b918161114610208578063bd27c22d14610235578063d39de6e914610263578063f2fde38b14610285575b600080fd5b3480156100d557600080fd5b506100e96100e436600461131c565b6102a5565b005b3480156100f757600080fd5b5061010b6101063660046114ee565b6103ec565b6040516101189190611618565b60405180910390f35b34801561012d57600080fd5b506100e961013c36600461137c565b610414565b34801561014d57600080fd5b506100e961015c36600461131c565b610507565b34801561016d57600080fd5b5061018161017c3660046114b9565b6106d5565b60405161011894939291906116fb565b34801561019d57600080fd5b5061010b6106f4565b3480156101b257600080fd5b506100e96101c1366004611342565b610703565b3480156101d257600080fd5b506100e96101e136600461143c565b6108c5565b3480156101f257600080fd5b506101fb610971565b60405161011891906116d2565b34801561021457600080fd5b5061022861022336600461131c565b610977565b60405161011891906116a3565b34801561024157600080fd5b506102556102503660046114b9565b61098c565b6040516101189291906116e0565b34801561026f57600080fd5b506102786109a2565b6040516101189190611692565b34801561029157600080fd5b506100e96102a036600461131c565b610a04565b600054600160a060020a031633146102db5760405160e560020a62461bcd0281526004016102d2906116c2565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156103505760405160e560020a62461bcd0281526004016102d291906116b1565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106103fa57fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff1615156104815760405160e560020a62461bcd0281526004016102d291906116b1565b50600090505b8451811015610500576104f885828151811015156104a157fe5b9060200190602002015185838151811015156104b957fe5b9060200190602002015185848151811015156104d157fe5b9060200190602002015185858151811015156104e957fe5b90602001906020020151610a6c565b600101610487565b5050505050565b60008054600160a060020a031633146105355760405160e560020a62461bcd0281526004016102d2906116c2565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105ab5760405160e560020a62461bcd0281526004016102d291906116b1565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b60025481101561069b5781600160a060020a03166002828154811015156105f157fe5b600091825260209091200154600160a060020a031614156106935760028054600019810190811061061e57fe5b60009182526020909120015460028054600160a060020a03909216918390811061064457fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061068d90826110e3565b5061069b565b6001016105ce565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b600080600060606106e585610c4d565b92989197509550909350915050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000602082015290821061075d5760405160e560020a62461bcd0281526004016102d291906116b1565b5081600160a060020a031660028281548110151561077757fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107e85760405160e560020a62461bcd0281526004016102d291906116b1565b50600160a060020a0382166000908152600160205260409020805460ff1916905560028054600019810190811061081b57fe5b60009182526020909120015460028054600160a060020a03909216918390811061084157fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061088a90826110e3565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156109325760405160e560020a62461bcd0281526004016102d291906116b1565b5061050085858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050848484610a6c565b60025b90565b60016020526000908152604090205460ff1681565b60008061099883610d2c565b9092509050915091565b606060028054806020026020016040519081016040528092919081815260200182805480156109fa57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116109dc575b5050505050905090565b600054600160a060020a03163314610a315760405160e560020a62461bcd0281526004016102d2906116c2565b600160a060020a03811615610a69576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60008060006060610a7c88610c4d565b60408051808201909152601781527f41535345545f50524f58595f49445f4d49534d4154434800000000000000000060208201529397509195509350915060ff8516600214610ae15760405160e560020a62461bcd0281526004016102d291906116b1565b5060408051808201909152600e81527f494e56414c49445f414d4f554e54000000000000000000000000000000000000602082015260018614610b3a5760405160e560020a62461bcd0281526004016102d291906116b1565b50600081511115610bc7576040517fb88d4fde000000000000000000000000000000000000000000000000000000008152600160a060020a0384169063b88d4fde90610b90908a908a908790879060040161164e565b600060405180830381600087803b158015610baa57600080fd5b505af1158015610bbe573d6000803e3d6000fd5b50505050610c43565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038416906323b872dd90610c10908a908a908790600401611626565b600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b505050505b5050505050505050565b805160408051808201909152601b81527f4c454e4754485f41545f4c454153545f35335f524551554952454400000000006020820152600091829182916060916035821015610cb25760405160e560020a62461bcd0281526004016102d291906116b1565b50610cbe866000610ddf565b9350610ccb866014610e86565b92506035811115610ce457610ce1866034610e99565b91505b8560018203815181101515610cf557fe5b01602001517f0100000000000000000000000000000000000000000000000000000000000000908190048102049450509193509193565b805160408051808201909152601281527f4c454e4754485f32315f524551554952454400000000000000000000000000006020820152600091829160158214610d8b5760405160e560020a62461bcd0281526004016102d291906116b1565b50610d97846000610ddf565b91508360018203815181101515610daa57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204925050915091565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610e695760405160e560020a62461bcd0281526004016102d291906116b1565b50506014818301810151910190600160a060020a03165b92915050565b6000610e928383610f92565b9392505050565b60606000610ea78484610e86565b905060208301925080830184511015606060405190810160405280603081526020017f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455381526020017f5f4c454e4754485f524551554952454400000000000000000000000000000000815250901515610f365760405160e560020a62461bcd0281526004016102d291906116b1565b50806040519080825280601f01601f191660200182016040528015610f65578160200160208202803883390190505b509150610f8b610f7483610974565b60200184610f8187610974565b0160200183611026565b5092915050565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f515549524544000000000000000000000000000000000000000000000000000081525090151561101c5760405160e560020a62461bcd0281526004016102d291906116b1565b5050016020015190565b6020811015611050576001816020036101000a0380198351168185511680821786525050506110de565b8282141561105d576110de565b828211156110a35760208104602082039150818301828501815160005b8481101561109857865188526020978801979096019560010161107a565b509052506110de9050565b60208104602082039150818301828501845160005b848110156110d75783518352601f1993840193909201916001016110b8565b5086525050505b505050565b8154818355818111156110de576000838152602090206110de91810190830161097491905b8082111561111c5760008155600101611108565b5090565b6000610e928235611783565b6000601f8201831361113d57600080fd5b813561115061114b82611730565b611709565b9150818183526020840193506020810190508385602084028201111561117557600080fd5b60005b838110156111a1578161118b8882611120565b8452506020928301929190910190600101611178565b5050505092915050565b6000601f820183136111bc57600080fd5b81356111ca61114b82611730565b81815260209384019390925082018360005b838110156111a157813586016111f288826112c1565b84525060209283019291909101906001016111dc565b6000601f8201831361121957600080fd5b813561122761114b82611730565b9150818183526020840193506020810190508385602084028201111561124c57600080fd5b60005b838110156111a157816112628882611310565b845250602092830192919091019060010161124f565b600080601f8301841361128a57600080fd5b50813567ffffffffffffffff8111156112a257600080fd5b6020830191508360018202830111156112ba57600080fd5b9250929050565b6000601f820183136112d257600080fd5b81356112e061114b82611751565b915080825260208301602083018583830111156112fc57600080fd5b61130783828461179a565b50505092915050565b6000610e928235610974565b60006020828403121561132e57600080fd5b600061133a8484611120565b949350505050565b6000806040838503121561135557600080fd5b60006113618585611120565b925050602061137285828601611310565b9150509250929050565b6000806000806080858703121561139257600080fd5b843567ffffffffffffffff8111156113a957600080fd5b6113b5878288016111ab565b945050602085013567ffffffffffffffff8111156113d257600080fd5b6113de8782880161112c565b935050604085013567ffffffffffffffff8111156113fb57600080fd5b6114078782880161112c565b925050606085013567ffffffffffffffff81111561142457600080fd5b61143087828801611208565b91505092959194509250565b60008060008060006080868803121561145457600080fd5b853567ffffffffffffffff81111561146b57600080fd5b61147788828901611278565b9550955050602061148a88828901611120565b935050604061149b88828901611120565b92505060606114ac88828901611310565b9150509295509295909350565b6000602082840312156114cb57600080fd5b813567ffffffffffffffff8111156114e257600080fd5b61133a848285016112c1565b60006020828403121561150057600080fd5b600061133a8484611310565b61151581611783565b82525050565b60006115268261177f565b80845260208401935061153883611779565b60005b828110156115685761154e86835161150c565b61155782611779565b60209690960195915060010161153b565b5093949350505050565b6115158161178f565b60006115868261177f565b80845261159a8160208601602086016117a6565b6115a3816117d6565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61151581610974565b61151581611794565b60208101610e80828461150c565b60608101611634828661150c565b611641602083018561150c565b61133a6040830184611606565b6080810161165c828761150c565b611669602083018661150c565b6116766040830185611606565b8181036060830152611688818461157b565b9695505050505050565b60208082528101610e92818461151b565b60208101610e808284611572565b60208082528101610e92818461157b565b60208082528101610e80816115b0565b60208101610e80828461160f565b604081016116ee828561160f565b610e92602083018461150c565b6080810161165c828761160f565b60405181810167ffffffffffffffff8111828210171561172857600080fd5b604052919050565b600067ffffffffffffffff82111561174757600080fd5b5060209081020190565b600067ffffffffffffffff82111561176857600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156117c15781810151838201526020016117a9565b838111156117d0576000848401525b50505050565b601f01601f1916905600a265627a7a723058203d0f329abd9e15bde62c80e2ff58d5d058db489dd1cfcc9b9f510c2033de7f6b6c6578706572696d656e74616cf50037",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x181A DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC4 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xC9 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xEB JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x121 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x141 JUMPI DUP1 PUSH4 0x72C2F527 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x191 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x1A6 JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x1C6 JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1E6 JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x208 JUMPI DUP1 PUSH4 0xBD27C22D EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x263 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x285 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0xE4 CALLDATASIZE PUSH1 0x4 PUSH2 0x131C JUMP JUMPDEST PUSH2 0x2A5 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x106 CALLDATASIZE PUSH1 0x4 PUSH2 0x14EE JUMP JUMPDEST PUSH2 0x3EC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP2 SWAP1 PUSH2 0x1618 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x13C CALLDATASIZE PUSH1 0x4 PUSH2 0x137C JUMP JUMPDEST PUSH2 0x414 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x15C CALLDATASIZE PUSH1 0x4 PUSH2 0x131C JUMP JUMPDEST PUSH2 0x507 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x181 PUSH2 0x17C CALLDATASIZE PUSH1 0x4 PUSH2 0x14B9 JUMP JUMPDEST PUSH2 0x6D5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x16FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x6F4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x1C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x1342 JUMP JUMPDEST PUSH2 0x703 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x143C JUMP JUMPDEST PUSH2 0x8C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FB PUSH2 0x971 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP2 SWAP1 PUSH2 0x16D2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x228 PUSH2 0x223 CALLDATASIZE PUSH1 0x4 PUSH2 0x131C JUMP JUMPDEST PUSH2 0x977 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP2 SWAP1 PUSH2 0x16A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x241 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x255 PUSH2 0x250 CALLDATASIZE PUSH1 0x4 PUSH2 0x14B9 JUMP JUMPDEST PUSH2 0x98C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP3 SWAP2 SWAP1 PUSH2 0x16E0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x278 PUSH2 0x9A2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP2 SWAP1 PUSH2 0x1692 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x291 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x2A0 CALLDATASIZE PUSH1 0x4 PUSH2 0x131C JUMP JUMPDEST PUSH2 0xA04 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2DB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP1 PUSH2 0x16C2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x350 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x3FA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x481 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x500 JUMPI PUSH2 0x4F8 DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4A1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4B9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4D1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4E9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA6C JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x487 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x535 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP1 PUSH2 0x16C2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x5AB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x69B JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5F1 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x693 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x61E JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x644 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x68D SWAP1 DUP3 PUSH2 0x10E3 JUMP JUMPDEST POP PUSH2 0x69B JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x5CE JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 PUSH2 0x6E5 DUP6 PUSH2 0xC4D JUMP JUMPDEST SWAP3 SWAP9 SWAP2 SWAP8 POP SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x75D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x777 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x7E8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x81B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x841 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x88A SWAP1 DUP3 PUSH2 0x10E3 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x932 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH2 0x500 DUP6 DUP6 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 DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0xA6C JUMP JUMPDEST PUSH1 0x2 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x998 DUP4 PUSH2 0xD2C JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x9FA JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x9DC JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xA31 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP1 PUSH2 0x16C2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0xA69 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 PUSH2 0xA7C DUP9 PUSH2 0xC4D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x41535345545F50524F58595F49445F4D49534D41544348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP4 SWAP8 POP SWAP2 SWAP6 POP SWAP4 POP SWAP2 POP PUSH1 0xFF DUP6 AND PUSH1 0x2 EQ PUSH2 0xAE1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1 DUP7 EQ PUSH2 0xB3A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0xBC7 JUMPI PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0xB90 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x164E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBBE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xC43 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xC10 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1626 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC3E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x4C454E4754485F41545F4C454153545F35335F52455155495245440000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 DUP3 SWAP2 PUSH1 0x60 SWAP2 PUSH1 0x35 DUP3 LT ISZERO PUSH2 0xCB2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH2 0xCBE DUP7 PUSH1 0x0 PUSH2 0xDDF JUMP JUMPDEST SWAP4 POP PUSH2 0xCCB DUP7 PUSH1 0x14 PUSH2 0xE86 JUMP JUMPDEST SWAP3 POP PUSH1 0x35 DUP2 GT ISZERO PUSH2 0xCE4 JUMPI PUSH2 0xCE1 DUP7 PUSH1 0x34 PUSH2 0xE99 JUMP JUMPDEST SWAP2 POP JUMPDEST DUP6 PUSH1 0x1 DUP3 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCF5 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP POP SWAP2 SWAP4 POP SWAP2 SWAP4 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F32315F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 PUSH1 0x15 DUP3 EQ PUSH2 0xD8B JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH2 0xD97 DUP5 PUSH1 0x0 PUSH2 0xDDF JUMP JUMPDEST SWAP2 POP DUP4 PUSH1 0x1 DUP3 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xDAA JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP3 POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xE69 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE92 DUP4 DUP4 PUSH2 0xF92 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xEA7 DUP5 DUP5 PUSH2 0xE86 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xF36 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xF65 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0xF8B PUSH2 0xF74 DUP4 PUSH2 0x974 JUMP JUMPDEST PUSH1 0x20 ADD DUP5 PUSH2 0xF81 DUP8 PUSH2 0x974 JUMP JUMPDEST ADD PUSH1 0x20 ADD DUP4 PUSH2 0x1026 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x101C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1050 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x10DE JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x105D JUMPI PUSH2 0x10DE JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x10A3 JUMPI PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP2 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1098 JUMPI DUP7 MLOAD DUP9 MSTORE PUSH1 0x20 SWAP8 DUP9 ADD SWAP8 SWAP1 SWAP7 ADD SWAP6 PUSH1 0x1 ADD PUSH2 0x107A JUMP JUMPDEST POP SWAP1 MSTORE POP PUSH2 0x10DE SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP5 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x10D7 JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x10B8 JUMP JUMPDEST POP DUP7 MSTORE POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x10DE JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x10DE SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x974 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x111C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1108 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE92 DUP3 CALLDATALOAD PUSH2 0x1783 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x113D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1150 PUSH2 0x114B DUP3 PUSH2 0x1730 JUMP JUMPDEST PUSH2 0x1709 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x1175 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11A1 JUMPI DUP2 PUSH2 0x118B DUP9 DUP3 PUSH2 0x1120 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1178 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x11BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x11CA PUSH2 0x114B DUP3 PUSH2 0x1730 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11A1 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x11F2 DUP9 DUP3 PUSH2 0x12C1 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x11DC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1219 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1227 PUSH2 0x114B DUP3 PUSH2 0x1730 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x124C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11A1 JUMPI DUP2 PUSH2 0x1262 DUP9 DUP3 PUSH2 0x1310 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x124F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x128A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x12BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x12D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x12E0 PUSH2 0x114B DUP3 PUSH2 0x1751 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x12FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1307 DUP4 DUP3 DUP5 PUSH2 0x179A JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE92 DUP3 CALLDATALOAD PUSH2 0x974 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x132E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x133A DUP5 DUP5 PUSH2 0x1120 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1355 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1361 DUP6 DUP6 PUSH2 0x1120 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1372 DUP6 DUP3 DUP7 ADD PUSH2 0x1310 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1392 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13B5 DUP8 DUP3 DUP9 ADD PUSH2 0x11AB JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13DE DUP8 DUP3 DUP9 ADD PUSH2 0x112C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1407 DUP8 DUP3 DUP9 ADD PUSH2 0x112C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1424 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1430 DUP8 DUP3 DUP9 ADD PUSH2 0x1208 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x146B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1477 DUP9 DUP3 DUP10 ADD PUSH2 0x1278 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x148A DUP9 DUP3 DUP10 ADD PUSH2 0x1120 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x149B DUP9 DUP3 DUP10 ADD PUSH2 0x1120 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x14AC DUP9 DUP3 DUP10 ADD PUSH2 0x1310 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x14CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x14E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x133A DUP5 DUP3 DUP6 ADD PUSH2 0x12C1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1500 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x133A DUP5 DUP5 PUSH2 0x1310 JUMP JUMPDEST PUSH2 0x1515 DUP2 PUSH2 0x1783 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1526 DUP3 PUSH2 0x177F JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x1538 DUP4 PUSH2 0x1779 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1568 JUMPI PUSH2 0x154E DUP7 DUP4 MLOAD PUSH2 0x150C JUMP JUMPDEST PUSH2 0x1557 DUP3 PUSH2 0x1779 JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x153B JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1515 DUP2 PUSH2 0x178F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1586 DUP3 PUSH2 0x177F JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x159A DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x17A6 JUMP JUMPDEST PUSH2 0x15A3 DUP2 PUSH2 0x17D6 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x1515 DUP2 PUSH2 0x974 JUMP JUMPDEST PUSH2 0x1515 DUP2 PUSH2 0x1794 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE80 DUP3 DUP5 PUSH2 0x150C JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1634 DUP3 DUP7 PUSH2 0x150C JUMP JUMPDEST PUSH2 0x1641 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x150C JUMP JUMPDEST PUSH2 0x133A PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x1606 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x165C DUP3 DUP8 PUSH2 0x150C JUMP JUMPDEST PUSH2 0x1669 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x150C JUMP JUMPDEST PUSH2 0x1676 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1606 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x1688 DUP2 DUP5 PUSH2 0x157B JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE92 DUP2 DUP5 PUSH2 0x151B JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE80 DUP3 DUP5 PUSH2 0x1572 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE92 DUP2 DUP5 PUSH2 0x157B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE80 DUP2 PUSH2 0x15B0 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE80 DUP3 DUP5 PUSH2 0x160F JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x16EE DUP3 DUP6 PUSH2 0x160F JUMP JUMPDEST PUSH2 0xE92 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x150C JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x165C DUP3 DUP8 PUSH2 0x160F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1728 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1747 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1768 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x17C1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x17A9 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x17D0 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 RETURNDATASIZE 0xf ORIGIN SWAP11 0xbd SWAP15 ISZERO 0xbd 0xe6 0x2c DUP1 0xe2 SELFDESTRUCT PC 0xd5 0xd0 PC 0xdb 0x48 SWAP14 0xd1 0xcf 0xcc SWAP12 SWAP16 MLOAD 0xc KECCAK256 CALLER 0xde PUSH32 0x6B6C6578706572696D656E74616CF50037000000000000000000000000000000 ",
"sourceMap": "744:1407:9:-;;;363:5:17;:18;;-1:-1:-1;;;;;;363:18:17;371:10;363:18;;;744:1407:9;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100c45763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146100c9578063494503d4146100eb578063563c875d14610121578063707129391461014157806372c2f527146101615780638da5cb5b146101915780639ad26744146101a6578063a85e59e4146101c6578063ae25532e146101e6578063b918161114610208578063bd27c22d14610235578063d39de6e914610263578063f2fde38b14610285575b600080fd5b3480156100d557600080fd5b506100e96100e436600461131c565b6102a5565b005b3480156100f757600080fd5b5061010b6101063660046114ee565b6103ec565b6040516101189190611618565b60405180910390f35b34801561012d57600080fd5b506100e961013c36600461137c565b610414565b34801561014d57600080fd5b506100e961015c36600461131c565b610507565b34801561016d57600080fd5b5061018161017c3660046114b9565b6106d5565b60405161011894939291906116fb565b34801561019d57600080fd5b5061010b6106f4565b3480156101b257600080fd5b506100e96101c1366004611342565b610703565b3480156101d257600080fd5b506100e96101e136600461143c565b6108c5565b3480156101f257600080fd5b506101fb610971565b60405161011891906116d2565b34801561021457600080fd5b5061022861022336600461131c565b610977565b60405161011891906116a3565b34801561024157600080fd5b506102556102503660046114b9565b61098c565b6040516101189291906116e0565b34801561026f57600080fd5b506102786109a2565b6040516101189190611692565b34801561029157600080fd5b506100e96102a036600461131c565b610a04565b600054600160a060020a031633146102db5760405160e560020a62461bcd0281526004016102d2906116c2565b60405180910390fd5b600160a060020a038116600090815260016020908152604091829020548251808401909352601983527f5441524745545f414c52454144595f415554484f52495a4544000000000000009183019190915260ff16156103505760405160e560020a62461bcd0281526004016102d291906116b1565b50600160a060020a0381166000818152600160208190526040808320805460ff19168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909101805473ffffffffffffffffffffffffffffffffffffffff191684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106103fa57fe5b600091825260209091200154600160a060020a0316905081565b336000908152600160209081526040808320548151808301909252601582527f53454e4445525f4e4f545f415554484f52495a45440000000000000000000000928201929092529060ff1615156104815760405160e560020a62461bcd0281526004016102d291906116b1565b50600090505b8451811015610500576104f885828151811015156104a157fe5b9060200190602002015185838151811015156104b957fe5b9060200190602002015185848151811015156104d157fe5b9060200190602002015185858151811015156104e957fe5b90602001906020020151610a6c565b600101610487565b5050505050565b60008054600160a060020a031633146105355760405160e560020a62461bcd0281526004016102d2906116c2565b600160a060020a038216600090815260016020908152604091829020548251808401909352601583527f5441524745545f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156105ab5760405160e560020a62461bcd0281526004016102d291906116b1565b5050600160a060020a0381166000908152600160205260408120805460ff191690555b60025481101561069b5781600160a060020a03166002828154811015156105f157fe5b600091825260209091200154600160a060020a031614156106935760028054600019810190811061061e57fe5b60009182526020909120015460028054600160a060020a03909216918390811061064457fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061068d90826110e3565b5061069b565b6001016105ce565b6040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b600080600060606106e585610c4d565b92989197509550909350915050565b600054600160a060020a031681565b60025460408051808201909152601381527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000602082015290821061075d5760405160e560020a62461bcd0281526004016102d291906116b1565b5081600160a060020a031660028281548110151561077757fe5b6000918252602091829020015460408051808201909152601b81527f415554484f52495a45445f414444524553535f4d49534d415443480000000000928101929092529091600160a060020a03909116146107e85760405160e560020a62461bcd0281526004016102d291906116b1565b50600160a060020a0382166000908152600160205260409020805460ff1916905560028054600019810190811061081b57fe5b60009182526020909120015460028054600160a060020a03909216918390811061084157fe5b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560028054600019019061088a90826110e3565b506040513390600160a060020a038416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b33600090815260016020908152604091829020548251808401909352601583527f53454e4445525f4e4f545f415554484f52495a454400000000000000000000009183019190915260ff1615156109325760405160e560020a62461bcd0281526004016102d291906116b1565b5061050085858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050848484610a6c565b60025b90565b60016020526000908152604090205460ff1681565b60008061099883610d2c565b9092509050915091565b606060028054806020026020016040519081016040528092919081815260200182805480156109fa57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116109dc575b5050505050905090565b600054600160a060020a03163314610a315760405160e560020a62461bcd0281526004016102d2906116c2565b600160a060020a03811615610a69576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b60008060006060610a7c88610c4d565b60408051808201909152601781527f41535345545f50524f58595f49445f4d49534d4154434800000000000000000060208201529397509195509350915060ff8516600214610ae15760405160e560020a62461bcd0281526004016102d291906116b1565b5060408051808201909152600e81527f494e56414c49445f414d4f554e54000000000000000000000000000000000000602082015260018614610b3a5760405160e560020a62461bcd0281526004016102d291906116b1565b50600081511115610bc7576040517fb88d4fde000000000000000000000000000000000000000000000000000000008152600160a060020a0384169063b88d4fde90610b90908a908a908790879060040161164e565b600060405180830381600087803b158015610baa57600080fd5b505af1158015610bbe573d6000803e3d6000fd5b50505050610c43565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038416906323b872dd90610c10908a908a908790600401611626565b600060405180830381600087803b158015610c2a57600080fd5b505af1158015610c3e573d6000803e3d6000fd5b505050505b5050505050505050565b805160408051808201909152601b81527f4c454e4754485f41545f4c454153545f35335f524551554952454400000000006020820152600091829182916060916035821015610cb25760405160e560020a62461bcd0281526004016102d291906116b1565b50610cbe866000610ddf565b9350610ccb866014610e86565b92506035811115610ce457610ce1866034610e99565b91505b8560018203815181101515610cf557fe5b01602001517f0100000000000000000000000000000000000000000000000000000000000000908190048102049450509193509193565b805160408051808201909152601281527f4c454e4754485f32315f524551554952454400000000000000000000000000006020820152600091829160158214610d8b5760405160e560020a62461bcd0281526004016102d291906116b1565b50610d97846000610ddf565b91508360018203815181101515610daa57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204925050915091565b60008160140183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524581526020017f5155495245440000000000000000000000000000000000000000000000000000815250901515610e695760405160e560020a62461bcd0281526004016102d291906116b1565b50506014818301810151910190600160a060020a03165b92915050565b6000610e928383610f92565b9392505050565b60606000610ea78484610e86565b905060208301925080830184511015606060405190810160405280603081526020017f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455381526020017f5f4c454e4754485f524551554952454400000000000000000000000000000000815250901515610f365760405160e560020a62461bcd0281526004016102d291906116b1565b50806040519080825280601f01601f191660200182016040528015610f65578160200160208202803883390190505b509150610f8b610f7483610974565b60200184610f8187610974565b0160200183611026565b5092915050565b60008160200183511015606060405190810160405280602681526020017f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524581526020017f515549524544000000000000000000000000000000000000000000000000000081525090151561101c5760405160e560020a62461bcd0281526004016102d291906116b1565b5050016020015190565b6020811015611050576001816020036101000a0380198351168185511680821786525050506110de565b8282141561105d576110de565b828211156110a35760208104602082039150818301828501815160005b8481101561109857865188526020978801979096019560010161107a565b509052506110de9050565b60208104602082039150818301828501845160005b848110156110d75783518352601f1993840193909201916001016110b8565b5086525050505b505050565b8154818355818111156110de576000838152602090206110de91810190830161097491905b8082111561111c5760008155600101611108565b5090565b6000610e928235611783565b6000601f8201831361113d57600080fd5b813561115061114b82611730565b611709565b9150818183526020840193506020810190508385602084028201111561117557600080fd5b60005b838110156111a1578161118b8882611120565b8452506020928301929190910190600101611178565b5050505092915050565b6000601f820183136111bc57600080fd5b81356111ca61114b82611730565b81815260209384019390925082018360005b838110156111a157813586016111f288826112c1565b84525060209283019291909101906001016111dc565b6000601f8201831361121957600080fd5b813561122761114b82611730565b9150818183526020840193506020810190508385602084028201111561124c57600080fd5b60005b838110156111a157816112628882611310565b845250602092830192919091019060010161124f565b600080601f8301841361128a57600080fd5b50813567ffffffffffffffff8111156112a257600080fd5b6020830191508360018202830111156112ba57600080fd5b9250929050565b6000601f820183136112d257600080fd5b81356112e061114b82611751565b915080825260208301602083018583830111156112fc57600080fd5b61130783828461179a565b50505092915050565b6000610e928235610974565b60006020828403121561132e57600080fd5b600061133a8484611120565b949350505050565b6000806040838503121561135557600080fd5b60006113618585611120565b925050602061137285828601611310565b9150509250929050565b6000806000806080858703121561139257600080fd5b843567ffffffffffffffff8111156113a957600080fd5b6113b5878288016111ab565b945050602085013567ffffffffffffffff8111156113d257600080fd5b6113de8782880161112c565b935050604085013567ffffffffffffffff8111156113fb57600080fd5b6114078782880161112c565b925050606085013567ffffffffffffffff81111561142457600080fd5b61143087828801611208565b91505092959194509250565b60008060008060006080868803121561145457600080fd5b853567ffffffffffffffff81111561146b57600080fd5b61147788828901611278565b9550955050602061148a88828901611120565b935050604061149b88828901611120565b92505060606114ac88828901611310565b9150509295509295909350565b6000602082840312156114cb57600080fd5b813567ffffffffffffffff8111156114e257600080fd5b61133a848285016112c1565b60006020828403121561150057600080fd5b600061133a8484611310565b61151581611783565b82525050565b60006115268261177f565b80845260208401935061153883611779565b60005b828110156115685761154e86835161150c565b61155782611779565b60209690960195915060010161153b565b5093949350505050565b6115158161178f565b60006115868261177f565b80845261159a8160208601602086016117a6565b6115a3816117d6565b9093016020019392505050565b603381527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208201527f6f2063616c6c2074686973206d6574686f642e00000000000000000000000000604082015260600190565b61151581610974565b61151581611794565b60208101610e80828461150c565b60608101611634828661150c565b611641602083018561150c565b61133a6040830184611606565b6080810161165c828761150c565b611669602083018661150c565b6116766040830185611606565b8181036060830152611688818461157b565b9695505050505050565b60208082528101610e92818461151b565b60208101610e808284611572565b60208082528101610e92818461157b565b60208082528101610e80816115b0565b60208101610e80828461160f565b604081016116ee828561160f565b610e92602083018461150c565b6080810161165c828761160f565b60405181810167ffffffffffffffff8111828210171561172857600080fd5b604052919050565b600067ffffffffffffffff82111561174757600080fd5b5060209081020190565b600067ffffffffffffffff82111561176857600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b151590565b60ff1690565b82818337506000910152565b60005b838110156117c15781810151838201526020016117a9565b838111156117d0576000848401525b50505050565b601f01601f1916905600a265627a7a723058203d0f329abd9e15bde62c80e2ff58d5d058db489dd1cfcc9b9f510c2033de7f6b6c6578706572696d656e74616cf50037",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC4 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0xC9 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xEB JUMPI DUP1 PUSH4 0x563C875D EQ PUSH2 0x121 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x141 JUMPI DUP1 PUSH4 0x72C2F527 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x191 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x1A6 JUMPI DUP1 PUSH4 0xA85E59E4 EQ PUSH2 0x1C6 JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x1E6 JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x208 JUMPI DUP1 PUSH4 0xBD27C22D EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x263 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x285 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0xE4 CALLDATASIZE PUSH1 0x4 PUSH2 0x131C JUMP JUMPDEST PUSH2 0x2A5 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x106 CALLDATASIZE PUSH1 0x4 PUSH2 0x14EE JUMP JUMPDEST PUSH2 0x3EC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP2 SWAP1 PUSH2 0x1618 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x13C CALLDATASIZE PUSH1 0x4 PUSH2 0x137C JUMP JUMPDEST PUSH2 0x414 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x15C CALLDATASIZE PUSH1 0x4 PUSH2 0x131C JUMP JUMPDEST PUSH2 0x507 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x181 PUSH2 0x17C CALLDATASIZE PUSH1 0x4 PUSH2 0x14B9 JUMP JUMPDEST PUSH2 0x6D5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x16FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10B PUSH2 0x6F4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x1C1 CALLDATASIZE PUSH1 0x4 PUSH2 0x1342 JUMP JUMPDEST PUSH2 0x703 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x143C JUMP JUMPDEST PUSH2 0x8C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FB PUSH2 0x971 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP2 SWAP1 PUSH2 0x16D2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x228 PUSH2 0x223 CALLDATASIZE PUSH1 0x4 PUSH2 0x131C JUMP JUMPDEST PUSH2 0x977 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP2 SWAP1 PUSH2 0x16A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x241 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x255 PUSH2 0x250 CALLDATASIZE PUSH1 0x4 PUSH2 0x14B9 JUMP JUMPDEST PUSH2 0x98C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP3 SWAP2 SWAP1 PUSH2 0x16E0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x278 PUSH2 0x9A2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x118 SWAP2 SWAP1 PUSH2 0x1692 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x291 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x2A0 CALLDATASIZE PUSH1 0x4 PUSH2 0x131C JUMP JUMPDEST PUSH2 0xA04 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x2DB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP1 PUSH2 0x16C2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x19 DUP4 MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO PUSH2 0x350 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x3FA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD DUP2 MLOAD DUP1 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x15 DUP3 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP3 DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x481 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP5 MLOAD DUP2 LT ISZERO PUSH2 0x500 JUMPI PUSH2 0x4F8 DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4A1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4B9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4D1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP6 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x4E9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA6C JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x487 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x535 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP1 PUSH2 0x16C2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x5AB JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x69B JUMPI DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5F1 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x693 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x61E JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x644 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x68D SWAP1 DUP3 PUSH2 0x10E3 JUMP JUMPDEST POP PUSH2 0x69B JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x5CE JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 PUSH2 0x6E5 DUP6 PUSH2 0xC4D JUMP JUMPDEST SWAP3 SWAP9 SWAP2 SWAP8 POP SWAP6 POP SWAP1 SWAP4 POP SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x13 DUP2 MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP3 LT PUSH2 0x75D JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x777 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND EQ PUSH2 0x7E8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x81B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x841 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x88A SWAP1 DUP3 PUSH2 0x10E3 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SLOAD DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0x15 DUP4 MSTORE PUSH32 0x53454E4445525F4E4F545F415554484F52495A45440000000000000000000000 SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x932 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH2 0x500 DUP6 DUP6 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 DUP3 ADD SWAP2 POP POP POP POP POP POP DUP5 DUP5 DUP5 PUSH2 0xA6C JUMP JUMPDEST PUSH1 0x2 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x998 DUP4 PUSH2 0xD2C JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x9FA JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x9DC JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xA31 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP1 PUSH2 0x16C2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH2 0xA69 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 PUSH2 0xA7C DUP9 PUSH2 0xC4D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x17 DUP2 MSTORE PUSH32 0x41535345545F50524F58595F49445F4D49534D41544348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP4 SWAP8 POP SWAP2 SWAP6 POP SWAP4 POP SWAP2 POP PUSH1 0xFF DUP6 AND PUSH1 0x2 EQ PUSH2 0xAE1 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x1 DUP7 EQ PUSH2 0xB3A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH1 0x0 DUP2 MLOAD GT ISZERO PUSH2 0xBC7 JUMPI PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0xB90 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x164E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBBE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xC43 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xC10 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1626 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC3E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH32 0x4C454E4754485F41545F4C454153545F35335F52455155495245440000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 DUP3 SWAP2 PUSH1 0x60 SWAP2 PUSH1 0x35 DUP3 LT ISZERO PUSH2 0xCB2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH2 0xCBE DUP7 PUSH1 0x0 PUSH2 0xDDF JUMP JUMPDEST SWAP4 POP PUSH2 0xCCB DUP7 PUSH1 0x14 PUSH2 0xE86 JUMP JUMPDEST SWAP3 POP PUSH1 0x35 DUP2 GT ISZERO PUSH2 0xCE4 JUMPI PUSH2 0xCE1 DUP7 PUSH1 0x34 PUSH2 0xE99 JUMP JUMPDEST SWAP2 POP JUMPDEST DUP6 PUSH1 0x1 DUP3 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCF5 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP POP SWAP2 SWAP4 POP SWAP2 SWAP4 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F32315F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 SWAP2 DUP3 SWAP2 PUSH1 0x15 DUP3 EQ PUSH2 0xD8B JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP PUSH2 0xD97 DUP5 PUSH1 0x0 PUSH2 0xDDF JUMP JUMPDEST SWAP2 POP DUP4 PUSH1 0x1 DUP3 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xDAA JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP3 POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xE69 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP POP PUSH1 0x14 DUP2 DUP4 ADD DUP2 ADD MLOAD SWAP2 ADD SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE92 DUP4 DUP4 PUSH2 0xF92 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xEA7 DUP5 DUP5 PUSH2 0xE86 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xF36 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xF65 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP PUSH2 0xF8B PUSH2 0xF74 DUP4 PUSH2 0x974 JUMP JUMPDEST PUSH1 0x20 ADD DUP5 PUSH2 0xF81 DUP8 PUSH2 0x974 JUMP JUMPDEST ADD PUSH1 0x20 ADD DUP4 PUSH2 0x1026 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x101C JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2D2 SWAP2 SWAP1 PUSH2 0x16B1 JUMP JUMPDEST POP POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1050 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0x10DE JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0x105D JUMPI PUSH2 0x10DE JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0x10A3 JUMPI PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP2 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x1098 JUMPI DUP7 MLOAD DUP9 MSTORE PUSH1 0x20 SWAP8 DUP9 ADD SWAP8 SWAP1 SWAP7 ADD SWAP6 PUSH1 0x1 ADD PUSH2 0x107A JUMP JUMPDEST POP SWAP1 MSTORE POP PUSH2 0x10DE SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP2 DIV PUSH1 0x20 DUP3 SUB SWAP2 POP DUP2 DUP4 ADD DUP3 DUP6 ADD DUP5 MLOAD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x10D7 JUMPI DUP4 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x10B8 JUMP JUMPDEST POP DUP7 MSTORE POP POP POP JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x10DE JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x10DE SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x974 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x111C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1108 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE92 DUP3 CALLDATALOAD PUSH2 0x1783 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x113D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1150 PUSH2 0x114B DUP3 PUSH2 0x1730 JUMP JUMPDEST PUSH2 0x1709 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x1175 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11A1 JUMPI DUP2 PUSH2 0x118B DUP9 DUP3 PUSH2 0x1120 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1178 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x11BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x11CA PUSH2 0x114B DUP3 PUSH2 0x1730 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11A1 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x11F2 DUP9 DUP3 PUSH2 0x12C1 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x11DC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1219 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1227 PUSH2 0x114B DUP3 PUSH2 0x1730 JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x124C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11A1 JUMPI DUP2 PUSH2 0x1262 DUP9 DUP3 PUSH2 0x1310 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x124F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x128A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x12A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x12BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x12D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x12E0 PUSH2 0x114B DUP3 PUSH2 0x1751 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x12FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1307 DUP4 DUP3 DUP5 PUSH2 0x179A JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE92 DUP3 CALLDATALOAD PUSH2 0x974 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x132E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x133A DUP5 DUP5 PUSH2 0x1120 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1355 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1361 DUP6 DUP6 PUSH2 0x1120 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1372 DUP6 DUP3 DUP7 ADD PUSH2 0x1310 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1392 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13B5 DUP8 DUP3 DUP9 ADD PUSH2 0x11AB JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x13DE DUP8 DUP3 DUP9 ADD PUSH2 0x112C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x13FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1407 DUP8 DUP3 DUP9 ADD PUSH2 0x112C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1424 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1430 DUP8 DUP3 DUP9 ADD PUSH2 0x1208 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x80 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x146B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1477 DUP9 DUP3 DUP10 ADD PUSH2 0x1278 JUMP JUMPDEST SWAP6 POP SWAP6 POP POP PUSH1 0x20 PUSH2 0x148A DUP9 DUP3 DUP10 ADD PUSH2 0x1120 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x149B DUP9 DUP3 DUP10 ADD PUSH2 0x1120 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH2 0x14AC DUP9 DUP3 DUP10 ADD PUSH2 0x1310 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x14CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x14E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x133A DUP5 DUP3 DUP6 ADD PUSH2 0x12C1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1500 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x133A DUP5 DUP5 PUSH2 0x1310 JUMP JUMPDEST PUSH2 0x1515 DUP2 PUSH2 0x1783 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1526 DUP3 PUSH2 0x177F JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x1538 DUP4 PUSH2 0x1779 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1568 JUMPI PUSH2 0x154E DUP7 DUP4 MLOAD PUSH2 0x150C JUMP JUMPDEST PUSH2 0x1557 DUP3 PUSH2 0x1779 JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x153B JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1515 DUP2 PUSH2 0x178F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1586 DUP3 PUSH2 0x177F JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x159A DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x17A6 JUMP JUMPDEST PUSH2 0x15A3 DUP2 PUSH2 0x17D6 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x33 DUP2 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0x1515 DUP2 PUSH2 0x974 JUMP JUMPDEST PUSH2 0x1515 DUP2 PUSH2 0x1794 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE80 DUP3 DUP5 PUSH2 0x150C JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x1634 DUP3 DUP7 PUSH2 0x150C JUMP JUMPDEST PUSH2 0x1641 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x150C JUMP JUMPDEST PUSH2 0x133A PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x1606 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x165C DUP3 DUP8 PUSH2 0x150C JUMP JUMPDEST PUSH2 0x1669 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x150C JUMP JUMPDEST PUSH2 0x1676 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x1606 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x1688 DUP2 DUP5 PUSH2 0x157B JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE92 DUP2 DUP5 PUSH2 0x151B JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE80 DUP3 DUP5 PUSH2 0x1572 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE92 DUP2 DUP5 PUSH2 0x157B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE80 DUP2 PUSH2 0x15B0 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xE80 DUP3 DUP5 PUSH2 0x160F JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x16EE DUP3 DUP6 PUSH2 0x160F JUMP JUMPDEST PUSH2 0xE92 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x150C JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x165C DUP3 DUP8 PUSH2 0x160F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1728 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1747 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1768 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x17C1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x17A9 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x17D0 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 RETURNDATASIZE 0xf ORIGIN SWAP11 0xbd SWAP15 ISZERO 0xbd 0xe6 0x2c DUP1 0xe2 SELFDESTRUCT PC 0xd5 0xd0 PC 0xdb 0x48 SWAP14 0xd1 0xcf 0xcc SWAP12 SWAP16 MLOAD 0xc KECCAK256 CALLER 0xde PUSH32 0x6B6C6578706572696D656E74616CF50037000000000000000000000000000000 ",
"sourceMap": "744:1407:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1244:318:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1244:318:3;;;;;;;;;;;1129:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1129:28:3;;;;;;;;;;;;;;;;;;;;;;;;;1679:431:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1679:431:2;;;;;;;;;1676:542:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1676:542:3;;;;;;;;;1648:501:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1648:501:9;;;;;;;;;;;;;;;;;;;;292:20:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;292:20:17;;;;2391:525:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2391:525:3;;;;;;;;;1037:287:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1037:287:2;;;;;;;;;2292:112:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2292:112:1;;;;;;;;;;;;1080:43:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1080:43:3;;;;;;;;;;;;;;;;;993:268:9;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;993:268:9;;;;;;;;;;;;;;;;;;3013:138:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3013:138:3;;;;;;;;;;;;566:167:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;566:167:17;;;;;;;;;1244:318:3;460:5:17;;-1:-1:-1;;;;;460:5:17;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:17;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1361:18:3;;;;;;:10;:18;;;;;;;;;;1393:25;;;;;;;;;;;;;;;;;;;1361:18;;1360:19;1339:89;;;;-1:-1:-1;;;;;1339:89:3;;;;;;;;;;-1:-1:-1;;;;;;1439:18:3;;;;;;1460:4;1439:18;;;;;;;;:25;;-1:-1:-1;;1439:25:3;;;;;1474:11;27:10:-1;;23:18;;;45:23;;1474:24:3;;;;;;;;-1:-1:-1;;1474:24:3;;;;;1513:42;1544:10;;1439:18;1513:42;;;1244:318;:::o;1129:28::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1129:28:3;;-1:-1:-1;1129:28:3;:::o;1679:431:2:-;1000:10:3;1897:9:2;989:22:3;;;:10;:22;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:3;;;;;;;;;;;1909:1:2;1897:13;;1892:212;1916:9;:16;1912:1;:20;1892:212;;;1953:140;1991:9;2001:1;1991:12;;;;;;;;;;;;;;;;;;2021:4;2026:1;2021:7;;;;;;;;;;;;;;;;;;2046:2;2049:1;2046:5;;;;;;;;;;;;;;;;;;2069:7;2077:1;2069:10;;;;;;;;;;;;;;;;;;1953:20;:140::i;:::-;1934:3;;1892:212;;;1679:431;;;;;:::o;1676:542:3:-;1909:6;460:5:17;;-1:-1:-1;;;;;460:5:17;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:17;;;;;;;;;-1:-1:-1;;;;;1795:18:3;;;;;;:10;:18;;;;;;;;;;1827:21;;;;;;;;;;;;;;;;;;;1795:18;;1774:84;;;;;;-1:-1:-1;;;;;1774:84:3;;;;;;;;;;-1:-1:-1;;;;;;;1876:18:3;;;;;;:10;:18;;;;;1869:25;;-1:-1:-1;;1869:25:3;;;1904:249;1925:11;:18;1921:22;;1904:249;;;1986:6;-1:-1:-1;;;;;1968:24:3;:11;1980:1;1968:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1968:14:3;:24;1964:179;;;2029:11;2041:18;;-1:-1:-1;;2041:22:3;;;2029:35;;;;;;;;;;;;;;;;2012:11;:14;;-1:-1:-1;;;;;2029:35:3;;;;2024:1;;2012:14;;;;;;;;;;;;;;;:52;;-1:-1:-1;;2012:52:3;-1:-1:-1;;;;;2012:52:3;;;;;;;;;;2082:11;:23;;-1:-1:-1;;2082:23:3;;;;;;:::i;:::-;;2123:5;;1964:179;1945:3;;1904:249;;;2167:44;;2200:10;;-1:-1:-1;;;;;2167:44:3;;;;;;;;1676:542;;:::o;1648:501:9:-;1762:13;1789;1816:15;1845:25;1995:32;2017:9;1995:21;:32::i;:::-;1895:132;;;;-1:-1:-1;1895:132:9;-1:-1:-1;1895:132:9;;-1:-1:-1;1648:501:9;-1:-1:-1;;1648:501:9:o;292:20:17:-;;;-1:-1:-1;;;;;292:20:17;;:::o;2391:525:3:-;2544:11;:18;2576:19;;;;;;;;;;;;;;;;;;2536:26;;2515:90;;;;-1:-1:-1;;;;;2515:90:3;;;;;;;;;;;2658:6;-1:-1:-1;;;;;2636:28:3;:11;2648:5;2636:18;;;;;;;;;;;;;;;;;;;;;2678:27;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2636:18:3;;;:28;2615:100;;;;-1:-1:-1;;;;;2615:100:3;;;;;;;;;;-1:-1:-1;;;;;;2733:18:3;;;;;;:10;:18;;;;;2726:25;;-1:-1:-1;;2726:25:3;;;2782:11;2794:18;;-1:-1:-1;;2794:22:3;;;2782:35;;;;;;;;;;;;;;;;2761:11;:18;;-1:-1:-1;;;;;2782:35:3;;;;2773:5;;2761:18;;;;;;;;;;;;;;;:56;;-1:-1:-1;;2761:56:3;-1:-1:-1;;;;;2761:56:3;;;;;;;;;;2827:11;:23;;-1:-1:-1;;2827:23:3;;;;;;:::i;:::-;-1:-1:-1;2865:44:3;;2898:10;;-1:-1:-1;;;;;2865:44:3;;;;;;;;2391:525;;:::o;1037:287:2:-;1000:10:3;989:22;;;;:10;:22;;;;;;;;;;1025:21;;;;;;;;;;;;;;;;;;;989:22;;968:88;;;;;;-1:-1:-1;;;;;968:88:3;;;;;;;;;;;1210:107:2;1244:9;;1210:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1267:4;1285:2;1301:6;1210:20;:107::i;2292:112:1:-;941:1;2292:112;;:::o;1080:43:3:-;;;;;;;;;;;;;;;:::o;993:268:9:-;1106:13;1133;1190:31;1211:9;1190:20;:31::i;:::-;1171:50;;-1:-1:-1;1171:50:9;-1:-1:-1;993:268:9;;;:::o;3013:138:3:-;3094:9;3133:11;3126:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3126:18:3;;;;;;;;;;;;;;;;;;;;;;;3013:138;:::o;566:167:17:-;460:5;;-1:-1:-1;;;;;460:5:17;446:10;:19;425:117;;;;-1:-1:-1;;;;;425:117:17;;;;;;;;;-1:-1:-1;;;;;662:22:17;;;658:69;;700:5;:16;;-1:-1:-1;;700:16:17;-1:-1:-1;;;;;700:16:17;;;;;658:69;566:167;:::o;1194:1000:1:-;1403:13;1430;1457:15;1486:25;1524:32;1546:9;1524:21;:32::i;:::-;1671:23;;;;;;;;;;;;;;;;;1389:167;;-1:-1:-1;1389:167:1;;-1:-1:-1;1389:167:1;-1:-1:-1;1389:167:1;-1:-1:-1;1638:19:1;;;941:1;1638:19;1617:87;;;;-1:-1:-1;;;;;1617:87:1;;;;;;;;;;-1:-1:-1;1807:14:1;;;;;;;;;;;;;;;;;1792:1;1782:11;;1761:70;;;;-1:-1:-1;;;;;1761:70:1;;;;;;;;;;;2011:1;1989:12;:19;:23;1986:202;;;2028:68;;;;;-1:-1:-1;;;;;2028:35:1;;;;;:68;;2064:4;;2070:2;;2074:7;;2083:12;;2028:68;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2028:68:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2028:68:1;;;;1986:202;;;2127:50;;;;;-1:-1:-1;;;;;2127:31:1;;;;;:50;;2159:4;;2165:2;;2169:7;;2127:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2127:50:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2127:50:1;;;;1986:202;1194:1000;;;;;;;;:::o;2791:795::-;3096:16;;3169:27;;;;;;;;;;;;;;;;;2906:13;;;;;;2989:25;;3153:2;3143:12;;;3122:84;;;;-1:-1:-1;;;;;3122:84:1;;;;;;;;;;;3255:25;3267:9;3278:1;3255:11;:25::i;:::-;3247:33;;3300:26;3312:9;3323:2;3300:11;:26::i;:::-;3290:36;;3349:2;3340:6;:11;3336:81;;;3382:24;3392:9;3403:2;3382:9;:24::i;:::-;3367:39;;3336:81;3442:9;3461:1;3452:6;:10;3442:21;;;;;;;;;;;;;;;;;;;;;3436:28;;-1:-1:-1;2791:795:1;;;;;;:::o;2211:493:0:-;2447:16;;2520:18;;;;;;;;;;;;;;;;;2325:13;;;;2504:2;2494:12;;2473:75;;;;-1:-1:-1;;;;;2473:75:0;;;;;;;;;;;2590:25;2602:9;2613:1;2590:11;:25::i;:::-;2582:33;;2641:9;2660:1;2651:6;:10;2641:21;;;;;;;;;;;;;;;;;;;;;2635:28;;-1:-1:-1;2211:493:0;;;;:::o;3858:884:14:-;3979:14;4042:5;4050:2;4042:10;4030:1;:8;:22;;4094:38;;;;;;;;;;;;;;;;;;;;;;;4009:133;;;;;;;-1:-1:-1;;;;;4009:133:14;;;;;;;;;;-1:-1:-1;;4389:2:14;4644:13;;;;;4638:20;4380:11;;;-1:-1:-1;;;;;4634:69:14;3858:884;;;;;:::o;8056:195::-;8177:14;8222:21;8234:1;8237:5;8222:11;:21::i;:::-;8214:30;8056:195;-1:-1:-1;;;8056:195:14:o;9355:784::-;9474:19;9548:25;9576:21;9588:1;9591:5;9576:11;:21::i;:::-;9548:49;;9616:2;9607:11;;;;9752:17;9744:5;:25;9732:1;:8;:37;;9783:48;;;;;;;;;;;;;;;;;;;;;;;9711:130;;;;;;;-1:-1:-1;;;;;9711:130:14;;;;;;;;;;;9923:17;9913:28;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9913:28:14;;9904:37;;9951:157;9972:21;9986:6;9972:13;:21::i;:::-;9996:2;9972:26;10057:5;10038:16;10052:1;10038:13;:16::i;:::-;:24;10065:2;10038:29;10081:17;9951:7;:157::i;:::-;9355:784;;;;;:::o;6642:488::-;6763:14;6826:5;6834:2;6826:10;6814:1;:8;:22;;6850:38;;;;;;;;;;;;;;;;;;;;;;;6793:105;;;;;;;-1:-1:-1;;;;;6793:105:14;;;;;;;;;;-1:-1:-1;;7077:13:14;6979:2;7077:13;7071:20;;6642:488::o;1244:3897:15:-;1394:2;1385:6;:11;1381:3754;;;1683:1;1673:6;1669:2;1665:15;1660:3;1656:25;1652:33;1734:4;1730:9;1721:6;1715:13;1711:29;1783:4;1776;1770:11;1766:22;1824:1;1821;1818:8;1812:4;1805:22;1622:219;;;;;;1945:4;1935:6;:14;1931:59;;;1969:7;;1931:59;2679:4;2670:6;:13;2666:2459;;;2829:2;2821:6;2817:15;3125:2;3117:6;3113:15;3103:25;;3173:6;3165;3161:19;3223:6;3217:4;3213:17;3530:4;3524:11;3625:1;3611:219;3634:6;3631:1;3628:13;3611:219;;;3698:13;;3685:27;;3759:2;3795:13;;;;3747:15;;;;3655:1;3648:9;3611:219;;;-1:-1:-1;3899:18:15;;-1:-1:-1;2712:1223:15;;-1:-1:-1;2712:1223:15;;4099:2;4091:6;4087:15;4300:2;4292:6;4288:15;4278:25;;4348:6;4340;4336:19;4398:6;4392:4;4388:17;4708:6;4702:13;4805:1;4791:213;4814:6;4811:1;4808:13;4791:213;;;4878:11;;4865:25;;-1:-1:-1;;4923:13:15;;;;4969;;;;4835:1;4828:9;4791:213;;;-1:-1:-1;5074:19:15;;-1:-1:-1;;;3982:1129:15;1244:3897;;;:::o;744:1407:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:118:-1;;72:46;110:6;97:20;72:46;;148:707;;258:4;246:17;;242:27;-1:-1;232:2;;283:1;280;273:12;232:2;320:6;307:20;342:80;357:64;414:6;357:64;;;342:80;;;333:89;;439:5;464:6;457:5;450:21;494:4;486:6;482:17;472:27;;516:4;511:3;507:14;500:21;;569:6;616:3;608:4;600:6;596:17;591:3;587:27;584:36;581:2;;;633:1;630;623:12;581:2;658:1;643:206;668:6;665:1;662:13;643:206;;;726:3;748:37;781:3;769:10;748:37;;;736:50;;-1:-1;809:4;800:14;;;;828;;;;;690:1;683:9;643:206;;;647:14;225:630;;;;;;;;879:693;;994:4;982:17;;978:27;-1:-1;968:2;;1019:1;1016;1009:12;968:2;1056:6;1043:20;1078:85;1093:69;1155:6;1093:69;;1078:85;1191:21;;;1235:4;1223:17;;;;1069:94;;-1:-1;1248:14;;1223:17;1343:1;1328:238;1353:6;1350:1;1347:13;1328:238;;;1436:3;1423:17;1415:6;1411:30;1460:42;1498:3;1486:10;1460:42;;;1448:55;;-1:-1;1526:4;1517:14;;;;1545;;;;;1375:1;1368:9;1328:238;;1598:707;;1708:4;1696:17;;1692:27;-1:-1;1682:2;;1733:1;1730;1723:12;1682:2;1770:6;1757:20;1792:80;1807:64;1864:6;1807:64;;1792:80;1783:89;;1889:5;1914:6;1907:5;1900:21;1944:4;1936:6;1932:17;1922:27;;1966:4;1961:3;1957:14;1950:21;;2019:6;2066:3;2058:4;2050:6;2046:17;2041:3;2037:27;2034:36;2031:2;;;2083:1;2080;2073:12;2031:2;2108:1;2093:206;2118:6;2115:1;2112:13;2093:206;;;2176:3;2198:37;2231:3;2219:10;2198:37;;;2186:50;;-1:-1;2259:4;2250:14;;;;2278;;;;;2140:1;2133:9;2093:206;;2327:335;;;2434:4;2422:17;;2418:27;-1:-1;2408:2;;2459:1;2456;2449:12;2408:2;-1:-1;2479:20;;2519:18;2508:30;;2505:2;;;2551:1;2548;2541:12;2505:2;2585:4;2577:6;2573:17;2561:29;;2635:3;2628;2620:6;2616:16;2606:8;2602:31;2599:40;2596:2;;;2652:1;2649;2642:12;2596:2;2401:261;;;;;;2671:432;;2761:4;2749:17;;2745:27;-1:-1;2735:2;;2786:1;2783;2776:12;2735:2;2823:6;2810:20;2845:60;2860:44;2897:6;2860:44;;2845:60;2836:69;;2925:6;2918:5;2911:21;2961:4;2953:6;2949:17;2994:4;2987:5;2983:16;3029:3;3020:6;3015:3;3011:16;3008:25;3005:2;;;3046:1;3043;3036:12;3005:2;3056:41;3090:6;3085:3;3080;3056:41;;;2728:375;;;;;;;;3560:118;;3627:46;3665:6;3652:20;3627:46;;3685:241;;3789:2;3777:9;3768:7;3764:23;3760:32;3757:2;;;3805:1;3802;3795:12;3757:2;3840:1;3857:53;3902:7;3882:9;3857:53;;;3847:63;3751:175;-1:-1;;;;3751:175;3933:366;;;4054:2;4042:9;4033:7;4029:23;4025:32;4022:2;;;4070:1;4067;4060:12;4022:2;4105:1;4122:53;4167:7;4147:9;4122:53;;;4112:63;;4084:97;4212:2;4230:53;4275:7;4266:6;4255:9;4251:22;4230:53;;;4220:63;;4191:98;4016:283;;;;;;4306:1171;;;;;4566:3;4554:9;4545:7;4541:23;4537:33;4534:2;;;4583:1;4580;4573:12;4534:2;4618:31;;4669:18;4658:30;;4655:2;;;4701:1;4698;4691:12;4655:2;4721:83;4796:7;4787:6;4776:9;4772:22;4721:83;;;4711:93;;4597:213;4869:2;4858:9;4854:18;4841:32;4893:18;4885:6;4882:30;4879:2;;;4925:1;4922;4915:12;4879:2;4945:78;5015:7;5006:6;4995:9;4991:22;4945:78;;;4935:88;;4820:209;5088:2;5077:9;5073:18;5060:32;5112:18;5104:6;5101:30;5098:2;;;5144:1;5141;5134:12;5098:2;5164:78;5234:7;5225:6;5214:9;5210:22;5164:78;;;5154:88;;5039:209;5307:2;5296:9;5292:18;5279:32;5331:18;5323:6;5320:30;5317:2;;;5363:1;5360;5353:12;5317:2;5383:78;5453:7;5444:6;5433:9;5429:22;5383:78;;;5373:88;;5258:209;4528:949;;;;;;;;5484:741;;;;;;5658:3;5646:9;5637:7;5633:23;5629:33;5626:2;;;5675:1;5672;5665:12;5626:2;5710:31;;5761:18;5750:30;;5747:2;;;5793:1;5790;5783:12;5747:2;5821:64;5877:7;5868:6;5857:9;5853:22;5821:64;;;5803:82;;;;5689:202;5922:2;5940:53;5985:7;5976:6;5965:9;5961:22;5940:53;;;5930:63;;5901:98;6030:2;6048:53;6093:7;6084:6;6073:9;6069:22;6048:53;;;6038:63;;6009:98;6138:2;6156:53;6201:7;6192:6;6181:9;6177:22;6156:53;;;6146:63;;6117:98;5620:605;;;;;;;;;6232:345;;6345:2;6333:9;6324:7;6320:23;6316:32;6313:2;;;6361:1;6358;6351:12;6313:2;6396:31;;6447:18;6436:30;;6433:2;;;6479:1;6476;6469:12;6433:2;6499:62;6553:7;6544:6;6533:9;6529:22;6499:62;;6584:241;;6688:2;6676:9;6667:7;6663:23;6659:32;6656:2;;;6704:1;6701;6694:12;6656:2;6739:1;6756:53;6801:7;6781:9;6756:53;;6832:110;6905:31;6930:5;6905:31;;;6900:3;6893:44;6887:55;;;6980:590;;7115:54;7163:5;7115:54;;;7187:6;7182:3;7175:19;7211:4;7206:3;7202:14;7195:21;;7256:56;7306:5;7256:56;;;7333:1;7318:230;7343:6;7340:1;7337:13;7318:230;;;7383:53;7432:3;7423:6;7417:13;7383:53;;;7453:60;7506:6;7453:60;;;7536:4;7527:14;;;;;7443:70;-1:-1;7365:1;7358:9;7318:230;;;-1:-1;7561:3;;7094:476;-1:-1;;;;7094:476;7578:101;7645:28;7667:5;7645:28;;7686:297;;7786:38;7818:5;7786:38;;;7841:6;7836:3;7829:19;7853:63;7909:6;7902:4;7897:3;7893:14;7886:4;7879:5;7875:16;7853:63;;;7948:29;7970:6;7948:29;;;7928:50;;;7941:4;7928:50;;7766:217;-1:-1;;;7766:217;8290:397;8445:2;8433:15;;8482:66;8477:2;8468:12;;8461:88;8583:66;8578:2;8569:12;;8562:88;8678:2;8669:12;;8426:261;8695:110;8768:31;8793:5;8768:31;;8812:104;8881:29;8904:5;8881:29;;8923:193;9031:2;9016:18;;9045:61;9020:9;9079:6;9045:61;;9123:395;9287:2;9272:18;;9301:61;9276:9;9335:6;9301:61;;;9373:62;9431:2;9420:9;9416:18;9407:6;9373:62;;;9446;9504:2;9493:9;9489:18;9480:6;9446:62;;9525:581;9735:3;9720:19;;9750:61;9724:9;9784:6;9750:61;;;9822:62;9880:2;9869:9;9865:18;9856:6;9822:62;;;9895;9953:2;9942:9;9938:18;9929:6;9895:62;;;10005:9;9999:4;9995:20;9990:2;9979:9;9975:18;9968:48;10030:66;10091:4;10082:6;10030:66;;;10022:74;9706:400;-1:-1;;;;;;9706:400;10113:341;10271:2;10285:47;;;10256:18;;10346:98;10256:18;10430:6;10346:98;;10461:181;10563:2;10548:18;;10577:55;10552:9;10605:6;10577:55;;10649:273;10773:2;10787:47;;;10758:18;;10848:64;10758:18;10898:6;10848:64;;10929:387;11110:2;11124:47;;;11095:18;;11185:121;11095:18;11185:121;;11323:185;11427:2;11412:18;;11441:57;11416:9;11471:6;11441:57;;11515:286;11647:2;11632:18;;11661:57;11636:9;11691:6;11661:57;;;11729:62;11787:2;11776:9;11772:18;11763:6;11729:62;;11808:573;12014:3;11999:19;;12029:57;12003:9;12059:6;12029:57;;12388:256;12450:2;12444:9;12476:17;;;12551:18;12536:34;;12572:22;;;12533:62;12530:2;;;12608:1;12605;12598:12;12530:2;12624;12617:22;12428:216;;-1:-1;12428:216;12651:258;;12810:18;12802:6;12799:30;12796:2;;;12842:1;12839;12832:12;12796:2;-1:-1;12871:4;12859:17;;;12889:15;;12733:176;13451:254;;13590:18;13582:6;13579:30;13576:2;;;13622:1;13619;13612:12;13576:2;-1:-1;13695:4;13666;13643:17;;;;-1:-1;;13639:33;13685:15;;13513:192;13979:121;14088:4;14076:17;;14057:43;14109:107;14199:12;;14183:33;14547:128;-1:-1;;;;;14616:54;;14599:76;14682:92;14755:13;14748:21;;14731:43;14867:88;14945:4;14934:16;;14917:38;15184:145;15265:6;15260:3;15255;15242:30;-1:-1;15321:1;15303:16;;15296:27;15235:94;15338:268;15403:1;15410:101;15424:6;15421:1;15418:13;15410:101;;;15491:11;;;15485:18;15472:11;;;15465:39;15446:2;15439:10;15410:101;;;15526:6;15523:1;15520:13;15517:2;;;15591:1;15582:6;15577:3;15573:16;15566:27;15517:2;15387:219;;;;;15614:97;15702:2;15682:14;-1:-1;;15678:28;;15662:49"
}
}
},
"sources": {
"current/protocol/AssetProxy/ERC20Proxy.sol": {
"id": 0
},
"current/protocol/AssetProxy/ERC721Proxy.sol": {
"id": 1
},
"current/protocol/AssetProxy/MixinAssetProxy.sol": {
"id": 2
},
"current/protocol/AssetProxy/MixinAuthorizable.sol": {
"id": 3
},
"current/protocol/AssetProxy/interfaces/IAssetProxy.sol": {
"id": 4
},
"current/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
"id": 5
},
"current/protocol/AssetProxy/libs/LibAssetProxyErrors.sol": {
"id": 6
},
"current/protocol/AssetProxy/mixins/MAssetProxy.sol": {
"id": 7
},
"current/protocol/AssetProxy/mixins/MAuthorizable.sol": {
"id": 8
},
"current/test/TestAssetDataDecoders/TestAssetDataDecoders.sol": {
"id": 9
},
"current/tokens/ERC20Token/IERC20Token.sol": {
"id": 10
},
"current/tokens/ERC721Token/ERC721Token.sol": {
"id": 11
},
"current/tokens/ERC721Token/IERC721Receiver.sol": {
"id": 12
},
"current/tokens/ERC721Token/IERC721Token.sol": {
"id": 13
},
"current/utils/LibBytes/LibBytes.sol": {
"id": 14
},
"current/utils/LibMem/LibMem.sol": {
"id": 15
},
"current/utils/Ownable/IOwnable.sol": {
"id": 16
},
"current/utils/Ownable/Ownable.sol": {
"id": 17
},
"current/utils/SafeMath/SafeMath.sol": {
"id": 18
}
},
"sourceCodes": {
"current/protocol/AssetProxy/ERC20Proxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAssetProxy.sol\";\nimport \"./MixinAuthorizable.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\n\ncontract ERC20Proxy is\n LibBytes,\n MixinAssetProxy,\n MixinAuthorizable\n{\n\n // Id of this proxy.\n uint8 constant PROXY_ID = 1;\n\n /// @dev Internal version of `transferFrom`.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFromInternal(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Decode asset data.\n (\n uint8 proxyId,\n address token\n ) = decodeERC20AssetData(assetData);\n\n // Data must be intended for this proxy.\n require(\n proxyId == PROXY_ID,\n ASSET_PROXY_ID_MISMATCH\n );\n\n // Transfer tokens.\n bool success = IERC20Token(token).transferFrom(from, to, amount);\n require(\n success,\n TRANSFER_FAILED\n );\n }\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8)\n {\n return PROXY_ID;\n }\n\n /// @dev Decodes ERC20 Asset data.\n /// @param assetData Encoded byte array.\n /// @return proxyId Intended ERC20 proxy id.\n /// @return token ERC20 token address.\n function decodeERC20AssetData(bytes memory assetData)\n internal\n pure\n returns (\n uint8 proxyId,\n address token\n )\n {\n // Validate encoded data length\n uint256 length = assetData.length;\n require(\n length == 21,\n LENGTH_21_REQUIRED\n );\n\n // Decode data\n token = readAddress(assetData, 0);\n proxyId = uint8(assetData[length - 1]);\n\n return (proxyId, token);\n }\n}\n",
"current/protocol/AssetProxy/ERC721Proxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAssetProxy.sol\";\nimport \"./MixinAuthorizable.sol\";\nimport \"../../tokens/ERC721Token/ERC721Token.sol\";\n\ncontract ERC721Proxy is\n LibBytes,\n MixinAssetProxy,\n MixinAuthorizable\n{\n\n // Id of this proxy.\n uint8 constant PROXY_ID = 2;\n\n /// @dev Internal version of `transferFrom`.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFromInternal(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Decode asset data.\n (\n uint8 proxyId,\n address token,\n uint256 tokenId,\n bytes memory receiverData\n ) = decodeERC721AssetData(assetData);\n\n\n // Data must be intended for this proxy.\n require(\n proxyId == PROXY_ID,\n ASSET_PROXY_ID_MISMATCH\n );\n\n // There exists only 1 of each token.\n require(\n amount == 1,\n INVALID_AMOUNT\n );\n\n // Transfer token. Saves gas by calling safeTransferFrom only\n // when there is receiverData present. Either succeeds or throws.\n if(receiverData.length > 0) {\n ERC721Token(token).safeTransferFrom(from, to, tokenId, receiverData);\n } else {\n ERC721Token(token).transferFrom(from, to, tokenId);\n }\n }\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8)\n {\n return PROXY_ID;\n }\n\n /// @dev Decodes ERC721 Asset data.\n /// @param assetData Encoded byte array.\n /// @return proxyId Intended ERC721 proxy id.\n /// @return token ERC721 token address.\n /// @return tokenId ERC721 token id.\n /// @return receiverData Additional data with no specific format, which\n /// is passed to the receiving contract's onERC721Received.\n function decodeERC721AssetData(bytes memory assetData)\n internal\n pure\n returns (\n uint8 proxyId,\n address token,\n uint256 tokenId,\n bytes memory receiverData\n )\n {\n // Validate encoded data length\n uint256 length = assetData.length;\n require(\n length >= 53,\n LENGTH_AT_LEAST_53_REQUIRED\n );\n\n // Decode asset data.\n token = readAddress(assetData, 0);\n tokenId = readUint256(assetData, 20);\n if (length > 53) {\n receiverData = readBytes(assetData, 52);\n }\n proxyId = uint8(assetData[length - 1]);\n\n return (\n proxyId,\n token,\n tokenId,\n receiverData\n );\n }\n}\n",
"current/protocol/AssetProxy/MixinAssetProxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./mixins/MAuthorizable.sol\";\nimport \"./mixins/MAssetProxy.sol\";\n\ncontract MixinAssetProxy is\n MAuthorizable,\n MAssetProxy\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external\n onlyAuthorized\n {\n transferFromInternal(\n assetData,\n from,\n to,\n amount\n );\n }\n\n /// @dev Makes multiple transfers of assets. Either succeeds or throws.\n /// @param assetData Array of byte arrays encoded for the respective asset proxy.\n /// @param from Array of addresses to transfer assets from.\n /// @param to Array of addresses to transfer assets to.\n /// @param amounts Array of amounts of assets to transfer.\n function batchTransferFrom(\n bytes[] memory assetData,\n address[] memory from,\n address[] memory to,\n uint256[] memory amounts\n )\n public\n onlyAuthorized\n {\n for (uint256 i = 0; i < assetData.length; i++) {\n transferFromInternal(\n assetData[i],\n from[i],\n to[i],\n amounts[i]\n );\n }\n }\n}\n",
"current/protocol/AssetProxy/MixinAuthorizable.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibAssetProxyErrors.sol\";\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"./mixins/MAuthorizable.sol\";\n\ncontract MixinAuthorizable is\n LibAssetProxyErrors,\n Ownable,\n MAuthorizable\n{\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n require(\n authorized[msg.sender],\n SENDER_NOT_AUTHORIZED\n );\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n !authorized[target],\n TARGET_ALREADY_AUTHORIZED\n );\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n authorized[target],\n TARGET_NOT_AUTHORIZED\n );\n\n delete authorized[target];\n for (uint i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n authorities[i] = authorities[authorities.length - 1];\n authorities.length -= 1;\n break;\n }\n }\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n {\n require(\n index < authorities.length,\n INDEX_OUT_OF_BOUNDS\n );\n require(\n authorities[index] == target,\n AUTHORIZED_ADDRESS_MISMATCH\n );\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.length -= 1;\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory)\n {\n return authorities;\n }\n}\n",
"current/protocol/AssetProxy/interfaces/IAssetProxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./IAuthorizable.sol\";\n\ncontract IAssetProxy is\n IAuthorizable\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external;\n \n /// @dev Makes multiple transfers of assets. Either succeeds or throws.\n /// @param assetData Array of byte arrays encoded for the respective asset proxy.\n /// @param from Array of addresses to transfer assets from.\n /// @param to Array of addresses to transfer assets to.\n /// @param amounts Array of amounts of assets to transfer.\n function batchTransferFrom(\n bytes[] memory assetData,\n address[] memory from,\n address[] memory to,\n uint256[] memory amounts\n )\n public;\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n view\n returns (uint8);\n}\n\n",
"current/protocol/AssetProxy/interfaces/IAuthorizable.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[]);\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n}\n",
"current/protocol/AssetProxy/libs/LibAssetProxyErrors.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibAssetProxyErrors {\n /// Authorizable errors ///\n string constant SENDER_NOT_AUTHORIZED = \"SENDER_NOT_AUTHORIZED\"; // Sender not authorized to call this method.\n string constant TARGET_NOT_AUTHORIZED = \"TARGET_NOT_AUTHORIZED\"; // Target address not authorized to call this method.\n string constant TARGET_ALREADY_AUTHORIZED = \"TARGET_ALREADY_AUTHORIZED\"; // Target address must not already be authorized.\n string constant INDEX_OUT_OF_BOUNDS = \"INDEX_OUT_OF_BOUNDS\"; // Specified array index is out of bounds.\n string constant AUTHORIZED_ADDRESS_MISMATCH = \"AUTHORIZED_ADDRESS_MISMATCH\"; // Address at index does not match given target address.\n\n /// AssetProxy errors ///\n string constant ASSET_PROXY_ID_MISMATCH = \"ASSET_PROXY_ID_MISMATCH\"; // Proxy id in metadata does not match this proxy id.\n string constant INVALID_AMOUNT = \"INVALID_AMOUNT\"; // Transfer amount must equal 1.\n string constant TRANSFER_FAILED = \"TRANSFER_FAILED\"; // Transfer failed.\n\n /// Length validation errors ///\n string constant LENGTH_21_REQUIRED = \"LENGTH_21_REQUIRED\"; // Byte array must have a length of 21.\n string constant LENGTH_AT_LEAST_53_REQUIRED = \"LENGTH_AT_LEAST_53_REQUIRED\"; // Byte array must have a length of at least 53.\n}\n",
"current/protocol/AssetProxy/mixins/MAssetProxy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../interfaces/IAssetProxy.sol\";\n\ncontract MAssetProxy is\n IAssetProxy\n{\n\n /// @dev Internal version of `transferFrom`.\n /// @param assetData Encoded byte array.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFromInternal(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal;\n}\n",
"current/protocol/AssetProxy/mixins/MAuthorizable.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../interfaces/IAuthorizable.sol\";\n\ncontract MAuthorizable is\n IAuthorizable\n{\n\n // Event logged when a new address is authorized.\n event AuthorizedAddressAdded(\n address indexed target,\n address indexed caller\n );\n\n // Event logged when a currently authorized address is unauthorized.\n event AuthorizedAddressRemoved(\n address indexed target,\n address indexed caller\n );\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized { revert(); _; }\n}\n",
"current/test/TestAssetDataDecoders/TestAssetDataDecoders.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/AssetProxy/ERC20Proxy.sol\";\nimport \"../../protocol/AssetProxy/ERC721Proxy.sol\";\n\ncontract TestAssetDataDecoders is\n ERC20Proxy,\n ERC721Proxy\n{\n\n /// @dev Decodes ERC20 Asset data.\n /// @param assetData Encoded byte array.\n /// @return proxyId Intended ERC20 proxy id.\n /// @return token ERC20 token address.\n function publicDecodeERC20Data(bytes memory assetData)\n public\n pure\n returns (\n uint8 proxyId,\n address token\n )\n {\n (proxyId, token) = decodeERC20AssetData(assetData);\n return (proxyId, token);\n }\n\n /// @dev Decodes ERC721 Asset data.\n /// @param assetData Encoded byte array.\n /// @return proxyId Intended ERC721 proxy id.\n /// @return token ERC721 token address.\n /// @return tokenId ERC721 token id.\n /// @return receiverData Additional data with no specific format, which\n /// is passed to the receiving contract's onERC721Received.\n function publicDecodeERC721Data(bytes memory assetData)\n public\n pure\n returns (\n uint8 proxyId,\n address token,\n uint256 tokenId,\n bytes memory receiverData\n )\n {\n (\n proxyId,\n token,\n tokenId,\n receiverData\n ) = decodeERC721AssetData(assetData);\n\n return (\n proxyId,\n token,\n tokenId,\n receiverData\n );\n }\n}\n",
"current/tokens/ERC20Token/IERC20Token.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\ncontract IERC20Token {\n\n /// @notice send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n public\n returns (bool);\n\n /// @notice send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool);\n \n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n public\n returns (bool);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner)\n public view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n public view\n returns (uint256);\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n \n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n}\n",
"current/tokens/ERC721Token/ERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\nimport \"./IERC721Token.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"../../utils/SafeMath/SafeMath.sol\";\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic implementation\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721BasicToken.sol\n */\ncontract ERC721Token is\n IERC721Token,\n SafeMath\n{\n // Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;\n\n // Mapping from token ID to owner\n mapping (uint256 => address) internal tokenOwner;\n\n // Mapping from token ID to approved address\n mapping (uint256 => address) internal tokenApprovals;\n\n // Mapping from owner to number of owned token\n mapping (address => uint256) internal ownedTokensCount;\n\n // Mapping from owner to operator approvals\n mapping (address => mapping (address => bool)) internal operatorApprovals;\n\n /**\n * @dev Guarantees msg.sender is owner of the given token\n * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender\n */\n modifier onlyOwnerOf(uint256 _tokenId) {\n require(ownerOf(_tokenId) == msg.sender);\n _;\n }\n\n /**\n * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator\n * @param _tokenId uint256 ID of the token to validate\n */\n modifier canTransfer(uint256 _tokenId) {\n require(isApprovedOrOwner(msg.sender, _tokenId));\n _;\n }\n\n function ERC721Token(\n string _name,\n string _symbol)\n public\n {\n name_ = _name;\n symbol_ = _symbol;\n }\n\n /**\n * @dev Gets the token name\n * @return string representing the token name\n */\n function name()\n public\n view\n returns (string)\n {\n return name_;\n }\n\n /**\n * @dev Gets the token symbol\n * @return string representing the token symbol\n */\n function symbol()\n public\n view\n returns (string)\n {\n return symbol_;\n }\n\n /**\n * @dev Gets the balance of the specified address\n * @param _owner address to query the balance of\n * @return uint256 representing the amount owned by the passed address\n */\n function balanceOf(address _owner)\n public\n view\n returns (uint256)\n {\n require(_owner != address(0));\n return ownedTokensCount[_owner];\n }\n\n /**\n * @dev Gets the owner of the specified token ID\n * @param _tokenId uint256 ID of the token to query the owner of\n * @return owner address currently marked as the owner of the given token ID\n */\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address)\n {\n address owner = tokenOwner[_tokenId];\n require(owner != address(0));\n return owner;\n }\n\n /**\n * @dev Returns whether the specified token exists\n * @param _tokenId uint256 ID of the token to query the existance of\n * @return whether the token exists\n */\n function exists(uint256 _tokenId)\n public\n view\n returns (bool)\n {\n address owner = tokenOwner[_tokenId];\n return owner != address(0);\n }\n\n /**\n * @dev Approves another address to transfer the given token ID\n * @dev The zero address indicates there is no approved address.\n * @dev There can only be one approved address per token at a given time.\n * @dev Can only be called by the token owner or an approved operator.\n * @param _to address to be approved for the given token ID\n * @param _tokenId uint256 ID of the token to be approved\n */\n function approve(address _to, uint256 _tokenId)\n public\n {\n address owner = ownerOf(_tokenId);\n require(_to != owner);\n require(msg.sender == owner || isApprovedForAll(owner, msg.sender));\n\n if (getApproved(_tokenId) != address(0) || _to != address(0)) {\n tokenApprovals[_tokenId] = _to;\n emit Approval(owner, _to, _tokenId);\n }\n }\n\n /**\n * @dev Gets the approved address for a token ID, or zero if no address set\n * @param _tokenId uint256 ID of the token to query the approval of\n * @return address currently approved for a the given token ID\n */\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address)\n {\n return tokenApprovals[_tokenId];\n }\n\n /**\n * @dev Sets or unsets the approval of a given operator\n * @dev An operator is allowed to transfer all tokens of the sender on their behalf\n * @param _to operator address to set the approval\n * @param _approved representing the status of the approval to be set\n */\n function setApprovalForAll(address _to, bool _approved)\n public\n {\n require(_to != msg.sender);\n operatorApprovals[msg.sender][_to] = _approved;\n emit ApprovalForAll(msg.sender, _to, _approved);\n }\n\n /**\n * @dev Tells whether an operator is approved by a given owner\n * @param _owner owner address which you want to query the approval of\n * @param _operator operator address which you want to query the approval of\n * @return bool whether the given operator is approved by the given owner\n */\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool)\n {\n return operatorApprovals[_owner][_operator];\n }\n\n /**\n * @dev Transfers the ownership of a given token ID to another address\n * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function transferFrom(address _from, address _to, uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n require(_from != address(0));\n require(_to != address(0));\n\n clearApproval(_from, _tokenId);\n removeTokenFrom(_from, _tokenId);\n addTokenTo(_to, _tokenId);\n\n emit Transfer(_from, _to, _tokenId);\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n // solium-disable-next-line arg-overflow\n safeTransferFrom(_from, _to, _tokenId, \"\");\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes data to send along with a safe transfer check\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n public\n canTransfer(_tokenId)\n {\n transferFrom(_from, _to, _tokenId);\n // solium-disable-next-line arg-overflow\n require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));\n }\n\n /**\n * @dev Returns whether the given spender can transfer a given token ID\n * @param _spender address of the spender to query\n * @param _tokenId uint256 ID of the token to be transferred\n * @return bool whether the msg.sender is approved for the given token ID,\n * is an operator of the owner, or is the owner of the token\n */\n function isApprovedOrOwner(address _spender, uint256 _tokenId)\n internal\n view\n returns (bool)\n {\n address owner = ownerOf(_tokenId);\n return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);\n }\n\n /**\n * @dev Internal function to mint a new token\n * @dev Reverts if the given token ID already exists\n * @param _to The address that will own the minted token\n * @param _tokenId uint256 ID of the token to be minted by the msg.sender\n */\n function _mint(address _to, uint256 _tokenId)\n internal\n {\n require(_to != address(0));\n addTokenTo(_to, _tokenId);\n emit Transfer(address(0), _to, _tokenId);\n }\n\n /**\n * @dev Internal function to burn a specific token\n * @dev Reverts if the token does not exist\n * @param _tokenId uint256 ID of the token being burned by the msg.sender\n */\n function _burn(address _owner, uint256 _tokenId)\n internal\n {\n clearApproval(_owner, _tokenId);\n removeTokenFrom(_owner, _tokenId);\n emit Transfer(_owner, address(0), _tokenId);\n }\n\n /**\n * @dev Internal function to clear current approval of a given token ID\n * @dev Reverts if the given address is not indeed the owner of the token\n * @param _owner owner of the token\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function clearApproval(address _owner, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _owner);\n if (tokenApprovals[_tokenId] != address(0)) {\n tokenApprovals[_tokenId] = address(0);\n emit Approval(_owner, address(0), _tokenId);\n }\n }\n\n /**\n * @dev Internal function to add a token ID to the list of a given address\n * @param _to address representing the new owner of the given token ID\n * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address\n */\n function addTokenTo(address _to, uint256 _tokenId)\n internal\n {\n require(tokenOwner[_tokenId] == address(0));\n tokenOwner[_tokenId] = _to;\n ownedTokensCount[_to] = safeAdd(ownedTokensCount[_to], 1);\n }\n\n /**\n * @dev Internal function to remove a token ID from the list of a given address\n * @param _from address representing the previous owner of the given token ID\n * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address\n */\n function removeTokenFrom(address _from, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _from);\n ownedTokensCount[_from] = safeSub(ownedTokensCount[_from], 1);\n tokenOwner[_tokenId] = address(0);\n }\n\n /**\n * @dev Internal function to invoke `onERC721Received` on a target address\n * @dev The call is not executed if the target address is not a contract\n * @param _from address representing the previous owner of the given token ID\n * @param _to target address that will receive the tokens\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes optional data to send along with the call\n * @return whether the call correctly returned the expected magic value\n */\n function checkAndCallSafeTransfer(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n internal\n returns (bool)\n {\n if (!isContract(_to)) {\n return true;\n }\n bytes4 retval = IERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);\n return (retval == ERC721_RECEIVED);\n }\n\n function isContract(address addr)\n internal\n view\n returns (bool)\n {\n uint256 size;\n // XXX Currently there is no better way to check if there is a contract in an address\n // than to check the size of the code at that address.\n // See https://ethereum.stackexchange.com/a/14016/36603\n // for more details about how this works.\n // TODO Check this again before the Serenity release, because all addresses will be\n // contracts then.\n assembly { size := extcodesize(addr) } // solium-disable-line security/no-inline-assembly\n return size > 0;\n }\n}\n",
"current/tokens/ERC721Token/IERC721Receiver.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * rom ERC721 asset contracts.\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Receiver.sol\n */\ncontract IERC721Receiver {\n /**\n * @dev Magic value to be returned upon successful reception of an NFT\n * Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`,\n * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n */\n bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;\n\n /**\n * @notice Handle the receipt of an NFT\n * @dev The ERC721 smart contract calls this function on the recipient\n * after a `safetransfer`. This function MAY throw to revert and reject the\n * transfer. This function MUST use 50,000 gas or less. Return of other\n * than the magic value MUST result in the transaction being reverted.\n * Note: the contract address is always the message sender.\n * @param _from The sending address\n * @param _tokenId The NFT identifier which is being transfered\n * @param _data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n */\n function onERC721Received(\n address _from,\n uint256 _tokenId,\n bytes _data)\n public\n returns (bytes4);\n}\n",
"current/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity ^0.4.24;\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n string internal name_;\n string internal symbol_;\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _tokenId\n );\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 _tokenId\n );\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n function name()\n public\n view\n returns (string);\n function symbol()\n public\n view\n returns (string);\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256 _balance);\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address _owner);\n function exists(uint256 _tokenId)\n public\n view\n returns (bool _exists);\n\n function approve(address _to, uint256 _tokenId)\n public;\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address _operator);\n\n function setApprovalForAll(address _operator, bool _approved)\n public;\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public;\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public;\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n public;\n}\n",
"current/utils/LibBytes/LibBytes.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\nimport \"../LibMem/LibMem.sol\";\n\ncontract LibBytes is\n LibMem\n{\n\n // Revert reasons\n string constant GREATER_THAN_ZERO_LENGTH_REQUIRED = \"GREATER_THAN_ZERO_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\";\n string constant GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED = \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\";\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n GREATER_THAN_ZERO_LENGTH_REQUIRED\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popAddress(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function areBytesEqual(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n assembly {\n // Get the number of words occupied by <lhs>\n let lenFullWords := div(add(mload(lhs), 0x1F), 0x20)\n\n // Add 1 to the number of words, to account for the length field\n lenFullWords := add(lenFullWords, 0x1)\n\n // Test equality word-by-word.\n // Terminates early if there is a mismatch.\n for {let i := 0} lt(i, lenFullWords) {i := add(i, 1)} {\n let lhsWord := mload(add(lhs, mul(i, 0x20)))\n let rhsWord := mload(add(rhs, mul(i, 0x20)))\n equal := eq(lhsWord, rhsWord)\n if eq(equal, 0) {\n // Break\n i := lenFullWords\n }\n }\n }\n\n return equal;\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(mload(add(b, index)), 0xffffffffffffffffffffffff0000000000000000000000000000000000000000)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads the first 4 bytes from a byte array of arbitrary length.\n /// @param b Byte array to read first 4 bytes from.\n /// @return First 4 bytes of data.\n function readFirst4(bytes memory b)\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= 4,\n GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\n );\n assembly {\n result := mload(add(b, 32))\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytes(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n );\n\n // Allocate memory and copy value to result\n result = new bytes(nestedBytesLength);\n memCopy(\n getMemAddress(result) + 32, // +32 skips array length\n getMemAddress(b) + index + 32,\n nestedBytesLength\n );\n\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytes(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 /* 32 bytes to store length */ + input.length,\n GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\n );\n\n // Copy <input> into <b>\n memCopy(\n getMemAddress(b) + 32 + index, // +32 to skip length of <b>\n getMemAddress(input), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n}\n",
"current/utils/LibMem/LibMem.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity ^0.4.24;\n\ncontract LibMem\n{\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array.\n function getMemAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // Record the total number of full words to copy\n let nWords := div(length, 32)\n\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n\n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // Record the total number of full words to copy\n let nWords := div(length, 32)\n\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n for {let i := 0} lt(i, nWords) {i := add(i, 1)} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n\n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n}\n",
"current/utils/Ownable/IOwnable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
"current/utils/Ownable/Ownable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Only contract owner is allowed to call this method.\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
"current/utils/SafeMath/SafeMath.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\ncontract SafeMath {\n function safeMul(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a * b;\n assert(a == 0 || c / a == b);\n return c;\n }\n\n function safeDiv(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a / b;\n return c;\n }\n\n function safeSub(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n assert(b <= a);\n return a - b;\n }\n\n function safeAdd(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a + b;\n assert(c >= a);\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
},
"sourceTreeHashHex": "0xd0b6951ec31c9ab1840a9808109ac60562e4c6145d89ea1eb0d55044d63814d1",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap"
]
}
}
}
},
"networks": {}
}