{
    "schemaVersion": "2.0.0",
    "contractName": "TestDexForwarderBridge",
    "compilerOutput": {
        "abi": [
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "caller",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "inputTokenBalance",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "inputToken",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "outputToken",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "BridgeTransferFromCalled",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "inputToken",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "outputToken",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "inputTokenAmount",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "outputTokenAmount",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    }
                ],
                "name": "ERC20BridgeTransfer",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "TokenTransferCalled",
                "type": "event"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "token",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "owner",
                        "type": "address"
                    }
                ],
                "name": "balanceOf",
                "outputs": [
                    {
                        "internalType": "uint256",
                        "name": "",
                        "type": "uint256"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "outputToken",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "",
                        "type": "uint256"
                    },
                    {
                        "internalType": "bytes",
                        "name": "bridgeData",
                        "type": "bytes"
                    }
                ],
                "name": "bridgeTransferFrom",
                "outputs": [
                    {
                        "internalType": "bytes4",
                        "name": "success",
                        "type": "bytes4"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "bytes4",
                        "name": "returnCode",
                        "type": "bytes4"
                    },
                    {
                        "internalType": "string",
                        "name": "revertError",
                        "type": "string"
                    }
                ],
                "name": "createBridge",
                "outputs": [
                    {
                        "internalType": "address",
                        "name": "bridge",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [],
                "name": "createToken",
                "outputs": [
                    {
                        "internalType": "address",
                        "name": "token",
                        "type": "address"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "caller",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "inputTokenBalance",
                        "type": "uint256"
                    },
                    {
                        "internalType": "address",
                        "name": "inputToken",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "outputToken",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "emitBridgeTransferFromCalled",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "from",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "emitTokenTransferCalled",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "bridge",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "to",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "inputToken",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "outputToken",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "inputTokenAmount",
                        "type": "uint256"
                    },
                    {
                        "internalType": "uint256",
                        "name": "outputTokenAmount",
                        "type": "uint256"
                    },
                    {
                        "internalType": "bytes",
                        "name": "bridgeData",
                        "type": "bytes"
                    }
                ],
                "name": "executeBridgeCall",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "internalType": "bytes32",
                        "name": "",
                        "type": "bytes32"
                    },
                    {
                        "internalType": "bytes",
                        "name": "",
                        "type": "bytes"
                    }
                ],
                "name": "isValidSignature",
                "outputs": [
                    {
                        "internalType": "bytes4",
                        "name": "magicValue",
                        "type": "bytes4"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "authorized",
                        "type": "address"
                    }
                ],
                "name": "setAuthorized",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "bridge",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "setBridgeTransferAmount",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "internalType": "address",
                        "name": "token",
                        "type": "address"
                    },
                    {
                        "internalType": "address",
                        "name": "owner",
                        "type": "address"
                    },
                    {
                        "internalType": "uint256",
                        "name": "amount",
                        "type": "uint256"
                    }
                ],
                "name": "setTokenBalance",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            }
        ],
        "devdoc": {
            "methods": {
                "bridgeTransferFrom(address,address,address,uint256,bytes)": {
                    "details": "Spends this contract's entire balance of input tokens by forwarding them to other bridges. Reverts if the entire balance is not spent.",
                    "params": {
                        "bridgeData": "The abi-encoded input token address.",
                        "outputToken": "The token being bought.",
                        "to": "The recipient of the bought tokens."
                    },
                    "return": "success The magic bytes if successful."
                },
                "executeBridgeCall(address,address,address,address,uint256,uint256,bytes)": {
                    "params": {
                        "bridge": "The bridge contract.",
                        "inputToken": "The input token.",
                        "inputTokenAmount": "The amount of input tokens to transfer to `bridge`.",
                        "outputToken": "The output token.",
                        "outputTokenAmount": "The amount of expected output tokens to be sent        to `to` by `bridge`.",
                        "to": "The recipient of `outputToken` tokens."
                    }
                },
                "isValidSignature(bytes32,bytes)": {
                    "details": "`SignatureType.Wallet` callback, so that this bridge can be the maker      and sign for itself in orders. Always succeeds.",
                    "return": "magicValue Magic success bytes, always."
                }
            }
        },
        "evm": {
            "bytecode": {
                "linkReferences": {},
                "object": "0x608060405234801561001057600080fd5b506127ba806100206000396000f3fe60806040523480156200001157600080fd5b5060043610620000dc5760003560e01c80639cbf9e36116200008d578063b717bb781162000063578063b717bb7814620001b5578063c2df82e614620001cc578063f7888aec14620001e357620000dc565b80639cbf9e36146200016e578063a7ea66351462000187578063a8219047146200019e57620000dc565b80631626ba7e11620000c35780631626ba7e1462000111578063216b5fc114620001405780635100b572146200015757620000dc565b8063060dac8814620000e157806314fc281214620000fa575b600080fd5b620000f8620000f23660046200151b565b62000209565b005b620000f86200010b366004620012d6565b62000298565b62000128620001223660046200161c565b620002df565b60405162000137919062001914565b60405180910390f35b620000f862000151366004620013e3565b62000307565b620000f8620001683660046200158e565b62000666565b62000178620006b4565b60405162000137919062001764565b620000f8620001983660046200151b565b620006e7565b620000f8620001af36600462001560565b62000729565b62000178620001c63660046200166a565b620007b5565b62000128620001dd3660046200148e565b620007fb565b620001fa620001f4366004620013a6565b62000c9f565b60405162000137919062001a44565b6040517fe30443bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063e30443bc906200025f90859085906004016200189f565b600060405180830381600087803b1580156200027a57600080fd5b505af11580156200028f573d6000803e3d6000fd5b50505050505050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7fb0671381000000000000000000000000000000000000000000000000000000009392505050565b3330146200034c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034390620019b0565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff88163014156200037057600080fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190620003c7908b9060040162001764565b60206040518083038186803b158015620003e057600080fd5b505afa158015620003f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200041b9190810190620016e1565b90506200042a878a8762000d51565b60405160009060609073ffffffffffffffffffffffffffffffffffffffff8c16907fc2df82e6000000000000000000000000000000000000000000000000000000009062000487908b908f908f908c908c908c90602401620017e9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905162000512919062001746565b6000604051808303816000865af19150503d806000811462000551576040519150601f19603f3d011682016040523d82523d6000602084013e62000556565b606091505b50915091508180156200056a575080516020145b8015620005a257507fdc1600f300000000000000000000000000000000000000000000000000000000620005a082600062000e1c565b145b80156200064f5750856200064c848a73ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401620005eb919062001764565b60206040518083038186803b1580156200060457600080fd5b505afa15801562000619573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200063f9190810190620016e1565b9063ffffffff62000e5016565b10155b6200065957600080fd5b5050505050505050505050565b7fa32c6370f8f70d860e490f35427e8f448e99e9919b95a033b206eb214203192c87878787878787604051620006a39796959493929190620018c5565b60405180910390a150505050505050565b6000604051620006c4906200111e565b604051809103906000f080158015620006e1573d6000803e3d6000fd5b50905090565b7f051a055da2249abb14ca9d819e46a4d13d6fbebd0767708feaa0509fad12b6468383836040516200071c939291906200186e565b60405180910390a1505050565b6040517f81c8223300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906381c82233906200077d90849060040162001a44565b600060405180830381600087803b1580156200079857600080fd5b505af1158015620007ad573d6000803e3d6000fd5b505050505050565b60008282604051620007c7906200112c565b620007d492919062001941565b604051809103906000f080158015620007f1573d6000803e3d6000fd5b5090505b92915050565b6000805a90506200080b62000e73565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000872576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034390620019e7565b6200087c6200113a565b6200088a84860186620012f5565b60a083015273ffffffffffffffffffffffffffffffffffffffff168082526040517f70a082310000000000000000000000000000000000000000000000000000000081526370a0823190620008e490309060040162001764565b60206040518083038186803b158015620008fd57600080fd5b505afa15801562000912573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620009389190810190620016e1565b602082015260005b8160a001515181101562000b8d578160200151826080015110620009645762000b8d565b620009a88260a0015182815181106200097957fe5b602002602001015160200151620009a28460800151856020015162000e5090919063ffffffff16565b62000e8f565b6040830181905260a08301518051620009f792919084908110620009c857fe5b6020026020010151602001518460a001518481518110620009e557fe5b60200260200101516040015162000ea7565b606083015260a0820151805160009130917f216b5fc10000000000000000000000000000000000000000000000000000000091908590811062000a3657fe5b6020026020010151600001518b86600001518f886040015189606001518a60a001518a8151811062000a6457fe5b60200260200101516060015160405160240162000a88979695949392919062001785565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905162000b13919062001746565b6000604051808303816000865af19150503d806000811462000b52576040519150601f19603f3d011682016040523d82523d6000602084013e62000b57565b606091505b50509050801562000b83576040830151608084015162000b7d9163ffffffff62000ed516565b60808401525b5060010162000940565b507fdc1600f300000000000000000000000000000000000000000000000000000000925050600062000bbe62000ef5565b905073ffffffffffffffffffffffffffffffffffffffff81161562000c9357600061a0aa5a840361374a018162000bf157fe5b0490508173ffffffffffffffffffffffffffffffffffffffff1663079d229f62000c1a62000efa565b836040518363ffffffff1660e01b815260040162000c3a9291906200189f565b602060405180830381600087803b15801562000c5557600080fd5b505af115801562000c6a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000c909190810190620016e1565b50505b50509695505050505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319062000cf690859060040162001764565b60206040518083038186803b15801562000d0f57600080fd5b505afa15801562000d24573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000d4a9190810190620016e1565b9392505050565b6040516060907fa9059cbb000000000000000000000000000000000000000000000000000000009062000d8b90859085906024016200189f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905062000e16848262000f0f565b50505050565b6000816020018351101562000e475762000e4762000e41600585518560200162000fd9565b62001080565b50016020015190565b60008282111562000e6d5762000e6d62000e416002858562001088565b50900390565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600081831062000ea0578162000d4a565b5090919050565b600062000ecd8362000ec0868563ffffffff620010a916565b9063ffffffff620010e116565b949350505050565b60008282018381101562000d4a5762000d4a62000e416000868662001088565b600090565b70d3b08566be75a6db803c03c85c0c1c5b9690565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405162000f3a919062001746565b6000604051808303816000865af19150503d806000811462000f79576040519150601f19603f3d011682016040523d82523d6000602084013e62000f7e565b606091505b5091509150811562000fca57805162000f9957505062000fd5565b80516020141562000fca57600062000fb382600062001110565b9050806001141562000fc85750505062000fd5565b505b62000e168162001080565b5050565b6060632800659560e01b84848460405160240162000ffa93929190620019a1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b606063e946c1bb60e01b84848460405160240162000ffa939291906200197e565b600082620010ba57506000620007f5565b82820282848281620010c857fe5b041462000d4a5762000d4a62000e416001868662001088565b600081620010fb57620010fb62000e416003858562001088565b60008284816200110757fe5b04949350505050565b600062000d4a838362000e1c565b6104a48062001aec83390190565b6107e88062001f9083390190565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001606081525090565b60008083601f84011262001198578182fd5b50813567ffffffffffffffff811115620011b0578182fd5b602083019150836020828501011115620011c957600080fd5b9250929050565b600082601f830112620011e1578081fd5b813567ffffffffffffffff811115620011f8578182fd5b6200122b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160162001a4d565b91508082528360208285010111156200124357600080fd5b8060208401602084013760009082016020015292915050565b6000608082840312156200126e578081fd5b6200127a608062001a4d565b90508135620012898162001ac5565b808252506020820135602082015260408201356040820152606082013567ffffffffffffffff811115620012bc57600080fd5b620012ca84828501620011d0565b60608301525092915050565b600060208284031215620012e8578081fd5b813562000d4a8162001ac5565b6000806040838503121562001308578081fd5b8235620013158162001ac5565b915060208381013567ffffffffffffffff81111562001332578283fd5b80850186601f82011262001344578384fd5b803591506200135d620013578362001a75565b62001a4d565b82815283810190828501865b858110156200139657620013838b8884358801016200125c565b8452928601929086019060010162001369565b5096999098509650505050505050565b60008060408385031215620013b9578182fd5b8235620013c68162001ac5565b91506020830135620013d88162001ac5565b809150509250929050565b60008060008060008060008060e0898b031215620013ff578384fd5b88356200140c8162001ac5565b975060208901356200141e8162001ac5565b96506040890135620014308162001ac5565b95506060890135620014428162001ac5565b94506080890135935060a0890135925060c089013567ffffffffffffffff8111156200146c578283fd5b6200147a8b828c0162001186565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215620014a7578182fd5b8635620014b48162001ac5565b95506020870135620014c68162001ac5565b94506040870135620014d88162001ac5565b935060608701359250608087013567ffffffffffffffff811115620014fb578283fd5b6200150989828a0162001186565b979a9699509497509295939492505050565b60008060006060848603121562001530578283fd5b83356200153d8162001ac5565b925060208401356200154f8162001ac5565b929592945050506040919091013590565b6000806040838503121562001573578182fd5b8235620015808162001ac5565b946020939093013593505050565b600080600080600080600060e0888a031215620015a9578283fd5b8735620015b68162001ac5565b9650602088013595506040880135620015cf8162001ac5565b94506060880135620015e18162001ac5565b93506080880135620015f38162001ac5565b925060a0880135620016058162001ac5565b8092505060c0880135905092959891949750929550565b60008060006040848603121562001631578081fd5b83359250602084013567ffffffffffffffff8111156200164f578182fd5b6200165d8682870162001186565b9497909650939450505050565b600080604083850312156200167d578182fd5b82357fffffffff0000000000000000000000000000000000000000000000000000000081168114620016ad578283fd5b9150602083013567ffffffffffffffff811115620016c9578182fd5b620016d785828601620011d0565b9150509250929050565b600060208284031215620016f3578081fd5b5051919050565b600081518084526200171481602086016020860162001a96565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516200175a81846020870162001a96565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff808a168352808916602084015280881660408401528087166060840152508460808301528360a083015260e060c0830152620017dc60e0830184620016fa565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8089168352808816602084015280871660408401525084606083015260a060808301528260a0830152828460c084013781830160c090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff97881681526020810196909652938616604086015291851660608501528416608084015290921660a082015260c081019190915260e00190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60007fffffffff00000000000000000000000000000000000000000000000000000000841682526040602083015262000ecd6040830184620016fa565b60608101600485106200198d57fe5b938152602081019290925260409091015290565b60608101600885106200198d57fe5b6020808252601c908201527f446578466f727761726465724272696467652f4f4e4c595f53454c4600000000604082015260600190565b60208082526028908201527f446578466f727761726465724272696467652f53454e4445525f4e4f545f415560408201527f54484f52495a4544000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171562001a6d57600080fd5b604052919050565b600067ffffffffffffffff82111562001a8c578081fd5b5060209081020190565b60005b8381101562001ab357818101518382015260200162001a99565b8381111562000e165750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811462001ae857600080fd5b5056fe608060405234801561001057600080fd5b50600180546001600160a01b03191633179055610472806100326000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806340c10f191461005157806370a0823114610066578063a9059cbb1461008f578063e30443bc146100af575b600080fd5b61006461005f36600461039e565b6100c2565b005b610079610074366004610383565b610125565b6040516100869190610426565b60405180910390f35b6100a261009d36600461039e565b610137565b60405161008691906103f9565b6100646100bd36600461039e565b610242565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020546100f8908263ffffffff61026b16565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526020819052604090209190915550565b60006020819052908152604090205481565b33600090815260208190526040812054610157908363ffffffff61029316565b336000908152602081905260408082209290925573ffffffffffffffffffffffffffffffffffffffff851681522054610196908363ffffffff61026b16565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040908190209290925560015491517fa7ea663500000000000000000000000000000000000000000000000000000000815291169063a7ea663590610205903390879087906004016103c8565b600060405180830381600087803b15801561021f57600080fd5b505af1158015610233573d6000803e3d6000fd5b50505050600190505b92915050565b73ffffffffffffffffffffffffffffffffffffffff909116600090815260208190526040902055565b60008282018381101561028c5761028c610287600086866102b2565b610357565b9392505050565b6000828211156102ac576102ac610287600285856102b2565b50900390565b606063e946c1bb60e01b8484846040516024016102d193929190610404565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461023c57600080fd5b600060208284031215610394578081fd5b61028c838361035f565b600080604083850312156103b0578081fd5b6103ba848461035f565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b901515815260200190565b606081016004851061041257fe5b938152602081019290925260409091015290565b9081526020019056fea365627a7a72315820c0631924a04fe30a4881cd112775f00399f3f6a5a4dec9b9508daf4dbf76bd506c6578706572696d656e74616cf564736f6c63430005110040608060405234801561001057600080fd5b506040516107e83803806107e883398101604081905261002f9161010c565b600380546001600160a01b031916331790556000805460e084901c63ffffffff199091161790558051610069906001906020840190610071565b5050506101e9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100b257805160ff19168380011785556100df565b828001600101855582156100df579182015b828111156100df5782518255916020019190600101906100c4565b506100eb9291506100ef565b5090565b61010991905b808211156100eb57600081556001016100f5565b90565b6000806040838503121561011e578182fd5b82516001600160e01b031981168114610135578283fd5b602084810151919350906001600160401b0380821115610153578384fd5b81860187601f820112610164578485fd5b8051925081831115610174578485fd5b604051601f8401601f1916810185018381118282101715610193578687fd5b60405283815281840185018910156101a9578586fd5b8592505b838310156101ca57818301850151818401860152918401916101ad565b838311156101da57858585830101525b80955050505050509250929050565b6105f0806101f86000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806381c822331461003b578063c2df82e614610050575b600080fd5b61004e61004936600461037a565b610079565b005b61006361005e3660046102bb565b61007e565b6040516100709190610440565b60405180910390f35b600255565b600060018054600181600116156101000203166002900490506000146100dc5760016040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d3919061046d565b60405180910390fd5b6000828060200190516100f29190810190610298565b6003546040517f70a0823100000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff90811691635100b572913391908516906370a08231906101579030906004016103aa565b60206040518083038186803b15801561016f57600080fd5b505afa158015610183573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101a79190810190610392565b848b8b8b8b6040518863ffffffff1660e01b81526004016101ce97969594939291906103cb565b600060405180830381600087803b1580156101e857600080fd5b505af11580156101fc573d6000803e3d6000fd5b50506002546040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1693506340c10f19925061025591899160040161041a565b600060405180830381600087803b15801561026f57600080fd5b505af1158015610283573d6000803e3d6000fd5b505060005460e01b9998505050505050505050565b6000602082840312156102a9578081fd5b81516102b481610588565b9392505050565b600080600080600060a086880312156102d2578081fd5b85356102dd81610588565b945060208601356102ed81610588565b935060408601356102fd81610588565b925060608601359150608086013567ffffffffffffffff81111561031f578182fd5b80870188601f820112610330578283fd5b803591506103456103408361053a565b610513565b828152896020848401011115610359578384fd5b61036a83602083016020850161057c565b8093505050509295509295909350565b60006020828403121561038b578081fd5b5035919050565b6000602082840312156103a3578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff97881681526020810196909652938616604086015291851660608501528416608084015290921660a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60006020820160208352818454600181166000811461049357600181146104cf57610508565b607f600283041684527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082166040870152606086019250610508565b6002820480855287865260208620865b828110156104fe578154898201604001526001909101906020016104df565b8801604001945050505b509095945050505050565b60405181810167ffffffffffffffff8111828210171561053257600080fd5b604052919050565b600067ffffffffffffffff821115610550578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b82818337506000910152565b73ffffffffffffffffffffffffffffffffffffffff811681146105aa57600080fd5b5056fea365627a7a72315820144f2f3a8a5c6aaeb6247156f3927cfb35c168129ded670499b68dbe4dd987446c6578706572696d656e74616cf564736f6c63430005110040a365627a7a723158209699014f8d00db27ad2f407e27cff8aeef748f74a10c1985bd10ecc0d8243d0a6c6578706572696d656e74616cf564736f6c63430005110040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x27BA DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH3 0xDC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9CBF9E36 GT PUSH3 0x8D JUMPI DUP1 PUSH4 0xB717BB78 GT PUSH3 0x63 JUMPI DUP1 PUSH4 0xB717BB78 EQ PUSH3 0x1B5 JUMPI DUP1 PUSH4 0xC2DF82E6 EQ PUSH3 0x1CC JUMPI DUP1 PUSH4 0xF7888AEC EQ PUSH3 0x1E3 JUMPI PUSH3 0xDC JUMP JUMPDEST DUP1 PUSH4 0x9CBF9E36 EQ PUSH3 0x16E JUMPI DUP1 PUSH4 0xA7EA6635 EQ PUSH3 0x187 JUMPI DUP1 PUSH4 0xA8219047 EQ PUSH3 0x19E JUMPI PUSH3 0xDC JUMP JUMPDEST DUP1 PUSH4 0x1626BA7E GT PUSH3 0xC3 JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH3 0x111 JUMPI DUP1 PUSH4 0x216B5FC1 EQ PUSH3 0x140 JUMPI DUP1 PUSH4 0x5100B572 EQ PUSH3 0x157 JUMPI PUSH3 0xDC JUMP JUMPDEST DUP1 PUSH4 0x60DAC88 EQ PUSH3 0xE1 JUMPI DUP1 PUSH4 0x14FC2812 EQ PUSH3 0xFA JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0xF8 PUSH3 0xF2 CALLDATASIZE PUSH1 0x4 PUSH3 0x151B JUMP JUMPDEST PUSH3 0x209 JUMP JUMPDEST STOP JUMPDEST PUSH3 0xF8 PUSH3 0x10B CALLDATASIZE PUSH1 0x4 PUSH3 0x12D6 JUMP JUMPDEST PUSH3 0x298 JUMP JUMPDEST PUSH3 0x128 PUSH3 0x122 CALLDATASIZE PUSH1 0x4 PUSH3 0x161C JUMP JUMPDEST PUSH3 0x2DF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x137 SWAP2 SWAP1 PUSH3 0x1914 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH3 0xF8 PUSH3 0x151 CALLDATASIZE PUSH1 0x4 PUSH3 0x13E3 JUMP JUMPDEST PUSH3 0x307 JUMP JUMPDEST PUSH3 0xF8 PUSH3 0x168 CALLDATASIZE PUSH1 0x4 PUSH3 0x158E JUMP JUMPDEST PUSH3 0x666 JUMP JUMPDEST PUSH3 0x178 PUSH3 0x6B4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x137 SWAP2 SWAP1 PUSH3 0x1764 JUMP JUMPDEST PUSH3 0xF8 PUSH3 0x198 CALLDATASIZE PUSH1 0x4 PUSH3 0x151B JUMP JUMPDEST PUSH3 0x6E7 JUMP JUMPDEST PUSH3 0xF8 PUSH3 0x1AF CALLDATASIZE PUSH1 0x4 PUSH3 0x1560 JUMP JUMPDEST PUSH3 0x729 JUMP JUMPDEST PUSH3 0x178 PUSH3 0x1C6 CALLDATASIZE PUSH1 0x4 PUSH3 0x166A JUMP JUMPDEST PUSH3 0x7B5 JUMP JUMPDEST PUSH3 0x128 PUSH3 0x1DD CALLDATASIZE PUSH1 0x4 PUSH3 0x148E JUMP JUMPDEST PUSH3 0x7FB JUMP JUMPDEST PUSH3 0x1FA PUSH3 0x1F4 CALLDATASIZE PUSH1 0x4 PUSH3 0x13A6 JUMP JUMPDEST PUSH3 0xC9F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x137 SWAP2 SWAP1 PUSH3 0x1A44 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xE30443BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xE30443BC SWAP1 PUSH3 0x25F SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH3 0x189F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x28F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH32 0xB067138100000000000000000000000000000000000000000000000000000000 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH3 0x34C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x343 SWAP1 PUSH3 0x19B0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND ADDRESS EQ ISZERO PUSH3 0x370 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH3 0x3C7 SWAP1 DUP12 SWAP1 PUSH1 0x4 ADD PUSH3 0x1764 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0x3F5 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 PUSH3 0x41B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16E1 JUMP JUMPDEST SWAP1 POP PUSH3 0x42A DUP8 DUP11 DUP8 PUSH3 0xD51 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP1 PUSH32 0xC2DF82E600000000000000000000000000000000000000000000000000000000 SWAP1 PUSH3 0x487 SWAP1 DUP12 SWAP1 DUP16 SWAP1 DUP16 SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP13 SWAP1 PUSH1 0x24 ADD PUSH3 0x17E9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH3 0x512 SWAP2 SWAP1 PUSH3 0x1746 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH3 0x551 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH3 0x556 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH3 0x56A JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST DUP1 ISZERO PUSH3 0x5A2 JUMPI POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 PUSH3 0x5A0 DUP3 PUSH1 0x0 PUSH3 0xE1C JUMP JUMPDEST EQ JUMPDEST DUP1 ISZERO PUSH3 0x64F JUMPI POP DUP6 PUSH3 0x64C DUP5 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 DUP15 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x5EB SWAP2 SWAP1 PUSH3 0x1764 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x604 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0x619 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 PUSH3 0x63F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16E1 JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH3 0xE50 AND JUMP JUMPDEST LT ISZERO JUMPDEST PUSH3 0x659 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0xA32C6370F8F70D860E490F35427E8F448E99E9919B95A033B206EB214203192C DUP8 DUP8 DUP8 DUP8 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH3 0x6A3 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x18C5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH3 0x6C4 SWAP1 PUSH3 0x111E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH3 0x6E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH32 0x51A055DA2249ABB14CA9D819E46A4D13D6FBEBD0767708FEAA0509FAD12B646 DUP4 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH3 0x71C SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x186E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x81C8223300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x81C82233 SWAP1 PUSH3 0x77D SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH3 0x1A44 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x798 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x7AD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH3 0x7C7 SWAP1 PUSH3 0x112C JUMP JUMPDEST PUSH3 0x7D4 SWAP3 SWAP2 SWAP1 PUSH3 0x1941 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH3 0x7F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 GAS SWAP1 POP PUSH3 0x80B PUSH3 0xE73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH3 0x872 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x343 SWAP1 PUSH3 0x19E7 JUMP JUMPDEST PUSH3 0x87C PUSH3 0x113A JUMP JUMPDEST PUSH3 0x88A DUP5 DUP7 ADD DUP7 PUSH3 0x12F5 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 DUP3 MSTORE PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x70A08231 SWAP1 PUSH3 0x8E4 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH3 0x1764 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x8FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0x912 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 PUSH3 0x938 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16E1 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 PUSH1 0xA0 ADD MLOAD MLOAD DUP2 LT ISZERO PUSH3 0xB8D JUMPI DUP2 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x80 ADD MLOAD LT PUSH3 0x964 JUMPI PUSH3 0xB8D JUMP JUMPDEST PUSH3 0x9A8 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 DUP2 MLOAD DUP2 LT PUSH3 0x979 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH3 0x9A2 DUP5 PUSH1 0x80 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH3 0xE50 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH3 0xE8F JUMP JUMPDEST PUSH1 0x40 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD DUP1 MLOAD PUSH3 0x9F7 SWAP3 SWAP2 SWAP1 DUP5 SWAP1 DUP2 LT PUSH3 0x9C8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0xA0 ADD MLOAD DUP5 DUP2 MLOAD DUP2 LT PUSH3 0x9E5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH3 0xEA7 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD DUP1 MLOAD PUSH1 0x0 SWAP2 ADDRESS SWAP2 PUSH32 0x216B5FC100000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 DUP6 SWAP1 DUP2 LT PUSH3 0xA36 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP12 DUP7 PUSH1 0x0 ADD MLOAD DUP16 DUP9 PUSH1 0x40 ADD MLOAD DUP10 PUSH1 0x60 ADD MLOAD DUP11 PUSH1 0xA0 ADD MLOAD DUP11 DUP2 MLOAD DUP2 LT PUSH3 0xA64 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH3 0xA88 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x1785 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH3 0xB13 SWAP2 SWAP1 PUSH3 0x1746 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH3 0xB52 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH3 0xB57 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 ISZERO PUSH3 0xB83 JUMPI PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH3 0xB7D SWAP2 PUSH4 0xFFFFFFFF PUSH3 0xED5 AND JUMP JUMPDEST PUSH1 0x80 DUP5 ADD MSTORE JUMPDEST POP PUSH1 0x1 ADD PUSH3 0x940 JUMP JUMPDEST POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP3 POP POP PUSH1 0x0 PUSH3 0xBBE PUSH3 0xEF5 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH3 0xC93 JUMPI PUSH1 0x0 PUSH2 0xA0AA GAS DUP5 SUB PUSH2 0x374A ADD DUP2 PUSH3 0xBF1 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x79D229F PUSH3 0xC1A PUSH3 0xEFA JUMP JUMPDEST DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0xC3A SWAP3 SWAP2 SWAP1 PUSH3 0x189F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0xC55 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0xC6A 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 PUSH3 0xC90 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16E1 JUMP JUMPDEST POP POP JUMPDEST POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH3 0xCF6 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH3 0x1764 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0xD0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0xD24 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 PUSH3 0xD4A SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16E1 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH3 0xD8B SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH3 0x189F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP PUSH3 0xE16 DUP5 DUP3 PUSH3 0xF0F JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH3 0xE47 JUMPI PUSH3 0xE47 PUSH3 0xE41 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH3 0xFD9 JUMP JUMPDEST PUSH3 0x1080 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH3 0xE6D JUMPI PUSH3 0xE6D PUSH3 0xE41 PUSH1 0x2 DUP6 DUP6 PUSH3 0x1088 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH3 0xEA0 JUMPI DUP2 PUSH3 0xD4A JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0xECD DUP4 PUSH3 0xEC0 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH3 0x10A9 AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH3 0x10E1 AND JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH3 0xD4A JUMPI PUSH3 0xD4A PUSH3 0xE41 PUSH1 0x0 DUP7 DUP7 PUSH3 0x1088 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH17 0xD3B08566BE75A6DB803C03C85C0C1C5B96 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH3 0xF3A SWAP2 SWAP1 PUSH3 0x1746 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH3 0xF79 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH3 0xF7E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 ISZERO PUSH3 0xFCA JUMPI DUP1 MLOAD PUSH3 0xF99 JUMPI POP POP PUSH3 0xFD5 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 EQ ISZERO PUSH3 0xFCA JUMPI PUSH1 0x0 PUSH3 0xFB3 DUP3 PUSH1 0x0 PUSH3 0x1110 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 EQ ISZERO PUSH3 0xFC8 JUMPI POP POP POP PUSH3 0xFD5 JUMP JUMPDEST POP JUMPDEST PUSH3 0xE16 DUP2 PUSH3 0x1080 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH3 0xFFA SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x19A1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH3 0xFFA SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x197E JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH3 0x10BA JUMPI POP PUSH1 0x0 PUSH3 0x7F5 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH3 0x10C8 JUMPI INVALID JUMPDEST DIV EQ PUSH3 0xD4A JUMPI PUSH3 0xD4A PUSH3 0xE41 PUSH1 0x1 DUP7 DUP7 PUSH3 0x1088 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH3 0x10FB JUMPI PUSH3 0x10FB PUSH3 0xE41 PUSH1 0x3 DUP6 DUP6 PUSH3 0x1088 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH3 0x1107 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0xD4A DUP4 DUP4 PUSH3 0xE1C JUMP JUMPDEST PUSH2 0x4A4 DUP1 PUSH3 0x1AEC DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x7E8 DUP1 PUSH3 0x1F90 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 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 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH3 0x1198 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x11B0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH3 0x11C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH3 0x11E1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x11F8 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH3 0x122B PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH3 0x1A4D JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH3 0x1243 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x126E JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH3 0x127A PUSH1 0x80 PUSH3 0x1A4D JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH3 0x1289 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST DUP1 DUP3 MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x12BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x12CA DUP5 DUP3 DUP6 ADD PUSH3 0x11D0 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x12E8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH3 0xD4A DUP2 PUSH3 0x1AC5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x1308 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH3 0x1315 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x1332 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH3 0x1344 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH3 0x135D PUSH3 0x1357 DUP4 PUSH3 0x1A75 JUMP JUMPDEST PUSH3 0x1A4D JUMP JUMPDEST DUP3 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP3 DUP6 ADD DUP7 JUMPDEST DUP6 DUP2 LT ISZERO PUSH3 0x1396 JUMPI PUSH3 0x1383 DUP12 DUP9 DUP5 CALLDATALOAD DUP9 ADD ADD PUSH3 0x125C JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP7 ADD SWAP3 SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH3 0x1369 JUMP JUMPDEST POP SWAP7 SWAP10 SWAP1 SWAP9 POP SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x13B9 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH3 0x13C6 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH3 0x13D8 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xE0 DUP10 DUP12 SUB SLT ISZERO PUSH3 0x13FF JUMPI DUP4 DUP5 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH3 0x140C DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH3 0x141E DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH3 0x1430 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD PUSH3 0x1442 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x146C JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH3 0x147A DUP12 DUP3 DUP13 ADD PUSH3 0x1186 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH3 0x14A7 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH3 0x14B4 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH3 0x14C6 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH3 0x14D8 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x14FB JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH3 0x1509 DUP10 DUP3 DUP11 ADD PUSH3 0x1186 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH3 0x1530 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH3 0x153D DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH3 0x154F DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x1573 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH3 0x1580 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH3 0x15A9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH3 0x15B6 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH3 0x15CF DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH3 0x15E1 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH3 0x15F3 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP3 POP PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH3 0x1605 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0xC0 DUP9 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH3 0x1631 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x164F JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH3 0x165D DUP7 DUP3 DUP8 ADD PUSH3 0x1186 JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x167D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH3 0x16AD JUMPI DUP3 DUP4 REVERT JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x16C9 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH3 0x16D7 DUP6 DUP3 DUP7 ADD PUSH3 0x11D0 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x16F3 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH3 0x1714 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH3 0x1A96 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH3 0x175A DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH3 0x1A96 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP11 AND DUP4 MSTORE DUP1 DUP10 AND PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP9 AND PUSH1 0x40 DUP5 ADD MSTORE DUP1 DUP8 AND PUSH1 0x60 DUP5 ADD MSTORE POP DUP5 PUSH1 0x80 DUP4 ADD MSTORE DUP4 PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xE0 PUSH1 0xC0 DUP4 ADD MSTORE PUSH3 0x17DC PUSH1 0xE0 DUP4 ADD DUP5 PUSH3 0x16FA JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP10 AND DUP4 MSTORE DUP1 DUP9 AND PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP8 AND PUSH1 0x40 DUP5 ADD MSTORE POP DUP5 PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE DUP3 PUSH1 0xA0 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0xC0 DUP5 ADD CALLDATACOPY DUP2 DUP4 ADD PUSH1 0xC0 SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1F SWAP1 SWAP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD ADD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 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 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE SWAP4 DUP7 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 DUP6 AND PUSH1 0x60 DUP6 ADD MSTORE DUP5 AND PUSH1 0x80 DUP5 ADD MSTORE SWAP1 SWAP3 AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP5 AND DUP3 MSTORE PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE PUSH3 0xECD PUSH1 0x40 DUP4 ADD DUP5 PUSH3 0x16FA JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH3 0x198D JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH3 0x198D JUMPI INVALID JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x446578466F727761726465724272696467652F4F4E4C595F53454C4600000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x446578466F727761726465724272696467652F53454E4445525F4E4F545F4155 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x54484F52495A4544000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 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 PUSH3 0x1A6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH3 0x1A8C JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x1AB3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x1A99 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0xE16 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH3 0x1AE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x472 DUP1 PUSH2 0x32 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 0x40C10F19 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x66 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x8F JUMPI DUP1 PUSH4 0xE30443BC EQ PUSH2 0xAF JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x39E JUMP JUMPDEST PUSH2 0xC2 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x79 PUSH2 0x74 CALLDATASIZE PUSH1 0x4 PUSH2 0x383 JUMP JUMPDEST PUSH2 0x125 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x86 SWAP2 SWAP1 PUSH2 0x426 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA2 PUSH2 0x9D CALLDATASIZE PUSH1 0x4 PUSH2 0x39E JUMP JUMPDEST PUSH2 0x137 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x86 SWAP2 SWAP1 PUSH2 0x3F9 JUMP JUMPDEST PUSH2 0x64 PUSH2 0xBD CALLDATASIZE PUSH1 0x4 PUSH2 0x39E JUMP JUMPDEST PUSH2 0x242 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xF8 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x26B AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x157 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x293 AND JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x196 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x26B AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE PUSH1 0x1 SLOAD SWAP2 MLOAD PUSH32 0xA7EA663500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 AND SWAP1 PUSH4 0xA7EA6635 SWAP1 PUSH2 0x205 SWAP1 CALLER SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x3C8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x21F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x233 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x1 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x28C JUMPI PUSH2 0x28C PUSH2 0x287 PUSH1 0x0 DUP7 DUP7 PUSH2 0x2B2 JUMP JUMPDEST PUSH2 0x357 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2AC JUMPI PUSH2 0x2AC PUSH2 0x287 PUSH1 0x2 DUP6 DUP6 PUSH2 0x2B2 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D1 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x404 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x23C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x394 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x28C DUP4 DUP4 PUSH2 0x35F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3B0 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x3BA DUP5 DUP5 PUSH2 0x35F JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 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 SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x412 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 0xC0 PUSH4 0x1924A04F 0xE3 EXP 0x48 DUP2 0xCD GT 0x27 PUSH22 0xF00399F3F6A5A4DEC9B9508DAF4DBF76BD506C657870 PUSH6 0x72696D656E74 PUSH2 0x6CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x7E8 CODESIZE SUB DUP1 PUSH2 0x7E8 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x10C JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER OR SWAP1 SSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0xE0 DUP5 SWAP1 SHR PUSH4 0xFFFFFFFF NOT SWAP1 SWAP2 AND OR SWAP1 SSTORE DUP1 MLOAD PUSH2 0x69 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH2 0x71 JUMP JUMPDEST POP POP POP PUSH2 0x1E9 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xB2 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0xDF JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0xDF JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0xDF JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xC4 JUMP JUMPDEST POP PUSH2 0xEB SWAP3 SWAP2 POP PUSH2 0xEF JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x109 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xEB JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x11E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x135 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 DUP5 DUP2 ADD MLOAD SWAP2 SWAP4 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x153 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP7 ADD DUP8 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x164 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 MLOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x174 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP5 ADD PUSH1 0x1F NOT AND DUP2 ADD DUP6 ADD DUP4 DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x193 JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE DUP2 DUP5 ADD DUP6 ADD DUP10 LT ISZERO PUSH2 0x1A9 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP6 SWAP3 POP JUMPDEST DUP4 DUP4 LT ISZERO PUSH2 0x1CA JUMPI DUP2 DUP4 ADD DUP6 ADD MLOAD DUP2 DUP5 ADD DUP7 ADD MSTORE SWAP2 DUP5 ADD SWAP2 PUSH2 0x1AD JUMP JUMPDEST DUP4 DUP4 GT ISZERO PUSH2 0x1DA JUMPI DUP6 DUP6 DUP6 DUP4 ADD ADD MSTORE JUMPDEST DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x5F0 DUP1 PUSH2 0x1F8 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 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x81C82233 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xC2DF82E6 EQ PUSH2 0x50 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x37A JUMP JUMPDEST PUSH2 0x79 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x63 PUSH2 0x5E CALLDATASIZE PUSH1 0x4 PUSH2 0x2BB JUMP JUMPDEST PUSH2 0x7E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x70 SWAP2 SWAP1 PUSH2 0x440 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x2 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 POP PUSH1 0x0 EQ PUSH2 0xDC JUMPI PUSH1 0x1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xD3 SWAP2 SWAP1 PUSH2 0x46D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xF2 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x298 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 PUSH4 0x5100B572 SWAP2 CALLER SWAP2 SWAP1 DUP6 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x157 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x3AA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x183 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 0x1A7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x392 JUMP JUMPDEST DUP5 DUP12 DUP12 DUP12 DUP12 PUSH1 0x40 MLOAD DUP9 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1CE SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3CB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1FC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x40C10F1900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP4 POP PUSH4 0x40C10F19 SWAP3 POP PUSH2 0x255 SWAP2 DUP10 SWAP2 PUSH1 0x4 ADD PUSH2 0x41A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x26F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x283 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x0 SLOAD PUSH1 0xE0 SHL SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2A9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2B4 DUP2 PUSH2 0x588 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x2D2 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x2DD DUP2 PUSH2 0x588 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x2ED DUP2 PUSH2 0x588 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH2 0x2FD DUP2 PUSH2 0x588 JUMP JUMPDEST SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD SWAP2 POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x31F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 DUP8 ADD DUP9 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x330 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH2 0x345 PUSH2 0x340 DUP4 PUSH2 0x53A JUMP JUMPDEST PUSH2 0x513 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP10 PUSH1 0x20 DUP5 DUP5 ADD ADD GT ISZERO PUSH2 0x359 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x36A DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP6 ADD PUSH2 0x57C JUMP JUMPDEST DUP1 SWAP4 POP POP POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x38B JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A3 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE SWAP4 DUP7 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 DUP6 AND PUSH1 0x60 DUP6 ADD MSTORE DUP5 AND PUSH1 0x80 DUP5 ADD MSTORE SWAP1 SWAP3 AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD PUSH1 0x20 DUP4 MSTORE DUP2 DUP5 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x493 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x4CF JUMPI PUSH2 0x508 JUMP JUMPDEST PUSH1 0x7F PUSH1 0x2 DUP4 DIV AND DUP5 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x40 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD SWAP3 POP PUSH2 0x508 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP6 MSTORE DUP8 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 DUP7 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x4FE JUMPI DUP2 SLOAD DUP10 DUP3 ADD PUSH1 0x40 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x4DF JUMP JUMPDEST DUP9 ADD PUSH1 0x40 ADD SWAP5 POP POP POP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x532 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x550 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 EQ 0x4F 0x2F GASPRICE DUP11 0x5C PUSH11 0xAEB6247156F3927CFB35C1 PUSH9 0x129DED670499B68DBE 0x4D 0xD9 DUP8 DIFFICULTY PUSH13 0x6578706572696D656E74616CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH LOG3 PUSH6 0x627A7A723158 KECCAK256 SWAP7 SWAP10 ADD 0x4F DUP14 STOP 0xDB 0x27 0xAD 0x2F BLOCKHASH PUSH31 0x27CFF8AEEF748F74A10C1985BD10ECC0D8243D0A6C6578706572696D656E74 PUSH2 0x6CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH ",
                "sourceMap": "3890:2148:51:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3890:2148:51;;;;;;;"
            },
            "deployedBytecode": {
                "linkReferences": {},
                "object": "0x60806040523480156200001157600080fd5b5060043610620000dc5760003560e01c80639cbf9e36116200008d578063b717bb781162000063578063b717bb7814620001b5578063c2df82e614620001cc578063f7888aec14620001e357620000dc565b80639cbf9e36146200016e578063a7ea66351462000187578063a8219047146200019e57620000dc565b80631626ba7e11620000c35780631626ba7e1462000111578063216b5fc114620001405780635100b572146200015757620000dc565b8063060dac8814620000e157806314fc281214620000fa575b600080fd5b620000f8620000f23660046200151b565b62000209565b005b620000f86200010b366004620012d6565b62000298565b62000128620001223660046200161c565b620002df565b60405162000137919062001914565b60405180910390f35b620000f862000151366004620013e3565b62000307565b620000f8620001683660046200158e565b62000666565b62000178620006b4565b60405162000137919062001764565b620000f8620001983660046200151b565b620006e7565b620000f8620001af36600462001560565b62000729565b62000178620001c63660046200166a565b620007b5565b62000128620001dd3660046200148e565b620007fb565b620001fa620001f4366004620013a6565b62000c9f565b60405162000137919062001a44565b6040517fe30443bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063e30443bc906200025f90859085906004016200189f565b600060405180830381600087803b1580156200027a57600080fd5b505af11580156200028f573d6000803e3d6000fd5b50505050505050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b7fb0671381000000000000000000000000000000000000000000000000000000009392505050565b3330146200034c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034390620019b0565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff88163014156200037057600080fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190620003c7908b9060040162001764565b60206040518083038186803b158015620003e057600080fd5b505afa158015620003f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200041b9190810190620016e1565b90506200042a878a8762000d51565b60405160009060609073ffffffffffffffffffffffffffffffffffffffff8c16907fc2df82e6000000000000000000000000000000000000000000000000000000009062000487908b908f908f908c908c908c90602401620017e9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905162000512919062001746565b6000604051808303816000865af19150503d806000811462000551576040519150601f19603f3d011682016040523d82523d6000602084013e62000556565b606091505b50915091508180156200056a575080516020145b8015620005a257507fdc1600f300000000000000000000000000000000000000000000000000000000620005a082600062000e1c565b145b80156200064f5750856200064c848a73ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401620005eb919062001764565b60206040518083038186803b1580156200060457600080fd5b505afa15801562000619573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200063f9190810190620016e1565b9063ffffffff62000e5016565b10155b6200065957600080fd5b5050505050505050505050565b7fa32c6370f8f70d860e490f35427e8f448e99e9919b95a033b206eb214203192c87878787878787604051620006a39796959493929190620018c5565b60405180910390a150505050505050565b6000604051620006c4906200111e565b604051809103906000f080158015620006e1573d6000803e3d6000fd5b50905090565b7f051a055da2249abb14ca9d819e46a4d13d6fbebd0767708feaa0509fad12b6468383836040516200071c939291906200186e565b60405180910390a1505050565b6040517f81c8223300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906381c82233906200077d90849060040162001a44565b600060405180830381600087803b1580156200079857600080fd5b505af1158015620007ad573d6000803e3d6000fd5b505050505050565b60008282604051620007c7906200112c565b620007d492919062001941565b604051809103906000f080158015620007f1573d6000803e3d6000fd5b5090505b92915050565b6000805a90506200080b62000e73565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000872576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034390620019e7565b6200087c6200113a565b6200088a84860186620012f5565b60a083015273ffffffffffffffffffffffffffffffffffffffff168082526040517f70a082310000000000000000000000000000000000000000000000000000000081526370a0823190620008e490309060040162001764565b60206040518083038186803b158015620008fd57600080fd5b505afa15801562000912573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620009389190810190620016e1565b602082015260005b8160a001515181101562000b8d578160200151826080015110620009645762000b8d565b620009a88260a0015182815181106200097957fe5b602002602001015160200151620009a28460800151856020015162000e5090919063ffffffff16565b62000e8f565b6040830181905260a08301518051620009f792919084908110620009c857fe5b6020026020010151602001518460a001518481518110620009e557fe5b60200260200101516040015162000ea7565b606083015260a0820151805160009130917f216b5fc10000000000000000000000000000000000000000000000000000000091908590811062000a3657fe5b6020026020010151600001518b86600001518f886040015189606001518a60a001518a8151811062000a6457fe5b60200260200101516060015160405160240162000a88979695949392919062001785565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905162000b13919062001746565b6000604051808303816000865af19150503d806000811462000b52576040519150601f19603f3d011682016040523d82523d6000602084013e62000b57565b606091505b50509050801562000b83576040830151608084015162000b7d9163ffffffff62000ed516565b60808401525b5060010162000940565b507fdc1600f300000000000000000000000000000000000000000000000000000000925050600062000bbe62000ef5565b905073ffffffffffffffffffffffffffffffffffffffff81161562000c9357600061a0aa5a840361374a018162000bf157fe5b0490508173ffffffffffffffffffffffffffffffffffffffff1663079d229f62000c1a62000efa565b836040518363ffffffff1660e01b815260040162000c3a9291906200189f565b602060405180830381600087803b15801562000c5557600080fd5b505af115801562000c6a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000c909190810190620016e1565b50505b50509695505050505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319062000cf690859060040162001764565b60206040518083038186803b15801562000d0f57600080fd5b505afa15801562000d24573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000d4a9190810190620016e1565b9392505050565b6040516060907fa9059cbb000000000000000000000000000000000000000000000000000000009062000d8b90859085906024016200189f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905062000e16848262000f0f565b50505050565b6000816020018351101562000e475762000e4762000e41600585518560200162000fd9565b62001080565b50016020015190565b60008282111562000e6d5762000e6d62000e416002858562001088565b50900390565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600081831062000ea0578162000d4a565b5090919050565b600062000ecd8362000ec0868563ffffffff620010a916565b9063ffffffff620010e116565b949350505050565b60008282018381101562000d4a5762000d4a62000e416000868662001088565b600090565b70d3b08566be75a6db803c03c85c0c1c5b9690565b600060608373ffffffffffffffffffffffffffffffffffffffff168360405162000f3a919062001746565b6000604051808303816000865af19150503d806000811462000f79576040519150601f19603f3d011682016040523d82523d6000602084013e62000f7e565b606091505b5091509150811562000fca57805162000f9957505062000fd5565b80516020141562000fca57600062000fb382600062001110565b9050806001141562000fc85750505062000fd5565b505b62000e168162001080565b5050565b6060632800659560e01b84848460405160240162000ffa93929190620019a1565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b606063e946c1bb60e01b84848460405160240162000ffa939291906200197e565b600082620010ba57506000620007f5565b82820282848281620010c857fe5b041462000d4a5762000d4a62000e416001868662001088565b600081620010fb57620010fb62000e416003858562001088565b60008284816200110757fe5b04949350505050565b600062000d4a838362000e1c565b6104a48062001aec83390190565b6107e88062001f9083390190565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001606081525090565b60008083601f84011262001198578182fd5b50813567ffffffffffffffff811115620011b0578182fd5b602083019150836020828501011115620011c957600080fd5b9250929050565b600082601f830112620011e1578081fd5b813567ffffffffffffffff811115620011f8578182fd5b6200122b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160162001a4d565b91508082528360208285010111156200124357600080fd5b8060208401602084013760009082016020015292915050565b6000608082840312156200126e578081fd5b6200127a608062001a4d565b90508135620012898162001ac5565b808252506020820135602082015260408201356040820152606082013567ffffffffffffffff811115620012bc57600080fd5b620012ca84828501620011d0565b60608301525092915050565b600060208284031215620012e8578081fd5b813562000d4a8162001ac5565b6000806040838503121562001308578081fd5b8235620013158162001ac5565b915060208381013567ffffffffffffffff81111562001332578283fd5b80850186601f82011262001344578384fd5b803591506200135d620013578362001a75565b62001a4d565b82815283810190828501865b858110156200139657620013838b8884358801016200125c565b8452928601929086019060010162001369565b5096999098509650505050505050565b60008060408385031215620013b9578182fd5b8235620013c68162001ac5565b91506020830135620013d88162001ac5565b809150509250929050565b60008060008060008060008060e0898b031215620013ff578384fd5b88356200140c8162001ac5565b975060208901356200141e8162001ac5565b96506040890135620014308162001ac5565b95506060890135620014428162001ac5565b94506080890135935060a0890135925060c089013567ffffffffffffffff8111156200146c578283fd5b6200147a8b828c0162001186565b999c989b5096995094979396929594505050565b60008060008060008060a08789031215620014a7578182fd5b8635620014b48162001ac5565b95506020870135620014c68162001ac5565b94506040870135620014d88162001ac5565b935060608701359250608087013567ffffffffffffffff811115620014fb578283fd5b6200150989828a0162001186565b979a9699509497509295939492505050565b60008060006060848603121562001530578283fd5b83356200153d8162001ac5565b925060208401356200154f8162001ac5565b929592945050506040919091013590565b6000806040838503121562001573578182fd5b8235620015808162001ac5565b946020939093013593505050565b600080600080600080600060e0888a031215620015a9578283fd5b8735620015b68162001ac5565b9650602088013595506040880135620015cf8162001ac5565b94506060880135620015e18162001ac5565b93506080880135620015f38162001ac5565b925060a0880135620016058162001ac5565b8092505060c0880135905092959891949750929550565b60008060006040848603121562001631578081fd5b83359250602084013567ffffffffffffffff8111156200164f578182fd5b6200165d8682870162001186565b9497909650939450505050565b600080604083850312156200167d578182fd5b82357fffffffff0000000000000000000000000000000000000000000000000000000081168114620016ad578283fd5b9150602083013567ffffffffffffffff811115620016c9578182fd5b620016d785828601620011d0565b9150509250929050565b600060208284031215620016f3578081fd5b5051919050565b600081518084526200171481602086016020860162001a96565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516200175a81846020870162001a96565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff808a168352808916602084015280881660408401528087166060840152508460808301528360a083015260e060c0830152620017dc60e0830184620016fa565b9998505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8089168352808816602084015280871660408401525084606083015260a060808301528260a0830152828460c084013781830160c090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010195945050505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff97881681526020810196909652938616604086015291851660608501528416608084015290921660a082015260c081019190915260e00190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60007fffffffff00000000000000000000000000000000000000000000000000000000841682526040602083015262000ecd6040830184620016fa565b60608101600485106200198d57fe5b938152602081019290925260409091015290565b60608101600885106200198d57fe5b6020808252601c908201527f446578466f727761726465724272696467652f4f4e4c595f53454c4600000000604082015260600190565b60208082526028908201527f446578466f727761726465724272696467652f53454e4445525f4e4f545f415560408201527f54484f52495a4544000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171562001a6d57600080fd5b604052919050565b600067ffffffffffffffff82111562001a8c578081fd5b5060209081020190565b60005b8381101562001ab357818101518382015260200162001a99565b8381111562000e165750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811462001ae857600080fd5b5056fe608060405234801561001057600080fd5b50600180546001600160a01b03191633179055610472806100326000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806340c10f191461005157806370a0823114610066578063a9059cbb1461008f578063e30443bc146100af575b600080fd5b61006461005f36600461039e565b6100c2565b005b610079610074366004610383565b610125565b6040516100869190610426565b60405180910390f35b6100a261009d36600461039e565b610137565b60405161008691906103f9565b6100646100bd36600461039e565b610242565b73ffffffffffffffffffffffffffffffffffffffff82166000908152602081905260409020546100f8908263ffffffff61026b16565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526020819052604090209190915550565b60006020819052908152604090205481565b33600090815260208190526040812054610157908363ffffffff61029316565b336000908152602081905260408082209290925573ffffffffffffffffffffffffffffffffffffffff851681522054610196908363ffffffff61026b16565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040908190209290925560015491517fa7ea663500000000000000000000000000000000000000000000000000000000815291169063a7ea663590610205903390879087906004016103c8565b600060405180830381600087803b15801561021f57600080fd5b505af1158015610233573d6000803e3d6000fd5b50505050600190505b92915050565b73ffffffffffffffffffffffffffffffffffffffff909116600090815260208190526040902055565b60008282018381101561028c5761028c610287600086866102b2565b610357565b9392505050565b6000828211156102ac576102ac610287600285856102b2565b50900390565b606063e946c1bb60e01b8484846040516024016102d193929190610404565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461023c57600080fd5b600060208284031215610394578081fd5b61028c838361035f565b600080604083850312156103b0578081fd5b6103ba848461035f565b946020939093013593505050565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b901515815260200190565b606081016004851061041257fe5b938152602081019290925260409091015290565b9081526020019056fea365627a7a72315820c0631924a04fe30a4881cd112775f00399f3f6a5a4dec9b9508daf4dbf76bd506c6578706572696d656e74616cf564736f6c63430005110040608060405234801561001057600080fd5b506040516107e83803806107e883398101604081905261002f9161010c565b600380546001600160a01b031916331790556000805460e084901c63ffffffff199091161790558051610069906001906020840190610071565b5050506101e9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100b257805160ff19168380011785556100df565b828001600101855582156100df579182015b828111156100df5782518255916020019190600101906100c4565b506100eb9291506100ef565b5090565b61010991905b808211156100eb57600081556001016100f5565b90565b6000806040838503121561011e578182fd5b82516001600160e01b031981168114610135578283fd5b602084810151919350906001600160401b0380821115610153578384fd5b81860187601f820112610164578485fd5b8051925081831115610174578485fd5b604051601f8401601f1916810185018381118282101715610193578687fd5b60405283815281840185018910156101a9578586fd5b8592505b838310156101ca57818301850151818401860152918401916101ad565b838311156101da57858585830101525b80955050505050509250929050565b6105f0806101f86000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806381c822331461003b578063c2df82e614610050575b600080fd5b61004e61004936600461037a565b610079565b005b61006361005e3660046102bb565b61007e565b6040516100709190610440565b60405180910390f35b600255565b600060018054600181600116156101000203166002900490506000146100dc5760016040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100d3919061046d565b60405180910390fd5b6000828060200190516100f29190810190610298565b6003546040517f70a0823100000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff90811691635100b572913391908516906370a08231906101579030906004016103aa565b60206040518083038186803b15801561016f57600080fd5b505afa158015610183573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101a79190810190610392565b848b8b8b8b6040518863ffffffff1660e01b81526004016101ce97969594939291906103cb565b600060405180830381600087803b1580156101e857600080fd5b505af11580156101fc573d6000803e3d6000fd5b50506002546040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1693506340c10f19925061025591899160040161041a565b600060405180830381600087803b15801561026f57600080fd5b505af1158015610283573d6000803e3d6000fd5b505060005460e01b9998505050505050505050565b6000602082840312156102a9578081fd5b81516102b481610588565b9392505050565b600080600080600060a086880312156102d2578081fd5b85356102dd81610588565b945060208601356102ed81610588565b935060408601356102fd81610588565b925060608601359150608086013567ffffffffffffffff81111561031f578182fd5b80870188601f820112610330578283fd5b803591506103456103408361053a565b610513565b828152896020848401011115610359578384fd5b61036a83602083016020850161057c565b8093505050509295509295909350565b60006020828403121561038b578081fd5b5035919050565b6000602082840312156103a3578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff97881681526020810196909652938616604086015291851660608501528416608084015290921660a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60006020820160208352818454600181166000811461049357600181146104cf57610508565b607f600283041684527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082166040870152606086019250610508565b6002820480855287865260208620865b828110156104fe578154898201604001526001909101906020016104df565b8801604001945050505b509095945050505050565b60405181810167ffffffffffffffff8111828210171561053257600080fd5b604052919050565b600067ffffffffffffffff821115610550578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b82818337506000910152565b73ffffffffffffffffffffffffffffffffffffffff811681146105aa57600080fd5b5056fea365627a7a72315820144f2f3a8a5c6aaeb6247156f3927cfb35c168129ded670499b68dbe4dd987446c6578706572696d656e74616cf564736f6c63430005110040a365627a7a723158209699014f8d00db27ad2f407e27cff8aeef748f74a10c1985bd10ecc0d8243d0a6c6578706572696d656e74616cf564736f6c63430005110040",
                "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH3 0xDC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9CBF9E36 GT PUSH3 0x8D JUMPI DUP1 PUSH4 0xB717BB78 GT PUSH3 0x63 JUMPI DUP1 PUSH4 0xB717BB78 EQ PUSH3 0x1B5 JUMPI DUP1 PUSH4 0xC2DF82E6 EQ PUSH3 0x1CC JUMPI DUP1 PUSH4 0xF7888AEC EQ PUSH3 0x1E3 JUMPI PUSH3 0xDC JUMP JUMPDEST DUP1 PUSH4 0x9CBF9E36 EQ PUSH3 0x16E JUMPI DUP1 PUSH4 0xA7EA6635 EQ PUSH3 0x187 JUMPI DUP1 PUSH4 0xA8219047 EQ PUSH3 0x19E JUMPI PUSH3 0xDC JUMP JUMPDEST DUP1 PUSH4 0x1626BA7E GT PUSH3 0xC3 JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH3 0x111 JUMPI DUP1 PUSH4 0x216B5FC1 EQ PUSH3 0x140 JUMPI DUP1 PUSH4 0x5100B572 EQ PUSH3 0x157 JUMPI PUSH3 0xDC JUMP JUMPDEST DUP1 PUSH4 0x60DAC88 EQ PUSH3 0xE1 JUMPI DUP1 PUSH4 0x14FC2812 EQ PUSH3 0xFA JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0xF8 PUSH3 0xF2 CALLDATASIZE PUSH1 0x4 PUSH3 0x151B JUMP JUMPDEST PUSH3 0x209 JUMP JUMPDEST STOP JUMPDEST PUSH3 0xF8 PUSH3 0x10B CALLDATASIZE PUSH1 0x4 PUSH3 0x12D6 JUMP JUMPDEST PUSH3 0x298 JUMP JUMPDEST PUSH3 0x128 PUSH3 0x122 CALLDATASIZE PUSH1 0x4 PUSH3 0x161C JUMP JUMPDEST PUSH3 0x2DF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x137 SWAP2 SWAP1 PUSH3 0x1914 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH3 0xF8 PUSH3 0x151 CALLDATASIZE PUSH1 0x4 PUSH3 0x13E3 JUMP JUMPDEST PUSH3 0x307 JUMP JUMPDEST PUSH3 0xF8 PUSH3 0x168 CALLDATASIZE PUSH1 0x4 PUSH3 0x158E JUMP JUMPDEST PUSH3 0x666 JUMP JUMPDEST PUSH3 0x178 PUSH3 0x6B4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x137 SWAP2 SWAP1 PUSH3 0x1764 JUMP JUMPDEST PUSH3 0xF8 PUSH3 0x198 CALLDATASIZE PUSH1 0x4 PUSH3 0x151B JUMP JUMPDEST PUSH3 0x6E7 JUMP JUMPDEST PUSH3 0xF8 PUSH3 0x1AF CALLDATASIZE PUSH1 0x4 PUSH3 0x1560 JUMP JUMPDEST PUSH3 0x729 JUMP JUMPDEST PUSH3 0x178 PUSH3 0x1C6 CALLDATASIZE PUSH1 0x4 PUSH3 0x166A JUMP JUMPDEST PUSH3 0x7B5 JUMP JUMPDEST PUSH3 0x128 PUSH3 0x1DD CALLDATASIZE PUSH1 0x4 PUSH3 0x148E JUMP JUMPDEST PUSH3 0x7FB JUMP JUMPDEST PUSH3 0x1FA PUSH3 0x1F4 CALLDATASIZE PUSH1 0x4 PUSH3 0x13A6 JUMP JUMPDEST PUSH3 0xC9F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x137 SWAP2 SWAP1 PUSH3 0x1A44 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xE30443BC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xE30443BC SWAP1 PUSH3 0x25F SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH3 0x189F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x28F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH32 0xB067138100000000000000000000000000000000000000000000000000000000 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH3 0x34C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x343 SWAP1 PUSH3 0x19B0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND ADDRESS EQ ISZERO PUSH3 0x370 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH3 0x3C7 SWAP1 DUP12 SWAP1 PUSH1 0x4 ADD PUSH3 0x1764 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0x3F5 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 PUSH3 0x41B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16E1 JUMP JUMPDEST SWAP1 POP PUSH3 0x42A DUP8 DUP11 DUP8 PUSH3 0xD51 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND SWAP1 PUSH32 0xC2DF82E600000000000000000000000000000000000000000000000000000000 SWAP1 PUSH3 0x487 SWAP1 DUP12 SWAP1 DUP16 SWAP1 DUP16 SWAP1 DUP13 SWAP1 DUP13 SWAP1 DUP13 SWAP1 PUSH1 0x24 ADD PUSH3 0x17E9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH3 0x512 SWAP2 SWAP1 PUSH3 0x1746 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH3 0x551 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH3 0x556 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH3 0x56A JUMPI POP DUP1 MLOAD PUSH1 0x20 EQ JUMPDEST DUP1 ISZERO PUSH3 0x5A2 JUMPI POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 PUSH3 0x5A0 DUP3 PUSH1 0x0 PUSH3 0xE1C JUMP JUMPDEST EQ JUMPDEST DUP1 ISZERO PUSH3 0x64F JUMPI POP DUP6 PUSH3 0x64C DUP5 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 DUP15 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x5EB SWAP2 SWAP1 PUSH3 0x1764 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x604 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0x619 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 PUSH3 0x63F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16E1 JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH3 0xE50 AND JUMP JUMPDEST LT ISZERO JUMPDEST PUSH3 0x659 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH32 0xA32C6370F8F70D860E490F35427E8F448E99E9919B95A033B206EB214203192C DUP8 DUP8 DUP8 DUP8 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH3 0x6A3 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x18C5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD PUSH3 0x6C4 SWAP1 PUSH3 0x111E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH3 0x6E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH32 0x51A055DA2249ABB14CA9D819E46A4D13D6FBEBD0767708FEAA0509FAD12B646 DUP4 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH3 0x71C SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x186E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x81C8223300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x81C82233 SWAP1 PUSH3 0x77D SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH3 0x1A44 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x798 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x7AD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH3 0x7C7 SWAP1 PUSH3 0x112C JUMP JUMPDEST PUSH3 0x7D4 SWAP3 SWAP2 SWAP1 PUSH3 0x1941 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH3 0x7F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 GAS SWAP1 POP PUSH3 0x80B PUSH3 0xE73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH3 0x872 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x343 SWAP1 PUSH3 0x19E7 JUMP JUMPDEST PUSH3 0x87C PUSH3 0x113A JUMP JUMPDEST PUSH3 0x88A DUP5 DUP7 ADD DUP7 PUSH3 0x12F5 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 DUP3 MSTORE PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH4 0x70A08231 SWAP1 PUSH3 0x8E4 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH3 0x1764 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x8FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0x912 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 PUSH3 0x938 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16E1 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 PUSH1 0xA0 ADD MLOAD MLOAD DUP2 LT ISZERO PUSH3 0xB8D JUMPI DUP2 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x80 ADD MLOAD LT PUSH3 0x964 JUMPI PUSH3 0xB8D JUMP JUMPDEST PUSH3 0x9A8 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 DUP2 MLOAD DUP2 LT PUSH3 0x979 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH3 0x9A2 DUP5 PUSH1 0x80 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH3 0xE50 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH3 0xE8F JUMP JUMPDEST PUSH1 0x40 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD DUP1 MLOAD PUSH3 0x9F7 SWAP3 SWAP2 SWAP1 DUP5 SWAP1 DUP2 LT PUSH3 0x9C8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0xA0 ADD MLOAD DUP5 DUP2 MLOAD DUP2 LT PUSH3 0x9E5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH3 0xEA7 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MLOAD DUP1 MLOAD PUSH1 0x0 SWAP2 ADDRESS SWAP2 PUSH32 0x216B5FC100000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 DUP6 SWAP1 DUP2 LT PUSH3 0xA36 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x0 ADD MLOAD DUP12 DUP7 PUSH1 0x0 ADD MLOAD DUP16 DUP9 PUSH1 0x40 ADD MLOAD DUP10 PUSH1 0x60 ADD MLOAD DUP11 PUSH1 0xA0 ADD MLOAD DUP11 DUP2 MLOAD DUP2 LT PUSH3 0xA64 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH3 0xA88 SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x1785 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE SWAP1 MLOAD PUSH3 0xB13 SWAP2 SWAP1 PUSH3 0x1746 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH3 0xB52 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH3 0xB57 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 ISZERO PUSH3 0xB83 JUMPI PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH3 0xB7D SWAP2 PUSH4 0xFFFFFFFF PUSH3 0xED5 AND JUMP JUMPDEST PUSH1 0x80 DUP5 ADD MSTORE JUMPDEST POP PUSH1 0x1 ADD PUSH3 0x940 JUMP JUMPDEST POP PUSH32 0xDC1600F300000000000000000000000000000000000000000000000000000000 SWAP3 POP POP PUSH1 0x0 PUSH3 0xBBE PUSH3 0xEF5 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH3 0xC93 JUMPI PUSH1 0x0 PUSH2 0xA0AA GAS DUP5 SUB PUSH2 0x374A ADD DUP2 PUSH3 0xBF1 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x79D229F PUSH3 0xC1A PUSH3 0xEFA JUMP JUMPDEST DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0xC3A SWAP3 SWAP2 SWAP1 PUSH3 0x189F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0xC55 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0xC6A 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 PUSH3 0xC90 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16E1 JUMP JUMPDEST POP POP JUMPDEST POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH3 0xCF6 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH3 0x1764 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0xD0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0xD24 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 PUSH3 0xD4A SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x16E1 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 SWAP1 PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 SWAP1 PUSH3 0xD8B SWAP1 DUP6 SWAP1 DUP6 SWAP1 PUSH1 0x24 ADD PUSH3 0x189F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP PUSH3 0xE16 DUP5 DUP3 PUSH3 0xF0F JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO PUSH3 0xE47 JUMPI PUSH3 0xE47 PUSH3 0xE41 PUSH1 0x5 DUP6 MLOAD DUP6 PUSH1 0x20 ADD PUSH3 0xFD9 JUMP JUMPDEST PUSH3 0x1080 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH3 0xE6D JUMPI PUSH3 0xE6D PUSH3 0xE41 PUSH1 0x2 DUP6 DUP6 PUSH3 0x1088 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH3 0xEA0 JUMPI DUP2 PUSH3 0xD4A JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0xECD DUP4 PUSH3 0xEC0 DUP7 DUP6 PUSH4 0xFFFFFFFF PUSH3 0x10A9 AND JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH3 0x10E1 AND JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH3 0xD4A JUMPI PUSH3 0xD4A PUSH3 0xE41 PUSH1 0x0 DUP7 DUP7 PUSH3 0x1088 JUMP JUMPDEST PUSH1 0x0 SWAP1 JUMP JUMPDEST PUSH17 0xD3B08566BE75A6DB803C03C85C0C1C5B96 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x40 MLOAD PUSH3 0xF3A SWAP2 SWAP1 PUSH3 0x1746 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH3 0xF79 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH3 0xF7E JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 ISZERO PUSH3 0xFCA JUMPI DUP1 MLOAD PUSH3 0xF99 JUMPI POP POP PUSH3 0xFD5 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 EQ ISZERO PUSH3 0xFCA JUMPI PUSH1 0x0 PUSH3 0xFB3 DUP3 PUSH1 0x0 PUSH3 0x1110 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 EQ ISZERO PUSH3 0xFC8 JUMPI POP POP POP PUSH3 0xFD5 JUMP JUMPDEST POP JUMPDEST PUSH3 0xE16 DUP2 PUSH3 0x1080 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x28006595 PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH3 0xFFA SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x19A1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH3 0xFFA SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0x197E JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH3 0x10BA JUMPI POP PUSH1 0x0 PUSH3 0x7F5 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH3 0x10C8 JUMPI INVALID JUMPDEST DIV EQ PUSH3 0xD4A JUMPI PUSH3 0xD4A PUSH3 0xE41 PUSH1 0x1 DUP7 DUP7 PUSH3 0x1088 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH3 0x10FB JUMPI PUSH3 0x10FB PUSH3 0xE41 PUSH1 0x3 DUP6 DUP6 PUSH3 0x1088 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP2 PUSH3 0x1107 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0xD4A DUP4 DUP4 PUSH3 0xE1C JUMP JUMPDEST PUSH2 0x4A4 DUP1 PUSH3 0x1AEC DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x7E8 DUP1 PUSH3 0x1F90 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 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 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH3 0x1198 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x11B0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH3 0x11C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH3 0x11E1 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x11F8 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH3 0x122B PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH3 0x1A4D JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH3 0x1243 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x126E JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH3 0x127A PUSH1 0x80 PUSH3 0x1A4D JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH3 0x1289 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST DUP1 DUP3 MSTORE POP PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x12BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x12CA DUP5 DUP3 DUP6 ADD PUSH3 0x11D0 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x12E8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH3 0xD4A DUP2 PUSH3 0x1AC5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x1308 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH3 0x1315 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 DUP2 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x1332 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 DUP6 ADD DUP7 PUSH1 0x1F DUP3 ADD SLT PUSH3 0x1344 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH3 0x135D PUSH3 0x1357 DUP4 PUSH3 0x1A75 JUMP JUMPDEST PUSH3 0x1A4D JUMP JUMPDEST DUP3 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP3 DUP6 ADD DUP7 JUMPDEST DUP6 DUP2 LT ISZERO PUSH3 0x1396 JUMPI PUSH3 0x1383 DUP12 DUP9 DUP5 CALLDATALOAD DUP9 ADD ADD PUSH3 0x125C JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP7 ADD SWAP3 SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH3 0x1369 JUMP JUMPDEST POP SWAP7 SWAP10 SWAP1 SWAP9 POP SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x13B9 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH3 0x13C6 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH3 0x13D8 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xE0 DUP10 DUP12 SUB SLT ISZERO PUSH3 0x13FF JUMPI DUP4 DUP5 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH3 0x140C DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH3 0x141E DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH3 0x1430 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD PUSH3 0x1442 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x146C JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH3 0x147A DUP12 DUP3 DUP13 ADD PUSH3 0x1186 JUMP JUMPDEST SWAP10 SWAP13 SWAP9 SWAP12 POP SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP5 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xA0 DUP8 DUP10 SUB SLT ISZERO PUSH3 0x14A7 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH3 0x14B4 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP6 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH3 0x14C6 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP5 POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH3 0x14D8 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP4 POP PUSH1 0x60 DUP8 ADD CALLDATALOAD SWAP3 POP PUSH1 0x80 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x14FB JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH3 0x1509 DUP10 DUP3 DUP11 ADD PUSH3 0x1186 JUMP JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 POP SWAP3 SWAP6 SWAP4 SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH3 0x1530 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH3 0x153D DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH3 0x154F DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x1573 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH3 0x1580 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH3 0x15A9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH3 0x15B6 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH3 0x15CF DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH3 0x15E1 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH3 0x15F3 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST SWAP3 POP PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH3 0x1605 DUP2 PUSH3 0x1AC5 JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0xC0 DUP9 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH3 0x1631 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x164F JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH3 0x165D DUP7 DUP3 DUP8 ADD PUSH3 0x1186 JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH3 0x167D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH3 0x16AD JUMPI DUP3 DUP4 REVERT JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x16C9 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH3 0x16D7 DUP6 DUP3 DUP7 ADD PUSH3 0x11D0 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x16F3 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH3 0x1714 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH3 0x1A96 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH3 0x175A DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH3 0x1A96 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP11 AND DUP4 MSTORE DUP1 DUP10 AND PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP9 AND PUSH1 0x40 DUP5 ADD MSTORE DUP1 DUP8 AND PUSH1 0x60 DUP5 ADD MSTORE POP DUP5 PUSH1 0x80 DUP4 ADD MSTORE DUP4 PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xE0 PUSH1 0xC0 DUP4 ADD MSTORE PUSH3 0x17DC PUSH1 0xE0 DUP4 ADD DUP5 PUSH3 0x16FA JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP10 AND DUP4 MSTORE DUP1 DUP9 AND PUSH1 0x20 DUP5 ADD MSTORE DUP1 DUP8 AND PUSH1 0x40 DUP5 ADD MSTORE POP DUP5 PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0xA0 PUSH1 0x80 DUP4 ADD MSTORE DUP3 PUSH1 0xA0 DUP4 ADD MSTORE DUP3 DUP5 PUSH1 0xC0 DUP5 ADD CALLDATACOPY DUP2 DUP4 ADD PUSH1 0xC0 SWAP1 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1F SWAP1 SWAP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD ADD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 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 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE SWAP4 DUP7 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 DUP6 AND PUSH1 0x60 DUP6 ADD MSTORE DUP5 AND PUSH1 0x80 DUP5 ADD MSTORE SWAP1 SWAP3 AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP5 AND DUP3 MSTORE PUSH1 0x40 PUSH1 0x20 DUP4 ADD MSTORE PUSH3 0xECD PUSH1 0x40 DUP4 ADD DUP5 PUSH3 0x16FA JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH3 0x198D JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x8 DUP6 LT PUSH3 0x198D JUMPI INVALID JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x446578466F727761726465724272696467652F4F4E4C595F53454C4600000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x446578466F727761726465724272696467652F53454E4445525F4E4F545F4155 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x54484F52495A4544000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 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 PUSH3 0x1A6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH3 0x1A8C JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x1AB3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x1A99 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0xE16 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH3 0x1AE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x472 DUP1 PUSH2 0x32 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 0x40C10F19 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x66 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x8F JUMPI DUP1 PUSH4 0xE30443BC EQ PUSH2 0xAF JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x5F CALLDATASIZE PUSH1 0x4 PUSH2 0x39E JUMP JUMPDEST PUSH2 0xC2 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x79 PUSH2 0x74 CALLDATASIZE PUSH1 0x4 PUSH2 0x383 JUMP JUMPDEST PUSH2 0x125 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x86 SWAP2 SWAP1 PUSH2 0x426 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA2 PUSH2 0x9D CALLDATASIZE PUSH1 0x4 PUSH2 0x39E JUMP JUMPDEST PUSH2 0x137 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x86 SWAP2 SWAP1 PUSH2 0x3F9 JUMP JUMPDEST PUSH2 0x64 PUSH2 0xBD CALLDATASIZE PUSH1 0x4 PUSH2 0x39E JUMP JUMPDEST PUSH2 0x242 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xF8 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x26B AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x157 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x293 AND JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x196 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x26B AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE PUSH1 0x1 SLOAD SWAP2 MLOAD PUSH32 0xA7EA663500000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 AND SWAP1 PUSH4 0xA7EA6635 SWAP1 PUSH2 0x205 SWAP1 CALLER SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x3C8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x21F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x233 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x1 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x28C JUMPI PUSH2 0x28C PUSH2 0x287 PUSH1 0x0 DUP7 DUP7 PUSH2 0x2B2 JUMP JUMPDEST PUSH2 0x357 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2AC JUMPI PUSH2 0x2AC PUSH2 0x287 PUSH1 0x2 DUP6 DUP6 PUSH2 0x2B2 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH4 0xE946C1BB PUSH1 0xE0 SHL DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2D1 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x404 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x23C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x394 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x28C DUP4 DUP4 PUSH2 0x35F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3B0 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x3BA DUP5 DUP5 PUSH2 0x35F JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 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 SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH1 0x4 DUP6 LT PUSH2 0x412 JUMPI INVALID JUMPDEST SWAP4 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 0xC0 PUSH4 0x1924A04F 0xE3 EXP 0x48 DUP2 0xCD GT 0x27 PUSH22 0xF00399F3F6A5A4DEC9B9508DAF4DBF76BD506C657870 PUSH6 0x72696D656E74 PUSH2 0x6CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x7E8 CODESIZE SUB DUP1 PUSH2 0x7E8 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0x10C JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER OR SWAP1 SSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0xE0 DUP5 SWAP1 SHR PUSH4 0xFFFFFFFF NOT SWAP1 SWAP2 AND OR SWAP1 SSTORE DUP1 MLOAD PUSH2 0x69 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH2 0x71 JUMP JUMPDEST POP POP POP PUSH2 0x1E9 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xB2 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0xDF JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0xDF JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0xDF JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xC4 JUMP JUMPDEST POP PUSH2 0xEB SWAP3 SWAP2 POP PUSH2 0xEF JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x109 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xEB JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF5 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x11E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x135 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 DUP5 DUP2 ADD MLOAD SWAP2 SWAP4 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x153 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP7 ADD DUP8 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x164 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP1 MLOAD SWAP3 POP DUP2 DUP4 GT ISZERO PUSH2 0x174 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP5 ADD PUSH1 0x1F NOT AND DUP2 ADD DUP6 ADD DUP4 DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x193 JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH1 0x40 MSTORE DUP4 DUP2 MSTORE DUP2 DUP5 ADD DUP6 ADD DUP10 LT ISZERO PUSH2 0x1A9 JUMPI DUP6 DUP7 REVERT JUMPDEST DUP6 SWAP3 POP JUMPDEST DUP4 DUP4 LT ISZERO PUSH2 0x1CA JUMPI DUP2 DUP4 ADD DUP6 ADD MLOAD DUP2 DUP5 ADD DUP7 ADD MSTORE SWAP2 DUP5 ADD SWAP2 PUSH2 0x1AD JUMP JUMPDEST DUP4 DUP4 GT ISZERO PUSH2 0x1DA JUMPI DUP6 DUP6 DUP6 DUP4 ADD ADD MSTORE JUMPDEST DUP1 SWAP6 POP POP POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x5F0 DUP1 PUSH2 0x1F8 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 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x81C82233 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xC2DF82E6 EQ PUSH2 0x50 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x37A JUMP JUMPDEST PUSH2 0x79 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x63 PUSH2 0x5E CALLDATASIZE PUSH1 0x4 PUSH2 0x2BB JUMP JUMPDEST PUSH2 0x7E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x70 SWAP2 SWAP1 PUSH2 0x440 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x2 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 POP PUSH1 0x0 EQ PUSH2 0xDC JUMPI PUSH1 0x1 PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xD3 SWAP2 SWAP1 PUSH2 0x46D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH2 0xF2 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x298 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 PUSH4 0x5100B572 SWAP2 CALLER SWAP2 SWAP1 DUP6 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x157 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x3AA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x183 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 0x1A7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x392 JUMP JUMPDEST DUP5 DUP12 DUP12 DUP12 DUP12 PUSH1 0x40 MLOAD DUP9 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1CE SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3CB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1FC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x40C10F1900000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP4 POP PUSH4 0x40C10F19 SWAP3 POP PUSH2 0x255 SWAP2 DUP10 SWAP2 PUSH1 0x4 ADD PUSH2 0x41A JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x26F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x283 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x0 SLOAD PUSH1 0xE0 SHL SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2A9 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2B4 DUP2 PUSH2 0x588 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x2D2 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x2DD DUP2 PUSH2 0x588 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x2ED DUP2 PUSH2 0x588 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH2 0x2FD DUP2 PUSH2 0x588 JUMP JUMPDEST SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD SWAP2 POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x31F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP1 DUP8 ADD DUP9 PUSH1 0x1F DUP3 ADD SLT PUSH2 0x330 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP2 POP PUSH2 0x345 PUSH2 0x340 DUP4 PUSH2 0x53A JUMP JUMPDEST PUSH2 0x513 JUMP JUMPDEST DUP3 DUP2 MSTORE DUP10 PUSH1 0x20 DUP5 DUP5 ADD ADD GT ISZERO PUSH2 0x359 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x36A DUP4 PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP6 ADD PUSH2 0x57C JUMP JUMPDEST DUP1 SWAP4 POP POP POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x38B JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A3 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE SWAP4 DUP7 AND PUSH1 0x40 DUP7 ADD MSTORE SWAP2 DUP6 AND PUSH1 0x60 DUP6 ADD MSTORE DUP5 AND PUSH1 0x80 DUP5 ADD MSTORE SWAP1 SWAP3 AND PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD PUSH1 0x20 DUP4 MSTORE DUP2 DUP5 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x493 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x4CF JUMPI PUSH2 0x508 JUMP JUMPDEST PUSH1 0x7F PUSH1 0x2 DUP4 DIV AND DUP5 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x40 DUP8 ADD MSTORE PUSH1 0x60 DUP7 ADD SWAP3 POP PUSH2 0x508 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP6 MSTORE DUP8 DUP7 MSTORE PUSH1 0x20 DUP7 KECCAK256 DUP7 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x4FE JUMPI DUP2 SLOAD DUP10 DUP3 ADD PUSH1 0x40 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x4DF JUMP JUMPDEST DUP9 ADD PUSH1 0x40 ADD SWAP5 POP POP POP JUMPDEST POP SWAP1 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x532 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x550 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG3 PUSH6 0x627A7A723158 KECCAK256 EQ 0x4F 0x2F GASPRICE DUP11 0x5C PUSH11 0xAEB6247156F3927CFB35C1 PUSH9 0x129DED670499B68DBE 0x4D 0xD9 DUP8 DIFFICULTY PUSH13 0x6578706572696D656E74616CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH LOG3 PUSH6 0x627A7A723158 KECCAK256 SWAP7 SWAP10 ADD 0x4F DUP14 STOP 0xDB 0x27 0xAD 0x2F BLOCKHASH PUSH31 0x27CFF8AEEF748F74A10C1985BD10ECC0D8243D0A6C6578706572696D656E74 PUSH2 0x6CF5 PUSH5 0x736F6C6343 STOP SDIV GT STOP BLOCKHASH ",
                "sourceMap": "3890:2148:51:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3890:2148:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4555:159;;;;;;;;;:::i;:::-;;4067:110;;;;;;;;;:::i;6954:192:16:-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5251:1497;;;;;;;;;:::i;4881:455:51:-;;;;;;;;;:::i;4425:124::-;;;:::i;:::-;;;;;;;;5342:229;;;;;;;;;:::i;4720:155::-;;;;;;;;;:::i;4183:236::-;;;;;;;;;:::i;2314:2275:16:-;;;;;;;;;:::i;5577:158:51:-;;;;;;;;;:::i;:::-;;;;;;;;4555:159;4643:64;;;;;:49;;;;;;:64;;4693:5;;4700:6;;4643:64;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4643:64:51;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4643:64:51;;;;4555:159;;;:::o;4067:110::-;4139:18;:31;;;;;;;;;;;;;;;4067:110::o;6954:192:16:-;7114:25;6954:192;;;;;:::o;5251:1497::-;5586:10;5608:4;5586:27;5578:68;;;;;;;;;;;;;;;;;;;;;;5711:23;;;5729:4;5711:23;;5703:32;;;;;;5843:38;;;;;5809:31;;5843:34;;;;;;:38;;5878:2;;5843:38;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5843:38:16;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5843:38:16;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5843:38:16;;;;;;;;;5809:72;;5940:60;5963:10;5975:6;5983:16;5940:22;:60::i;:::-;6108:233;;6040:15;;6057:23;;6096:11;;;;6148:43;;6108:233;;6209:11;;6096:6;;6262:2;;6282:17;;6317:10;;;;6108:233;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;6108:233:16;;;49:4:-1;25:18;;61:17;;6108:233:16;182:15:-1;6108:233:16;;;;179:29:-1;;;;160:49;;;6096:246:16;;;;6108:233;6096:246;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;6039:303:16;;;;6496:10;:49;;;;;6522:10;:17;6543:2;6522:23;6496:49;:127;;;;-1:-1:-1;6608:14:16;6561:35;6582:10;6594:1;6561:20;:35::i;:::-;:62;6496:127;:235;;;;;6714:17;6639:71;6686:23;6651:11;6639:34;;;6674:2;6639:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6639:38:16;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6639:38:16;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6639:38:16;;;;;;;;;:46;:71;:46;:71;:::i;:::-;:92;;6496:235;6475:266;;;;;;5251:1497;;;;;;;;;;;:::o;4881:455:51:-;5141:188;5179:6;5199:17;5230:10;5254:11;5279:4;5297:2;5313:6;5141:188;;;;;;;;;;;;;;;;;;;;;4881:455;;;;;;;:::o;4425:124::-;4464:13;4504:37;;;;;:::i;:::-;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4504:37:51;4489:53;;4425:124;:::o;5342:229::-;5481:83;5514:4;5532:2;5548:6;5481:83;;;;;;;;;;;;;;;;;5342:229;;;:::o;4720:155::-;4802:66;;;;;:58;;;;;;:66;;4861:6;;4802:66;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4802:66:51;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4802:66:51;;;;4720:155;;:::o;4183:236::-;4305:14;4387:10;4399:11;4350:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4350:61:51;4335:77;;4183:236;;;;;:::o;2314:2275:16:-;2560:14;1455:17:21;1475:9;1455:29;;2625::16;:27;:29::i;:::-;2611:43;;:10;:43;;;2590:130;;;;;;;;;;;;;;2730:30;;:::i;:::-;2838:47;;;;2849:10;2838:47;;;2814:11;;;2770:115;;;;;;2941:54;;;;;:39;;:54;;2989:4;;2941:54;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2941:54:16;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2941:54:16;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;2941:54:16;;;;;;;;;2896:30;;;:99;3011:9;3006:1519;3030:5;:11;;;:18;3026:1;:22;3006:1519;;;3162:5;:30;;;3133:5;:25;;;:59;3129:103;;3212:5;;3129:103;3313:164;3349:5;:11;;;3361:1;3349:14;;;;;;;;;;;;;;:31;;;3398:65;3437:5;:25;;;3398:5;:30;;;:38;;:65;;;;:::i;:::-;3313:18;:164::i;:::-;3284:26;;;:193;;;3612:11;;;;:14;;3521:186;;3284:193;3612:11;3624:1;;3612:14;;;;;;;;;;;;:31;;;3661:5;:11;;;3673:1;3661:14;;;;;;;;;;;;;;:32;;;3521:29;:186::i;:::-;3491:27;;;:216;3990:11;;;;:14;;3836:15;;3865:4;;3937:31;;3990:11;4002:1;;3990:14;;;;;;;;;;;;:21;;;4033:2;4057:5;:16;;;4095:11;4128:5;:26;;;4176:5;:27;;;4225:5;:11;;;4237:1;4225:14;;;;;;;;;;;;;;:25;;;3893:375;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;3893:375:16;;;49:4:-1;25:18;;61:17;;3893:375:16;182:15:-1;3893:375:16;;;;179:29:-1;;;;160:49;;;3857:412:16;;;;3893:375;3857:412;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;3835:434:16;;;4288:10;4284:231;;;4456:26;;;;4401:25;;;;:99;;;:33;:99;:::i;:::-;4373:25;;;:127;4284:231;-1:-1:-1;3050:3:16;;3006:1519;;;-1:-1:-1;4568:14:16;;-1:-1:-1;;1505:13:21;1531:16;:14;:16::i;:::-;1505:43;-1:-1:-1;1562:26:21;;;;1558:306;;1734:13;1784:5;1763:9;1751;:21;1775:5;1751:29;1750:39;;;;;;1734:55;;1803:3;:16;;;1820:25;:23;:25::i;:::-;1847:5;1803:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1803:50:21;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1803:50:21;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1803:50:21;;;;;;;;;;1558:306;;2314:2275:16;;;;;;;;;;:::o;5577:158:51:-;5673:55;;;;;5647:7;;5673:48;;;;;;:55;;5722:5;;5673:55;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5673:55:51;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5673:55:51;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5673:55:51;;;;;;;;;5666:62;5577:158;-1:-1:-1;;;5577:158:51:o;2581:324:61:-;2727:114;;2703:21;;2763:32;;2727:114;;2809:2;;2825:6;;2727:114;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;2727:114:61;;;49:4:-1;25:18;;61:17;;2727:114:61;182:15:-1;2727:114:61;;;;179:29:-1;;;;160:49;;;2727:114:61;-1:-1:-1;2851:47:61;2882:5;2727:114;2851:30;:47::i;:::-;2581:324;;;;:::o;14133:679:72:-;14254:14;14299:5;14307:2;14299:10;14288:1;:8;:21;14284:297;;;14325:245;14347:222;14409:92;14519:1;:8;14545:5;14553:2;14545:10;14347:44;:222::i;:::-;14325:21;:245::i;:::-;-1:-1:-1;14759:13:72;14661:2;14759:13;14753:20;;14133:679::o;965:364:76:-;1051:7;1082:1;1078;:5;1074:227;;;1099:191;1121:168;1178:59;1255:1;1274;1121:39;:168::i;1099:191::-;-1:-1:-1;1317:5:76;;;965:364::o;5871:165:51:-;5957:31;6011:18;;;5871:165;:::o;1866:135:76:-;1951:7;1985:1;1981;:5;:13;;1993:1;1981:13;;;-1:-1:-1;1989:1:76;;1866:135;-1:-1:-1;1866:135:76:o;3189:300:65:-;3353:21;3406:46;3440:11;3406:25;:9;3424:6;3406:25;:17;:25;:::i;:::-;:33;:46;:33;:46;:::i;:::-;3390:62;3189:300;-1:-1:-1;;;;3189:300:65:o;1335:383:76:-;1421:7;1456:5;;;1475;;;1471:223;;;1496:187;1518:164;1575:55;1648:1;1667;1518:39;:164::i;5741:124:51:-;5814:11;5741:124;:::o;13369:150:68:-;2883:42;13369:150;:::o;6120:571:61:-;6252:15;6269:23;6296:6;:11;;6308:8;6296:21;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;6251:66:61;;;;6331:10;6327:315;;;6361:17;;6357:67;;6403:7;;;;6357:67;6441:10;:17;6462:2;6441:23;6437:195;;;6484:14;6501:35;6522:10;6534:1;6501:20;:35::i;:::-;6484:52;;6558:6;6568:1;6558:11;6554:64;;;6593:7;;;;;6554:64;6437:195;;6651:33;6673:10;6651:21;:33::i;6120:571::-;;;:::o;1292:378:73:-;1480:12;1232:10;1551:37;;1602:9;1625:6;1645:8;1515:148;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1515:148:73;;;49:4:-1;25:18;;61:17;;1515:148:73;182:15:-1;1515:148:73;;;;179:29:-1;;;;160:49;;;1515:148:73;-1:-1:-1;1292:378:73;;;;;:::o;1511:170:75:-;1654:9;1648:16;1641:4;1630:9;1626:20;1619:46;731:322:77;884:12;196:10;955:28;;997:9;1020:1;1035;919:127;;;;;;;;;;;122:448:76;208:7;235:6;231:45;;-1:-1:-1;264:1:76;257:8;;231:45;297:5;;;301:1;297;:5;:1;316:5;;;;;:10;312:234;;342:193;364:170;421:61;500:1;519;364:39;:170::i;576:383::-;662:7;689:6;685:223;;711:186;733:163;790:54;862:1;881;733:39;:163::i;711:186::-;917:9;933:1;929;:5;;;;;;;576:383;-1:-1:-1;;;;576:383:76:o;15929:220:72:-;16050:14;16097:21;16109:1;16112:5;16097:11;:21::i;3890:2148:51:-;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1378:336:-1:-;;;1492:3;1485:4;1477:6;1473:17;1469:27;1459:2;;-1:-1;;1500:12;1459:2;-1:-1;1530:20;;1570:18;1559:30;;1556:2;;;-1:-1;;1592:12;1556:2;1636:4;1628:6;1624:17;1612:29;;1687:3;1636:4;1667:17;1628:6;1653:32;;1650:41;1647:2;;;1704:1;;1694:12;1647:2;1452:262;;;;;;1723:432;;1820:3;1813:4;1805:6;1801:17;1797:27;1787:2;;-1:-1;;1828:12;1787:2;1875:6;1862:20;20252:18;20244:6;20241:30;20238:2;;;-1:-1;;20274:12;20238:2;1897:60;20415:4;20347:9;1813:4;20332:6;20328:17;20324:33;20405:15;1897:60;;;1888:69;;1977:6;1970:5;1963:21;2081:3;20415:4;2072:6;2005;2063:16;;2060:25;2057:2;;;2098:1;;2088:12;2057:2;23046:6;20415:4;2005:6;2001:17;20415:4;2039:5;2035:16;23023:30;23102:1;23084:16;;;20415:4;23084:16;23077:27;2039:5;1780:375;-1:-1;;1780:375;2657:878;;2770:4;2758:9;2753:3;2749:19;2745:30;2742:2;;;-1:-1;;2778:12;2742:2;2806:20;2770:4;2806:20;;;2797:29;;85:6;72:20;97:33;124:5;97:33;;;2910:49;2892:16;2885:75;;3033:2;3091:9;3087:22;3609:20;3033:2;3052:5;3048:16;3041:75;3190:2;3248:9;3244:22;3609:20;3190:2;3209:5;3205:16;3198:75;3368:2;3357:9;3353:18;3340:32;3392:18;3384:6;3381:30;3378:2;;;-1:-1;;3414:12;3378:2;3459:54;3509:3;3500:6;3489:9;3485:22;3459:54;;;3368:2;3445:5;3441:16;3434:80;;2736:799;;;;;3820:241;;3924:2;3912:9;3903:7;3899:23;3895:32;3892:2;;;-1:-1;;3930:12;3892:2;85:6;72:20;97:33;124:5;97:33;;4068:558;;;4242:2;4230:9;4221:7;4217:23;4213:32;4210:2;;;-1:-1;;4248:12;4210:2;230:6;217:20;242:41;277:5;242:41;;;4300:71;-1:-1;4436:2;4421:18;;;4408:32;4460:18;4449:30;;4446:2;;;-1:-1;;4482:12;4446:2;4593:6;4582:9;4578:22;479:3;472:4;464:6;460:17;456:27;446:2;;-1:-1;;487:12;446:2;534:6;521:20;507:34;;556:100;571:84;648:6;571:84;;;556:100;;;684:21;;;741:14;;;;716:17;;;-1:-1;821:257;846:6;843:1;840:13;821:257;;;953:61;1010:3;4436:2;929:3;916:17;720:6;904:30;;953:61;;;941:74;;1029:14;;;;1057;;;;868:1;861:9;821:257;;;-1:-1;4204:422;;4502:108;;-1:-1;4204:422;-1:-1;;;;;;;4204:422;4633:366;;;4754:2;4742:9;4733:7;4729:23;4725:32;4722:2;;;-1:-1;;4760:12;4722:2;85:6;72:20;97:33;124:5;97:33;;;4812:63;-1:-1;4912:2;4951:22;;72:20;97:33;72:20;97:33;;;4920:63;;;;4716:283;;;;;;5006:1119;;;;;;;;;5231:3;5219:9;5210:7;5206:23;5202:33;5199:2;;;-1:-1;;5238:12;5199:2;85:6;72:20;97:33;124:5;97:33;;;5290:63;-1:-1;5390:2;5429:22;;72:20;97:33;72:20;97:33;;;5398:63;-1:-1;5498:2;5537:22;;72:20;97:33;72:20;97:33;;;5506:63;-1:-1;5606:2;5645:22;;72:20;97:33;72:20;97:33;;;5614:63;-1:-1;5714:3;5754:22;;3609:20;;-1:-1;5823:3;5863:22;;3609:20;;-1:-1;5960:3;5945:19;;5932:33;5985:18;5974:30;;5971:2;;;-1:-1;;6007:12;5971:2;6045:64;6101:7;6092:6;6081:9;6077:22;6045:64;;;5193:932;;;;-1:-1;5193:932;;-1:-1;5193:932;;;;;;6035:74;-1:-1;;;5193:932;6132:867;;;;;;;6323:3;6311:9;6302:7;6298:23;6294:33;6291:2;;;-1:-1;;6330:12;6291:2;85:6;72:20;97:33;124:5;97:33;;;6382:63;-1:-1;6482:2;6521:22;;72:20;97:33;72:20;97:33;;;6490:63;-1:-1;6590:2;6629:22;;72:20;97:33;72:20;97:33;;;6598:63;-1:-1;6698:2;6737:22;;3609:20;;-1:-1;6834:3;6819:19;;6806:33;6859:18;6848:30;;6845:2;;;-1:-1;;6881:12;6845:2;6919:64;6975:7;6966:6;6955:9;6951:22;6919:64;;;6285:714;;;;-1:-1;6285:714;;-1:-1;6285:714;;6909:74;;6285:714;-1:-1;;;6285:714;7006:491;;;;7144:2;7132:9;7123:7;7119:23;7115:32;7112:2;;;-1:-1;;7150:12;7112:2;85:6;72:20;97:33;124:5;97:33;;;7202:63;-1:-1;7302:2;7341:22;;72:20;97:33;72:20;97:33;;;7106:391;;7310:63;;-1:-1;;;7410:2;7449:22;;;;3609:20;;7106:391;7504:366;;;7625:2;7613:9;7604:7;7600:23;7596:32;7593:2;;;-1:-1;;7631:12;7593:2;85:6;72:20;97:33;124:5;97:33;;;7683:63;7783:2;7822:22;;;;3609:20;;-1:-1;;;7587:283;7877:995;;;;;;;;8083:3;8071:9;8062:7;8058:23;8054:33;8051:2;;;-1:-1;;8090:12;8051:2;85:6;72:20;97:33;124:5;97:33;;;8142:63;-1:-1;8242:2;8281:22;;3609:20;;-1:-1;8350:2;8389:22;;72:20;97:33;72:20;97:33;;;8358:63;-1:-1;8458:2;8497:22;;72:20;97:33;72:20;97:33;;;8466:63;-1:-1;8566:3;8606:22;;72:20;97:33;72:20;97:33;;;8575:63;-1:-1;8675:3;8715:22;;72:20;97:33;72:20;97:33;;;8684:63;;;;8784:3;8828:9;8824:22;3609:20;8793:63;;8045:827;;;;;;;;;;;8879:490;;;;9019:2;9007:9;8998:7;8994:23;8990:32;8987:2;;;-1:-1;;9025:12;8987:2;1172:6;1159:20;9077:63;;9205:2;9194:9;9190:18;9177:32;9229:18;9221:6;9218:30;9215:2;;;-1:-1;;9251:12;9215:2;9289:64;9345:7;9336:6;9325:9;9321:22;9289:64;;;8981:388;;9279:74;;-1:-1;9279:74;;-1:-1;;;;8981:388;9376:470;;;9506:2;9494:9;9485:7;9481:23;9477:32;9474:2;;;-1:-1;;9512:12;9474:2;1308:6;1295:20;21998:66;24226:5;21987:78;24202:5;24199:34;24189:2;;-1:-1;;24237:12;24189:2;9564:62;-1:-1;9691:2;9676:18;;9663:32;9715:18;9704:30;;9701:2;;;-1:-1;;9737:12;9701:2;9767:63;9822:7;9813:6;9802:9;9798:22;9767:63;;;9757:73;;;9468:378;;;;;;9853:263;;9968:2;9956:9;9947:7;9943:23;9939:32;9936:2;;;-1:-1;;9974:12;9936:2;-1:-1;3757:13;;9930:186;-1:-1;9930:186;11051:335;;11185:5;20849:12;21262:6;21257:3;21250:19;11278:52;11323:6;21299:4;21294:3;21290:14;21299:4;11304:5;11300:16;11278:52;;;23483:2;23463:14;23479:7;23459:28;11342:39;;;;21299:4;11342:39;;11137:249;-1:-1;;11137:249;12962:262;;10848:5;20849:12;10959:52;11004:6;10999:3;10992:4;10985:5;10981:16;10959:52;;;11023:16;;;;;13087:137;-1:-1;;13087:137;13231:213;22490:42;22479:54;;;;10194:37;;13349:2;13334:18;;13320:124;13451:959;;22490:42;;22483:5;22479:54;10201:3;10194:37;22490:42;22483:5;22479:54;13916:2;13905:9;13901:18;10194:37;22490:42;22483:5;22479:54;13999:2;13988:9;13984:18;10194:37;22490:42;22483:5;22479:54;14082:2;14071:9;14067:18;10194:37;;12943:5;14165:3;14154:9;14150:19;12913:37;12943:5;14249:3;14238:9;14234:19;12913:37;13751:3;14287;14276:9;14272:19;14265:49;14328:72;13751:3;13740:9;13736:19;14386:6;14328:72;;;14320:80;13722:688;-1:-1;;;;;;;;;13722:688;14417:763;;22490:42;;22483:5;22479:54;10201:3;10194:37;22490:42;22483:5;22479:54;14840:2;14829:9;14825:18;10194:37;22490:42;22483:5;22479:54;14923:2;14912:9;14908:18;10194:37;;12943:5;15006:2;14995:9;14991:18;12913:37;14675:3;15043;15032:9;15028:19;15021:49;21262:6;14675:3;14664:9;14660:19;21250;23046:6;23041:3;21290:14;14664:9;21290:14;23023:30;23084:16;;;21290:14;23084:16;;;23077:27;;;;23483:2;23463:14;;;23479:7;23459:28;10635:39;;;14646:534;-1:-1;;;;;14646:534;15187:435;22490:42;22479:54;;;10194:37;;22479:54;;;;15525:2;15510:18;;10194:37;15608:2;15593:18;;12913:37;;;;15361:2;15346:18;;15332:290;15629:324;22490:42;22479:54;;;;10194:37;;15939:2;15924:18;;12913:37;15775:2;15760:18;;15746:207;15960:883;22490:42;22479:54;;;10194:37;;16411:2;16396:18;;12913:37;;;;22479:54;;;16494:2;16479:18;;10194:37;22479:54;;;16577:2;16562:18;;10194:37;22479:54;;16660:3;16645:19;;10194:37;22479:54;;;16744:3;16729:19;;10194:37;16828:3;16813:19;;12913:37;;;;16246:3;16231:19;;16217:626;16850:209;21998:66;21987:78;;;;10312:36;;16966:2;16951:18;;16937:122;17066:408;;21998:66;10341:5;21987:78;10319:3;10312:36;17230:2;17346;17335:9;17331:18;17324:48;17386:78;17230:2;17219:9;17215:18;17450:6;17386:78;;17481:473;17674:2;17659:18;;23590:1;23580:12;;23570:2;;23596:9;23570:2;11483:69;;;17857:2;17842:18;;12913:37;;;;17940:2;17925:18;;;12913:37;17645:309;;17961:503;18169:2;18154:18;;23724:1;23714:12;;23704:2;;23730:9;18471:407;18662:2;18676:47;;;12344:2;18647:18;;;21250:19;12380:30;21290:14;;;12360:51;12430:12;;;18633:245;18885:407;19076:2;19090:47;;;12681:2;19061:18;;;21250:19;12717:34;21290:14;;;12697:55;12786:10;12772:12;;;12765:32;12816:12;;;19047:245;19299:213;12913:37;;;19417:2;19402:18;;19388:124;19519:256;19581:2;19575:9;19607:17;;;19682:18;19667:34;;19703:22;;;19664:62;19661:2;;;19739:1;;19729:12;19661:2;19581;19748:22;19559:216;;-1:-1;19559:216;19782:324;;19961:18;19953:6;19950:30;19947:2;;;-1:-1;;19983:12;19947:2;-1:-1;20028:4;20016:17;;;20081:15;;19884:222;23119:268;23184:1;23191:101;23205:6;23202:1;23199:13;23191:101;;;23272:11;;;23266:18;23253:11;;;23246:39;23227:2;23220:10;23191:101;;;23307:6;23304:1;23301:13;23298:2;;;-1:-1;;23184:1;23354:16;;23347:27;23168:219;23753:117;22490:42;23840:5;22479:54;23815:5;23812:35;23802:2;;23861:1;;23851:12;23802:2;23796:74;"
            }
        }
    },
    "sourceTreeHashHex": "0x68191e0021a7d6f89c90f5b7e34d0a89bf1e7697d6972e1e3e65a32e2b73248b",
    "sources": {
        "./TestDexForwarderBridge.sol": {
            "id": 51,
            "content": "/*\n\n  Copyright 2020 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.9;\npragma experimental ABIEncoderV2;\n\nimport \"../src/bridges/DexForwarderBridge.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\n\n\ninterface ITestDexForwarderBridge {\n    event BridgeTransferFromCalled(\n        address caller,\n        uint256 inputTokenBalance,\n        address inputToken,\n        address outputToken,\n        address from,\n        address to,\n        uint256 amount\n    );\n\n    event TokenTransferCalled(\n        address from,\n        address to,\n        uint256 amount\n    );\n\n    function emitBridgeTransferFromCalled(\n        address caller,\n        uint256 inputTokenBalance,\n        address inputToken,\n        address outputToken,\n        address from,\n        address to,\n        uint256 amount\n    ) external;\n\n    function emitTokenTransferCalled(\n        address from,\n        address to,\n        uint256 amount\n    ) external;\n}\n\n\ninterface ITestDexForwarderBridgeTestToken {\n\n    function transfer(address to, uint256 amount)\n        external\n        returns (bool);\n\n    function mint(address to, uint256 amount)\n        external;\n\n    function balanceOf(address owner) external view returns (uint256);\n}\n\n\ncontract TestDexForwarderBridgeTestBridge {\n\n    bytes4 private _returnCode;\n    string private _revertError;\n    uint256 private _transferAmount;\n    ITestDexForwarderBridge private _testContract;\n\n    constructor(bytes4 returnCode, string memory revertError) public {\n        _testContract = ITestDexForwarderBridge(msg.sender);\n        _returnCode = returnCode;\n        _revertError = revertError;\n    }\n\n    function setTransferAmount(uint256 amount) external {\n        _transferAmount = amount;\n    }\n\n    function bridgeTransferFrom(\n        address outputToken,\n        address from,\n        address to,\n        uint256 amount,\n        bytes memory bridgeData\n    )\n        public\n        returns (bytes4 success)\n    {\n        if (bytes(_revertError).length != 0) {\n            revert(_revertError);\n        }\n        address inputToken = abi.decode(bridgeData, (address));\n        _testContract.emitBridgeTransferFromCalled(\n            msg.sender,\n            ITestDexForwarderBridgeTestToken(inputToken).balanceOf(address(this)),\n            inputToken,\n            outputToken,\n            from,\n            to,\n            amount\n        );\n        ITestDexForwarderBridgeTestToken(outputToken).mint(to, _transferAmount);\n        return _returnCode;\n    }\n}\n\n\ncontract TestDexForwarderBridgeTestToken {\n\n    using LibSafeMath for uint256;\n\n    mapping(address => uint256) public balanceOf;\n    ITestDexForwarderBridge private _testContract;\n\n    constructor() public {\n        _testContract = ITestDexForwarderBridge(msg.sender);\n    }\n\n    function transfer(address to, uint256 amount)\n        external\n        returns (bool)\n    {\n        balanceOf[msg.sender] = balanceOf[msg.sender].safeSub(amount);\n        balanceOf[to] = balanceOf[to].safeAdd(amount);\n        _testContract.emitTokenTransferCalled(msg.sender, to, amount);\n        return true;\n    }\n\n    function mint(address owner, uint256 amount)\n        external\n    {\n        balanceOf[owner] = balanceOf[owner].safeAdd(amount);\n    }\n\n    function setBalance(address owner, uint256 amount)\n        external\n    {\n        balanceOf[owner] = amount;\n    }\n}\n\n\ncontract TestDexForwarderBridge is\n    ITestDexForwarderBridge,\n    DexForwarderBridge\n{\n    address private AUTHORIZED_ADDRESS; // solhint-disable-line var-name-mixedcase\n\n    function setAuthorized(address authorized)\n        public\n    {\n        AUTHORIZED_ADDRESS = authorized;\n    }\n\n    function createBridge(\n        bytes4 returnCode,\n        string memory revertError\n    )\n        public\n        returns (address bridge)\n    {\n        return address(new TestDexForwarderBridgeTestBridge(returnCode, revertError));\n    }\n\n    function createToken() public returns (address token) {\n        return address(new TestDexForwarderBridgeTestToken());\n    }\n\n    function setTokenBalance(address token, address owner, uint256 amount) public {\n        TestDexForwarderBridgeTestToken(token).setBalance(owner, amount);\n    }\n\n    function setBridgeTransferAmount(address bridge, uint256 amount) public {\n        TestDexForwarderBridgeTestBridge(bridge).setTransferAmount(amount);\n    }\n\n    function emitBridgeTransferFromCalled(\n        address caller,\n        uint256 inputTokenBalance,\n        address inputToken,\n        address outputToken,\n        address from,\n        address to,\n        uint256 amount\n    )\n        public\n    {\n        emit BridgeTransferFromCalled(\n            caller,\n            inputTokenBalance,\n            inputToken,\n            outputToken,\n            from,\n            to,\n            amount\n        );\n    }\n\n    function emitTokenTransferCalled(\n        address from,\n        address to,\n        uint256 amount\n    )\n        public\n    {\n        emit TokenTransferCalled(\n            from,\n            to,\n            amount\n        );\n    }\n\n    function balanceOf(address token, address owner) public view returns (uint256) {\n        return TestDexForwarderBridgeTestToken(token).balanceOf(owner);\n    }\n\n    function _getGstAddress()\n        internal\n        view\n        returns (address gst)\n    {\n        return address(0);\n    }\n\n    function _getERC20BridgeProxyAddress()\n        internal\n        view\n        returns (address erc20BridgeProxyAddress)\n    {\n        return AUTHORIZED_ADDRESS;\n    }\n}\n"
        },
        "../src/bridges/DexForwarderBridge.sol": {
            "id": 16,
            "content": "/*\n\n  Copyright 2020 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.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\nimport \"@0x/contracts-erc20/contracts/src/LibERC20Token.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/IWallet.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/DeploymentConstants.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../interfaces/IERC20Bridge.sol\";\nimport \"./MixinGasToken.sol\";\n\n\n// solhint-disable space-after-comma, indent\ncontract DexForwarderBridge is\n    IERC20Bridge,\n    IWallet,\n    DeploymentConstants,\n    MixinGasToken\n{\n    using LibSafeMath for uint256;\n\n    /// @dev Data needed to reconstruct a bridge call.\n    struct BridgeCall {\n        address target;\n        uint256 inputTokenAmount;\n        uint256 outputTokenAmount;\n        bytes bridgeData;\n    }\n\n    /// @dev Intermediate state variables used by `bridgeTransferFrom()`, in\n    ///      struct form to get around stack limits.\n    struct TransferFromState {\n        address inputToken;\n        uint256 initialInputTokenBalance;\n        uint256 callInputTokenAmount;\n        uint256 callOutputTokenAmount;\n        uint256 totalInputTokenSold;\n        BridgeCall[] calls;\n    }\n\n    /// @dev Spends this contract's entire balance of input tokens by forwarding\n    /// them to other bridges. Reverts if the entire balance is not spent.\n    /// @param outputToken The token being bought.\n    /// @param to The recipient of the bought tokens.\n    /// @param bridgeData The abi-encoded input token address.\n    /// @return success The magic bytes if successful.\n    function bridgeTransferFrom(\n        address outputToken,\n        address /* from */,\n        address to,\n        uint256 /* amount */,\n        bytes calldata bridgeData\n    )\n        external\n        freesGasTokensFromCollector\n        returns (bytes4 success)\n    {\n        require(\n            msg.sender == _getERC20BridgeProxyAddress(),\n            \"DexForwarderBridge/SENDER_NOT_AUTHORIZED\"\n        );\n        TransferFromState memory state;\n        (\n            state.inputToken,\n            state.calls\n        ) = abi.decode(bridgeData, (address, BridgeCall[]));\n\n        state.initialInputTokenBalance =\n            IERC20Token(state.inputToken).balanceOf(address(this));\n\n        for (uint256 i = 0; i < state.calls.length; ++i) {\n            // Stop if the we've sold all our input tokens.\n            if (state.totalInputTokenSold >= state.initialInputTokenBalance) {\n                break;\n            }\n\n            // Compute token amounts.\n            state.callInputTokenAmount = LibSafeMath.min256(\n                state.calls[i].inputTokenAmount,\n                state.initialInputTokenBalance.safeSub(state.totalInputTokenSold)\n            );\n            state.callOutputTokenAmount = LibMath.getPartialAmountFloor(\n                state.callInputTokenAmount,\n                state.calls[i].inputTokenAmount,\n                state.calls[i].outputTokenAmount\n            );\n\n            // Execute the call in a new context so we can recoup transferred\n            // funds by reverting.\n            (bool didSucceed, ) = address(this)\n                .call(abi.encodeWithSelector(\n                    this.executeBridgeCall.selector,\n                    state.calls[i].target,\n                    to,\n                    state.inputToken,\n                    outputToken,\n                    state.callInputTokenAmount,\n                    state.callOutputTokenAmount,\n                    state.calls[i].bridgeData\n                ));\n\n            if (didSucceed) {\n                // Increase the amount of tokens sold.\n                state.totalInputTokenSold = state.totalInputTokenSold.safeAdd(\n                    state.callInputTokenAmount\n                );\n            }\n        }\n        // Always succeed.\n        return BRIDGE_SUCCESS;\n    }\n\n    /// @dev Transfers `inputToken` token to a bridge contract then calls\n    ///      its `bridgeTransferFrom()`. This is executed in separate context\n    ///      so we can revert the transfer on error. This can only be called\n    //       by this contract itself.\n    /// @param bridge The bridge contract.\n    /// @param to The recipient of `outputToken` tokens.\n    /// @param inputToken The input token.\n    /// @param outputToken The output token.\n    /// @param inputTokenAmount The amount of input tokens to transfer to `bridge`.\n    /// @param outputTokenAmount The amount of expected output tokens to be sent\n    ///        to `to` by `bridge`.\n    function executeBridgeCall(\n        address bridge,\n        address to,\n        address inputToken,\n        address outputToken,\n        uint256 inputTokenAmount,\n        uint256 outputTokenAmount,\n        bytes calldata bridgeData\n    )\n        external\n    {\n        // Must be called through `bridgeTransferFrom()`.\n        require(msg.sender == address(this), \"DexForwarderBridge/ONLY_SELF\");\n        // `bridge` must not be this contract.\n        require(bridge != address(this));\n\n        // Get the starting balance of output tokens for `to`.\n        uint256 initialRecipientBalance = IERC20Token(outputToken).balanceOf(to);\n\n        // Transfer input tokens to the bridge.\n        LibERC20Token.transfer(inputToken, bridge, inputTokenAmount);\n\n        // Call the bridge.\n        (bool didSucceed, bytes memory resultData) =\n            bridge.call(abi.encodeWithSelector(\n                IERC20Bridge(0).bridgeTransferFrom.selector,\n                outputToken,\n                bridge,\n                to,\n                outputTokenAmount,\n                bridgeData\n            ));\n\n        // Revert if the call failed or not enough tokens were bought.\n        // This will also undo the token transfer.\n        require(\n            didSucceed\n            && resultData.length == 32\n            && LibBytes.readBytes32(resultData, 0) == bytes32(BRIDGE_SUCCESS)\n            && IERC20Token(outputToken).balanceOf(to).safeSub(initialRecipientBalance) >= outputTokenAmount\n        );\n    }\n\n    /// @dev `SignatureType.Wallet` callback, so that this bridge can be the maker\n    ///      and sign for itself in orders. Always succeeds.\n    /// @return magicValue Magic success bytes, always.\n    function isValidSignature(\n        bytes32,\n        bytes calldata\n    )\n        external\n        view\n        returns (bytes4 magicValue)\n    {\n        return LEGACY_WALLET_MAGIC_VALUE;\n    }\n}\n"
        },
        "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": {
            "id": 62,
            "content": "/*\n\n  Copyright 2019 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.9;\n\n\ncontract IERC20Token {\n\n    // solhint-disable no-simple-event-func-name\n    event Transfer(\n        address indexed _from,\n        address indexed _to,\n        uint256 _value\n    );\n\n    event Approval(\n        address indexed _owner,\n        address indexed _spender,\n        uint256 _value\n    );\n\n    /// @dev send `value` token to `to` from `msg.sender`\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transfer(address _to, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n    /// @param _from The address of the sender\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transferFrom(\n        address _from,\n        address _to,\n        uint256 _value\n    )\n        external\n        returns (bool);\n\n    /// @dev `msg.sender` approves `_spender` to spend `_value` tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @param _value The amount of wei to be approved for transfer\n    /// @return Always true if the call has enough gas to complete execution\n    function approve(address _spender, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev Query total supply of token\n    /// @return Total supply of token\n    function totalSupply()\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address from which the balance will be retrieved\n    /// @return Balance of owner\n    function balanceOf(address _owner)\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address of the account owning tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @return Amount of remaining tokens allowed to spent\n    function allowance(address _owner, address _spender)\n        external\n        view\n        returns (uint256);\n}\n"
        },
        "@0x/contracts-erc20/contracts/src/LibERC20Token.sol": {
            "id": 61,
            "content": "/*\n\n  Copyright 2019 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.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"../src/interfaces/IERC20Token.sol\";\n\n\nlibrary LibERC20Token {\n    bytes constant private DECIMALS_CALL_DATA = hex\"313ce567\";\n\n    /// @dev Calls `IERC20Token(token).approve()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param spender The address that receives an allowance.\n    /// @param allowance The allowance to set.\n    function approve(\n        address token,\n        address spender,\n        uint256 allowance\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).approve.selector,\n            spender,\n            allowance\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Calls `IERC20Token(token).approve()` and sets the allowance to the\n    ///      maximum if the current approval is not already >= an amount.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param spender The address that receives an allowance.\n    /// @param amount The minimum allowance needed.\n    function approveIfBelow(\n        address token,\n        address spender,\n        uint256 amount\n    )\n        internal\n    {\n        if (IERC20Token(token).allowance(address(this), spender) < amount) {\n            approve(token, spender, uint256(-1));\n        }\n    }\n\n    /// @dev Calls `IERC20Token(token).transfer()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param to The address that receives the tokens\n    /// @param amount Number of tokens to transfer.\n    function transfer(\n        address token,\n        address to,\n        uint256 amount\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).transfer.selector,\n            to,\n            amount\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Calls `IERC20Token(token).transferFrom()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param from The owner of the tokens.\n    /// @param to The address that receives the tokens\n    /// @param amount Number of tokens to transfer.\n    function transferFrom(\n        address token,\n        address from,\n        address to,\n        uint256 amount\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).transferFrom.selector,\n            from,\n            to,\n            amount\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Retrieves the number of decimals for a token.\n    ///      Returns `18` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @return tokenDecimals The number of decimals places for the token.\n    function decimals(address token)\n        internal\n        view\n        returns (uint8 tokenDecimals)\n    {\n        tokenDecimals = 18;\n        (bool didSucceed, bytes memory resultData) = token.staticcall(DECIMALS_CALL_DATA);\n        if (didSucceed && resultData.length == 32) {\n            tokenDecimals = uint8(LibBytes.readUint256(resultData, 0));\n        }\n    }\n\n    /// @dev Retrieves the allowance for a token, owner, and spender.\n    ///      Returns `0` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @param owner The owner of the tokens.\n    /// @param spender The address the spender.\n    /// @return allowance The allowance for a token, owner, and spender.\n    function allowance(address token, address owner, address spender)\n        internal\n        view\n        returns (uint256 allowance_)\n    {\n        (bool didSucceed, bytes memory resultData) = token.staticcall(\n            abi.encodeWithSelector(\n                IERC20Token(0).allowance.selector,\n                owner,\n                spender\n            )\n        );\n        if (didSucceed && resultData.length == 32) {\n            allowance_ = LibBytes.readUint256(resultData, 0);\n        }\n    }\n\n    /// @dev Retrieves the balance for a token owner.\n    ///      Returns `0` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @param owner The owner of the tokens.\n    /// @return balance The token balance of an owner.\n    function balanceOf(address token, address owner)\n        internal\n        view\n        returns (uint256 balance)\n    {\n        (bool didSucceed, bytes memory resultData) = token.staticcall(\n            abi.encodeWithSelector(\n                IERC20Token(0).balanceOf.selector,\n                owner\n            )\n        );\n        if (didSucceed && resultData.length == 32) {\n            balance = LibBytes.readUint256(resultData, 0);\n        }\n    }\n\n    /// @dev Executes a call on address `target` with calldata `callData`\n    ///      and asserts that either nothing was returned or a single boolean\n    ///      was returned equal to `true`.\n    /// @param target The call target.\n    /// @param callData The abi-encoded call data.\n    function _callWithOptionalBooleanResult(\n        address target,\n        bytes memory callData\n    )\n        private\n    {\n        (bool didSucceed, bytes memory resultData) = target.call(callData);\n        if (didSucceed) {\n            if (resultData.length == 0) {\n                return;\n            }\n            if (resultData.length == 32) {\n                uint256 result = LibBytes.readUint256(resultData, 0);\n                if (result == 1) {\n                    return;\n                }\n            }\n        }\n        LibRichErrors.rrevert(resultData);\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibRichErrors.sol": {
            "id": 75,
            "content": "/*\n\n  Copyright 2019 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.9;\n\n\nlibrary LibRichErrors {\n\n    // bytes4(keccak256(\"Error(string)\"))\n    bytes4 internal constant STANDARD_ERROR_SELECTOR =\n        0x08c379a0;\n\n    // solhint-disable func-name-mixedcase\n    /// @dev ABI encode a standard, string revert error payload.\n    ///      This is the same payload that would be included by a `revert(string)`\n    ///      solidity statement. It has the function signature `Error(string)`.\n    /// @param message The error string.\n    /// @return The ABI encoded error.\n    function StandardError(\n        string memory message\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            STANDARD_ERROR_SELECTOR,\n            bytes(message)\n        );\n    }\n    // solhint-enable func-name-mixedcase\n\n    /// @dev Reverts an encoded rich revert reason `errorData`.\n    /// @param errorData ABI encoded error data.\n    function rrevert(bytes memory errorData)\n        internal\n        pure\n    {\n        assembly {\n            revert(add(errorData, 0x20), mload(errorData))\n        }\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibBytes.sol": {
            "id": 72,
            "content": "/*\n\n  Copyright 2019 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.9;\n\nimport \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n    using LibBytes for bytes;\n\n    /// @dev Gets the memory address for a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of byte array. This\n    ///         points to the header of the byte array which contains\n    ///         the length.\n    function rawAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := input\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Gets the memory address for the contents of a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of the contents of the byte array.\n    function contentAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := add(input, 32)\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Copies `length` bytes from memory location `source` to `dest`.\n    /// @param dest memory address to copy bytes to.\n    /// @param source memory address to copy bytes from.\n    /// @param length number of bytes to copy.\n    function memCopy(\n        uint256 dest,\n        uint256 source,\n        uint256 length\n    )\n        internal\n        pure\n    {\n        if (length < 32) {\n            // Handle a partial word by reading destination and masking\n            // off the bits we are interested in.\n            // This correctly handles overlap, zero lengths and source == dest\n            assembly {\n                let mask := sub(exp(256, sub(32, length)), 1)\n                let s := and(mload(source), not(mask))\n                let d := and(mload(dest), mask)\n                mstore(dest, or(s, d))\n            }\n        } else {\n            // Skip the O(length) loop when source == dest.\n            if (source == dest) {\n                return;\n            }\n\n            // For large copies we copy whole words at a time. The final\n            // word is aligned to the end of the range (instead of after the\n            // previous) to handle partial words. So a copy will look like this:\n            //\n            //  ####\n            //      ####\n            //          ####\n            //            ####\n            //\n            // We handle overlap in the source and destination range by\n            // changing the copying direction. This prevents us from\n            // overwriting parts of source that we still need to copy.\n            //\n            // This correctly handles source == dest\n            //\n            if (source > dest) {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because it\n                    // is easier to compare with in the loop, and these\n                    // are also the addresses we need for copying the\n                    // last bytes.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the last 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the last bytes in\n                    // source already due to overlap.\n                    let last := mload(sEnd)\n\n                    // Copy whole words front to back\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} lt(source, sEnd) {} {\n                        mstore(dest, mload(source))\n                        source := add(source, 32)\n                        dest := add(dest, 32)\n                    }\n\n                    // Write the last 32 bytes\n                    mstore(dEnd, last)\n                }\n            } else {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because those\n                    // are the starting points when copying a word at the end.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the first 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the first bytes in\n                    // source already due to overlap.\n                    let first := mload(source)\n\n                    // Copy whole words back to front\n                    // We use a signed comparisson here to allow dEnd to become\n                    // negative (happens when source and dest < 32). Valid\n                    // addresses in local memory will never be larger than\n                    // 2**255, so they can be safely re-interpreted as signed.\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} slt(dest, dEnd) {} {\n                        mstore(dEnd, mload(sEnd))\n                        sEnd := sub(sEnd, 32)\n                        dEnd := sub(dEnd, 32)\n                    }\n\n                    // Write the first 32 bytes\n                    mstore(dest, first)\n                }\n            }\n        }\n    }\n\n    /// @dev Returns a slices from a byte array.\n    /// @param b The byte array to take a slice from.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    function slice(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure and copy contents\n        result = new bytes(to - from);\n        memCopy(\n            result.contentAddress(),\n            b.contentAddress() + from,\n            result.length\n        );\n        return result;\n    }\n\n    /// @dev Returns a slice from a byte array without preserving the input.\n    /// @param b The byte array to take a slice from. Will be destroyed in the process.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n    function sliceDestructive(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure around [from, to) in-place.\n        assembly {\n            result := add(b, from)\n            mstore(result, sub(to, from))\n        }\n        return result;\n    }\n\n    /// @dev Pops the last byte off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The byte that was popped off.\n    function popLastByte(bytes memory b)\n        internal\n        pure\n        returns (bytes1 result)\n    {\n        if (b.length == 0) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n                b.length,\n                0\n            ));\n        }\n\n        // Store last byte.\n        result = b[b.length - 1];\n\n        assembly {\n            // Decrement length of byte array.\n            let newLen := sub(mload(b), 1)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Tests equality of two byte arrays.\n    /// @param lhs First byte array to compare.\n    /// @param rhs Second byte array to compare.\n    /// @return True if arrays are the same. False otherwise.\n    function equals(\n        bytes memory lhs,\n        bytes memory rhs\n    )\n        internal\n        pure\n        returns (bool equal)\n    {\n        // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n        // We early exit on unequal lengths, but keccak would also correctly\n        // handle this.\n        return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n    }\n\n    /// @dev Reads an address from a position in a byte array.\n    /// @param b Byte array containing an address.\n    /// @param index Index in byte array of address.\n    /// @return address from byte array.\n    function readAddress(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (address result)\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Read address from array memory\n        assembly {\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 20-byte mask to obtain address\n            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        return result;\n    }\n\n    /// @dev Writes an address into a specific position in a byte array.\n    /// @param b Byte array to insert address into.\n    /// @param index Index in byte array of address.\n    /// @param input Address to put into byte array.\n    function writeAddress(\n        bytes memory b,\n        uint256 index,\n        address input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Store address into array memory\n        assembly {\n            // The address occupies 20 bytes and mstore stores 32 bytes.\n            // First fetch the 32-byte word where we'll be storing the address, then\n            // apply a mask so we have only the bytes in the word that the address will not occupy.\n            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n            let neighbors := and(\n                mload(add(b, index)),\n                0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n            )\n\n            // Make sure input address is clean.\n            // (Solidity does not guarantee this)\n            input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n            // Store the neighbors and address into memory\n            mstore(add(b, index), xor(input, neighbors))\n        }\n    }\n\n    /// @dev Reads a bytes32 value from a position in a byte array.\n    /// @param b Byte array containing a bytes32 value.\n    /// @param index Index in byte array of bytes32 value.\n    /// @return bytes32 value from byte array.\n    function readBytes32(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            result := mload(add(b, index))\n        }\n        return result;\n    }\n\n    /// @dev Writes a bytes32 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes32 to put into byte array.\n    function writeBytes32(\n        bytes memory b,\n        uint256 index,\n        bytes32 input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            mstore(add(b, index), input)\n        }\n    }\n\n    /// @dev Reads a uint256 value from a position in a byte array.\n    /// @param b Byte array containing a uint256 value.\n    /// @param index Index in byte array of uint256 value.\n    /// @return uint256 value from byte array.\n    function readUint256(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (uint256 result)\n    {\n        result = uint256(readBytes32(b, index));\n        return result;\n    }\n\n    /// @dev Writes a uint256 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input uint256 to put into byte array.\n    function writeUint256(\n        bytes memory b,\n        uint256 index,\n        uint256 input\n    )\n        internal\n        pure\n    {\n        writeBytes32(b, index, bytes32(input));\n    }\n\n    /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n    /// @param b Byte array containing a bytes4 value.\n    /// @param index Index in byte array of bytes4 value.\n    /// @return bytes4 value from byte array.\n    function readBytes4(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes4 result)\n    {\n        if (b.length < index + 4) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n                b.length,\n                index + 4\n            ));\n        }\n\n        // Arrays are prefixed by a 32 byte length field\n        index += 32;\n\n        // Read the bytes4 from array memory\n        assembly {\n            result := mload(add(b, index))\n            // Solidity does not require us to clean the trailing bytes.\n            // We do it anyway\n            result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n        }\n        return result;\n    }\n\n    /// @dev Writes a new length to a byte array.\n    ///      Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n    ///      Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n    /// @param b Bytes array to write new length to.\n    /// @param length New length of byte array.\n    function writeLength(bytes memory b, uint256 length)\n        internal\n        pure\n    {\n        assembly {\n            mstore(b, length)\n        }\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": {
            "id": 73,
            "content": "/*\n\n  Copyright 2019 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.9;\n\n\nlibrary LibBytesRichErrors {\n\n    enum InvalidByteOperationErrorCodes {\n        FromLessThanOrEqualsToRequired,\n        ToLessThanOrEqualsLengthRequired,\n        LengthGreaterThanZeroRequired,\n        LengthGreaterThanOrEqualsFourRequired,\n        LengthGreaterThanOrEqualsTwentyRequired,\n        LengthGreaterThanOrEqualsThirtyTwoRequired,\n        LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n        DestinationLengthGreaterThanOrEqualSourceLengthRequired\n    }\n\n    // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n    bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n        0x28006595;\n\n    // solhint-disable func-name-mixedcase\n    function InvalidByteOperationError(\n        InvalidByteOperationErrorCodes errorCode,\n        uint256 offset,\n        uint256 required\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n            errorCode,\n            offset,\n            required\n        );\n    }\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/IWallet.sol": {
            "id": 64,
            "content": "/*\n\n  Copyright 2019 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.9;\npragma experimental ABIEncoderV2;\n\n\ncontract IWallet {\n\n    bytes4 internal constant LEGACY_WALLET_MAGIC_VALUE = 0xb0671381;\n\n    /// @dev Validates a hash with the `Wallet` signature type.\n    /// @param hash Message hash that is signed.\n    /// @param signature Proof of signing.\n    /// @return magicValue `bytes4(0xb0671381)` if the signature check succeeds.\n    function isValidSignature(\n        bytes32 hash,\n        bytes calldata signature\n    )\n        external\n        view\n        returns (bytes4 magicValue);\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/LibMath.sol": {
            "id": 65,
            "content": "/*\n\n  Copyright 2019 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.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibMathRichErrors.sol\";\n\n\nlibrary LibMath {\n\n    using LibSafeMath for uint256;\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function safeGetPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorFloor(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function safeGetPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorCeil(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function getPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function getPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // The absolute rounding error is the difference between the rounded\n        // value and the ideal value. The relative rounding error is the\n        // absolute rounding error divided by the absolute value of the\n        // ideal value. This is undefined when the ideal value is zero.\n        //\n        // The ideal value is `numerator * target / denominator`.\n        // Let's call `numerator * target % denominator` the remainder.\n        // The absolute error is `remainder / denominator`.\n        //\n        // When the ideal value is zero, we require the absolute error to\n        // be zero. Fortunately, this is always the case. The ideal value is\n        // zero iff `numerator == 0` and/or `target == 0`. In this case the\n        // remainder and absolute error are also zero.\n        if (target == 0 || numerator == 0) {\n            return false;\n        }\n\n        // Otherwise, we want the relative rounding error to be strictly\n        // less than 0.1%.\n        // The relative error is `remainder / (numerator * target)`.\n        // We want the relative error less than 1 / 1000:\n        //        remainder / (numerator * denominator)  <  1 / 1000\n        // or equivalently:\n        //        1000 * remainder  <  numerator * target\n        // so we have a rounding error iff:\n        //        1000 * remainder  >=  numerator * target\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding up.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // See the comments in `isRoundingError`.\n        if (target == 0 || numerator == 0) {\n            // When either is zero, the ideal value and rounded value are zero\n            // and there is no rounding error. (Although the relative error\n            // is undefined.)\n            return false;\n        }\n        // Compute remainder as before\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        remainder = denominator.safeSub(remainder) % denominator;\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/LibSafeMath.sol": {
            "id": 76,
            "content": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\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        if (c / a != b) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function safeDiv(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b == 0) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n                a,\n                b\n            ));\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        if (b > a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n                a,\n                b\n            ));\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        if (c < a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\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-utils/contracts/src/LibSafeMathRichErrors.sol": {
            "id": 77,
            "content": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n    // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n    bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n        0xe946c1bb;\n\n    // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n    bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n        0xc996af7b;\n\n    enum BinOpErrorCodes {\n        ADDITION_OVERFLOW,\n        MULTIPLICATION_OVERFLOW,\n        SUBTRACTION_UNDERFLOW,\n        DIVISION_BY_ZERO\n    }\n\n    enum DowncastErrorCodes {\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n    }\n\n    // solhint-disable func-name-mixedcase\n    function Uint256BinOpError(\n        BinOpErrorCodes errorCode,\n        uint256 a,\n        uint256 b\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_BINOP_ERROR_SELECTOR,\n            errorCode,\n            a,\n            b\n        );\n    }\n\n    function Uint256DowncastError(\n        DowncastErrorCodes errorCode,\n        uint256 a\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_DOWNCAST_ERROR_SELECTOR,\n            errorCode,\n            a\n        );\n    }\n}\n"
        },
        "@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": {
            "id": 66,
            "content": "pragma solidity ^0.5.9;\n\n\nlibrary LibMathRichErrors {\n\n    // bytes4(keccak256(\"DivisionByZeroError()\"))\n    bytes internal constant DIVISION_BY_ZERO_ERROR =\n        hex\"a791837c\";\n\n    // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n    bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n        0x339f3de2;\n\n    // solhint-disable func-name-mixedcase\n    function DivisionByZeroError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return DIVISION_BY_ZERO_ERROR;\n    }\n\n    function RoundingError(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            ROUNDING_ERROR_SELECTOR,\n            numerator,\n            denominator,\n            target\n        );\n    }\n}\n"
        },
        "@0x/contracts-utils/contracts/src/DeploymentConstants.sol": {
            "id": 68,
            "content": "/*\n\n  Copyright 2020 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.9;\n\n\ncontract DeploymentConstants {\n\n    // solhint-disable separate-by-one-line-in-contract\n\n    // Mainnet addresses ///////////////////////////////////////////////////////\n    /// @dev Mainnet address of the WETH contract.\n    address constant private WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;\n    /// @dev Mainnet address of the KyberNetworkProxy contract.\n    address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x9AAb3f75489902f3a48495025729a0AF77d4b11e;\n    /// @dev Mainnet address of the KyberHintHandler contract.\n    address constant private KYBER_HINT_HANDLER_ADDRESS = 0xa1C0Fa73c39CFBcC11ec9Eb1Afc665aba9996E2C;\n    /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95;\n    /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    address constant private ETH2DAI_ADDRESS = 0x794e6e91555438aFc3ccF1c5076A74F42133d08D;\n    /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x8ED95d1746bf1E4dAb58d8ED4724f1Ef95B20Db0;\n    ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    address constant private DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;\n    /// @dev Mainnet address of the `Chai` contract\n    address constant private CHAI_ADDRESS = 0x06AF07097C9Eeb7fD685c692751D5C66dB49c215;\n    /// @dev Mainnet address of the 0x DevUtils contract.\n    address constant private DEV_UTILS_ADDRESS = 0x74134CF88b21383713E096a5ecF59e297dc7f547;\n    /// @dev Kyber ETH pseudo-address.\n    address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    /// @dev Mainnet address of the dYdX contract.\n    address constant private DYDX_ADDRESS = 0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e;\n    /// @dev Mainnet address of the GST2 contract\n    address constant private GST_ADDRESS = 0x0000000000b3F879cb30FE243b4Dfee438691c04;\n    /// @dev Mainnet address of the GST Collector\n    address constant private GST_COLLECTOR_ADDRESS = 0x000000D3b08566BE75A6DB803C03C85C0c1c5B96;\n    /// @dev Mainnet address of the mStable mUSD contract.\n    address constant private MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5;\n    /// @dev Mainnet address of the Mooniswap Registry contract\n    address constant private MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303;\n    /// @dev Mainnet address of the DODO Registry (ZOO) contract\n    address constant private DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950;\n    /// @dev Mainnet address of the DODO Helper contract\n    address constant private DODO_HELPER = 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb;\n\n    // // Ropsten addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0xd719c34261e099Fdb33030ac8909d5788D3039C4;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xb344afeD348de15eb4a9e180205A2B0739628339;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0xC812AF3f3fBC62F76ea4262576EC0f49dB8B7f1c;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = 0x4E1000616990D83e56f4b5fC6CC8602DcfD20459;\n\n    // // Rinkeby addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x0d5371e5EE23dec7DF251A8957279629aa79E9C5;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xA2AA4bEFED748Fba27a3bE7Dfd2C4b2c6DB1F49B;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x46B5BC959e8A754c0256FFF73bF34A52Ad5CdfA9;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    // // Kovan addresses /////////////////////////////////////////////////////////\n    // /// @dev Kovan address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;\n    // /// @dev Kovan address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x692f391bCc85cefCe8C237C01e1f636BbD70EA4D;\n    // /// @dev Kovan address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30;\n    // /// @dev Kovan address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Kovan address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = 0xe325acB9765b02b8b418199bf9650972299235F4;\n    // /// @dev Kovan address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x3577552C1Fb7A44aD76BeEB7aB53251668A21F8D;\n    // /// @dev Kovan address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Kovan address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;\n    // /// @dev Kovan address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x9402639A828BdF4E9e4103ac3B69E1a6E522eB59;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Kovan address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    /// @dev Overridable way to get the `KyberNetworkProxy` address.\n    /// @return kyberAddress The `IKyberNetworkProxy` address.\n    function _getKyberNetworkProxyAddress()\n        internal\n        view\n        returns (address kyberAddress)\n    {\n        return KYBER_NETWORK_PROXY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `KyberHintHandler` address.\n    /// @return kyberAddress The `IKyberHintHandler` address.\n    function _getKyberHintHandlerAddress()\n        internal\n        view\n        returns (address hintHandlerAddress)\n    {\n        return KYBER_HINT_HANDLER_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the WETH address.\n    /// @return wethAddress The WETH address.\n    function _getWethAddress()\n        internal\n        view\n        returns (address wethAddress)\n    {\n        return WETH_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapExchangeFactory` address.\n    /// @return uniswapAddress The `UniswapExchangeFactory` address.\n    function _getUniswapExchangeFactoryAddress()\n        internal\n        view\n        returns (address uniswapAddress)\n    {\n        return UNISWAP_EXCHANGE_FACTORY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapV2Router01` address.\n    /// @return uniswapRouterAddress The `UniswapV2Router01` address.\n    function _getUniswapV2Router01Address()\n        internal\n        view\n        returns (address uniswapRouterAddress)\n    {\n        return UNISWAP_V2_ROUTER_01_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Eth2Dai `MatchingMarket` contract.\n    /// @return eth2daiAddress The Eth2Dai `MatchingMarket` contract.\n    function _getEth2DaiAddress()\n        internal\n        view\n        returns (address eth2daiAddress)\n    {\n        return ETH2DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `ERC20BridgeProxy` contract.\n    /// @return erc20BridgeProxyAddress The `ERC20BridgeProxy` contract.\n    function _getERC20BridgeProxyAddress()\n        internal\n        view\n        returns (address erc20BridgeProxyAddress)\n    {\n        return ERC20_BRIDGE_PROXY_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Dai` contract.\n    /// @return daiAddress The `Dai` contract.\n    function _getDaiAddress()\n        internal\n        view\n        returns (address daiAddress)\n    {\n        return DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Chai` contract.\n    /// @return chaiAddress The `Chai` contract.\n    function _getChaiAddress()\n        internal\n        view\n        returns (address chaiAddress)\n    {\n        return CHAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the 0x `DevUtils` contract address.\n    /// @return devUtils The 0x `DevUtils` contract address.\n    function _getDevUtilsAddress()\n        internal\n        view\n        returns (address devUtils)\n    {\n        return DEV_UTILS_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the DyDx contract.\n    /// @return exchange The DyDx exchange contract.\n    function _getDydxAddress()\n        internal\n        view\n        returns (address dydxAddress)\n    {\n        return DYDX_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST2 contract address.\n    /// @return gst The GST contract.\n    function _getGstAddress()\n        internal\n        view\n        returns (address gst)\n    {\n        return GST_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST Collector address.\n    /// @return collector The GST collector address.\n    function _getGstCollectorAddress()\n        internal\n        view\n        returns (address collector)\n    {\n        return GST_COLLECTOR_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the mStable mUSD address.\n    /// @return musd The mStable mUSD address.\n    function _getMUsdAddress()\n        internal\n        view\n        returns (address musd)\n    {\n        return MUSD_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Mooniswap registry address.\n    /// @return registry The Mooniswap registry address.\n    function _getMooniswapAddress()\n        internal\n        view\n        returns (address)\n    {\n        return MOONISWAP_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Registry contract address.\n    /// @return registry The DODO Registry contract address.\n    function _getDODORegistryAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Helper contract address.\n    /// @return registry The DODO Helper contract address.\n    function _getDODOHelperAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_HELPER;\n    }\n}\n"
        },
        "../src/interfaces/IERC20Bridge.sol": {
            "id": 39,
            "content": "/*\n\n  Copyright 2019 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.9;\n\n\ncontract IERC20Bridge {\n\n    /// @dev Result of a successful bridge call.\n    bytes4 constant internal BRIDGE_SUCCESS = 0xdc1600f3;\n\n    /// @dev Emitted when a trade occurs.\n    /// @param inputToken The token the bridge is converting from.\n    /// @param outputToken The token the bridge is converting to.\n    /// @param inputTokenAmount Amount of input token.\n    /// @param outputTokenAmount Amount of output token.\n    /// @param from The `from` address in `bridgeTransferFrom()`\n    /// @param to The `to` address in `bridgeTransferFrom()`\n    event ERC20BridgeTransfer(\n        address inputToken,\n        address outputToken,\n        uint256 inputTokenAmount,\n        uint256 outputTokenAmount,\n        address from,\n        address to\n    );\n\n    /// @dev Transfers `amount` of the ERC20 `tokenAddress` from `from` to `to`.\n    /// @param tokenAddress The address of the ERC20 token to transfer.\n    /// @param from Address to transfer asset from.\n    /// @param to Address to transfer asset to.\n    /// @param amount Amount of asset to transfer.\n    /// @param bridgeData Arbitrary asset data needed by the bridge contract.\n    /// @return success The magic bytes `0xdc1600f3` if successful.\n    function bridgeTransferFrom(\n        address tokenAddress,\n        address from,\n        address to,\n        uint256 amount,\n        bytes calldata bridgeData\n    )\n        external\n        returns (bytes4 success);\n}\n"
        },
        "../src/bridges/MixinGasToken.sol": {
            "id": 21,
            "content": "/*\n\n  Copyright 2019 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.16;\n\nimport \"@0x/contracts-utils/contracts/src/DeploymentConstants.sol\";\nimport \"../interfaces/IGasToken.sol\";\n\n\ncontract MixinGasToken is\n    DeploymentConstants\n{\n\n    /// @dev Frees gas tokens based on the amount of gas consumed in the function\n    modifier freesGasTokens {\n        uint256 gasBefore = gasleft();\n        _;\n        IGasToken gst = IGasToken(_getGstAddress());\n        if (address(gst) != address(0)) {\n            // (gasUsed + FREE_BASE) / (2 * REIMBURSE - FREE_TOKEN)\n            //            14154             24000        6870\n            uint256 value = (gasBefore - gasleft() + 14154) / 41130;\n            gst.freeUpTo(value);\n        }\n    }\n\n    /// @dev Frees gas tokens using the balance of `from`. Amount freed is based\n    ///     on the gas consumed in the function\n    modifier freesGasTokensFromCollector() {\n        uint256 gasBefore = gasleft();\n        _;\n        IGasToken gst = IGasToken(_getGstAddress());\n        if (address(gst) != address(0)) {\n            // (gasUsed + FREE_BASE) / (2 * REIMBURSE - FREE_TOKEN)\n            //            14154             24000        6870\n            uint256 value = (gasBefore - gasleft() + 14154) / 41130;\n            gst.freeFromUpTo(_getGstCollectorAddress(), value);\n        }\n    }\n}\n"
        },
        "../src/interfaces/IGasToken.sol": {
            "id": 41,
            "content": "/*\n\n  Copyright 2019 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.15;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\n\n\ncontract IGasToken is IERC20Token {\n\n    /// @dev Frees up to `value` sub-tokens\n    /// @param value The amount of tokens to free\n    /// @return How many tokens were freed\n    function freeUpTo(uint256 value) external returns (uint256 freed);\n\n    /// @dev Frees up to `value` sub-tokens owned by `from`\n    /// @param from The owner of tokens to spend\n    /// @param value The amount of tokens to free\n    /// @return How many tokens were freed\n    function freeFromUpTo(address from, uint256 value) external returns (uint256 freed);\n\n    /// @dev Mints `value` amount of tokens\n    /// @param value The amount of tokens to mint\n    function mint(uint256 value) external;\n}\n"
        }
    },
    "sourceCodes": {
        "./TestDexForwarderBridge.sol": "/*\n\n  Copyright 2020 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.9;\npragma experimental ABIEncoderV2;\n\nimport \"../src/bridges/DexForwarderBridge.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\n\n\ninterface ITestDexForwarderBridge {\n    event BridgeTransferFromCalled(\n        address caller,\n        uint256 inputTokenBalance,\n        address inputToken,\n        address outputToken,\n        address from,\n        address to,\n        uint256 amount\n    );\n\n    event TokenTransferCalled(\n        address from,\n        address to,\n        uint256 amount\n    );\n\n    function emitBridgeTransferFromCalled(\n        address caller,\n        uint256 inputTokenBalance,\n        address inputToken,\n        address outputToken,\n        address from,\n        address to,\n        uint256 amount\n    ) external;\n\n    function emitTokenTransferCalled(\n        address from,\n        address to,\n        uint256 amount\n    ) external;\n}\n\n\ninterface ITestDexForwarderBridgeTestToken {\n\n    function transfer(address to, uint256 amount)\n        external\n        returns (bool);\n\n    function mint(address to, uint256 amount)\n        external;\n\n    function balanceOf(address owner) external view returns (uint256);\n}\n\n\ncontract TestDexForwarderBridgeTestBridge {\n\n    bytes4 private _returnCode;\n    string private _revertError;\n    uint256 private _transferAmount;\n    ITestDexForwarderBridge private _testContract;\n\n    constructor(bytes4 returnCode, string memory revertError) public {\n        _testContract = ITestDexForwarderBridge(msg.sender);\n        _returnCode = returnCode;\n        _revertError = revertError;\n    }\n\n    function setTransferAmount(uint256 amount) external {\n        _transferAmount = amount;\n    }\n\n    function bridgeTransferFrom(\n        address outputToken,\n        address from,\n        address to,\n        uint256 amount,\n        bytes memory bridgeData\n    )\n        public\n        returns (bytes4 success)\n    {\n        if (bytes(_revertError).length != 0) {\n            revert(_revertError);\n        }\n        address inputToken = abi.decode(bridgeData, (address));\n        _testContract.emitBridgeTransferFromCalled(\n            msg.sender,\n            ITestDexForwarderBridgeTestToken(inputToken).balanceOf(address(this)),\n            inputToken,\n            outputToken,\n            from,\n            to,\n            amount\n        );\n        ITestDexForwarderBridgeTestToken(outputToken).mint(to, _transferAmount);\n        return _returnCode;\n    }\n}\n\n\ncontract TestDexForwarderBridgeTestToken {\n\n    using LibSafeMath for uint256;\n\n    mapping(address => uint256) public balanceOf;\n    ITestDexForwarderBridge private _testContract;\n\n    constructor() public {\n        _testContract = ITestDexForwarderBridge(msg.sender);\n    }\n\n    function transfer(address to, uint256 amount)\n        external\n        returns (bool)\n    {\n        balanceOf[msg.sender] = balanceOf[msg.sender].safeSub(amount);\n        balanceOf[to] = balanceOf[to].safeAdd(amount);\n        _testContract.emitTokenTransferCalled(msg.sender, to, amount);\n        return true;\n    }\n\n    function mint(address owner, uint256 amount)\n        external\n    {\n        balanceOf[owner] = balanceOf[owner].safeAdd(amount);\n    }\n\n    function setBalance(address owner, uint256 amount)\n        external\n    {\n        balanceOf[owner] = amount;\n    }\n}\n\n\ncontract TestDexForwarderBridge is\n    ITestDexForwarderBridge,\n    DexForwarderBridge\n{\n    address private AUTHORIZED_ADDRESS; // solhint-disable-line var-name-mixedcase\n\n    function setAuthorized(address authorized)\n        public\n    {\n        AUTHORIZED_ADDRESS = authorized;\n    }\n\n    function createBridge(\n        bytes4 returnCode,\n        string memory revertError\n    )\n        public\n        returns (address bridge)\n    {\n        return address(new TestDexForwarderBridgeTestBridge(returnCode, revertError));\n    }\n\n    function createToken() public returns (address token) {\n        return address(new TestDexForwarderBridgeTestToken());\n    }\n\n    function setTokenBalance(address token, address owner, uint256 amount) public {\n        TestDexForwarderBridgeTestToken(token).setBalance(owner, amount);\n    }\n\n    function setBridgeTransferAmount(address bridge, uint256 amount) public {\n        TestDexForwarderBridgeTestBridge(bridge).setTransferAmount(amount);\n    }\n\n    function emitBridgeTransferFromCalled(\n        address caller,\n        uint256 inputTokenBalance,\n        address inputToken,\n        address outputToken,\n        address from,\n        address to,\n        uint256 amount\n    )\n        public\n    {\n        emit BridgeTransferFromCalled(\n            caller,\n            inputTokenBalance,\n            inputToken,\n            outputToken,\n            from,\n            to,\n            amount\n        );\n    }\n\n    function emitTokenTransferCalled(\n        address from,\n        address to,\n        uint256 amount\n    )\n        public\n    {\n        emit TokenTransferCalled(\n            from,\n            to,\n            amount\n        );\n    }\n\n    function balanceOf(address token, address owner) public view returns (uint256) {\n        return TestDexForwarderBridgeTestToken(token).balanceOf(owner);\n    }\n\n    function _getGstAddress()\n        internal\n        view\n        returns (address gst)\n    {\n        return address(0);\n    }\n\n    function _getERC20BridgeProxyAddress()\n        internal\n        view\n        returns (address erc20BridgeProxyAddress)\n    {\n        return AUTHORIZED_ADDRESS;\n    }\n}\n",
        "../src/bridges/DexForwarderBridge.sol": "/*\n\n  Copyright 2020 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.9;\npragma experimental ABIEncoderV2;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\nimport \"@0x/contracts-erc20/contracts/src/LibERC20Token.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/IWallet.sol\";\nimport \"@0x/contracts-exchange-libs/contracts/src/LibMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/DeploymentConstants.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"../interfaces/IERC20Bridge.sol\";\nimport \"./MixinGasToken.sol\";\n\n\n// solhint-disable space-after-comma, indent\ncontract DexForwarderBridge is\n    IERC20Bridge,\n    IWallet,\n    DeploymentConstants,\n    MixinGasToken\n{\n    using LibSafeMath for uint256;\n\n    /// @dev Data needed to reconstruct a bridge call.\n    struct BridgeCall {\n        address target;\n        uint256 inputTokenAmount;\n        uint256 outputTokenAmount;\n        bytes bridgeData;\n    }\n\n    /// @dev Intermediate state variables used by `bridgeTransferFrom()`, in\n    ///      struct form to get around stack limits.\n    struct TransferFromState {\n        address inputToken;\n        uint256 initialInputTokenBalance;\n        uint256 callInputTokenAmount;\n        uint256 callOutputTokenAmount;\n        uint256 totalInputTokenSold;\n        BridgeCall[] calls;\n    }\n\n    /// @dev Spends this contract's entire balance of input tokens by forwarding\n    /// them to other bridges. Reverts if the entire balance is not spent.\n    /// @param outputToken The token being bought.\n    /// @param to The recipient of the bought tokens.\n    /// @param bridgeData The abi-encoded input token address.\n    /// @return success The magic bytes if successful.\n    function bridgeTransferFrom(\n        address outputToken,\n        address /* from */,\n        address to,\n        uint256 /* amount */,\n        bytes calldata bridgeData\n    )\n        external\n        freesGasTokensFromCollector\n        returns (bytes4 success)\n    {\n        require(\n            msg.sender == _getERC20BridgeProxyAddress(),\n            \"DexForwarderBridge/SENDER_NOT_AUTHORIZED\"\n        );\n        TransferFromState memory state;\n        (\n            state.inputToken,\n            state.calls\n        ) = abi.decode(bridgeData, (address, BridgeCall[]));\n\n        state.initialInputTokenBalance =\n            IERC20Token(state.inputToken).balanceOf(address(this));\n\n        for (uint256 i = 0; i < state.calls.length; ++i) {\n            // Stop if the we've sold all our input tokens.\n            if (state.totalInputTokenSold >= state.initialInputTokenBalance) {\n                break;\n            }\n\n            // Compute token amounts.\n            state.callInputTokenAmount = LibSafeMath.min256(\n                state.calls[i].inputTokenAmount,\n                state.initialInputTokenBalance.safeSub(state.totalInputTokenSold)\n            );\n            state.callOutputTokenAmount = LibMath.getPartialAmountFloor(\n                state.callInputTokenAmount,\n                state.calls[i].inputTokenAmount,\n                state.calls[i].outputTokenAmount\n            );\n\n            // Execute the call in a new context so we can recoup transferred\n            // funds by reverting.\n            (bool didSucceed, ) = address(this)\n                .call(abi.encodeWithSelector(\n                    this.executeBridgeCall.selector,\n                    state.calls[i].target,\n                    to,\n                    state.inputToken,\n                    outputToken,\n                    state.callInputTokenAmount,\n                    state.callOutputTokenAmount,\n                    state.calls[i].bridgeData\n                ));\n\n            if (didSucceed) {\n                // Increase the amount of tokens sold.\n                state.totalInputTokenSold = state.totalInputTokenSold.safeAdd(\n                    state.callInputTokenAmount\n                );\n            }\n        }\n        // Always succeed.\n        return BRIDGE_SUCCESS;\n    }\n\n    /// @dev Transfers `inputToken` token to a bridge contract then calls\n    ///      its `bridgeTransferFrom()`. This is executed in separate context\n    ///      so we can revert the transfer on error. This can only be called\n    //       by this contract itself.\n    /// @param bridge The bridge contract.\n    /// @param to The recipient of `outputToken` tokens.\n    /// @param inputToken The input token.\n    /// @param outputToken The output token.\n    /// @param inputTokenAmount The amount of input tokens to transfer to `bridge`.\n    /// @param outputTokenAmount The amount of expected output tokens to be sent\n    ///        to `to` by `bridge`.\n    function executeBridgeCall(\n        address bridge,\n        address to,\n        address inputToken,\n        address outputToken,\n        uint256 inputTokenAmount,\n        uint256 outputTokenAmount,\n        bytes calldata bridgeData\n    )\n        external\n    {\n        // Must be called through `bridgeTransferFrom()`.\n        require(msg.sender == address(this), \"DexForwarderBridge/ONLY_SELF\");\n        // `bridge` must not be this contract.\n        require(bridge != address(this));\n\n        // Get the starting balance of output tokens for `to`.\n        uint256 initialRecipientBalance = IERC20Token(outputToken).balanceOf(to);\n\n        // Transfer input tokens to the bridge.\n        LibERC20Token.transfer(inputToken, bridge, inputTokenAmount);\n\n        // Call the bridge.\n        (bool didSucceed, bytes memory resultData) =\n            bridge.call(abi.encodeWithSelector(\n                IERC20Bridge(0).bridgeTransferFrom.selector,\n                outputToken,\n                bridge,\n                to,\n                outputTokenAmount,\n                bridgeData\n            ));\n\n        // Revert if the call failed or not enough tokens were bought.\n        // This will also undo the token transfer.\n        require(\n            didSucceed\n            && resultData.length == 32\n            && LibBytes.readBytes32(resultData, 0) == bytes32(BRIDGE_SUCCESS)\n            && IERC20Token(outputToken).balanceOf(to).safeSub(initialRecipientBalance) >= outputTokenAmount\n        );\n    }\n\n    /// @dev `SignatureType.Wallet` callback, so that this bridge can be the maker\n    ///      and sign for itself in orders. Always succeeds.\n    /// @return magicValue Magic success bytes, always.\n    function isValidSignature(\n        bytes32,\n        bytes calldata\n    )\n        external\n        view\n        returns (bytes4 magicValue)\n    {\n        return LEGACY_WALLET_MAGIC_VALUE;\n    }\n}\n",
        "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol": "/*\n\n  Copyright 2019 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.9;\n\n\ncontract IERC20Token {\n\n    // solhint-disable no-simple-event-func-name\n    event Transfer(\n        address indexed _from,\n        address indexed _to,\n        uint256 _value\n    );\n\n    event Approval(\n        address indexed _owner,\n        address indexed _spender,\n        uint256 _value\n    );\n\n    /// @dev send `value` token to `to` from `msg.sender`\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transfer(address _to, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev send `value` token to `to` from `from` on the condition it is approved by `from`\n    /// @param _from The address of the sender\n    /// @param _to The address of the recipient\n    /// @param _value The amount of token to be transferred\n    /// @return True if transfer was successful\n    function transferFrom(\n        address _from,\n        address _to,\n        uint256 _value\n    )\n        external\n        returns (bool);\n\n    /// @dev `msg.sender` approves `_spender` to spend `_value` tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @param _value The amount of wei to be approved for transfer\n    /// @return Always true if the call has enough gas to complete execution\n    function approve(address _spender, uint256 _value)\n        external\n        returns (bool);\n\n    /// @dev Query total supply of token\n    /// @return Total supply of token\n    function totalSupply()\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address from which the balance will be retrieved\n    /// @return Balance of owner\n    function balanceOf(address _owner)\n        external\n        view\n        returns (uint256);\n\n    /// @param _owner The address of the account owning tokens\n    /// @param _spender The address of the account able to transfer the tokens\n    /// @return Amount of remaining tokens allowed to spent\n    function allowance(address _owner, address _spender)\n        external\n        view\n        returns (uint256);\n}\n",
        "@0x/contracts-erc20/contracts/src/LibERC20Token.sol": "/*\n\n  Copyright 2019 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.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibBytes.sol\";\nimport \"../src/interfaces/IERC20Token.sol\";\n\n\nlibrary LibERC20Token {\n    bytes constant private DECIMALS_CALL_DATA = hex\"313ce567\";\n\n    /// @dev Calls `IERC20Token(token).approve()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param spender The address that receives an allowance.\n    /// @param allowance The allowance to set.\n    function approve(\n        address token,\n        address spender,\n        uint256 allowance\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).approve.selector,\n            spender,\n            allowance\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Calls `IERC20Token(token).approve()` and sets the allowance to the\n    ///      maximum if the current approval is not already >= an amount.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param spender The address that receives an allowance.\n    /// @param amount The minimum allowance needed.\n    function approveIfBelow(\n        address token,\n        address spender,\n        uint256 amount\n    )\n        internal\n    {\n        if (IERC20Token(token).allowance(address(this), spender) < amount) {\n            approve(token, spender, uint256(-1));\n        }\n    }\n\n    /// @dev Calls `IERC20Token(token).transfer()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param to The address that receives the tokens\n    /// @param amount Number of tokens to transfer.\n    function transfer(\n        address token,\n        address to,\n        uint256 amount\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).transfer.selector,\n            to,\n            amount\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Calls `IERC20Token(token).transferFrom()`.\n    ///      Reverts if `false` is returned or if the return\n    ///      data length is nonzero and not 32 bytes.\n    /// @param token The address of the token contract.\n    /// @param from The owner of the tokens.\n    /// @param to The address that receives the tokens\n    /// @param amount Number of tokens to transfer.\n    function transferFrom(\n        address token,\n        address from,\n        address to,\n        uint256 amount\n    )\n        internal\n    {\n        bytes memory callData = abi.encodeWithSelector(\n            IERC20Token(0).transferFrom.selector,\n            from,\n            to,\n            amount\n        );\n        _callWithOptionalBooleanResult(token, callData);\n    }\n\n    /// @dev Retrieves the number of decimals for a token.\n    ///      Returns `18` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @return tokenDecimals The number of decimals places for the token.\n    function decimals(address token)\n        internal\n        view\n        returns (uint8 tokenDecimals)\n    {\n        tokenDecimals = 18;\n        (bool didSucceed, bytes memory resultData) = token.staticcall(DECIMALS_CALL_DATA);\n        if (didSucceed && resultData.length == 32) {\n            tokenDecimals = uint8(LibBytes.readUint256(resultData, 0));\n        }\n    }\n\n    /// @dev Retrieves the allowance for a token, owner, and spender.\n    ///      Returns `0` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @param owner The owner of the tokens.\n    /// @param spender The address the spender.\n    /// @return allowance The allowance for a token, owner, and spender.\n    function allowance(address token, address owner, address spender)\n        internal\n        view\n        returns (uint256 allowance_)\n    {\n        (bool didSucceed, bytes memory resultData) = token.staticcall(\n            abi.encodeWithSelector(\n                IERC20Token(0).allowance.selector,\n                owner,\n                spender\n            )\n        );\n        if (didSucceed && resultData.length == 32) {\n            allowance_ = LibBytes.readUint256(resultData, 0);\n        }\n    }\n\n    /// @dev Retrieves the balance for a token owner.\n    ///      Returns `0` if the call reverts.\n    /// @param token The address of the token contract.\n    /// @param owner The owner of the tokens.\n    /// @return balance The token balance of an owner.\n    function balanceOf(address token, address owner)\n        internal\n        view\n        returns (uint256 balance)\n    {\n        (bool didSucceed, bytes memory resultData) = token.staticcall(\n            abi.encodeWithSelector(\n                IERC20Token(0).balanceOf.selector,\n                owner\n            )\n        );\n        if (didSucceed && resultData.length == 32) {\n            balance = LibBytes.readUint256(resultData, 0);\n        }\n    }\n\n    /// @dev Executes a call on address `target` with calldata `callData`\n    ///      and asserts that either nothing was returned or a single boolean\n    ///      was returned equal to `true`.\n    /// @param target The call target.\n    /// @param callData The abi-encoded call data.\n    function _callWithOptionalBooleanResult(\n        address target,\n        bytes memory callData\n    )\n        private\n    {\n        (bool didSucceed, bytes memory resultData) = target.call(callData);\n        if (didSucceed) {\n            if (resultData.length == 0) {\n                return;\n            }\n            if (resultData.length == 32) {\n                uint256 result = LibBytes.readUint256(resultData, 0);\n                if (result == 1) {\n                    return;\n                }\n            }\n        }\n        LibRichErrors.rrevert(resultData);\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibRichErrors.sol": "/*\n\n  Copyright 2019 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.9;\n\n\nlibrary LibRichErrors {\n\n    // bytes4(keccak256(\"Error(string)\"))\n    bytes4 internal constant STANDARD_ERROR_SELECTOR =\n        0x08c379a0;\n\n    // solhint-disable func-name-mixedcase\n    /// @dev ABI encode a standard, string revert error payload.\n    ///      This is the same payload that would be included by a `revert(string)`\n    ///      solidity statement. It has the function signature `Error(string)`.\n    /// @param message The error string.\n    /// @return The ABI encoded error.\n    function StandardError(\n        string memory message\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            STANDARD_ERROR_SELECTOR,\n            bytes(message)\n        );\n    }\n    // solhint-enable func-name-mixedcase\n\n    /// @dev Reverts an encoded rich revert reason `errorData`.\n    /// @param errorData ABI encoded error data.\n    function rrevert(bytes memory errorData)\n        internal\n        pure\n    {\n        assembly {\n            revert(add(errorData, 0x20), mload(errorData))\n        }\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibBytes.sol": "/*\n\n  Copyright 2019 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.9;\n\nimport \"./LibBytesRichErrors.sol\";\nimport \"./LibRichErrors.sol\";\n\n\nlibrary LibBytes {\n\n    using LibBytes for bytes;\n\n    /// @dev Gets the memory address for a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of byte array. This\n    ///         points to the header of the byte array which contains\n    ///         the length.\n    function rawAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := input\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Gets the memory address for the contents of a byte array.\n    /// @param input Byte array to lookup.\n    /// @return memoryAddress Memory address of the contents of the byte array.\n    function contentAddress(bytes memory input)\n        internal\n        pure\n        returns (uint256 memoryAddress)\n    {\n        assembly {\n            memoryAddress := add(input, 32)\n        }\n        return memoryAddress;\n    }\n\n    /// @dev Copies `length` bytes from memory location `source` to `dest`.\n    /// @param dest memory address to copy bytes to.\n    /// @param source memory address to copy bytes from.\n    /// @param length number of bytes to copy.\n    function memCopy(\n        uint256 dest,\n        uint256 source,\n        uint256 length\n    )\n        internal\n        pure\n    {\n        if (length < 32) {\n            // Handle a partial word by reading destination and masking\n            // off the bits we are interested in.\n            // This correctly handles overlap, zero lengths and source == dest\n            assembly {\n                let mask := sub(exp(256, sub(32, length)), 1)\n                let s := and(mload(source), not(mask))\n                let d := and(mload(dest), mask)\n                mstore(dest, or(s, d))\n            }\n        } else {\n            // Skip the O(length) loop when source == dest.\n            if (source == dest) {\n                return;\n            }\n\n            // For large copies we copy whole words at a time. The final\n            // word is aligned to the end of the range (instead of after the\n            // previous) to handle partial words. So a copy will look like this:\n            //\n            //  ####\n            //      ####\n            //          ####\n            //            ####\n            //\n            // We handle overlap in the source and destination range by\n            // changing the copying direction. This prevents us from\n            // overwriting parts of source that we still need to copy.\n            //\n            // This correctly handles source == dest\n            //\n            if (source > dest) {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because it\n                    // is easier to compare with in the loop, and these\n                    // are also the addresses we need for copying the\n                    // last bytes.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the last 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the last bytes in\n                    // source already due to overlap.\n                    let last := mload(sEnd)\n\n                    // Copy whole words front to back\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} lt(source, sEnd) {} {\n                        mstore(dest, mload(source))\n                        source := add(source, 32)\n                        dest := add(dest, 32)\n                    }\n\n                    // Write the last 32 bytes\n                    mstore(dEnd, last)\n                }\n            } else {\n                assembly {\n                    // We subtract 32 from `sEnd` and `dEnd` because those\n                    // are the starting points when copying a word at the end.\n                    length := sub(length, 32)\n                    let sEnd := add(source, length)\n                    let dEnd := add(dest, length)\n\n                    // Remember the first 32 bytes of source\n                    // This needs to be done here and not after the loop\n                    // because we may have overwritten the first bytes in\n                    // source already due to overlap.\n                    let first := mload(source)\n\n                    // Copy whole words back to front\n                    // We use a signed comparisson here to allow dEnd to become\n                    // negative (happens when source and dest < 32). Valid\n                    // addresses in local memory will never be larger than\n                    // 2**255, so they can be safely re-interpreted as signed.\n                    // Note: the first check is always true,\n                    // this could have been a do-while loop.\n                    // solhint-disable-next-line no-empty-blocks\n                    for {} slt(dest, dEnd) {} {\n                        mstore(dEnd, mload(sEnd))\n                        sEnd := sub(sEnd, 32)\n                        dEnd := sub(dEnd, 32)\n                    }\n\n                    // Write the first 32 bytes\n                    mstore(dest, first)\n                }\n            }\n        }\n    }\n\n    /// @dev Returns a slices from a byte array.\n    /// @param b The byte array to take a slice from.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    function slice(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure and copy contents\n        result = new bytes(to - from);\n        memCopy(\n            result.contentAddress(),\n            b.contentAddress() + from,\n            result.length\n        );\n        return result;\n    }\n\n    /// @dev Returns a slice from a byte array without preserving the input.\n    /// @param b The byte array to take a slice from. Will be destroyed in the process.\n    /// @param from The starting index for the slice (inclusive).\n    /// @param to The final index for the slice (exclusive).\n    /// @return result The slice containing bytes at indices [from, to)\n    /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n    function sliceDestructive(\n        bytes memory b,\n        uint256 from,\n        uint256 to\n    )\n        internal\n        pure\n        returns (bytes memory result)\n    {\n        // Ensure that the from and to positions are valid positions for a slice within\n        // the byte array that is being used.\n        if (from > to) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,\n                from,\n                to\n            ));\n        }\n        if (to > b.length) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,\n                to,\n                b.length\n            ));\n        }\n\n        // Create a new bytes structure around [from, to) in-place.\n        assembly {\n            result := add(b, from)\n            mstore(result, sub(to, from))\n        }\n        return result;\n    }\n\n    /// @dev Pops the last byte off of a byte array by modifying its length.\n    /// @param b Byte array that will be modified.\n    /// @return The byte that was popped off.\n    function popLastByte(bytes memory b)\n        internal\n        pure\n        returns (bytes1 result)\n    {\n        if (b.length == 0) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,\n                b.length,\n                0\n            ));\n        }\n\n        // Store last byte.\n        result = b[b.length - 1];\n\n        assembly {\n            // Decrement length of byte array.\n            let newLen := sub(mload(b), 1)\n            mstore(b, newLen)\n        }\n        return result;\n    }\n\n    /// @dev Tests equality of two byte arrays.\n    /// @param lhs First byte array to compare.\n    /// @param rhs Second byte array to compare.\n    /// @return True if arrays are the same. False otherwise.\n    function equals(\n        bytes memory lhs,\n        bytes memory rhs\n    )\n        internal\n        pure\n        returns (bool equal)\n    {\n        // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n        // We early exit on unequal lengths, but keccak would also correctly\n        // handle this.\n        return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n    }\n\n    /// @dev Reads an address from a position in a byte array.\n    /// @param b Byte array containing an address.\n    /// @param index Index in byte array of address.\n    /// @return address from byte array.\n    function readAddress(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (address result)\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Read address from array memory\n        assembly {\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 20-byte mask to obtain address\n            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        return result;\n    }\n\n    /// @dev Writes an address into a specific position in a byte array.\n    /// @param b Byte array to insert address into.\n    /// @param index Index in byte array of address.\n    /// @param input Address to put into byte array.\n    function writeAddress(\n        bytes memory b,\n        uint256 index,\n        address input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 20) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,\n                b.length,\n                index + 20 // 20 is length of address\n            ));\n        }\n\n        // Add offset to index:\n        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n        index += 20;\n\n        // Store address into array memory\n        assembly {\n            // The address occupies 20 bytes and mstore stores 32 bytes.\n            // First fetch the 32-byte word where we'll be storing the address, then\n            // apply a mask so we have only the bytes in the word that the address will not occupy.\n            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n            // 1. Add index to address of bytes array\n            // 2. Load 32-byte word from memory\n            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n            let neighbors := and(\n                mload(add(b, index)),\n                0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n            )\n\n            // Make sure input address is clean.\n            // (Solidity does not guarantee this)\n            input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n            // Store the neighbors and address into memory\n            mstore(add(b, index), xor(input, neighbors))\n        }\n    }\n\n    /// @dev Reads a bytes32 value from a position in a byte array.\n    /// @param b Byte array containing a bytes32 value.\n    /// @param index Index in byte array of bytes32 value.\n    /// @return bytes32 value from byte array.\n    function readBytes32(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes32 result)\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            result := mload(add(b, index))\n        }\n        return result;\n    }\n\n    /// @dev Writes a bytes32 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input bytes32 to put into byte array.\n    function writeBytes32(\n        bytes memory b,\n        uint256 index,\n        bytes32 input\n    )\n        internal\n        pure\n    {\n        if (b.length < index + 32) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,\n                b.length,\n                index + 32\n            ));\n        }\n\n        // Arrays are prefixed by a 256 bit length parameter\n        index += 32;\n\n        // Read the bytes32 from array memory\n        assembly {\n            mstore(add(b, index), input)\n        }\n    }\n\n    /// @dev Reads a uint256 value from a position in a byte array.\n    /// @param b Byte array containing a uint256 value.\n    /// @param index Index in byte array of uint256 value.\n    /// @return uint256 value from byte array.\n    function readUint256(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (uint256 result)\n    {\n        result = uint256(readBytes32(b, index));\n        return result;\n    }\n\n    /// @dev Writes a uint256 into a specific position in a byte array.\n    /// @param b Byte array to insert <input> into.\n    /// @param index Index in byte array of <input>.\n    /// @param input uint256 to put into byte array.\n    function writeUint256(\n        bytes memory b,\n        uint256 index,\n        uint256 input\n    )\n        internal\n        pure\n    {\n        writeBytes32(b, index, bytes32(input));\n    }\n\n    /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n    /// @param b Byte array containing a bytes4 value.\n    /// @param index Index in byte array of bytes4 value.\n    /// @return bytes4 value from byte array.\n    function readBytes4(\n        bytes memory b,\n        uint256 index\n    )\n        internal\n        pure\n        returns (bytes4 result)\n    {\n        if (b.length < index + 4) {\n            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(\n                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,\n                b.length,\n                index + 4\n            ));\n        }\n\n        // Arrays are prefixed by a 32 byte length field\n        index += 32;\n\n        // Read the bytes4 from array memory\n        assembly {\n            result := mload(add(b, index))\n            // Solidity does not require us to clean the trailing bytes.\n            // We do it anyway\n            result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n        }\n        return result;\n    }\n\n    /// @dev Writes a new length to a byte array.\n    ///      Decreasing length will lead to removing the corresponding lower order bytes from the byte array.\n    ///      Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.\n    /// @param b Bytes array to write new length to.\n    /// @param length New length of byte array.\n    function writeLength(bytes memory b, uint256 length)\n        internal\n        pure\n    {\n        assembly {\n            mstore(b, length)\n        }\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibBytesRichErrors.sol": "/*\n\n  Copyright 2019 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.9;\n\n\nlibrary LibBytesRichErrors {\n\n    enum InvalidByteOperationErrorCodes {\n        FromLessThanOrEqualsToRequired,\n        ToLessThanOrEqualsLengthRequired,\n        LengthGreaterThanZeroRequired,\n        LengthGreaterThanOrEqualsFourRequired,\n        LengthGreaterThanOrEqualsTwentyRequired,\n        LengthGreaterThanOrEqualsThirtyTwoRequired,\n        LengthGreaterThanOrEqualsNestedBytesLengthRequired,\n        DestinationLengthGreaterThanOrEqualSourceLengthRequired\n    }\n\n    // bytes4(keccak256(\"InvalidByteOperationError(uint8,uint256,uint256)\"))\n    bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =\n        0x28006595;\n\n    // solhint-disable func-name-mixedcase\n    function InvalidByteOperationError(\n        InvalidByteOperationErrorCodes errorCode,\n        uint256 offset,\n        uint256 required\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            INVALID_BYTE_OPERATION_ERROR_SELECTOR,\n            errorCode,\n            offset,\n            required\n        );\n    }\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/IWallet.sol": "/*\n\n  Copyright 2019 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.9;\npragma experimental ABIEncoderV2;\n\n\ncontract IWallet {\n\n    bytes4 internal constant LEGACY_WALLET_MAGIC_VALUE = 0xb0671381;\n\n    /// @dev Validates a hash with the `Wallet` signature type.\n    /// @param hash Message hash that is signed.\n    /// @param signature Proof of signing.\n    /// @return magicValue `bytes4(0xb0671381)` if the signature check succeeds.\n    function isValidSignature(\n        bytes32 hash,\n        bytes calldata signature\n    )\n        external\n        view\n        returns (bytes4 magicValue);\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibMath.sol": "/*\n\n  Copyright 2019 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.9;\n\nimport \"@0x/contracts-utils/contracts/src/LibSafeMath.sol\";\nimport \"@0x/contracts-utils/contracts/src/LibRichErrors.sol\";\nimport \"./LibMathRichErrors.sol\";\n\n\nlibrary LibMath {\n\n    using LibSafeMath for uint256;\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function safeGetPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorFloor(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    ///      Reverts if rounding error is >= 0.1%\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function safeGetPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        if (isRoundingErrorCeil(\n                numerator,\n                denominator,\n                target\n        )) {\n            LibRichErrors.rrevert(LibMathRichErrors.RoundingError(\n                numerator,\n                denominator,\n                target\n            ));\n        }\n\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded down.\n    function getPartialAmountFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        partialAmount = numerator.safeMul(target).safeDiv(denominator);\n        return partialAmount;\n    }\n\n    /// @dev Calculates partial value given a numerator and denominator rounded down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to calculate partial of.\n    /// @return Partial value of target rounded up.\n    function getPartialAmountCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (uint256 partialAmount)\n    {\n        // safeDiv computes `floor(a / b)`. We use the identity (a, b integer):\n        //       ceil(a / b) = floor((a + b - 1) / b)\n        // To implement `ceil(a / b)` using safeDiv.\n        partialAmount = numerator.safeMul(target)\n            .safeAdd(denominator.safeSub(1))\n            .safeDiv(denominator);\n\n        return partialAmount;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding down.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorFloor(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // The absolute rounding error is the difference between the rounded\n        // value and the ideal value. The relative rounding error is the\n        // absolute rounding error divided by the absolute value of the\n        // ideal value. This is undefined when the ideal value is zero.\n        //\n        // The ideal value is `numerator * target / denominator`.\n        // Let's call `numerator * target % denominator` the remainder.\n        // The absolute error is `remainder / denominator`.\n        //\n        // When the ideal value is zero, we require the absolute error to\n        // be zero. Fortunately, this is always the case. The ideal value is\n        // zero iff `numerator == 0` and/or `target == 0`. In this case the\n        // remainder and absolute error are also zero.\n        if (target == 0 || numerator == 0) {\n            return false;\n        }\n\n        // Otherwise, we want the relative rounding error to be strictly\n        // less than 0.1%.\n        // The relative error is `remainder / (numerator * target)`.\n        // We want the relative error less than 1 / 1000:\n        //        remainder / (numerator * denominator)  <  1 / 1000\n        // or equivalently:\n        //        1000 * remainder  <  numerator * target\n        // so we have a rounding error iff:\n        //        1000 * remainder  >=  numerator * target\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n\n    /// @dev Checks if rounding error >= 0.1% when rounding up.\n    /// @param numerator Numerator.\n    /// @param denominator Denominator.\n    /// @param target Value to multiply with numerator/denominator.\n    /// @return Rounding error is present.\n    function isRoundingErrorCeil(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bool isError)\n    {\n        if (denominator == 0) {\n            LibRichErrors.rrevert(LibMathRichErrors.DivisionByZeroError());\n        }\n\n        // See the comments in `isRoundingError`.\n        if (target == 0 || numerator == 0) {\n            // When either is zero, the ideal value and rounded value are zero\n            // and there is no rounding error. (Although the relative error\n            // is undefined.)\n            return false;\n        }\n        // Compute remainder as before\n        uint256 remainder = mulmod(\n            target,\n            numerator,\n            denominator\n        );\n        remainder = denominator.safeSub(remainder) % denominator;\n        isError = remainder.safeMul(1000) >= numerator.safeMul(target);\n        return isError;\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/LibSafeMath.sol": "pragma solidity ^0.5.9;\n\nimport \"./LibRichErrors.sol\";\nimport \"./LibSafeMathRichErrors.sol\";\n\n\nlibrary LibSafeMath {\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        if (c / a != b) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\n    }\n\n    function safeDiv(uint256 a, uint256 b)\n        internal\n        pure\n        returns (uint256)\n    {\n        if (b == 0) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,\n                a,\n                b\n            ));\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        if (b > a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,\n                a,\n                b\n            ));\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        if (c < a) {\n            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(\n                LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,\n                a,\n                b\n            ));\n        }\n        return c;\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-utils/contracts/src/LibSafeMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibSafeMathRichErrors {\n\n    // bytes4(keccak256(\"Uint256BinOpError(uint8,uint256,uint256)\"))\n    bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =\n        0xe946c1bb;\n\n    // bytes4(keccak256(\"Uint256DowncastError(uint8,uint256)\"))\n    bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =\n        0xc996af7b;\n\n    enum BinOpErrorCodes {\n        ADDITION_OVERFLOW,\n        MULTIPLICATION_OVERFLOW,\n        SUBTRACTION_UNDERFLOW,\n        DIVISION_BY_ZERO\n    }\n\n    enum DowncastErrorCodes {\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,\n        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96\n    }\n\n    // solhint-disable func-name-mixedcase\n    function Uint256BinOpError(\n        BinOpErrorCodes errorCode,\n        uint256 a,\n        uint256 b\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_BINOP_ERROR_SELECTOR,\n            errorCode,\n            a,\n            b\n        );\n    }\n\n    function Uint256DowncastError(\n        DowncastErrorCodes errorCode,\n        uint256 a\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            UINT256_DOWNCAST_ERROR_SELECTOR,\n            errorCode,\n            a\n        );\n    }\n}\n",
        "@0x/contracts-exchange-libs/contracts/src/LibMathRichErrors.sol": "pragma solidity ^0.5.9;\n\n\nlibrary LibMathRichErrors {\n\n    // bytes4(keccak256(\"DivisionByZeroError()\"))\n    bytes internal constant DIVISION_BY_ZERO_ERROR =\n        hex\"a791837c\";\n\n    // bytes4(keccak256(\"RoundingError(uint256,uint256,uint256)\"))\n    bytes4 internal constant ROUNDING_ERROR_SELECTOR =\n        0x339f3de2;\n\n    // solhint-disable func-name-mixedcase\n    function DivisionByZeroError()\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return DIVISION_BY_ZERO_ERROR;\n    }\n\n    function RoundingError(\n        uint256 numerator,\n        uint256 denominator,\n        uint256 target\n    )\n        internal\n        pure\n        returns (bytes memory)\n    {\n        return abi.encodeWithSelector(\n            ROUNDING_ERROR_SELECTOR,\n            numerator,\n            denominator,\n            target\n        );\n    }\n}\n",
        "@0x/contracts-utils/contracts/src/DeploymentConstants.sol": "/*\n\n  Copyright 2020 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.9;\n\n\ncontract DeploymentConstants {\n\n    // solhint-disable separate-by-one-line-in-contract\n\n    // Mainnet addresses ///////////////////////////////////////////////////////\n    /// @dev Mainnet address of the WETH contract.\n    address constant private WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;\n    /// @dev Mainnet address of the KyberNetworkProxy contract.\n    address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x9AAb3f75489902f3a48495025729a0AF77d4b11e;\n    /// @dev Mainnet address of the KyberHintHandler contract.\n    address constant private KYBER_HINT_HANDLER_ADDRESS = 0xa1C0Fa73c39CFBcC11ec9Eb1Afc665aba9996E2C;\n    /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95;\n    /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    address constant private ETH2DAI_ADDRESS = 0x794e6e91555438aFc3ccF1c5076A74F42133d08D;\n    /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x8ED95d1746bf1E4dAb58d8ED4724f1Ef95B20Db0;\n    ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    address constant private DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F;\n    /// @dev Mainnet address of the `Chai` contract\n    address constant private CHAI_ADDRESS = 0x06AF07097C9Eeb7fD685c692751D5C66dB49c215;\n    /// @dev Mainnet address of the 0x DevUtils contract.\n    address constant private DEV_UTILS_ADDRESS = 0x74134CF88b21383713E096a5ecF59e297dc7f547;\n    /// @dev Kyber ETH pseudo-address.\n    address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    /// @dev Mainnet address of the dYdX contract.\n    address constant private DYDX_ADDRESS = 0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e;\n    /// @dev Mainnet address of the GST2 contract\n    address constant private GST_ADDRESS = 0x0000000000b3F879cb30FE243b4Dfee438691c04;\n    /// @dev Mainnet address of the GST Collector\n    address constant private GST_COLLECTOR_ADDRESS = 0x000000D3b08566BE75A6DB803C03C85C0c1c5B96;\n    /// @dev Mainnet address of the mStable mUSD contract.\n    address constant private MUSD_ADDRESS = 0xe2f2a5C287993345a840Db3B0845fbC70f5935a5;\n    /// @dev Mainnet address of the Mooniswap Registry contract\n    address constant private MOONISWAP_REGISTRY = 0x71CD6666064C3A1354a3B4dca5fA1E2D3ee7D303;\n    /// @dev Mainnet address of the DODO Registry (ZOO) contract\n    address constant private DODO_REGISTRY = 0x3A97247DF274a17C59A3bd12735ea3FcDFb49950;\n    /// @dev Mainnet address of the DODO Helper contract\n    address constant private DODO_HELPER = 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb;\n\n    // // Ropsten addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0xd719c34261e099Fdb33030ac8909d5788D3039C4;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0x9c83dCE8CA20E9aAF9D3efc003b2ea62aBC08351;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xb344afeD348de15eb4a9e180205A2B0739628339;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0xC812AF3f3fBC62F76ea4262576EC0f49dB8B7f1c;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = 0x4E1000616990D83e56f4b5fC6CC8602DcfD20459;\n\n    // // Rinkeby addresses ///////////////////////////////////////////////////////\n    // /// @dev Mainnet address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xc778417E063141139Fce010982780140Aa0cD5Ab;\n    // /// @dev Mainnet address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x0d5371e5EE23dec7DF251A8957279629aa79E9C5;\n    // /// @dev Mainnet address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xf5D915570BC477f9B8D6C0E980aA81757A3AaC36;\n    // /// @dev Mainnet address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Mainnet address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0xA2AA4bEFED748Fba27a3bE7Dfd2C4b2c6DB1F49B;\n    // ///@dev Mainnet address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Mainnet address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x46B5BC959e8A754c0256FFF73bF34A52Ad5CdfA9;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Mainnet address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Mainnet address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    // // Kovan addresses /////////////////////////////////////////////////////////\n    // /// @dev Kovan address of the WETH contract.\n    // address constant private WETH_ADDRESS = 0xd0A1E359811322d97991E03f863a0C30C2cF029C;\n    // /// @dev Kovan address of the KyberNetworkProxy contract.\n    // address constant private KYBER_NETWORK_PROXY_ADDRESS = 0x692f391bCc85cefCe8C237C01e1f636BbD70EA4D;\n    // /// @dev Kovan address of the `UniswapExchangeFactory` contract.\n    // address constant private UNISWAP_EXCHANGE_FACTORY_ADDRESS = 0xD3E51Ef092B2845f10401a0159B2B96e8B6c3D30;\n    // /// @dev Kovan address of the `UniswapV2Router01` contract.\n    // address constant private UNISWAP_V2_ROUTER_01_ADDRESS = 0xf164fC0Ec4E93095b804a4795bBe1e041497b92a;\n    // /// @dev Kovan address of the Eth2Dai `MatchingMarket` contract.\n    // address constant private ETH2DAI_ADDRESS = 0xe325acB9765b02b8b418199bf9650972299235F4;\n    // /// @dev Kovan address of the `ERC20BridgeProxy` contract\n    // address constant private ERC20_BRIDGE_PROXY_ADDRESS = 0x3577552C1Fb7A44aD76BeEB7aB53251668A21F8D;\n    // /// @dev Kovan address of the `Chai` contract\n    // address constant private CHAI_ADDRESS = address(0);\n    // /// @dev Kovan address of the `Dai` (multi-collateral) contract\n    // address constant private DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa;\n    // /// @dev Kovan address of the 0x DevUtils contract.\n    // address constant private DEV_UTILS_ADDRESS = 0x9402639A828BdF4E9e4103ac3B69E1a6E522eB59;\n    // /// @dev Kyber ETH pseudo-address.\n    // address constant internal KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n    // /// @dev Kovan address of the dYdX contract.\n    // address constant private DYDX_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST2 contract\n    // address constant private GST_ADDRESS = address(0);\n    // /// @dev Kovan address of the GST Collector\n    // address constant private GST_COLLECTOR_ADDRESS = address(0);\n    // /// @dev Mainnet address of the mStable mUSD contract.\n    // address constant private MUSD_ADDRESS = address(0);\n\n    /// @dev Overridable way to get the `KyberNetworkProxy` address.\n    /// @return kyberAddress The `IKyberNetworkProxy` address.\n    function _getKyberNetworkProxyAddress()\n        internal\n        view\n        returns (address kyberAddress)\n    {\n        return KYBER_NETWORK_PROXY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `KyberHintHandler` address.\n    /// @return kyberAddress The `IKyberHintHandler` address.\n    function _getKyberHintHandlerAddress()\n        internal\n        view\n        returns (address hintHandlerAddress)\n    {\n        return KYBER_HINT_HANDLER_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the WETH address.\n    /// @return wethAddress The WETH address.\n    function _getWethAddress()\n        internal\n        view\n        returns (address wethAddress)\n    {\n        return WETH_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapExchangeFactory` address.\n    /// @return uniswapAddress The `UniswapExchangeFactory` address.\n    function _getUniswapExchangeFactoryAddress()\n        internal\n        view\n        returns (address uniswapAddress)\n    {\n        return UNISWAP_EXCHANGE_FACTORY_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the `UniswapV2Router01` address.\n    /// @return uniswapRouterAddress The `UniswapV2Router01` address.\n    function _getUniswapV2Router01Address()\n        internal\n        view\n        returns (address uniswapRouterAddress)\n    {\n        return UNISWAP_V2_ROUTER_01_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Eth2Dai `MatchingMarket` contract.\n    /// @return eth2daiAddress The Eth2Dai `MatchingMarket` contract.\n    function _getEth2DaiAddress()\n        internal\n        view\n        returns (address eth2daiAddress)\n    {\n        return ETH2DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `ERC20BridgeProxy` contract.\n    /// @return erc20BridgeProxyAddress The `ERC20BridgeProxy` contract.\n    function _getERC20BridgeProxyAddress()\n        internal\n        view\n        returns (address erc20BridgeProxyAddress)\n    {\n        return ERC20_BRIDGE_PROXY_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Dai` contract.\n    /// @return daiAddress The `Dai` contract.\n    function _getDaiAddress()\n        internal\n        view\n        returns (address daiAddress)\n    {\n        return DAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the `Chai` contract.\n    /// @return chaiAddress The `Chai` contract.\n    function _getChaiAddress()\n        internal\n        view\n        returns (address chaiAddress)\n    {\n        return CHAI_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the 0x `DevUtils` contract address.\n    /// @return devUtils The 0x `DevUtils` contract address.\n    function _getDevUtilsAddress()\n        internal\n        view\n        returns (address devUtils)\n    {\n        return DEV_UTILS_ADDRESS;\n    }\n\n    /// @dev Overridable way to get the DyDx contract.\n    /// @return exchange The DyDx exchange contract.\n    function _getDydxAddress()\n        internal\n        view\n        returns (address dydxAddress)\n    {\n        return DYDX_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST2 contract address.\n    /// @return gst The GST contract.\n    function _getGstAddress()\n        internal\n        view\n        returns (address gst)\n    {\n        return GST_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the GST Collector address.\n    /// @return collector The GST collector address.\n    function _getGstCollectorAddress()\n        internal\n        view\n        returns (address collector)\n    {\n        return GST_COLLECTOR_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the mStable mUSD address.\n    /// @return musd The mStable mUSD address.\n    function _getMUsdAddress()\n        internal\n        view\n        returns (address musd)\n    {\n        return MUSD_ADDRESS;\n    }\n\n    /// @dev An overridable way to retrieve the Mooniswap registry address.\n    /// @return registry The Mooniswap registry address.\n    function _getMooniswapAddress()\n        internal\n        view\n        returns (address)\n    {\n        return MOONISWAP_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Registry contract address.\n    /// @return registry The DODO Registry contract address.\n    function _getDODORegistryAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_REGISTRY;\n    }\n\n    /// @dev An overridable way to retrieve the DODO Helper contract address.\n    /// @return registry The DODO Helper contract address.\n    function _getDODOHelperAddress()\n        internal\n        view\n        returns (address)\n    {\n        return DODO_HELPER;\n    }\n}\n",
        "../src/interfaces/IERC20Bridge.sol": "/*\n\n  Copyright 2019 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.9;\n\n\ncontract IERC20Bridge {\n\n    /// @dev Result of a successful bridge call.\n    bytes4 constant internal BRIDGE_SUCCESS = 0xdc1600f3;\n\n    /// @dev Emitted when a trade occurs.\n    /// @param inputToken The token the bridge is converting from.\n    /// @param outputToken The token the bridge is converting to.\n    /// @param inputTokenAmount Amount of input token.\n    /// @param outputTokenAmount Amount of output token.\n    /// @param from The `from` address in `bridgeTransferFrom()`\n    /// @param to The `to` address in `bridgeTransferFrom()`\n    event ERC20BridgeTransfer(\n        address inputToken,\n        address outputToken,\n        uint256 inputTokenAmount,\n        uint256 outputTokenAmount,\n        address from,\n        address to\n    );\n\n    /// @dev Transfers `amount` of the ERC20 `tokenAddress` from `from` to `to`.\n    /// @param tokenAddress The address of the ERC20 token to transfer.\n    /// @param from Address to transfer asset from.\n    /// @param to Address to transfer asset to.\n    /// @param amount Amount of asset to transfer.\n    /// @param bridgeData Arbitrary asset data needed by the bridge contract.\n    /// @return success The magic bytes `0xdc1600f3` if successful.\n    function bridgeTransferFrom(\n        address tokenAddress,\n        address from,\n        address to,\n        uint256 amount,\n        bytes calldata bridgeData\n    )\n        external\n        returns (bytes4 success);\n}\n",
        "../src/bridges/MixinGasToken.sol": "/*\n\n  Copyright 2019 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.16;\n\nimport \"@0x/contracts-utils/contracts/src/DeploymentConstants.sol\";\nimport \"../interfaces/IGasToken.sol\";\n\n\ncontract MixinGasToken is\n    DeploymentConstants\n{\n\n    /// @dev Frees gas tokens based on the amount of gas consumed in the function\n    modifier freesGasTokens {\n        uint256 gasBefore = gasleft();\n        _;\n        IGasToken gst = IGasToken(_getGstAddress());\n        if (address(gst) != address(0)) {\n            // (gasUsed + FREE_BASE) / (2 * REIMBURSE - FREE_TOKEN)\n            //            14154             24000        6870\n            uint256 value = (gasBefore - gasleft() + 14154) / 41130;\n            gst.freeUpTo(value);\n        }\n    }\n\n    /// @dev Frees gas tokens using the balance of `from`. Amount freed is based\n    ///     on the gas consumed in the function\n    modifier freesGasTokensFromCollector() {\n        uint256 gasBefore = gasleft();\n        _;\n        IGasToken gst = IGasToken(_getGstAddress());\n        if (address(gst) != address(0)) {\n            // (gasUsed + FREE_BASE) / (2 * REIMBURSE - FREE_TOKEN)\n            //            14154             24000        6870\n            uint256 value = (gasBefore - gasleft() + 14154) / 41130;\n            gst.freeFromUpTo(_getGstCollectorAddress(), value);\n        }\n    }\n}\n",
        "../src/interfaces/IGasToken.sol": "/*\n\n  Copyright 2019 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.15;\n\nimport \"@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol\";\n\n\ncontract IGasToken is IERC20Token {\n\n    /// @dev Frees up to `value` sub-tokens\n    /// @param value The amount of tokens to free\n    /// @return How many tokens were freed\n    function freeUpTo(uint256 value) external returns (uint256 freed);\n\n    /// @dev Frees up to `value` sub-tokens owned by `from`\n    /// @param from The owner of tokens to spend\n    /// @param value The amount of tokens to free\n    /// @return How many tokens were freed\n    function freeFromUpTo(address from, uint256 value) external returns (uint256 freed);\n\n    /// @dev Mints `value` amount of tokens\n    /// @param value The amount of tokens to mint\n    function mint(uint256 value) external;\n}\n"
    },
    "compiler": {
        "name": "solc",
        "version": "0.5.17+commit.d19bba13",
        "settings": {
            "remappings": [
                "@0x/contracts-utils=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-utils",
                "@0x/contracts-erc1155=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-erc1155",
                "@0x/contracts-erc20=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-erc20",
                "@0x/contracts-exchange-libs=/home/runner/work/protocol/protocol/contracts/asset-proxy/node_modules/@0x/contracts-exchange-libs"
            ],
            "optimizer": {
                "enabled": true,
                "runs": 1000000,
                "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": "istanbul"
        }
    },
    "chains": {}
}
