UNPKG

@dolomite-exchange/dolomite-margin

Version:

Ethereum Smart Contracts and TypeScript library used for the DolomiteMargin trading protocol

576 lines 1.41 MB
{ "contractName": "MultiSig", "abi": [ { "inputs": [ { "internalType": "address[]", "name": "_owners", "type": "address[]" }, { "internalType": "uint256", "name": "_required", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "transactionId", "type": "uint256" } ], "name": "Confirmation", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "transactionId", "type": "uint256" } ], "name": "Execution", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "transactionId", "type": "uint256" }, { "indexed": false, "internalType": "string", "name": "error", "type": "string" } ], "name": "ExecutionFailure", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" } ], "name": "OwnerAddition", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" } ], "name": "OwnerRemoval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "required", "type": "uint256" } ], "name": "RequirementChange", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "transactionId", "type": "uint256" } ], "name": "Revocation", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "transactionId", "type": "uint256" } ], "name": "Submission", "type": "event" }, { "constant": true, "inputs": [], "name": "MAX_OWNER_COUNT", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "address", "name": "", "type": "address" } ], "name": "confirmations", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "isOwner", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "owners", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "required", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "transactionCount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "transactions", "outputs": [ { "internalType": "address", "name": "destination", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "bool", "name": "executed", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "addOwner", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "removeOwner", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "replaceOwner", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "uint256", "name": "_required", "type": "uint256" } ], "name": "changeRequirement", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "destination", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "submitTransaction", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "uint256", "name": "transactionId", "type": "uint256" } ], "name": "confirmTransaction", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "uint256", "name": "transactionId", "type": "uint256" } ], "name": "revokeConfirmation", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "uint256", "name": "transactionId", "type": "uint256" } ], "name": "executeTransaction", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "transactionId", "type": "uint256" } ], "name": "isConfirmed", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "transactionId", "type": "uint256" } ], "name": "getConfirmationCount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "bool", "name": "pending", "type": "bool" }, { "internalType": "bool", "name": "executed", "type": "bool" } ], "name": "getTransactionCount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "getOwners", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "transactionId", "type": "uint256" } ], "name": "getConfirmations", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "from", "type": "uint256" }, { "internalType": "uint256", "name": "to", "type": "uint256" }, { "internalType": "bool", "name": "pending", "type": "bool" }, { "internalType": "bool", "name": "executed", "type": "bool" } ], "name": "getTransactionIds", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "payable": false, "stateMutability": "view", "type": "function" } ], "metadata": "{\"compiler\":{\"version\":\"0.5.16+commit.9c3226ce\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_required\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Confirmation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Execution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"transactionId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"error\",\"type\":\"string\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"RequirementChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Revocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Submission\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_OWNER_COUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"addOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_required\",\"type\":\"uint256\"}],\"name\":\"changeRequirement\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"confirmTransaction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"confirmations\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeTransaction\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmationCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmations\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bool\",\"name\":\"pending\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"from\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"to\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"pending\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"isConfirmed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"removeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"replaceOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"required\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"revokeConfirmation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"submitTransaction\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transactionCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transactions\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"dYdX * Multi-Signature Wallet. Allows multiple parties to agree on transactions before execution. Adapted from Stefan George's MultiSigWallet contract. * Logic Changes: - Removed the fallback function - Ensure newOwner is notNull * Syntax Changes: - Update Solidity syntax for 0.5.X: use `emit` keyword (events), use `view` keyword (functions) - Add braces to all `if` and `for` statements - Remove named return variables - Add space before and after comparison operators - Add ADDRESS_ZERO as a constant - uint => uint256 - external_call => externalCall\",\"methods\":{\"addOwner(address)\":{\"params\":{\"owner\":\"Address of new owner.\"}},\"changeRequirement(uint256)\":{\"params\":{\"_required\":\"Number of required confirmations.\"}},\"confirmTransaction(uint256)\":{\"params\":{\"transactionId\":\"Transaction ID.\"}},\"constructor\":{\"params\":{\"_owners\":\"List of initial owners.\",\"_required\":\"Number of required confirmations.\"}},\"executeTransaction(uint256)\":{\"params\":{\"transactionId\":\"Transaction ID.\"}},\"getConfirmationCount(uint256)\":{\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Number of confirmations.\"},\"getConfirmations(uint256)\":{\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Array of owner addresses.\"},\"getOwners()\":{\"return\":\"Array of owner addresses.\"},\"getTransactionCount(bool,bool)\":{\"params\":{\"executed\":\"Include executed transactions.\",\"pending\":\"Include pending transactions.\"},\"return\":\"Total number of transactions after filters are applied.\"},\"getTransactionIds(uint256,uint256,bool,bool)\":{\"params\":{\"executed\":\"Include executed transactions.\",\"from\":\"Index start position of transaction array.\",\"pending\":\"Include pending transactions.\",\"to\":\"Index end position of transaction array.\"},\"return\":\"Array of transaction IDs.\"},\"isConfirmed(uint256)\":{\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Confirmation status.\"},\"removeOwner(address)\":{\"params\":{\"owner\":\"Address of owner.\"}},\"replaceOwner(address,address)\":{\"params\":{\"newOwner\":\"Address of new owner.\",\"owner\":\"Address of owner to be replaced.\"}},\"revokeConfirmation(uint256)\":{\"params\":{\"transactionId\":\"Transaction ID.\"}},\"submitTransaction(address,uint256,bytes)\":{\"params\":{\"data\":\"Transaction data payload.\",\"destination\":\"Transaction target address.\",\"value\":\"Transaction ether value.\"},\"return\":\"Transaction ID.\"}},\"title\":\"MultiSig\"},\"userdoc\":{\"methods\":{\"addOwner(address)\":{\"notice\":\"Allows to add a new owner. Transaction has to be sent by wallet.\"},\"changeRequirement(uint256)\":{\"notice\":\"Allows to change the number of required confirmations. Transaction has to be sent by wallet.\"},\"confirmTransaction(uint256)\":{\"notice\":\"Allows an owner to confirm a transaction.\"},\"constructor\":\"Contract constructor sets initial owners and required number of confirmations.\",\"executeTransaction(uint256)\":{\"notice\":\"Allows an owner to execute a confirmed transaction.\"},\"getConfirmationCount(uint256)\":{\"notice\":\"Returns number of confirmations of a transaction.\"},\"getConfirmations(uint256)\":{\"notice\":\"Returns array with owner addresses, which confirmed transaction.\"},\"getOwners()\":{\"notice\":\"Returns array of owners.\"},\"getTransactionCount(bool,bool)\":{\"notice\":\"Returns total number of transactions after filers are applied.\"},\"getTransactionIds(uint256,uint256,bool,bool)\":{\"notice\":\"Returns list of transaction IDs in defined range.\"},\"isConfirmed(uint256)\":{\"notice\":\"Returns the confirmation status of a transaction.\"},\"removeOwner(address)\":{\"notice\":\"Allows to remove an owner. Transaction has to be sent by wallet.\"},\"replaceOwner(address,address)\":{\"notice\":\"Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\"},\"revokeConfirmation(uint256)\":{\"notice\":\"Allows an owner to revoke a confirmation for a transaction.\"},\"submitTransaction(address,uint256,bytes)\":{\"notice\":\"Allows an owner to submit and confirm a transaction.\"}}}},\"settings\":{\"compilationTarget\":{\"/home/cdc218/projects/dolomite-protocol-v2/contracts/external/multisig/MultiSig.sol\":\"MultiSig\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"/home/cdc218/projects/dolomite-protocol-v2/contracts/external/multisig/MultiSig.sol\":{\"keccak256\":\"0x3c0776aedd29b782018b6ad2c3810ac64a84f19c32a5c05bb3577fc2c96364b1\",\"urls\":[\"bzz-raw://268ea85da028f8a4a73e023a88da6c608eb94c08d6f39591540670025b298ce1\",\"dweb:/ipfs/Qmea9fLLdTzmbuNqQY2ct9Mi4AuyCntDWQR8P5fD81HEKJ\"]}},\"version\":1}", "bytecode": "0x60806040523480156200001157600080fd5b50604051620027ee380380620027ee8339810160408190526200003491620002d0565b81518160328211158015620000495750818111155b80156200005557508015155b80156200006157508115155b620000895760405162461bcd60e51b815260040162000080906200037e565b60405180910390fd5b60005b8451811015620001705760026000868381518110620000a757fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615801562000103575060006001600160a01b0316858281518110620000ef57fe5b60200260200101516001600160a01b031614155b620001225760405162461bcd60e51b8152600401620000809062000390565b6001600260008784815181106200013557fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556001016200008c565b5083516200018690600390602087019062000193565b505050600455506200042a565b828054828255906000526020600020908101928215620001eb579160200282015b82811115620001eb57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620001b4565b50620001f9929150620001fd565b5090565b6200022491905b80821115620001f95780546001600160a01b031916815560010162000204565b90565b8051620002348162000405565b92915050565b600082601f8301126200024c57600080fd5b8151620002636200025d82620003c9565b620003a2565b915081818352602084019350602081019050838560208402820111156200028957600080fd5b60005b83811015620002b95781620002a2888262000227565b84525060209283019291909101906001016200028c565b5050505092915050565b805162000234816200041f565b60008060408385031215620002e457600080fd5b82516001600160401b03811115620002fb57600080fd5b62000309858286016200023a565b92505060206200031c85828601620002c3565b9150509250929050565b600062000335600f83620003ea565b6e4e4f5f524551554952454d454e545360881b815260200192915050565b600062000362600d83620003ea565b6c20a62922a0a22cafa7aba722a960991b815260200192915050565b60208082528101620002348162000326565b60208082528101620002348162000353565b6040518181016001600160401b0381118282101715620003c157600080fd5b604052919050565b60006001600160401b03821115620003e057600080fd5b5060209081020190565b90815260200190565b60006001600160a01b03821662000234565b6200041081620003f3565b81146200041c57600080fd5b50565b620004108162000224565b6123b4806200043a6000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063a0e67e2b116100d8578063c01a8c841161008c578063dc8452cd11610066578063dc8452cd1461030d578063e20056e614610315578063ee22610b1461032857610177565b8063c01a8c84146102df578063c6427474146102f2578063d74f8edd1461030557610177565b8063b5dc40c3116100bd578063b5dc40c3146102b1578063b77bf600146102c4578063ba51a6df146102cc57610177565b8063a0e67e2b1461027c578063a8abe69a1461029157610177565b8063547415251161012f578063784547a711610114578063784547a7146102335780638b51d13f146102465780639ace38c21461025957610177565b806354741525146102005780637065cb481461022057610177565b806320ea8d861161016057806320ea8d86146101ba5780632f54bf6e146101cd5780633411c81c146101ed57610177565b8063025e7c271461017c578063173825d9146101a5575b600080fd5b61018f61018a366004611bf0565b61033b565b60405161019c9190612112565b60405180910390f35b6101b86101b3366004611ace565b61036f565b005b6101b86101c8366004611bf0565b6105cc565b6101e06101db366004611ace565b6106bb565b60405161019c919061217e565b6101e06101fb366004611c0e565b6106d0565b61021361020e366004611b8b565b6106f0565b60405161019c919061222d565b6101b861022e366004611ace565b610760565b6101e0610241366004611bf0565b6108ff565b610213610254366004611bf0565b610997565b61026c610267366004611bf0565b610a15565b60405161019c9493929190612120565b610284610afe565b60405161019c919061215c565b6102a461029f366004611c2d565b610b6e565b60405161019c919061216d565b6102846102bf366004611bf0565b610ca0565b610213610e73565b6101b86102da366004611bf0565b610e79565b6101b86102ed366004611bf0565b610f21565b610213610300366004611b26565b61102e565b61021361104f565b610213611054565b6101b8610323366004611aec565b61105a565b6101b8610336366004611bf0565b6112ad565b6003818154811061034857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b3330146103975760405162461bcd60e51b815260040161038e906121bd565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff166103de5760405162461bcd60e51b815260040161038e906121fd565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260408120805460ff191690555b6003547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0181101561053c578273ffffffffffffffffffffffffffffffffffffffff166003828154811061045c57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561053457600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106104b457fe5b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff90921691839081106104e757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061053c565b60010161040c565b50600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061056e9082611952565b5060035460045411156105875760035461058790610e79565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25050565b3360008181526002602052604090205460ff166105fb5760405162461bcd60e51b815260040161038e906121fd565b60008281526001602090815260408083203380855292529091205483919060ff166106385760405162461bcd60e51b815260040161038e906121ed565b600084815260208190526040902060030154849060ff161561066c5760405162461bcd60e51b815260040161038e906121dd565b6000858152600160209081526040808320338085529252808320805460ff191690555187927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b600080805b6005548110156107565784801561071e575060008181526020819052604090206003015460ff16155b806107425750838015610742575060008181526020819052604090206003015460ff165b1561074e576001820191505b6001016106f5565b5090505b92915050565b33301461077f5760405162461bcd60e51b815260040161038e906121bd565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff16156107c75760405162461bcd60e51b815260040161038e9061219d565b8173ffffffffffffffffffffffffffffffffffffffff81166107fb5760405162461bcd60e51b815260040161038e9061220d565b600380549050600101600454603282111580156108185750818111155b801561082357508015155b801561082e57508115155b61084a5760405162461bcd60e51b815260040161038e906121ad565b73ffffffffffffffffffffffffffffffffffffffff8516600081815260026020526040808220805460ff1916600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b600080805b60035481101561098b576000848152600160205260408120600380549192918490811061092d57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff161561096e576001820191505b60045482141561098357600192505050610992565b600101610904565b5060009150505b919050565b600080805b600354811015610a0e57600084815260016020526040812060038054919291849081106109c557fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610a06576001820191505b60010161099c565b5092915050565b60006020818152918152604090819020805460018083015460028085018054875161010095821615959095027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f810188900488028401880190965285835273ffffffffffffffffffffffffffffffffffffffff90931695909491929190830182828015610aeb5780601f10610ac057610100808354040283529160200191610aeb565b820191906000526020600020905b815481529060010190602001808311610ace57829003601f168201915b5050506003909301549192505060ff1684565b60606003805480602002602001604051908101604052809291908181526020018280548015610b6357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610b38575b505050505090505b90565b606080600554604051908082528060200260200182016040528015610b9d578160200160208202803883390190505b5090506000805b600554811015610c1e57858015610bcd575060008181526020819052604090206003015460ff16155b80610bf15750848015610bf1575060008181526020819052604090206003015460ff165b15610c165780838381518110610c0357fe5b6020026020010181815250506001820191505b600101610ba4565b6060888803604051908082528060200260200182016040528015610c4c578160200160208202803883390190505b5090508891505b87821015610c9457838281518110610c6757fe5b6020026020010151818a840381518110610c7d57fe5b602002602001018181525050816001019150610c53565b98975050505050505050565b606080600380549050604051908082528060200260200182016040528015610cd2578160200160208202803883390190505b5090506000805b600354811015610dc95760008581526001602052604081206003805491929184908110610d0257fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610dc15760038181548110610d4957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838381518110610d8057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b600101610cd9565b606082604051908082528060200260200182016040528015610df5578160200160208202803883390190505b509050600091505b82821015610e6a57838281518110610e1157fe5b6020026020010151818381518110610e2557fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050816001019150610dfd565b95945050505050565b60055481565b333014610e985760405162461bcd60e51b815260040161038e906121bd565b6003548160328211801590610ead5750818111155b8015610eb857508015155b8015610ec357508115155b610edf5760405162461bcd60e51b815260040161038e906121ad565b60048390556040517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a90610f1490859061222d565b60405180910390a1505050565b3360008181526002602052604090205460ff16610f505760405162461bcd60e51b815260040161038e906121fd565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16610f935760405162461bcd60e51b815260040161038e906121cd565b60008381526001602090815260408083203380855292529091205484919060ff1615610fd15760405162461bcd60e51b815260040161038e9061221d565b6000858152600160208181526040808420338086529252808420805460ff1916909317909255905187927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a3611027856112ad565b5050505050565b60008061103c8585856114db565b905061104781610f21565b949350505050565b603281565b60045481565b3330146110795760405162461bcd60e51b815260040161038e906121bd565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff166110c05760405162461bcd60e51b815260040161038e906121fd565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff16156111085760405162461bcd60e51b815260040161038e9061219d565b8273ffffffffffffffffffffffffffffffffffffffff811661113c5760405162461bcd60e51b815260040161038e9061220d565b60005b6003548110156111f8578573ffffffffffffffffffffffffffffffffffffffff166003828154811061116d57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156111f05784600382815481106111a357fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506111f8565b60010161113f565b5073ffffffffffffffffffffffffffffffffffffffff808616600081815260026020526040808220805460ff1990811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a260405173ffffffffffffffffffffffffffffffffffffffff8516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25050505050565b3360008181526002602052604090205460ff166112dc5760405162461bcd60e51b815260040161038e906121fd565b60008281526001602090815260408083203380855292529091205483919060ff166113195760405162461bcd60e51b815260040161038e906121ed565b600084815260208190526040902060030154849060ff161561134d5760405162461bcd60e51b815260040161038e906121dd565b611356856108ff565b1561102757600085815260208181526040808320600381018054600160ff19909116811790915581548183015460028085018054875161010096821615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f81018890048802850188019096528584529396956060956114529573ffffffffffffffffffffffffffffffffffffffff909416949293918301828280156114485780601f1061141d57610100808354040283529160200191611448565b820191906000526020600020905b81548152906001019060200180831161142b57829003601f168201915b50505050506115fe565b91509150811561148c5760405188907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26114d1565b877ff46b9a37318f375b6612b0522f04ac289129cafb279d379fa487be62a147477c826040516114bc919061218c565b60405180910390a260038301805460ff191690555b5050505050505050565b60008373ffffffffffffffffffffffffffffffffffffffff81166115115760405162461bcd60e51b815260040161038e9061220d565b6005546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8881168252602080830189815283850189815260006060860181905287815280845295909520845181547fffffffffffffffffffffffff000000000000000000000000000000000000000016941693909317835551600183015592518051929391926115a5926002850192019061197b565b50606091909101516003909101805460ff191691151591909117905560058054600101905560405181907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a295945050505050565b60006060600060608673ffffffffffffffffffffffffffffffffffffffff16868660405161162c91906120af565b60006040518083038185875af1925050503d8060008114611669576040519150601f19603f3d011682016040523d82523d6000602084013e61166e565b606091505b5091509150816116eb5760606116838861170c565b90506044825110156116bd576000816040516020016116a291906120f0565b60405160208183030381529060405294509450505050611704565b600482019150600081838060200190516116da9190810190611bbb565b6040516020016116a29291906120c2565b6001604051806020016040528060008152509350935050505b935093915050565b604080518082018252601081527f303132333435363738396162636465660000000000000000000000000000000060208201528151602a808252606082810190945273ffffffffffffffffffffffffffffffffffffffff8516929184916020820181803883390190505090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106117a657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061180357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b6014811015611949578260048583600c016020811061185057fe5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901c60f81c60ff168151811061188857fe5b602001015160f81c60f81b8282600202600201815181106118a557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350828482600c01602081106118e457fe5b825191901a600f169081106118f557fe5b602001015160f81c60f81b82826002026003018151811061191257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101611835565b50949350505050565b815481835581811115611976576000838152602090206119769181019083016119f9565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106119bc57805160ff19168380011785556119e9565b828001600101855582156119e9579182015b828111156119e95782518255916020019190600101906119ce565b506119f59291506119f9565b5090565b610b6b91905b808211156119f557600081556001016119ff565b803561075a81612348565b803561075a8161235f565b600082601f830112611a3a57600080fd5b8135611a4d611a4882612262565b61223b565b91508082526020830160208301858383011115611a6957600080fd5b611a748382846122e4565b50505092915050565b600082601f830112611a8e57600080fd5b8151611a9c611a4882612262565b91508082526020830160208301858383011115611ab857600080fd5b611a748382846122f0565b803561075a81612368565b600060208284031215611ae057600080fd5b60006110478484611a13565b60008060408385031215611aff57600080fd5b6000611b0b8585611a13565b9250506020611b1c85828601611a13565b9150509250929050565b600080600060608486031215611b3b57600080fd5b6000611b478686611a13565b9350506020611b5886828701611ac3565b925050604084013567ffffffffffffffff811115611b7557600080fd5b611b8186828701611a29565b9150509250925092565b60008060408385031215611b9e57600080fd5b6000611baa8585611a1e565b9250506020611b1c85828601611a1e565b600060208284031215611bcd57600080fd5b815167ffffffffffffffff811115611be457600080fd5b61104784828501611a7d565b600060208284031215611c0257600080fd5b60006110478484611ac3565b60008060408385031215611c2157600080fd5b6000611b0b8585611ac3565b60008060008060808587031215611c4357600080fd5b6000611c4f8787611ac3565b9450506020611c6087828801611ac3565b9350506040611c7187828801611a1e565b9250506060611c8287828801611a1e565b91505092959194509250565b6000611c9a8383611cae565b505060200190565b6000611c9a83836120a6565b611cb7816122bb565b82525050565b6000611cc8826122ae565b611cd281856122b2565b9350611cdd836122a8565b8060005b83811015611d0b578151611cf58882611c8e565b9750611d00836122a8565b925050600101611ce1565b509495945050505050565b6000611d21826122ae565b611d2b81856122b2565b9350611d36836122a8565b8060005b83811015611d0b578151611d4e8882611ca2565b9750611d59836122a8565b925050600101611d3a565b611cb7816122c6565b6000611d78826122ae565b611d828185610992565b9350611d928185602086016122f0565b9290920192915050565b6000611da7826122ae565b611db181856122b2565b9350611dc18185602086016122f0565b611dca81612320565b9093019392505050565b6000611de1600c836122b2565b7f4f574e45525f4558495354530000000000000000000000000000000000000000815260200192915050565b6000611e1a600f836122b2565b7f4e4f5f524551554952454d454e54530000000000000000000000000000000000815260200192915050565b6000611e53600b836122b2565b7f4f4e4c595f57414c4c4554000000000000000000000000000000000000000000815260200192915050565b6000611e8c602483610992565b7f4d756c74695369673a3a5f65787465726e616c43616c6c3a207265766572742081527f6174203c00000000000000000000000000000000000000000000000000000000602082015260240192915050565b6000611eeb601a836122b2565b7f5452414e53414354494f4e5f444f45535f4e4f545f4558495354000000000000815260200192915050565b6000611f24601c836122b2565b7f5452414e53414354494f4e5f414c52454144595f455845435554454400000000815260200192915050565b6000611f5d6019836122b2565b7f5452414e53414354494f4e5f4e4f545f434f4e4649524d454400000000000000815260200192915050565b6000611f966014836122b2565b7f4f574e45525f444f45535f4e4f545f4558495354000000000000000000000000815260200192915050565b6000611fcf600f836122b2565b7f414444524553535f49535f4e554c4c0000000000000000000000000000000000815260200192915050565b6000612008601d836122b2565b7f5452414e53414354494f4e5f414c52454144595f434f4e4649524d4544000000815260200192915050565b6000612041600f83610992565b7f3e207769746820726561736f6e3a2000000000000000000000000000000000008152600f0192915050565b600061207a600183610992565b7f3e00000000000000000000000000000000000000000000000000000000000000815260010192915050565b611cb781610b6b565b60006120bb8284611d6d565b9392505050565b60006120cd82611e7f565b91506120d98285611d6d565b91506120e482612034565b91506110478284611d6d565b60006120fb82611e7f565b91506121078284611d6d565b91506120bb8261206d565b6020810161075a8284611cae565b6080810161212e8287611cae565b61213b60208301866120a6565b818103604083015261214d8185611d9c565b9050610e6a6060830184611d64565b602080825281016120bb8184611cbd565b602080825281016120bb8184611d16565b6020810161075a8284611d64565b602080825281016120bb8184611d9c565b6020808252810161075a81611dd4565b6020808252810161075a81611e0d565b6020808252810161075a81611e46565b6020808252810161075a81611ede565b6020808252810161075a81611f17565b6020808252810161075a81611f50565b6020808252810161075a81611f89565b6020808252810161075a81611fc2565b6020808252810161075a81611ffb565b6020810161075a82846120a6565b60405181810167ffffffffffffffff8111828210171561225a57600080fd5b604052919050565b600067ffffffffffffffff82111561227957600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b90815260200190565b600061075a826122cb565b151590565b73ffffffffffffffffffffffffffffffffffffffff1690565b82818337506000910152565b60005b8381101561230b5781810151838201526020016122f3565b8381111561231a576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b612351816122bb565b811461235c57600080fd5b50565b612351816122c6565b61235181610b6b56fea365627a7a723158206acf7d1eb3d9c474ddc6bc6d2d6111f69281943294015eeebae08d7b3182540f6c6578706572696d656e74616cf564736f6c63430005100040", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063a0e67e2b116100d8578063c01a8c841161008c578063dc8452cd11610066578063dc8452cd1461030d578063e20056e614610315578063ee22610b1461032857610177565b8063c01a8c84146102df578063c6427474146102f2578063d74f8edd1461030557610177565b8063b5dc40c3116100bd578063b5dc40c3146102b1578063b77bf600146102c4578063ba51a6df146102cc57610177565b8063a0e67e2b1461027c578063a8abe69a1461029157610177565b8063547415251161012f578063784547a711610114578063784547a7146102335780638b51d13f146102465780639ace38c21461025957610177565b806354741525146102005780637065cb481461022057610177565b806320ea8d861161016057806320ea8d86146101ba5780632f54bf6e146101cd5780633411c81c146101ed57610177565b8063025e7c271461017c578063173825d9146101a5575b600080fd5b61018f61018a366004611bf0565b61033b565b60405161019c9190612112565b60405180910390f35b6101b86101b3366004611ace565b61036f565b005b6101b86101c8366004611bf0565b6105cc565b6101e06101db366004611ace565b6106bb565b60405161019c919061217e565b6101e06101fb366004611c0e565b6106d0565b61021361020e366004611b8b565b6106f0565b60405161019c919061222d565b6101b861022e366004611ace565b610760565b6101e0610241366004611bf0565b6108ff565b610213610254366004611bf0565b610997565b61026c610267366004611bf0565b610a15565b60405161019c9493929190612120565b610284610afe565b60405161019c919061215c565b6102a461029f366004611c2d565b610b6e565b60405161019c919061216d565b6102846102bf366004611bf0565b610ca0565b610213610e73565b6101b86102da366004611bf0565b610e79565b6101b86102ed366004611bf0565b610f21565b610213610300366004611b26565b61102e565b61021361104f565b610213611054565b6101b8610323366004611aec565b61105a565b6101b8610336366004611bf0565b6112ad565b6003818154811061034857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b3330146103975760405162461bcd60e51b815260040161038e906121bd565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff166103de5760405162461bcd60e51b815260040161038e906121fd565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260408120805460ff191690555b6003547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0181101561053c578273ffffffffffffffffffffffffffffffffffffffff166003828154811061045c57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561053457600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106104b457fe5b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff90921691839081106104e757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061053c565b60010161040c565b50600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061056e9082611952565b5060035460045411156105875760035461058790610e79565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25050565b3360008181526002602052604090205460ff166105fb5760405162461bcd60e51b815260040161038e906121fd565b60008281526001602090815260408083203380855292529091205483919060ff166106385760405162461bcd60e51b815260040161038e906121ed565b600084815260208190526040902060030154849060ff161561066c5760405162461bcd60e51b815260040161038e906121dd565b6000858152600160209081526040808320338085529252808320805460ff191690555187927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b600080805b6005548110156107565784801561071e575060008181526020819052604090206003015460ff16155b806107425750838015610742575060008181526020819052604090206003015460ff165b1561074e576001820191505b6001016106f5565b5090505b92915050565b33301461077f5760405162461bcd60e51b815260040161038e906121bd565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff16156107c75760405162461bcd60e51b815260040161038e9061219d565b8173ffffffffffffffffffffffffffffffffffffffff81166107fb5760405162461bcd60e51b815260040161038e9061220d565b600380549050600101600454603282111580156108185750818111155b801561082357508015155b801561082e57508115155b61084a5760405162461bcd60e51b815260040161038e906121ad565b73ffffffffffffffffffffffffffffffffffffffff8516600081815260026020526040808220805460ff1916600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b600080805b60035481101561098b576000848152600160205260408120600380549192918490811061092d57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff161561096e57600182