{
    "schemaVersion": "2.0.0",
    "contractName": "ZeroExV2SubContract",
    "compilerOutput": {
        "abi": [
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "bytes",
                        "name": "data",
                        "type": "bytes"
                    }
                ],
                "name": "isValid",
                "outputs": [
                    {
                        "internalType": "bool",
                        "name": "",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "bytes",
                        "name": "data",
                        "type": "bytes"
                    }
                ],
                "name": "amountRemaining",
                "outputs": [
                    {
                        "internalType": "uint256",
                        "name": "",
                        "type": "uint256"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "arguments",
                "outputs": [
                    {
                        "internalType": "string",
                        "name": "",
                        "type": "string"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "bytes",
                        "name": "data",
                        "type": "bytes"
                    }
                ],
                "name": "participate",
                "outputs": [
                    {
                        "internalType": "bool",
                        "name": "",
                        "type": "bool"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "inputs": [
                    {
                        "internalType": "string",
                        "name": "args",
                        "type": "string"
                    },
                    {
                        "internalType": "address",
                        "name": "exchangeAddress",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "proxyAddress",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "constructor"
            }
        ],
        "devdoc": {
            "author": "Freydal",
            "details": "Implementation of a SubContract that forwards kosu orders with 0x resolution to the 0x exchange contract.",
            "methods": {
                "amountRemaining(bytes)": {
                    "details": "De-serializes kosu order data to 0x order and checks remaining fillable tokens.",
                    "params": {
                        "data": "Kosu order data serialized with arguments."
                    },
                    "return": "Tokens remaining to fill."
                },
                "arguments()": {
                    "details": "The arguments used to serialize kosu orders into values to generate the 0x exchange transaction.",
                    "return": "String encoded JSON object used to encode contract input."
                },
                "constructor": {
                    "details": "Initialize subContract with arguments json 0x Exchange address and the 0x erc20 proxy address.",
                    "params": {
                        "args": "The arguments json string.",
                        "exchangeAddress": "The 0x deployed exchange address.",
                        "proxyAddress": "The 0x deployed erc20 proxy address."
                    }
                },
                "isValid(bytes)": {
                    "details": "De-serializes kosu order data to 0x order and checks validity.",
                    "params": {
                        "data": "Kosu order data serialized with arguments."
                    },
                    "return": "Validity of order."
                },
                "participate(bytes)": {
                    "details": "De-serializes ksou order data to 0x order and submits to the 0x exchange for final resolution. Finalizes by forwarding along any successfully exchanged tokens.",
                    "params": {
                        "data": "Kosu order data serialized with arguments."
                    },
                    "return": "Fill success."
                }
            },
            "title": "ZeroExV2SubContract"
        },
        "evm": {
            "bytecode": {
                "linkReferences": {},
                "object": "0x6080604052604051620000129062000212565b6040519081900390206003805463ffffffff191660e09290921c9190911790553480156200003f57600080fd5b50604051620012f8380380620012f8833981016040819052620000629162000150565b825162000077906002906020860190620000ab565b50600080546001600160a01b039384166001600160a01b0319918216179091556001805492909316911617905550620002ae565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000ee57805160ff19168380011785556200011e565b828001600101855582156200011e579182015b828111156200011e57825182559160200191906001019062000101565b506200012c92915062000130565b5090565b6200014d91905b808211156200012c576000815560010162000137565b90565b60008060006060848603121562000165578283fd5b83516001600160401b03808211156200017c578485fd5b81860187601f8201126200018e578586fd5b80519250818311156200019f578586fd5b620001b4601f8401601f19166020016200023b565b9150828252876020848301011115620001cb578586fd5b620001de83602084016020840162000262565b5080945050506020840151620001f48162000295565b6040850151909250620002078162000295565b809150509250925092565b7f4552433230546f6b656e28616464726573732900000000000000000000000000815260130190565b6040518181016001600160401b03811182821017156200025a57600080fd5b604052919050565b60005b838110156200027f57818101518382015260200162000265565b838111156200028f576000848401525b50505050565b6001600160a01b0381168114620002ab57600080fd5b50565b61103a80620002be6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630a03e738146100515780635b2ac04a1461007a5780637528de0d1461009a578063d7d49123146100af575b600080fd5b61006461005f366004610b93565b6100c2565b6040516100719190610e07565b60405180910390f35b61008d610088366004610b93565b6101a5565b6040516100719190610fc7565b6100a261028e565b6040516100719190610e12565b6100646100bd366004610b93565b610321565b60006100cc610a9d565b61010b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061086a92505050565b9050610115610b22565b60005460405163c75e0a8160e01b81526001600160a01b039091169063c75e0a8190610145908590600401610f89565b60606040518083038186803b15801561015d57600080fd5b505afa158015610171573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101959190810190610c52565b5160ff1660031495945050505050565b60006101af610a9d565b6101ee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061086a92505050565b90506101f8610b22565b60005460405163c75e0a8160e01b81526001600160a01b039091169063c75e0a8190610228908590600401610f89565b60606040518083038186803b15801561024057600080fd5b505afa158015610254573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506102789190810190610c52565b6040015160a09092015191909103949350505050565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103175780601f106102ec57610100808354040283529160200191610317565b820191906000526020600020905b8154815290600101906020018083116102fa57829003601f168201915b5050505050905090565b600061032b610a9d565b61036a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061086a92505050565b905060006103b961019a86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff6109b6169050565b905060006104086101ae87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff6109be169050565b90506001600160a01b038216321461043b5760405162461bcd60e51b815260040161043290610ef0565b60405180910390fd5b60035461014084015160e09190911b6001600160e01b0319169061046b9061046690600060046109c6565b610a50565b6001600160e01b031916146104925760405162461bcd60e51b815260040161043290610e5c565b60035461016084015160e09190911b6001600160e01b031916906104bd9061046690600060046109c6565b6001600160e01b031916146104e45760405162461bcd60e51b815260040161043290610e25565b6101408301516000906104fe90601063ffffffff6109b616565b9050600061051b60108661016001516109b690919063ffffffff16565b6040516323b872dd60e01b81529091506001600160a01b038216906323b872dd9061054e90879030908890600401610dca565b602060405180830381600087803b15801561056857600080fd5b505af115801561057c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105a09190810190610b6a565b5060015460405163095ea7b360e01b81526001600160a01b038381169263095ea7b3926105d592909116908790600401610dee565b602060405180830381600087803b1580156105ef57600080fd5b505af1158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106279190810190610b6a565b50610630610b42565b600054604080516020601f8c018190048102820181019092528a81526001600160a01b039092169163b4be83d5918991889161068791908f908f9081908401838280828437600092019190915250610a6c92505050565b6040518463ffffffff1660e01b81526004016106a593929190610f9c565b608060405180830381600087803b1580156106bf57600080fd5b505af11580156106d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106f79190810190610bfd565b80519091501561079d57805160405163a9059cbb60e01b81526001600160a01b0385169163a9059cbb9161072f918991600401610dee565b602060405180830381600087803b15801561074957600080fd5b505af115801561075d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107819190810190610b6a565b61079d5760405162461bcd60e51b815260040161043290610e93565b838160200151101561085b57816001600160a01b031663a9059cbb866107d0846020015188610a8890919063ffffffff16565b6040518363ffffffff1660e01b81526004016107ed929190610dee565b602060405180830381600087803b15801561080757600080fd5b505af115801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061083f9190810190610b6a565b61085b5760405162461bcd60e51b815260040161043290610f35565b50600198975050505050505050565b610872610a9d565b6040805161018081019091528061089084600063ffffffff6109b616565b6001600160a01b031681526020016108af84601463ffffffff6109b616565b6001600160a01b031681526020016108ce84602863ffffffff6109b616565b6001600160a01b031681526020016108ed84603c63ffffffff6109b616565b6001600160a01b0316815260200161090c84605063ffffffff6109be16565b815260200161092284607063ffffffff6109be16565b815260200161093884609063ffffffff6109be16565b815260200161094e8460b063ffffffff6109be16565b81526020016109648460d063ffffffff6109be16565b815260200161097a8460f063ffffffff6109be16565b815260200161099384610110602463ffffffff6109c616565b81526020016109ac84610134602463ffffffff6109c616565b905290505b919050565b016014015190565b016020015190565b606080826040519080825280601f01601f1916602001820160405280156109f4576020820181803883390190505b509050835b848401811015610a4757858181518110610a0f57fe5b602001015160f81c60f81b8286830381518110610a2857fe5b60200101906001600160f81b031916908160001a9053506001016109f9565b50949350505050565b6000815160001415610a64575060006109b1565b506020015190565b6060610a8282610158604263ffffffff6109c616565b92915050565b600082821115610a9757600080fd5b50900390565b60405180610180016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600060208284031215610b7c57600080fd5b81518015158114610b8c57600080fd5b9392505050565b60008060208385031215610ba5578081fd5b823567ffffffffffffffff80821115610bbc578283fd5b81850186601f820112610bcd578384fd5b8035925081831115610bdd578384fd5b866020848301011115610bee578384fd5b60200196919550909350505050565b60006080828403128015610c1057600080fd5b8015610c1b57600080fd5b50610c266080610fd0565b825181526020830151602082015260408301516040820152606083015160608201528091505092915050565b60006060828403128015610c64578182fd5b8015610c6e578182fd5b50610c796060610fd0565b825160ff81168114610c89578283fd5b8152602083810151908201526040928301519281019290925250919050565b6001600160a01b03169052565b6000815180845260005b81811015610cdb57602081850181015186830182015201610cbf565b81811115610ced576000602083870101525b50601f01601f19169290920160200192915050565b6000610180610d12848451610ca8565b6020830151610d246020860182610ca8565b506040830151610d376040860182610ca8565b506060830151610d4a6060860182610ca8565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152610da383870182610cb5565b91505061016091508184015185820383870152610dc08282610cb5565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252610b8c6020830184610cb5565b6020808252601d908201527f54616b657220746f6b656e2061737365742069736e2774204552433230000000604082015260600190565b6020808252601d908201527f4d616b657220746f6b656e2061737365742069736e2774204552433230000000604082015260600190565b60208082526038908201527f4469646e2774207375636365737366756c6c7920666f7277617264206578636860408201527f616e67656420746f6b656e732e20526576657274696e672e0000000000000000606082015260800190565b60208082526025908201527f5468652074616b65722073686f756c642073656e6420746865207472616e736160408201526431ba34b7b760d91b606082015260800190565b60208082526034908201527f4469646e2774207375636365737366756c6c792072657475726e20657863657360408201527339903a37b5b2b73997102932bb32b93a34b7339760611b606082015260800190565b600060208252610b8c6020830184610d02565b600060608252610faf6060830186610d02565b8460208401528281036040840152610dc08185610cb5565b90815260200190565b60405181810167ffffffffffffffff81118282101715610fef57600080fd5b60405291905056fea365627a7a72315820dd79f6a1c2a0b84f571df06c0add6d41d8b3ee7f69ae3051ef5ba17452314b886c6578706572696d656e74616cf564736f6c634300050b0040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH3 0x12 SWAP1 PUSH3 0x212 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB SWAP1 KECCAK256 PUSH1 0x3 DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH1 0xE0 SWAP3 SWAP1 SWAP3 SHR SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE CALLVALUE DUP1 ISZERO PUSH3 0x3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x12F8 CODESIZE SUB DUP1 PUSH3 0x12F8 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x62 SWAP2 PUSH3 0x150 JUMP JUMPDEST DUP3 MLOAD PUSH3 0x77 SWAP1 PUSH1 0x2 SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH3 0xAB JUMP JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 AND OR SWAP1 SSTORE POP PUSH3 0x2AE JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0xEE JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x11E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x11E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x11E JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x101 JUMP JUMPDEST POP PUSH3 0x12C SWAP3 SWAP2 POP PUSH3 0x130 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x14D SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x12C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x137 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH3 0x165 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH3 0x17C JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP7 ADD DUP8 PUSH1 0x1F DUP3 ADD SLT PUSH3 0x18E JUMPI DUP6 DUP7 REVERT JUMPDEST DUP1 MLOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH3 0x19F JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH3 0x1B4 PUSH1 0x1F DUP5 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH3 0x23B JUMP JUMPDEST SWAP2 POP DUP3 DUP3 MSTORE DUP8 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH3 0x1CB JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH3 0x1DE DUP4 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD PUSH3 0x262 JUMP JUMPDEST POP DUP1 SWAP5 POP POP POP PUSH1 0x20 DUP5 ADD MLOAD PUSH3 0x1F4 DUP2 PUSH3 0x295 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x207 DUP2 PUSH3 0x295 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE PUSH1 0x13 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x25A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x27F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x265 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x28F JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x2AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x103A DUP1 PUSH3 0x2BE PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA03E738 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x5B2AC04A EQ PUSH2 0x7A JUMPI DUP1 PUSH4 0x7528DE0D EQ PUSH2 0x9A JUMPI DUP1 PUSH4 0xD7D49123 EQ PUSH2 0xAF JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0xB93 JUMP JUMPDEST PUSH2 0xC2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0xE07 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8D PUSH2 0x88 CALLDATASIZE PUSH1 0x4 PUSH2 0xB93 JUMP JUMPDEST PUSH2 0x1A5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0xFC7 JUMP JUMPDEST PUSH2 0xA2 PUSH2 0x28E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0xE12 JUMP JUMPDEST PUSH2 0x64 PUSH2 0xBD CALLDATASIZE PUSH1 0x4 PUSH2 0xB93 JUMP JUMPDEST PUSH2 0x321 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCC PUSH2 0xA9D JUMP JUMPDEST PUSH2 0x10B DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x86A SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH2 0x115 PUSH2 0xB22 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH4 0xC75E0A81 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x145 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0xF89 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x15D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x171 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x195 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xC52 JUMP JUMPDEST MLOAD PUSH1 0xFF AND PUSH1 0x3 EQ SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1AF PUSH2 0xA9D JUMP JUMPDEST PUSH2 0x1EE DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x86A SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH2 0x1F8 PUSH2 0xB22 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH4 0xC75E0A81 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x228 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0xF89 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x240 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x254 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x278 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xC52 JUMP JUMPDEST PUSH1 0x40 ADD MLOAD PUSH1 0xA0 SWAP1 SWAP3 ADD MLOAD SWAP2 SWAP1 SWAP2 SUB SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND DUP6 SWAP1 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x317 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2EC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x317 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2FA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x32B PUSH2 0xA9D JUMP JUMPDEST PUSH2 0x36A DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x86A SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3B9 PUSH2 0x19A DUP7 DUP7 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP4 SWAP3 POP POP PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x408 PUSH2 0x1AE DUP8 DUP8 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP4 SWAP3 POP POP PUSH4 0xFFFFFFFF PUSH2 0x9BE AND SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ORIGIN EQ PUSH2 0x43B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x432 SWAP1 PUSH2 0xEF0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x140 DUP5 ADD MLOAD PUSH1 0xE0 SWAP2 SWAP1 SWAP2 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND SWAP1 PUSH2 0x46B SWAP1 PUSH2 0x466 SWAP1 PUSH1 0x0 PUSH1 0x4 PUSH2 0x9C6 JUMP JUMPDEST PUSH2 0xA50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND EQ PUSH2 0x492 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x432 SWAP1 PUSH2 0xE5C JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x160 DUP5 ADD MLOAD PUSH1 0xE0 SWAP2 SWAP1 SWAP2 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND SWAP1 PUSH2 0x4BD SWAP1 PUSH2 0x466 SWAP1 PUSH1 0x0 PUSH1 0x4 PUSH2 0x9C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND EQ PUSH2 0x4E4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x432 SWAP1 PUSH2 0xE25 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x4FE SWAP1 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x51B PUSH1 0x10 DUP7 PUSH2 0x160 ADD MLOAD PUSH2 0x9B6 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0x54E SWAP1 DUP8 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0xDCA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x568 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x57C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x5A0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xB6A JUMP JUMPDEST POP PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP3 PUSH4 0x95EA7B3 SWAP3 PUSH2 0x5D5 SWAP3 SWAP1 SWAP2 AND SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0xDEE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x603 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x627 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xB6A JUMP JUMPDEST POP PUSH2 0x630 PUSH2 0xB42 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP13 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP11 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xB4BE83D5 SWAP2 DUP10 SWAP2 DUP9 SWAP2 PUSH2 0x687 SWAP2 SWAP1 DUP16 SWAP1 DUP16 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xA6C SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6A5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xF9C JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6D3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x6F7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xBFD JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x79D JUMPI DUP1 MLOAD PUSH1 0x40 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH2 0x72F SWAP2 DUP10 SWAP2 PUSH1 0x4 ADD PUSH2 0xDEE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x749 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x75D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x781 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xB6A JUMP JUMPDEST PUSH2 0x79D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x432 SWAP1 PUSH2 0xE93 JUMP JUMPDEST DUP4 DUP2 PUSH1 0x20 ADD MLOAD LT ISZERO PUSH2 0x85B JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA9059CBB DUP7 PUSH2 0x7D0 DUP5 PUSH1 0x20 ADD MLOAD DUP9 PUSH2 0xA88 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x7ED SWAP3 SWAP2 SWAP1 PUSH2 0xDEE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x807 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x81B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x83F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xB6A JUMP JUMPDEST PUSH2 0x85B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x432 SWAP1 PUSH2 0xF35 JUMP JUMPDEST POP PUSH1 0x1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x872 PUSH2 0xA9D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x180 DUP2 ADD SWAP1 SWAP2 MSTORE DUP1 PUSH2 0x890 DUP5 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8AF DUP5 PUSH1 0x14 PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8CE DUP5 PUSH1 0x28 PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8ED DUP5 PUSH1 0x3C PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x90C DUP5 PUSH1 0x50 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x922 DUP5 PUSH1 0x70 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x938 DUP5 PUSH1 0x90 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x94E DUP5 PUSH1 0xB0 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x964 DUP5 PUSH1 0xD0 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x97A DUP5 PUSH1 0xF0 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x993 DUP5 PUSH2 0x110 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x9C6 AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x9AC DUP5 PUSH2 0x134 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x9C6 AND JUMP JUMPDEST SWAP1 MSTORE SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST ADD PUSH1 0x14 ADD MLOAD SWAP1 JUMP JUMPDEST ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 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 0x9F4 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP DUP4 JUMPDEST DUP5 DUP5 ADD DUP2 LT ISZERO PUSH2 0xA47 JUMPI DUP6 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0xA0F JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD MLOAD PUSH1 0xF8 SHR PUSH1 0xF8 SHL DUP3 DUP7 DUP4 SUB DUP2 MLOAD DUP2 LT PUSH2 0xA28 JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 ADD PUSH2 0x9F9 JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0xA64 JUMPI POP PUSH1 0x0 PUSH2 0x9B1 JUMP JUMPDEST POP PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA82 DUP3 PUSH2 0x158 PUSH1 0x42 PUSH4 0xFFFFFFFF PUSH2 0x9C6 AND JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xA97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x180 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB7C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xB8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xBA5 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xBBC JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0xBCD JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0xBDD JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH2 0xBEE JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x20 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0xC10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO PUSH2 0xC1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC26 PUSH1 0x80 PUSH2 0xFD0 JUMP JUMPDEST DUP3 MLOAD DUP2 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0xC64 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 ISZERO PUSH2 0xC6E JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0xC79 PUSH1 0x60 PUSH2 0xFD0 JUMP JUMPDEST DUP3 MLOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xC89 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 SWAP3 DUP4 ADD MLOAD SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xCDB JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0xCBF JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xCED JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 PUSH2 0xD12 DUP5 DUP5 MLOAD PUSH2 0xCA8 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0xD24 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0xCA8 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0xD37 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0xCA8 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0xD4A PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0xCA8 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x80 DUP6 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x120 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x140 DUP1 DUP5 ADD MLOAD DUP3 DUP3 DUP8 ADD MSTORE PUSH2 0xDA3 DUP4 DUP8 ADD DUP3 PUSH2 0xCB5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 SWAP2 POP DUP2 DUP5 ADD MLOAD DUP6 DUP3 SUB DUP4 DUP8 ADD MSTORE PUSH2 0xDC0 DUP3 DUP3 PUSH2 0xCB5 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xB8C PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xCB5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x54616B657220746F6B656E2061737365742069736E2774204552433230000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D616B657220746F6B656E2061737365742069736E2774204552433230000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x38 SWAP1 DUP3 ADD MSTORE PUSH32 0x4469646E2774207375636365737366756C6C7920666F72776172642065786368 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x616E67656420746F6B656E732E20526576657274696E672E0000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x5468652074616B65722073686F756C642073656E6420746865207472616E7361 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x31BA34B7B7 PUSH1 0xD9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x34 SWAP1 DUP3 ADD MSTORE PUSH32 0x4469646E2774207375636365737366756C6C792072657475726E206578636573 PUSH1 0x40 DUP3 ADD MSTORE PUSH20 0x39903A37B5B2B73997102932BB32B93A34B73397 PUSH1 0x61 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xB8C PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xD02 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0xFAF PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0xD02 JUMP JUMPDEST DUP5 PUSH1 0x20 DUP5 ADD MSTORE DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0xDC0 DUP2 DUP6 PUSH2 0xCB5 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xFEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 0xdd PUSH26 0xF6A1C2A0B84F571DF06C0ADD6D41D8B3EE7F69AE3051EF5BA174 MSTORE BALANCE 0x4b DUP9 PUSH13 0x6578706572696D656E74616CF5 PUSH5 0x736F6C6343 STOP SDIV SIGNEXTEND STOP BLOCKHASH ",
                "sourceMap": "641:5589:15:-;;;885:32;;;;;;;;;;;;;;;850:68;;;-1:-1:-1;;850:68:15;;;;;;;;;;;;1328:199;5:2:-1;;;;30:1;27;20:12;5:2;1328:199:15;;;;;;;;;;;;;;;;;;;;;1424:17;;;;:10;;:17;;;;;:::i;:::-;-1:-1:-1;1451:9:15;:38;;-1:-1:-1;;;;;1451:38:15;;;-1:-1:-1;;;;;;1451:38:15;;;;;;;;1499:21;;;;;;;;;;;-1:-1:-1;641:5589:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;641:5589:15;;;-1:-1:-1;641:5589:15;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;599:634:-1:-;;;;758:2;746:9;737:7;733:23;729:32;726:2;;;774:1;771;764:12;726:2;809:24;;-1:-1;;;;;842:30;;;839:2;;;885:1;882;875:12;839:2;962:6;951:9;947:22;260:3;253:4;245:6;241:17;237:27;227:2;;278:1;275;268:12;227:2;308:6;302:13;288:27;;2435:18;2427:6;2424:30;2421:2;;;2467:1;2464;2457:12;2421:2;330:65;2530:9;2511:17;;-1:-1;;2507:33;2598:4;2588:15;330:65;;;321:74;;415:6;408:5;401:21;519:3;2598:4;510:6;443;501:16;;498:25;495:2;;;536:1;533;526:12;495:2;546:39;578:6;2598:4;477:5;473:16;2598:4;443:6;439:17;546:39;;;;895:84;;;;;2598:4;1070:9;1066:22;83:13;101:33;128:5;101:33;;;1135:2;1185:22;;83:13;1024:74;;-1:-1;101:33;83:13;101:33;;;1143:74;;;;720:513;;;;;;1649:372;1537:66;1517:87;;1501:2;1623:12;;1829:192;2028:256;2090:2;2084:9;2116:17;;;-1:-1;;;;;2176:34;;2212:22;;;2173:62;2170:2;;;2248:1;;2238:12;2170:2;2090;2257:22;2068:216;;-1:-1;2068:216;3001:268;3066:1;3073:101;3087:6;3084:1;3081:13;3073:101;;;3154:11;;;3148:18;3135:11;;;3128:39;3109:2;3102:10;3073:101;;;3189:6;3186:1;3183:13;3180:2;;;3066:1;3245:6;3240:3;3236:16;3229:27;3180:2;;3050:219;;;;3277:117;-1:-1;;;;;2934:54;;3336:35;;3326:2;;3385:1;;3375:12;3326:2;3320:74;;;641:5589:15;;;;;;"
            },
            "deployedBytecode": {
                "linkReferences": {},
                "object": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630a03e738146100515780635b2ac04a1461007a5780637528de0d1461009a578063d7d49123146100af575b600080fd5b61006461005f366004610b93565b6100c2565b6040516100719190610e07565b60405180910390f35b61008d610088366004610b93565b6101a5565b6040516100719190610fc7565b6100a261028e565b6040516100719190610e12565b6100646100bd366004610b93565b610321565b60006100cc610a9d565b61010b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061086a92505050565b9050610115610b22565b60005460405163c75e0a8160e01b81526001600160a01b039091169063c75e0a8190610145908590600401610f89565b60606040518083038186803b15801561015d57600080fd5b505afa158015610171573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101959190810190610c52565b5160ff1660031495945050505050565b60006101af610a9d565b6101ee84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061086a92505050565b90506101f8610b22565b60005460405163c75e0a8160e01b81526001600160a01b039091169063c75e0a8190610228908590600401610f89565b60606040518083038186803b15801561024057600080fd5b505afa158015610254573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506102789190810190610c52565b6040015160a09092015191909103949350505050565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156103175780601f106102ec57610100808354040283529160200191610317565b820191906000526020600020905b8154815290600101906020018083116102fa57829003601f168201915b5050505050905090565b600061032b610a9d565b61036a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061086a92505050565b905060006103b961019a86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff6109b6169050565b905060006104086101ae87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505063ffffffff6109be169050565b90506001600160a01b038216321461043b5760405162461bcd60e51b815260040161043290610ef0565b60405180910390fd5b60035461014084015160e09190911b6001600160e01b0319169061046b9061046690600060046109c6565b610a50565b6001600160e01b031916146104925760405162461bcd60e51b815260040161043290610e5c565b60035461016084015160e09190911b6001600160e01b031916906104bd9061046690600060046109c6565b6001600160e01b031916146104e45760405162461bcd60e51b815260040161043290610e25565b6101408301516000906104fe90601063ffffffff6109b616565b9050600061051b60108661016001516109b690919063ffffffff16565b6040516323b872dd60e01b81529091506001600160a01b038216906323b872dd9061054e90879030908890600401610dca565b602060405180830381600087803b15801561056857600080fd5b505af115801561057c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105a09190810190610b6a565b5060015460405163095ea7b360e01b81526001600160a01b038381169263095ea7b3926105d592909116908790600401610dee565b602060405180830381600087803b1580156105ef57600080fd5b505af1158015610603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106279190810190610b6a565b50610630610b42565b600054604080516020601f8c018190048102820181019092528a81526001600160a01b039092169163b4be83d5918991889161068791908f908f9081908401838280828437600092019190915250610a6c92505050565b6040518463ffffffff1660e01b81526004016106a593929190610f9c565b608060405180830381600087803b1580156106bf57600080fd5b505af11580156106d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106f79190810190610bfd565b80519091501561079d57805160405163a9059cbb60e01b81526001600160a01b0385169163a9059cbb9161072f918991600401610dee565b602060405180830381600087803b15801561074957600080fd5b505af115801561075d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107819190810190610b6a565b61079d5760405162461bcd60e51b815260040161043290610e93565b838160200151101561085b57816001600160a01b031663a9059cbb866107d0846020015188610a8890919063ffffffff16565b6040518363ffffffff1660e01b81526004016107ed929190610dee565b602060405180830381600087803b15801561080757600080fd5b505af115801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061083f9190810190610b6a565b61085b5760405162461bcd60e51b815260040161043290610f35565b50600198975050505050505050565b610872610a9d565b6040805161018081019091528061089084600063ffffffff6109b616565b6001600160a01b031681526020016108af84601463ffffffff6109b616565b6001600160a01b031681526020016108ce84602863ffffffff6109b616565b6001600160a01b031681526020016108ed84603c63ffffffff6109b616565b6001600160a01b0316815260200161090c84605063ffffffff6109be16565b815260200161092284607063ffffffff6109be16565b815260200161093884609063ffffffff6109be16565b815260200161094e8460b063ffffffff6109be16565b81526020016109648460d063ffffffff6109be16565b815260200161097a8460f063ffffffff6109be16565b815260200161099384610110602463ffffffff6109c616565b81526020016109ac84610134602463ffffffff6109c616565b905290505b919050565b016014015190565b016020015190565b606080826040519080825280601f01601f1916602001820160405280156109f4576020820181803883390190505b509050835b848401811015610a4757858181518110610a0f57fe5b602001015160f81c60f81b8286830381518110610a2857fe5b60200101906001600160f81b031916908160001a9053506001016109f9565b50949350505050565b6000815160001415610a64575060006109b1565b506020015190565b6060610a8282610158604263ffffffff6109c616565b92915050565b600082821115610a9757600080fd5b50900390565b60405180610180016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160608152602001606081525090565b604080516060810182526000808252602082018190529181019190915290565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600060208284031215610b7c57600080fd5b81518015158114610b8c57600080fd5b9392505050565b60008060208385031215610ba5578081fd5b823567ffffffffffffffff80821115610bbc578283fd5b81850186601f820112610bcd578384fd5b8035925081831115610bdd578384fd5b866020848301011115610bee578384fd5b60200196919550909350505050565b60006080828403128015610c1057600080fd5b8015610c1b57600080fd5b50610c266080610fd0565b825181526020830151602082015260408301516040820152606083015160608201528091505092915050565b60006060828403128015610c64578182fd5b8015610c6e578182fd5b50610c796060610fd0565b825160ff81168114610c89578283fd5b8152602083810151908201526040928301519281019290925250919050565b6001600160a01b03169052565b6000815180845260005b81811015610cdb57602081850181015186830182015201610cbf565b81811115610ced576000602083870101525b50601f01601f19169290920160200192915050565b6000610180610d12848451610ca8565b6020830151610d246020860182610ca8565b506040830151610d376040860182610ca8565b506060830151610d4a6060860182610ca8565b506080830151608085015260a083015160a085015260c083015160c085015260e083015160e0850152610100808401518186015250610120808401518186015250610140808401518282870152610da383870182610cb5565b91505061016091508184015185820383870152610dc08282610cb5565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252610b8c6020830184610cb5565b6020808252601d908201527f54616b657220746f6b656e2061737365742069736e2774204552433230000000604082015260600190565b6020808252601d908201527f4d616b657220746f6b656e2061737365742069736e2774204552433230000000604082015260600190565b60208082526038908201527f4469646e2774207375636365737366756c6c7920666f7277617264206578636860408201527f616e67656420746f6b656e732e20526576657274696e672e0000000000000000606082015260800190565b60208082526025908201527f5468652074616b65722073686f756c642073656e6420746865207472616e736160408201526431ba34b7b760d91b606082015260800190565b60208082526034908201527f4469646e2774207375636365737366756c6c792072657475726e20657863657360408201527339903a37b5b2b73997102932bb32b93a34b7339760611b606082015260800190565b600060208252610b8c6020830184610d02565b600060608252610faf6060830186610d02565b8460208401528281036040840152610dc08185610cb5565b90815260200190565b60405181810167ffffffffffffffff81118282101715610fef57600080fd5b60405291905056fea365627a7a72315820dd79f6a1c2a0b84f571df06c0add6d41d8b3ee7f69ae3051ef5ba17452314b886c6578706572696d656e74616cf564736f6c634300050b0040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA03E738 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x5B2AC04A EQ PUSH2 0x7A JUMPI DUP1 PUSH4 0x7528DE0D EQ PUSH2 0x9A JUMPI DUP1 PUSH4 0xD7D49123 EQ PUSH2 0xAF JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0xB93 JUMP JUMPDEST PUSH2 0xC2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0xE07 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8D PUSH2 0x88 CALLDATASIZE PUSH1 0x4 PUSH2 0xB93 JUMP JUMPDEST PUSH2 0x1A5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0xFC7 JUMP JUMPDEST PUSH2 0xA2 PUSH2 0x28E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0xE12 JUMP JUMPDEST PUSH2 0x64 PUSH2 0xBD CALLDATASIZE PUSH1 0x4 PUSH2 0xB93 JUMP JUMPDEST PUSH2 0x321 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCC PUSH2 0xA9D JUMP JUMPDEST PUSH2 0x10B DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x86A SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH2 0x115 PUSH2 0xB22 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH4 0xC75E0A81 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x145 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0xF89 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x15D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x171 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x195 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xC52 JUMP JUMPDEST MLOAD PUSH1 0xFF AND PUSH1 0x3 EQ SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1AF PUSH2 0xA9D JUMP JUMPDEST PUSH2 0x1EE DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x86A SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH2 0x1F8 PUSH2 0xB22 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH4 0xC75E0A81 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x228 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0xF89 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x240 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x254 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x278 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xC52 JUMP JUMPDEST PUSH1 0x40 ADD MLOAD PUSH1 0xA0 SWAP1 SWAP3 ADD MLOAD SWAP2 SWAP1 SWAP2 SUB SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND DUP6 SWAP1 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x317 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2EC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x317 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2FA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x32B PUSH2 0xA9D JUMP JUMPDEST PUSH2 0x36A DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x86A SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3B9 PUSH2 0x19A DUP7 DUP7 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP4 SWAP3 POP POP PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x408 PUSH2 0x1AE DUP8 DUP8 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP4 SWAP3 POP POP PUSH4 0xFFFFFFFF PUSH2 0x9BE AND SWAP1 POP JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ORIGIN EQ PUSH2 0x43B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x432 SWAP1 PUSH2 0xEF0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x140 DUP5 ADD MLOAD PUSH1 0xE0 SWAP2 SWAP1 SWAP2 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND SWAP1 PUSH2 0x46B SWAP1 PUSH2 0x466 SWAP1 PUSH1 0x0 PUSH1 0x4 PUSH2 0x9C6 JUMP JUMPDEST PUSH2 0xA50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND EQ PUSH2 0x492 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x432 SWAP1 PUSH2 0xE5C JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x160 DUP5 ADD MLOAD PUSH1 0xE0 SWAP2 SWAP1 SWAP2 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND SWAP1 PUSH2 0x4BD SWAP1 PUSH2 0x466 SWAP1 PUSH1 0x0 PUSH1 0x4 PUSH2 0x9C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND EQ PUSH2 0x4E4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x432 SWAP1 PUSH2 0xE25 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x4FE SWAP1 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x51B PUSH1 0x10 DUP7 PUSH2 0x160 ADD MLOAD PUSH2 0x9B6 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0x54E SWAP1 DUP8 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0xDCA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x568 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x57C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x5A0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xB6A JUMP JUMPDEST POP PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP3 PUSH4 0x95EA7B3 SWAP3 PUSH2 0x5D5 SWAP3 SWAP1 SWAP2 AND SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0xDEE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x603 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x627 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xB6A JUMP JUMPDEST POP PUSH2 0x630 PUSH2 0xB42 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP13 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP11 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xB4BE83D5 SWAP2 DUP10 SWAP2 DUP9 SWAP2 PUSH2 0x687 SWAP2 SWAP1 DUP16 SWAP1 DUP16 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0xA6C SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6A5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xF9C JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6D3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x6F7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xBFD JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x79D JUMPI DUP1 MLOAD PUSH1 0x40 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH2 0x72F SWAP2 DUP10 SWAP2 PUSH1 0x4 ADD PUSH2 0xDEE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x749 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x75D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x781 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xB6A JUMP JUMPDEST PUSH2 0x79D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x432 SWAP1 PUSH2 0xE93 JUMP JUMPDEST DUP4 DUP2 PUSH1 0x20 ADD MLOAD LT ISZERO PUSH2 0x85B JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA9059CBB DUP7 PUSH2 0x7D0 DUP5 PUSH1 0x20 ADD MLOAD DUP9 PUSH2 0xA88 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x7ED SWAP3 SWAP2 SWAP1 PUSH2 0xDEE JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x807 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x81B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x83F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0xB6A JUMP JUMPDEST PUSH2 0x85B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x432 SWAP1 PUSH2 0xF35 JUMP JUMPDEST POP PUSH1 0x1 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x872 PUSH2 0xA9D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH2 0x180 DUP2 ADD SWAP1 SWAP2 MSTORE DUP1 PUSH2 0x890 DUP5 PUSH1 0x0 PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8AF DUP5 PUSH1 0x14 PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8CE DUP5 PUSH1 0x28 PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x8ED DUP5 PUSH1 0x3C PUSH4 0xFFFFFFFF PUSH2 0x9B6 AND JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x90C DUP5 PUSH1 0x50 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x922 DUP5 PUSH1 0x70 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x938 DUP5 PUSH1 0x90 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x94E DUP5 PUSH1 0xB0 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x964 DUP5 PUSH1 0xD0 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x97A DUP5 PUSH1 0xF0 PUSH4 0xFFFFFFFF PUSH2 0x9BE AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x993 DUP5 PUSH2 0x110 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x9C6 AND JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x9AC DUP5 PUSH2 0x134 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x9C6 AND JUMP JUMPDEST SWAP1 MSTORE SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST ADD PUSH1 0x14 ADD MLOAD SWAP1 JUMP JUMPDEST ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 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 0x9F4 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP DUP4 JUMPDEST DUP5 DUP5 ADD DUP2 LT ISZERO PUSH2 0xA47 JUMPI DUP6 DUP2 DUP2 MLOAD DUP2 LT PUSH2 0xA0F JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD MLOAD PUSH1 0xF8 SHR PUSH1 0xF8 SHL DUP3 DUP7 DUP4 SUB DUP2 MLOAD DUP2 LT PUSH2 0xA28 JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 ADD PUSH2 0x9F9 JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0xA64 JUMPI POP PUSH1 0x0 PUSH2 0x9B1 JUMP JUMPDEST POP PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA82 DUP3 PUSH2 0x158 PUSH1 0x42 PUSH4 0xFFFFFFFF PUSH2 0x9C6 AND JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xA97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH2 0x180 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB7C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xB8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xBA5 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xBBC JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH2 0xBCD JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0xBDD JUMPI DUP4 DUP5 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP5 DUP4 ADD ADD GT ISZERO PUSH2 0xBEE JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH1 0x20 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0xC10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO PUSH2 0xC1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC26 PUSH1 0x80 PUSH2 0xFD0 JUMP JUMPDEST DUP3 MLOAD DUP2 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT DUP1 ISZERO PUSH2 0xC64 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 ISZERO PUSH2 0xC6E JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0xC79 PUSH1 0x60 PUSH2 0xFD0 JUMP JUMPDEST DUP3 MLOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xC89 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 DUP2 ADD MLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x40 SWAP3 DUP4 ADD MLOAD SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xCDB JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0xCBF JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0xCED JUMPI PUSH1 0x0 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 PUSH2 0xD12 DUP5 DUP5 MLOAD PUSH2 0xCA8 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0xD24 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0xCA8 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0xD37 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0xCA8 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0xD4A PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0xCA8 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x80 DUP6 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xA0 DUP6 ADD MSTORE PUSH1 0xC0 DUP4 ADD MLOAD PUSH1 0xC0 DUP6 ADD MSTORE PUSH1 0xE0 DUP4 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x120 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x140 DUP1 DUP5 ADD MLOAD DUP3 DUP3 DUP8 ADD MSTORE PUSH2 0xDA3 DUP4 DUP8 ADD DUP3 PUSH2 0xCB5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 SWAP2 POP DUP2 DUP5 ADD MLOAD DUP6 DUP3 SUB DUP4 DUP8 ADD MSTORE PUSH2 0xDC0 DUP3 DUP3 PUSH2 0xCB5 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xB8C PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xCB5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x54616B657220746F6B656E2061737365742069736E2774204552433230000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D616B657220746F6B656E2061737365742069736E2774204552433230000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x38 SWAP1 DUP3 ADD MSTORE PUSH32 0x4469646E2774207375636365737366756C6C7920666F72776172642065786368 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x616E67656420746F6B656E732E20526576657274696E672E0000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x5468652074616B65722073686F756C642073656E6420746865207472616E7361 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x31BA34B7B7 PUSH1 0xD9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x34 SWAP1 DUP3 ADD MSTORE PUSH32 0x4469646E2774207375636365737366756C6C792072657475726E206578636573 PUSH1 0x40 DUP3 ADD MSTORE PUSH20 0x39903A37B5B2B73997102932BB32B93A34B73397 PUSH1 0x61 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xB8C PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xD02 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0xFAF PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0xD02 JUMP JUMPDEST DUP5 PUSH1 0x20 DUP5 ADD MSTORE DUP3 DUP2 SUB PUSH1 0x40 DUP5 ADD MSTORE PUSH2 0xDC0 DUP2 DUP6 PUSH2 0xCB5 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xFEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 0xdd PUSH26 0xF6A1C2A0B84F571DF06C0ADD6D41D8B3EE7F69AE3051EF5BA174 MSTORE BALANCE 0x4b DUP9 PUSH13 0x6578706572696D656E74616CF5 PUSH5 0x736F6C6343 STOP SDIV SIGNEXTEND STOP BLOCKHASH ",
                "sourceMap": "641:5589:15:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:5589:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2196:274;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2777:283;;;;;;;;;:::i;:::-;;;;;;;;1837:93;;;:::i;:::-;;;;;;;;3515:1491;;;;;;;;;:::i;2196:274::-;2257:4;2273:27;;:::i;:::-;2303:15;2313:4;;2303:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;2303:9:15;;-1:-1:-1;;;2303:15:15:i;:::-;2273:45;;2328:30;;:::i;:::-;2361:9;;:29;;-1:-1:-1;;;2361:29:15;;-1:-1:-1;;;;;2361:9:15;;;;:22;;:29;;2384:5;;2361:29;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2361:29:15;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2361:29:15;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2361:29:15;;;;;;;;;2407:16;:56;;2433:29;2407:56;;;-1:-1:-1;;;;;2196:274:15:o;2777:283::-;2846:4;2862:27;;:::i;:::-;2892:15;2902:4;;2892:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;2892:9:15;;-1:-1:-1;;;2892:15:15:i;:::-;2862:45;;2917:30;;:::i;:::-;2950:9;;:29;;-1:-1:-1;;;2950:29:15;;-1:-1:-1;;;;;2950:9:15;;;;:22;;:29;;2973:5;;2950:29;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2950:29:15;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2950:29:15;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2950:29:15;;;;;;;;;3021:32;;;2996:22;;;;;:57;;;;;2777:283;-1:-1:-1;;;;2777:283:15:o;1837:93::-;1913:10;1906:17;;;;;;;-1:-1:-1;;1906:17:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1881:13;;1906:17;;1913:10;;1906:17;;1913:10;1906:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1837:93;:::o;3515:1491::-;3575:4;3591:27;;:::i;:::-;3621:15;3631:4;;3621:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3621:9:15;;-1:-1:-1;;;3621:15:15:i;:::-;3591:45;;3646:13;3662:20;3678:3;3662:4;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3662:15:15;;:20;-1:-1:-1;;3662:20:15;:15;:20;;-1:-1:-1;3662:20:15:i;:::-;3646:36;;3692:15;3710:17;3723:3;3710:4;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3710:12:15;;:17;-1:-1:-1;;3710:17:15;:12;:17;;-1:-1:-1;3710:17:15:i;:::-;3692:35;-1:-1:-1;;;;;;3746:18:15;;3755:9;3746:18;3738:68;;;;-1:-1:-1;;;3738:68:15;;;;;;;;;;;;;;;;;3995:10;;3955:20;;;;3995:10;;;;;-1:-1:-1;;;;;;3936:69:15;;:55;;3955:35;;3995:10;3988:1;3955:29;:35::i;:::-;3936:18;:55::i;:::-;-1:-1:-1;;;;;;3936:69:15;;3928:111;;;;-1:-1:-1;;;3928:111:15;;;;;;;;;4116:10;;4076:20;;;;4116:10;;;;;-1:-1:-1;;;;;;4057:69:15;;:55;;4076:35;;4116:10;4109:1;4076:29;:35::i;4057:55::-;-1:-1:-1;;;;;;4057:69:15;;4049:111;;;;-1:-1:-1;;;4049:111:15;;;;;;;;;4198:20;;;;4171:17;;4198:35;;4230:2;4198:35;:31;:35;:::i;:::-;4171:63;;4244:17;4271:35;4303:2;4271:5;:20;;;:31;;:35;;;;:::i;:::-;4318:57;;-1:-1:-1;;;4318:57:15;;4244:63;;-1:-1:-1;;;;;;4318:23:15;;;;;:57;;4342:5;;4357:4;;4364:10;;4318:57;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4318:57:15;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4318:57:15;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4318:57:15;;;;;;;;;-1:-1:-1;4404:6:15;;4385:38;;-1:-1:-1;;;4385:38:15;;-1:-1:-1;;;;;4385:18:15;;;;;;:38;;4404:6;;;;4412:10;;4385:38;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4385:38:15;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4385:38:15;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4385:38:15;;;;;;;;;;4434:44;;:::i;:::-;4481:9;;4520:19;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4481:9:15;;;;:19;;4501:5;;4508:10;;4520:19;;;4534:4;;;;;;4520:19;;4534:4;;;;4520:19;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;4520:13:15;;-1:-1:-1;;;4520:19:15:i;:::-;4481:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4481:59:15;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4481:59:15;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4481:59:15;;;;;;;;;4555:33;;4434:106;;-1:-1:-1;4555:37:15;4551:198;;4643:33;;4616:61;;-1:-1:-1;;;4616:61:15;;-1:-1:-1;;;;;4616:19:15;;;;;:61;;4636:5;;4616:61;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4616:61:15;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4616:61:15;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4616:61:15;;;;;;;;;4608:130;;;;-1:-1:-1;;;4608:130:15;;;;;;;;;4799:10;4763;:33;;;:46;4759:219;;;4833:10;-1:-1:-1;;;;;4833:19:15;;4853:5;4860:49;4875:10;:33;;;4860:10;:14;;:49;;;;:::i;:::-;4833:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4833:77:15;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4833:77:15;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4833:77:15;;;;;;;;;4825:142;;;;-1:-1:-1;;;4825:142:15;;;;;;;;;-1:-1:-1;4995:4:15;;3515:1491;-1:-1:-1;;;;;;;;3515:1491:15:o;5102:520::-;5163:21;;:::i;:::-;5203:412;;;;;;;;;;5231:18;:4;-1:-1:-1;5231:18:15;:15;:18;:::i;:::-;-1:-1:-1;;;;;5203:412:15;;;;;5263:19;:4;5279:2;5263:19;:15;:19;:::i;:::-;-1:-1:-1;;;;;5203:412:15;;;;;5296:19;:4;5312:2;5296:19;:15;:19;:::i;:::-;-1:-1:-1;;;;;5203:412:15;;;;;5329:19;:4;5345:2;5329:19;:15;:19;:::i;:::-;-1:-1:-1;;;;;5203:412:15;;;;;5362:16;:4;5375:2;5362:16;:12;:16;:::i;:::-;5203:412;;;;5392:17;:4;5405:3;5392:17;:12;:17;:::i;:::-;5203:412;;;;5423:17;:4;5436:3;5423:17;:12;:17;:::i;:::-;5203:412;;;;5454:17;:4;5467:3;5454:17;:12;:17;:::i;:::-;5203:412;;;;5485:17;:4;5498:3;5485:17;:12;:17;:::i;:::-;5203:412;;;;5516:17;:4;5529:3;5516:17;:12;:17;:::i;:::-;5203:412;;;;5547:22;:4;5561:3;5566:2;5547:22;:13;:22;:::i;:::-;5203:412;;;;5583:22;:4;5597:3;5602:2;5583:22;:13;:22;:::i;:::-;5203:412;;5196:419;-1:-1:-1;5102:520:15;;;;:::o;52:171:18:-;185:16;203:2;181:25;175:32;;156:61::o;229:167::-;358:16;376:2;354:25;348:32;;328:62::o;571:282::-;656:12;680:19;712:6;702:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;702:17:18;87:34:-1;135:17;;-1:-1;702:17:18;-1:-1:-1;680:39:18;-1:-1:-1;742:5:18;729:95;762:5;753:6;:14;749:1;:18;729:95;;;806:4;811:1;806:7;;;;;;;;;;;;;;;;788:6;797:5;795:1;:7;788:15;;;;;;;;;;;:25;-1:-1:-1;;;;;788:25:18;;;;;;;;-1:-1:-1;769:3:18;;729:95;;;-1:-1:-1;840:6:18;571:282;-1:-1:-1;;;;571:282:18:o;5991:237:15:-;6061:16;6093:4;:11;6108:1;6093:16;6089:57;;;-1:-1:-1;6132:3:15;6125:10;;6089:57;-1:-1:-1;6208:2:15;6198:13;6192:20;;6165:57::o;5720:198::-;5780:12;5811:22;:4;5825:3;5830:2;5811:22;:13;:22;:::i;:::-;5804:29;5720:198;-1:-1:-1;;5720:198:15:o;1205:145:12:-;1263:7;1295:1;1290;:6;;1282:15;;;;;;-1:-1:-1;1319:5:12;;;1205:145::o;641:5589:15:-;;;;;;;;;;-1:-1:-1;;;;;641:5589:15;;;;;;-1:-1:-1;;;;;641:5589:15;;;;;;-1:-1:-1;;;;;641:5589:15;;;;;;-1:-1:-1;;;;;641:5589:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;641:5589:15;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2553:257:-1:-;;2665:2;2653:9;2644:7;2640:23;2636:32;2633:2;;;-1:-1;;2671:12;2633:2;86:6;80:13;16718:5;15855:13;15848:21;16696:5;16693:32;16683:2;;-1:-1;;16729:12;16683:2;2723:71;2627:183;-1:-1;;;2627:183;2817:365;;;2940:2;2928:9;2919:7;2915:23;2911:32;2908:2;;;2956:1;2953;2946:12;2908:2;3004:17;2991:31;3042:18;;3034:6;3031:30;3028:2;;;3074:1;3071;3064:12;3028:2;3149:6;3138:9;3134:22;409:3;402:4;394:6;390:17;386:27;376:2;;427:1;424;417:12;376:2;460:6;447:20;437:30;;487:18;479:6;476:30;473:2;;;519:1;516;509:12;473:2;603:3;2940:2;584:16;545:6;570:31;;567:40;564:2;;;620:1;617;610:12;564:2;2940;541:17;;3092:74;;-1:-1;2902:280;;-1:-1;;;;2902:280;3189:318;;3331:3;3319:9;3310:7;3306:23;3302:33;;3299:2;;;-1:-1;;3338:12;3299:2;780:30;777:2;;;-1:-1;;813:12;777:2;;841:20;3331:3;841:20;;;224:6;218:13;943:15;936:85;1100:2;1169:9;1165:22;218:13;1100:2;1119:5;1115:16;1108:86;1263:2;1332:9;1328:22;218:13;1263:2;1282:5;1278:16;1271:86;1426:2;1495:9;1491:22;218:13;1426:2;1445:5;1441:16;1434:86;3390:101;;;;3293:214;;;;;3514:315;;3655:2;3643:9;3634:7;3630:23;3626:32;;3623:2;;;3671:1;3668;3661:12;3623:2;1681:30;1678:2;;;1724:1;1721;1714:12;1678:2;;1742:20;3655:2;1742:20;;;2498:6;2492:13;16238:4;17086:5;16227:16;17063:5;17060:33;17050:2;;17107:1;17104;17097:12;17050:2;1826:83;;1975:2;2040:22;;;218:13;1990:16;;;1983:86;2153:2;2218:22;;;218:13;2168:16;;;2161:86;;;;-1:-1;1833:15;3617:212;-1:-1;3617:212;3836:103;-1:-1;;;;;16022:54;3897:37;;3891:48;4177:343;;4319:5;14889:12;15292:6;15287:3;15280:19;-1:-1;16328:101;16342:6;16339:1;16336:13;16328:101;;;15329:4;16409:11;;;;;16403:18;16390:11;;;;;16383:39;16357:10;16328:101;;;16444:6;16441:1;16438:13;16435:2;;;-1:-1;15329:4;16500:6;15324:3;16491:16;;16484:27;16435:2;-1:-1;16616:7;16600:14;-1:-1;;16596:28;4476:39;;;;15329:4;4476:39;;4267:253;-1:-1;;4267:253;7424:2285;;7569:5;7672:62;7720:13;7650:15;7644:22;7672:62;;;7821:4;7814:5;7810:16;7804:23;7833:63;7821:4;7885:3;7881:14;7867:12;7833:63;;;;7990:4;7983:5;7979:16;7973:23;8002:63;7990:4;8054:3;8050:14;8036:12;8002:63;;;;8153:4;8146:5;8142:16;8136:23;8165:63;8153:4;8217:3;8213:14;8199:12;8165:63;;;;8319:4;8312:5;8308:16;8302:23;8319:4;8383:3;8379:14;9777:37;8485:4;8478:5;8474:16;8468:23;8485:4;8549:3;8545:14;9777:37;8643:4;8636:5;8632:16;8626:23;8643:4;8707:3;8703:14;9777:37;8801:4;8794:5;8790:16;8784:23;8801:4;8865:3;8861:14;9777:37;8972:5;;8965;8961:17;8955:24;9042:5;9037:3;9033:15;9777:37;;9128:5;;9121;9117:17;9111:24;9198:5;9193:3;9189:15;9777:37;;9294:5;;9287;9283:17;9277:24;9338:14;9330:5;9325:3;9321:15;9314:39;9368:67;7569:5;7564:3;7560:15;9416:12;9368:67;;;9360:75;;;9530:5;;;;9523;9519:17;9513:24;9584:3;9578:4;9574:14;9566:5;9561:3;9557:15;9550:39;9604:67;9666:4;9652:12;9604:67;;;9693:11;7542:2167;-1:-1;;;;;;7542:2167;9946:435;-1:-1;;;;;16022:54;;;3897:37;;16022:54;;;;10284:2;10269:18;;3897:37;10367:2;10352:18;;9777:37;;;;10120:2;10105:18;;10091:290;10388:324;-1:-1;;;;;16022:54;;;;3897:37;;10698:2;10683:18;;9777:37;10534:2;10519:18;;10505:207;10719:201;15855:13;;15848:21;4131:34;;10831:2;10816:18;;10802:118;10927:301;;11065:2;11086:17;11079:47;11140:78;11065:2;11054:9;11050:18;11204:6;11140:78;;11235:407;11426:2;11440:47;;;5428:2;11411:18;;;15280:19;5464:66;15320:14;;;5444:87;5550:12;;;11397:245;11649:407;11840:2;11854:47;;;5801:2;11825:18;;;15280:19;5837:66;15320:14;;;5817:87;5923:12;;;11811:245;12063:407;12254:2;12268:47;;;6174:2;12239:18;;;15280:19;6210:66;15320:14;;;6190:87;6311:66;6297:12;;;6290:88;6397:12;;;12225:245;12477:407;12668:2;12682:47;;;6648:2;12653:18;;;15280:19;6684:66;15320:14;;;6664:87;-1:-1;;;6771:12;;;6764:88;6871:12;;;12639:245;12891:407;13082:2;13096:47;;;7122:2;13067:18;;;15280:19;7158:66;15320:14;;;7138:87;-1:-1;;;7245:12;;;7238:88;7345:12;;;13053:245;13305:349;;13467:2;13488:17;13481:47;13542:102;13467:2;13456:9;13452:18;13630:6;13542:102;;13661:655;;13897:2;13918:17;13911:47;13972:102;13897:2;13886:9;13882:18;14060:6;13972:102;;;9807:5;14153:2;14142:9;14138:18;9777:37;14205:9;14199:4;14195:20;14190:2;14179:9;14175:18;14168:48;14230:76;14301:4;14292:6;14230:76;;14323:213;9777:37;;;14441:2;14426:18;;14412:124;14543:256;14605:2;14599:9;14631:17;;;14706:18;14691:34;;14727:22;;;14688:62;14685:2;;;14763:1;;14753:12;14685:2;14605;14772:22;14583:216;;-1:-1;14583:216"
            }
        }
    },
    "sources": {
        "sub-contracts/ZeroExV2SubContract.sol": {
            "id": 15
        },
        "@kosu/subcontract-sdk/contracts/SubContract.sol": {
            "id": 20
        },
        "@kosu/subcontract-sdk/contracts/BytesDecoder.sol": {
            "id": 18
        },
        "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol": {
            "id": 14
        },
        "openzeppelin-solidity/contracts/math/SafeMath.sol": {
            "id": 12
        },
        "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol": {
            "id": 4
        },
        "@0x/contracts-exchange/contracts/src/interfaces/IExchangeCore.sol": {
            "id": 5
        },
        "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol": {
            "id": 2
        },
        "@0x/contracts-exchange-libs/contracts/src/LibEIP712.sol": {
            "id": 0
        },
        "@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol": {
            "id": 1
        },
        "@0x/contracts-utils/contracts/src/SafeMath.sol": {
            "id": 10
        },
        "@0x/contracts-exchange/contracts/src/interfaces/IMatchOrders.sol": {
            "id": 6
        },
        "@0x/contracts-exchange/contracts/src/interfaces/ISignatureValidator.sol": {
            "id": 7
        },
        "@0x/contracts-exchange/contracts/src/interfaces/ITransactions.sol": {
            "id": 8
        },
        "@0x/contracts-exchange/contracts/src/interfaces/IAssetProxyDispatcher.sol": {
            "id": 3
        },
        "@0x/contracts-exchange/contracts/src/interfaces/IWrapperFunctions.sol": {
            "id": 9
        }
    },
    "sourceCodes": {
        "sub-contracts/ZeroExV2SubContract.sol": "pragma solidity ^0.5.0;\npragma experimental ABIEncoderV2;\n\nimport \"@kosu/subcontract-sdk/contracts/SubContract.sol\";\nimport \"@kosu/subcontract-sdk/contracts/BytesDecoder.sol\";\nimport \"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\";\nimport { SafeMath as ZepSafeMath } from \"openzeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\n\n/** @title ZeroExV2SubContract\n    @author Freydal\n    @dev Implementation of a SubContract that forwards kosu orders with 0x resolution to the 0x exchange contract.\n*/\ncontract ZeroExV2SubContract is SubContract {\n    using BytesDecoder for bytes;\n    using ZepSafeMath for uint;\n\n    IExchange private _exchange;\n    address private _proxy;\n    string private _arguments;\n    bytes4 private ERC20bytes = bytes4(keccak256(\"ERC20Token(address)\"));\n\n    /** @dev Initialize subContract with arguments json 0x Exchange address and the 0x erc20 proxy address.\n        @notice Initialize subContract with arguments json 0x Exchange address and the 0x erc20 proxy address.\n        @param args The arguments json string.\n        @param exchangeAddress The 0x deployed exchange address.\n        @param proxyAddress The 0x deployed erc20 proxy address.\n    */\n    constructor(string memory args, address exchangeAddress, address proxyAddress) public {\n        _arguments = args;\n        _exchange = IExchange(exchangeAddress);\n        _proxy = proxyAddress;\n    }\n\n    /** @dev The arguments used to serialize kosu orders into values to generate the 0x exchange transaction.\n        @notice The arguments used to serialize kosu orders into values to generate the 0x exchange transaction.\n        @return String encoded JSON object used to encode contract input.\n    */\n    function arguments() external view returns (string memory) {\n        return _arguments;\n    }\n\n    /** @dev De-serializes kosu order data to 0x order and checks validity.\n        @notice De-serializes kosu order data to 0x order and checks validity.\n        @param data Kosu order data serialized with arguments.\n        @return Validity of order.\n    */\n    function isValid(bytes calldata data) external view returns (bool) {\n        LibOrder.Order memory order = _getOrder(data);\n        LibOrder.OrderInfo memory info = _exchange.getOrderInfo(order);\n        return info.orderStatus == uint8(LibOrder.OrderStatus.FILLABLE);\n    }\n\n    /** @dev De-serializes kosu order data to 0x order and checks remaining fillable tokens.\n        @notice De-serializes kosu order data to 0x order and checks remaining fillable tokens.\n        @param data Kosu order data serialized with arguments.\n        @return Tokens remaining to fill.\n    */\n    function amountRemaining(bytes calldata data) external view returns (uint) {\n        LibOrder.Order memory order = _getOrder(data);\n        LibOrder.OrderInfo memory info = _exchange.getOrderInfo(order);\n        return order.takerAssetAmount - info.orderTakerAssetFilledAmount;\n    }\n\n    /** @dev De-serializes ksou order data to 0x order and submits to the 0x exchange for final resolution. Finalizes by forwarding along any successfully exchanged tokens.\n        @notice De-serializes ksou order data to 0x order and submits to the 0x exchange for final resolution. Finalizes by forwarding along any successfully exchanged tokens.\n        @param data Kosu order data serialized with arguments.\n        @return Fill success.\n    */\n    function participate(bytes calldata data) external returns (bool) {\n        LibOrder.Order memory order = _getOrder(data);\n        address taker = data.getAddress(410);\n        uint takeAmount = data.getUint(430);\n\n        require(taker == tx.origin, \"The taker should send the transaction\");\n\n        // TODO May want to use a different method since 0x started doing something different for gas reasons.\n        require(_getTokenAssetCode(order.makerAssetData.getBytes(0, 4)) == ERC20bytes, \"Maker token asset isn't ERC20\");\n        require(_getTokenAssetCode(order.takerAssetData.getBytes(0, 4)) == ERC20bytes, \"Taker token asset isn't ERC20\");\n\n        IERC20 makerToken = IERC20(order.makerAssetData.getAddress(16));\n        IERC20 takerToken = IERC20(order.takerAssetData.getAddress(16));\n\n        takerToken.transferFrom(taker, address(this), takeAmount);\n        takerToken.approve(_proxy, takeAmount);\n\n        LibFillResults.FillResults memory fillResult = _exchange.fillOrder(order, takeAmount, _getSignature(data));\n\n        if (fillResult.makerAssetFilledAmount > 0) {\n            require(makerToken.transfer(taker, fillResult.makerAssetFilledAmount), \"Didn't successfully forward exchanged tokens. Reverting.\");\n        }\n\n        if (fillResult.takerAssetFilledAmount < takeAmount) {\n            require(takerToken.transfer(taker, takeAmount.sub(fillResult.takerAssetFilledAmount)), \"Didn't successfully return excess tokens. Reverting.\");\n        }\n\n        return true;\n    }\n\n    /** @dev Internal function to deserialize the Order data from the input bytes.\n    */\n    function _getOrder(bytes memory data) internal pure returns (LibOrder.Order memory) {\n        return LibOrder.Order(\n            data.getAddress(0),\n            data.getAddress(20),\n            data.getAddress(40),\n            data.getAddress(60),\n            data.getUint(80),\n            data.getUint(112),\n            data.getUint(144),\n            data.getUint(176),\n            data.getUint(208),\n            data.getUint(240),\n            data.getBytes(272, 36),\n            data.getBytes(308, 36)\n        );\n    }\n\n    /** @dev Internal function to deserialize the 0x signature from the input bytes.\n    */\n    function _getSignature(bytes memory data) internal returns (bytes memory) {\n        return data.getBytes(344, 66); // Special 0x signature with a trailing code representing the signature type.\n    }\n\n    /** @dev Internal function to read the token asset code\n    */\n    function _getTokenAssetCode(bytes memory data) internal pure returns (bytes4 outBytes4) {\n        if (data.length == 0) {\n            return 0x0;\n        }\n\n        assembly {\n            outBytes4 := mload(add(data, 32))\n        }\n    }\n}\n",
        "@kosu/subcontract-sdk/contracts/SubContract.sol": "pragma solidity ^0.5.0;\n\n/** @title SubContract\n    @author Freydal\n*/\ninterface SubContract {\n\n    /** @dev Defines interface for reporting argument json.\n        @notice Defines interface for reporting argument json.\n        @return JSON string representing arguments.\n    */\n    function arguments() external view returns (string memory);\n\n    /** @dev Defines interface for Kosu Order validation.\n        @notice Defines interface for Kosu Order validation.\n        @param data Kosu Order serialized based on arguments.\n        @return boolean representing validity of order\n    */\n    function isValid(bytes calldata data) external view returns (bool);\n\n    /** @dev Defines interface for determining remaining amount available in Kosu order\n        @notice Defines interface for determining remaining amount available in Kosu order\n        @param data Kosu Order serialized based on arguments.\n        @return Number of asset available to be taken\n    */\n    function amountRemaining(bytes calldata data) external view returns (uint);\n\n    /** @dev Defines interface to settlement of Kosu order\n        @notice Defines interface to settlement of Kosu order\n        @param data Kosu Order serialized based on arguments.\n        @return Number of asset successfully taken\n    */\n    function participate(bytes calldata data) external returns (bool);\n}\n",
        "@kosu/subcontract-sdk/contracts/BytesDecoder.sol": "pragma solidity ^0.5.0;\n\nlibrary BytesDecoder {\n    function getAddress(bytes memory this, uint index) internal pure returns (address a) {\n        assembly {\n            a := mload(add(add(this, index), 20))\n        }\n    }\n\n    function getUint(bytes memory this, uint index) internal pure returns (uint ui) {\n        assembly {\n            ui := mload(add(add(this, index), 32))\n        }\n    }\n\n    function getInt(bytes memory this, uint index) internal pure returns (int i) {\n        assembly {\n            i := mload(add(add(this, index), 32))\n        }\n    }\n\n    function getBytes(bytes memory this, uint start, uint length) internal pure returns (bytes memory) {\n        bytes memory result = new bytes(length);\n        for(uint i = start; i < length + start; i++) {\n            result[i-start] = this[i];\n        }\n        return result;\n    }\n\n    function getSignature(bytes memory this, uint start) internal pure returns (bytes memory) {\n        return getBytes(this, start, 65);\n    }\n}",
        "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol": "pragma solidity ^0.5.0;\n\n/**\n * @title ERC20 interface\n * @dev see https://github.com/ethereum/EIPs/issues/20\n */\ninterface IERC20 {\n    function transfer(address to, uint256 value) external returns (bool);\n\n    function approve(address spender, uint256 value) external returns (bool);\n\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n\n    function totalSupply() external view returns (uint256);\n\n    function balanceOf(address who) external view returns (uint256);\n\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n",
        "openzeppelin-solidity/contracts/math/SafeMath.sol": "pragma solidity ^0.5.0;\n\n/**\n * @title SafeMath\n * @dev Unsigned math operations with safety checks that revert on error\n */\nlibrary SafeMath {\n    /**\n    * @dev Multiplies two unsigned integers, reverts on overflow.\n    */\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n        // benefit is lost if 'b' is also tested.\n        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n        if (a == 0) {\n            return 0;\n        }\n\n        uint256 c = a * b;\n        require(c / a == b);\n\n        return c;\n    }\n\n    /**\n    * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.\n    */\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\n        // Solidity only automatically asserts when dividing by 0\n        require(b > 0);\n        uint256 c = a / b;\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n        return c;\n    }\n\n    /**\n    * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).\n    */\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n        require(b <= a);\n        uint256 c = a - b;\n\n        return c;\n    }\n\n    /**\n    * @dev Adds two unsigned integers, reverts on overflow.\n    */\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\n        uint256 c = a + b;\n        require(c >= a);\n\n        return c;\n    }\n\n    /**\n    * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),\n    * reverts when dividing by zero.\n    */\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n        require(b != 0);\n        return a % b;\n    }\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/IExchange.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.5.5;\npragma experimental ABIEncoderV2;\n\nimport \"./IExchangeCore.sol\";\nimport \"./IMatchOrders.sol\";\nimport \"./ISignatureValidator.sol\";\nimport \"./ITransactions.sol\";\nimport \"./IAssetProxyDispatcher.sol\";\nimport \"./IWrapperFunctions.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract IExchange is\n    IExchangeCore,\n    IMatchOrders,\n    ISignatureValidator,\n    ITransactions,\n    IAssetProxyDispatcher,\n    IWrapperFunctions\n{}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/IExchangeCore.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.5.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n    /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n    ///      and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n    /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n    function cancelOrdersUpTo(uint256 targetOrderEpoch)\n        external;\n\n    /// @dev Fills the input order.\n    /// @param order Order struct containing order specifications.\n    /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n    /// @param signature Proof that order has been created by maker.\n    /// @return Amounts filled and fees paid by maker and taker.\n    function fillOrder(\n        LibOrder.Order memory order,\n        uint256 takerAssetFillAmount,\n        bytes memory signature\n    )\n        public\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev After calling, the order can not be filled anymore.\n    /// @param order Order struct containing order specifications.\n    function cancelOrder(LibOrder.Order memory order)\n        public;\n\n    /// @dev Gets information about an order: status, hash, and amount filled.\n    /// @param order Order to gather information on.\n    /// @return OrderInfo Information about the order and its state.\n    ///                   See LibOrder.OrderInfo for a complete description.\n    function getOrderInfo(LibOrder.Order memory order)\n        public\n        view\n        returns (LibOrder.OrderInfo memory orderInfo);\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibOrder.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.5.5;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n    LibEIP712\n{\n    // Hash for the EIP712 Order Schema\n    bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n        \"Order(\",\n        \"address makerAddress,\",\n        \"address takerAddress,\",\n        \"address feeRecipientAddress,\",\n        \"address senderAddress,\",\n        \"uint256 makerAssetAmount,\",\n        \"uint256 takerAssetAmount,\",\n        \"uint256 makerFee,\",\n        \"uint256 takerFee,\",\n        \"uint256 expirationTimeSeconds,\",\n        \"uint256 salt,\",\n        \"bytes makerAssetData,\",\n        \"bytes takerAssetData\",\n        \")\"\n    ));\n\n    // A valid order remains fillable until it is expired, fully filled, or cancelled.\n    // An order's state is unaffected by external factors, like account balances.\n    enum OrderStatus {\n        INVALID,                     // Default value\n        INVALID_MAKER_ASSET_AMOUNT,  // Order does not have a valid maker asset amount\n        INVALID_TAKER_ASSET_AMOUNT,  // Order does not have a valid taker asset amount\n        FILLABLE,                    // Order is fillable\n        EXPIRED,                     // Order has already expired\n        FULLY_FILLED,                // Order is fully filled\n        CANCELLED                    // Order has been cancelled\n    }\n\n    // solhint-disable max-line-length\n    struct Order {\n        address makerAddress;           // Address that created the order.      \n        address takerAddress;           // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order.          \n        address feeRecipientAddress;    // Address that will recieve fees when order is filled.      \n        address senderAddress;          // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n        uint256 makerAssetAmount;       // Amount of makerAsset being offered by maker. Must be greater than 0.        \n        uint256 takerAssetAmount;       // Amount of takerAsset being bid on by maker. Must be greater than 0.        \n        uint256 makerFee;               // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n        uint256 takerFee;               // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n        uint256 expirationTimeSeconds;  // Timestamp in seconds at which order expires.          \n        uint256 salt;                   // Arbitrary number to facilitate uniqueness of the order's hash.     \n        bytes makerAssetData;           // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n        bytes takerAssetData;           // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n    }\n    // solhint-enable max-line-length\n\n    struct OrderInfo {\n        uint8 orderStatus;                    // Status that describes order's validity and fillability.\n        bytes32 orderHash;                    // EIP712 hash of the order (see LibOrder.getOrderHash).\n        uint256 orderTakerAssetFilledAmount;  // Amount of order that has already been filled.\n    }\n\n    /// @dev Calculates Keccak-256 hash of the order.\n    /// @param order The order structure.\n    /// @return Keccak-256 EIP712 hash of the order.\n    function getOrderHash(Order memory order)\n        internal\n        view\n        returns (bytes32 orderHash)\n    {\n        orderHash = hashEIP712Message(hashOrder(order));\n        return orderHash;\n    }\n\n    /// @dev Calculates EIP712 hash of the order.\n    /// @param order The order structure.\n    /// @return EIP712 hash of the order.\n    function hashOrder(Order memory order)\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n        bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n        bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n        // Assembly for more efficiently computing:\n        // keccak256(abi.encodePacked(\n        //     EIP712_ORDER_SCHEMA_HASH,\n        //     bytes32(order.makerAddress),\n        //     bytes32(order.takerAddress),\n        //     bytes32(order.feeRecipientAddress),\n        //     bytes32(order.senderAddress),\n        //     order.makerAssetAmount,\n        //     order.takerAssetAmount,\n        //     order.makerFee,\n        //     order.takerFee,\n        //     order.expirationTimeSeconds,\n        //     order.salt,\n        //     keccak256(order.makerAssetData),\n        //     keccak256(order.takerAssetData)\n        // ));\n\n        assembly {\n            // Calculate memory addresses that will be swapped out before hashing\n            let pos1 := sub(order, 32)\n            let pos2 := add(order, 320)\n            let pos3 := add(order, 352)\n\n            // Backup\n            let temp1 := mload(pos1)\n            let temp2 := mload(pos2)\n            let temp3 := mload(pos3)\n            \n            // Hash in place\n            mstore(pos1, schemaHash)\n            mstore(pos2, makerAssetDataHash)\n            mstore(pos3, takerAssetDataHash)\n            result := keccak256(pos1, 416)\n            \n            // Restore\n            mstore(pos1, temp1)\n            mstore(pos2, temp2)\n            mstore(pos3, temp3)\n        }\n        return result;\n    }\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibEIP712.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.5.5;\n\n\ncontract LibEIP712 {\n\n    // EIP191 header for EIP712 prefix\n    string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n    // EIP712 Domain Name value\n    string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n    // EIP712 Domain Version value\n    string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n    // Hash of the EIP712 Domain Separator Schema\n    bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n        \"EIP712Domain(\",\n        \"string name,\",\n        \"string version,\",\n        \"address verifyingContract\",\n        \")\"\n    ));\n\n    // Hash of the EIP712 Domain Separator data\n    // solhint-disable-next-line var-name-mixedcase\n    bytes32 public EIP712_DOMAIN_HASH;\n\n    constructor ()\n        public\n    {\n        EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n            EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n            keccak256(bytes(EIP712_DOMAIN_NAME)),\n            keccak256(bytes(EIP712_DOMAIN_VERSION)),\n            uint256(address(this))\n        ));\n    }\n\n    /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n    /// @param hashStruct The EIP712 hash struct.\n    /// @return EIP712 hash applied to this EIP712 Domain.\n    function hashEIP712Message(bytes32 hashStruct)\n        internal\n        view\n        returns (bytes32 result)\n    {\n        bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n        // Assembly for more efficient computing:\n        // keccak256(abi.encodePacked(\n        //     EIP191_HEADER,\n        //     EIP712_DOMAIN_HASH,\n        //     hashStruct    \n        // ));\n\n        assembly {\n            // Load free memory pointer\n            let memPtr := mload(64)\n\n            mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000)  // EIP191 header\n            mstore(add(memPtr, 2), eip712DomainHash)                                            // EIP712 domain hash\n            mstore(add(memPtr, 34), hashStruct)                                                 // Hash of struct\n\n            // Compute hash\n            result := keccak256(memPtr, 66)\n        }\n        return result;\n    }\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibFillResults.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.5.5;\n\nimport \"@0x/contracts-utils/contracts/src/SafeMath.sol\";\n\n\ncontract LibFillResults is\n    SafeMath\n{\n    struct FillResults {\n        uint256 makerAssetFilledAmount;  // Total amount of makerAsset(s) filled.\n        uint256 takerAssetFilledAmount;  // Total amount of takerAsset(s) filled.\n        uint256 makerFeePaid;            // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n        uint256 takerFeePaid;            // Total amount of ZRX paid by taker to feeRecipients(s).\n    }\n\n    struct MatchedFillResults {\n        FillResults left;                    // Amounts filled and fees paid of left order.\n        FillResults right;                   // Amounts filled and fees paid of right order.\n        uint256 leftMakerAssetSpreadAmount;  // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n    }\n\n    /// @dev Adds properties of both FillResults instances.\n    ///      Modifies the first FillResults instance specified.\n    /// @param totalFillResults Fill results instance that will be added onto.\n    /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n    function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n        internal\n        pure\n    {\n        totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n        totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n        totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n        totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/SafeMath.sol": "pragma solidity ^0.5.5;\n\n\ncontract SafeMath {\n\n    function safeMul(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (a == 0) {\n            return 0;\n        }\n        uint256 c = a * b;\n        require(\n            c / a == b,\n            \"UINT256_OVERFLOW\"\n        );\n        return c;\n    }\n\n    function safeDiv(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        uint256 c = a / b;\n        return c;\n    }\n\n    function safeSub(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        require(\n            b <= a,\n            \"UINT256_UNDERFLOW\"\n        );\n        return a - b;\n    }\n\n    function safeAdd(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        uint256 c = a + b;\n        require(\n            c >= a,\n            \"UINT256_OVERFLOW\"\n        );\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",
        "@0x/contracts-exchange/contracts/src/interfaces/IMatchOrders.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.5.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n    /// @dev Match two complementary orders that have a profitable spread.\n    ///      Each order is filled at their respective price point. However, the calculations are\n    ///      carried out as though the orders are both being filled at the right order's price point.\n    ///      The profit made by the left order goes to the taker (who matched the two orders).\n    /// @param leftOrder First order to match.\n    /// @param rightOrder Second order to match.\n    /// @param leftSignature Proof that order was created by the left maker.\n    /// @param rightSignature Proof that order was created by the right maker.\n    /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n    function matchOrders(\n        LibOrder.Order memory leftOrder,\n        LibOrder.Order memory rightOrder,\n        bytes memory leftSignature,\n        bytes memory rightSignature\n    )\n        public\n        returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/ISignatureValidator.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.5.5;\n\n\ncontract ISignatureValidator {\n\n    /// @dev Approves a hash on-chain using any valid signature type.\n    ///      After presigning a hash, the preSign signature type will become valid for that hash and signer.\n    /// @param signerAddress Address that should have signed the given hash.\n    /// @param signature Proof that the hash has been signed by signer.\n    function preSign(\n        bytes32 hash,\n        address signerAddress,\n        bytes calldata signature\n    )\n        external;\n    \n    /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n    /// @param validatorAddress Address of Validator contract.\n    /// @param approval Approval or disapproval of  Validator contract.\n    function setSignatureValidatorApproval(\n        address validatorAddress,\n        bool approval\n    )\n        external;\n\n    /// @dev Verifies that a signature is valid.\n    /// @param hash Message hash that is signed.\n    /// @param signerAddress Address of signer.\n    /// @param signature Proof of signing.\n    /// @return Validity of order signature.\n    function isValidSignature(\n        bytes32 hash,\n        address signerAddress,\n        bytes memory signature\n    )\n        public\n        view\n        returns (bool isValid);\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/ITransactions.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.5.5;\n\n\ncontract ITransactions {\n\n    /// @dev Executes an exchange method call in the context of signer.\n    /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n    /// @param signerAddress Address of transaction signer.\n    /// @param data AbiV2 encoded calldata.\n    /// @param signature Proof of signer transaction by signer.\n    function executeTransaction(\n        uint256 salt,\n        address signerAddress,\n        bytes calldata data,\n        bytes calldata signature\n    )\n        external;\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/IAssetProxyDispatcher.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.5.5;\n\n\ncontract IAssetProxyDispatcher {\n\n    /// @dev Registers an asset proxy to its asset proxy id.\n    ///      Once an asset proxy is registered, it cannot be unregistered.\n    /// @param assetProxy Address of new asset proxy to register.\n    function registerAssetProxy(address assetProxy)\n        external;\n\n    /// @dev Gets an asset proxy.\n    /// @param assetProxyId Id of the asset proxy.\n    /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n    function getAssetProxy(bytes4 assetProxyId)\n        external\n        view\n        returns (address);\n}\n",
        "@0x/contracts-exchange/contracts/src/interfaces/IWrapperFunctions.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.5.5;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-exchange-libs/contracts/src/LibOrder.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n    /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n    /// @param order LibOrder.Order struct containing order specifications.\n    /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n    /// @param signature Proof that order has been created by maker.\n    function fillOrKillOrder(\n        LibOrder.Order memory order,\n        uint256 takerAssetFillAmount,\n        bytes memory signature\n    )\n        public\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Fills an order with specified parameters and ECDSA signature.\n    ///      Returns false if the transaction would otherwise revert.\n    /// @param order LibOrder.Order struct containing order specifications.\n    /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n    /// @param signature Proof that order has been created by maker.\n    /// @return Amounts filled and fees paid by maker and taker.\n    function fillOrderNoThrow(\n        LibOrder.Order memory order,\n        uint256 takerAssetFillAmount,\n        bytes memory signature\n    )\n        public\n        returns (LibFillResults.FillResults memory fillResults);\n\n    /// @dev Synchronously executes multiple calls of fillOrder.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n    /// @param signatures Proofs that orders have been created by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function batchFillOrders(\n        LibOrder.Order[] memory orders,\n        uint256[] memory takerAssetFillAmounts,\n        bytes[] memory signatures\n    )\n        public\n        returns (LibFillResults.FillResults memory totalFillResults);\n\n    /// @dev Synchronously executes multiple calls of fillOrKill.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n    /// @param signatures Proofs that orders have been created by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function batchFillOrKillOrders(\n        LibOrder.Order[] memory orders,\n        uint256[] memory takerAssetFillAmounts,\n        bytes[] memory signatures\n    )\n        public\n        returns (LibFillResults.FillResults memory totalFillResults);\n\n    /// @dev Fills an order with specified parameters and ECDSA signature.\n    ///      Returns false if the transaction would otherwise revert.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n    /// @param signatures Proofs that orders have been created by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function batchFillOrdersNoThrow(\n        LibOrder.Order[] memory orders,\n        uint256[] memory takerAssetFillAmounts,\n        bytes[] memory signatures\n    )\n        public\n        returns (LibFillResults.FillResults memory totalFillResults);\n\n    /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n    /// @param signatures Proofs that orders have been created by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketSellOrders(\n        LibOrder.Order[] memory orders,\n        uint256 takerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        returns (LibFillResults.FillResults memory totalFillResults);\n\n    /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n    ///      Returns false if the transaction would otherwise revert.\n    /// @param orders Array of order specifications.\n    /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n    /// @param signatures Proofs that orders have been signed by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketSellOrdersNoThrow(\n        LibOrder.Order[] memory orders,\n        uint256 takerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        returns (LibFillResults.FillResults memory totalFillResults);\n\n    /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n    /// @param orders Array of order specifications.\n    /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n    /// @param signatures Proofs that orders have been signed by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketBuyOrders(\n        LibOrder.Order[] memory orders,\n        uint256 makerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        returns (LibFillResults.FillResults memory totalFillResults);\n\n    /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n    ///      Returns false if the transaction would otherwise revert.\n    /// @param orders Array of order specifications.\n    /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n    /// @param signatures Proofs that orders have been signed by makers.\n    /// @return Amounts filled and fees paid by makers and taker.\n    function marketBuyOrdersNoThrow(\n        LibOrder.Order[] memory orders,\n        uint256 makerAssetFillAmount,\n        bytes[] memory signatures\n    )\n        public\n        returns (LibFillResults.FillResults memory totalFillResults);\n\n    /// @dev Synchronously cancels multiple orders in a single transaction.\n    /// @param orders Array of order specifications.\n    function batchCancelOrders(LibOrder.Order[] memory orders)\n        public;\n\n    /// @dev Fetches information for all passed in orders\n    /// @param orders Array of order specifications.\n    /// @return Array of OrderInfo instances that correspond to each order.\n    function getOrdersInfo(LibOrder.Order[] memory orders)\n        public\n        view\n        returns (LibOrder.OrderInfo[] memory);\n}\n"
    },
    "sourceTreeHashHex": "0xaaf479155cf6974bf9908b3909c2ae350956ec6b3936d50d3ccc2856330f166e",
    "compiler": {
        "name": "solc",
        "version": "soljson-v0.5.11+commit.c082d0b4.js",
        "settings": {
            "optimizer": {
                "enabled": true,
                "runs": 200,
                "details": {
                    "yul": true,
                    "deduplicate": true,
                    "cse": true,
                    "constantOptimizer": true
                }
            },
            "outputSelection": {
                "*": {
                    "*": [
                        "abi",
                        "devdoc",
                        "evm.bytecode.object",
                        "evm.bytecode.sourceMap",
                        "evm.deployedBytecode.object",
                        "evm.deployedBytecode.sourceMap"
                    ]
                }
            },
            "evmVersion": "constantinople",
            "remappings": [
                "@kosu/subcontract-sdk=/Users/hen/GitHub/km/packages/kosu-system-contracts/node_modules/@kosu/subcontract-sdk",
                "openzeppelin-solidity=/Users/hen/GitHub/km/node_modules/openzeppelin-solidity",
                "@0x/contracts-exchange=/Users/hen/GitHub/km/node_modules/@0x/contracts-exchange",
                "@0x/contracts-exchange-libs=/Users/hen/GitHub/km/node_modules/@0x/contracts-exchange-libs",
                "@0x/contracts-utils=/Users/hen/GitHub/km/node_modules/@0x/contracts-utils"
            ]
        }
    },
    "networks": {}
}
