bnpl
Version:
The smart contracts for bnpl
1,347 lines • 86.6 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "Consideration",
"sourceName": "contracts/lib/Consideration.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "conduitController",
"type": "address"
},
{
"internalType": "address",
"name": "shadowToken",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "BadContractSignature",
"type": "error"
},
{
"inputs": [],
"name": "BadFraction",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "BadReturnValueFromERC20OnTransfer",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
}
],
"name": "BadSignatureV",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "orderIndex",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "considerationIndex",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "shortfallAmount",
"type": "uint256"
}
],
"name": "ConsiderationNotMet",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256[]",
"name": "identifiers",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "amounts",
"type": "uint256[]"
}
],
"name": "ERC1155BatchTransferGenericFailure",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "EtherTransferGenericFailure",
"type": "error"
},
{
"inputs": [],
"name": "InsufficientEtherSupplied",
"type": "error"
},
{
"inputs": [],
"name": "Invalid1155BatchTransferEncoding",
"type": "error"
},
{
"inputs": [],
"name": "InvalidBasicOrderParameterEncoding",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "conduit",
"type": "address"
}
],
"name": "InvalidCallToConduit",
"type": "error"
},
{
"inputs": [],
"name": "InvalidCanceller",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "conduitKey",
"type": "bytes32"
},
{
"internalType": "address",
"name": "conduit",
"type": "address"
}
],
"name": "InvalidConduit",
"type": "error"
},
{
"inputs": [],
"name": "InvalidERC721TransferAmount",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "InvalidMsgValue",
"type": "error"
},
{
"inputs": [],
"name": "InvalidNativeOfferItem",
"type": "error"
},
{
"inputs": [],
"name": "InvalidOrderParameters",
"type": "error"
},
{
"inputs": [],
"name": "InvalidSignature",
"type": "error"
},
{
"inputs": [],
"name": "InvalidSigner",
"type": "error"
},
{
"inputs": [],
"name": "InvalidTime",
"type": "error"
},
{
"inputs": [],
"name": "MissingItemAmount",
"type": "error"
},
{
"inputs": [],
"name": "MissingOriginalConsiderationItems",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "NoContract",
"type": "error"
},
{
"inputs": [],
"name": "NoReentrantCalls",
"type": "error"
},
{
"inputs": [],
"name": "NoSpecifiedOrdersAvailable",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "OrderAlreadyFilled",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "OrderAlreadyFinalized",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "OrderAlreadyStarted",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "OrderExpired",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "OrderInvalidRepayParameters",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "OrderIsCancelled",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "OrderNotExpired",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "OrderNotStarted",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "OrderNotValidated",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "OrderPartiallyFilled",
"type": "error"
},
{
"inputs": [],
"name": "PartialFillsNotEnabledForOrder",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "identifier",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "TokenTransferGenericFailure",
"type": "error"
},
{
"inputs": [],
"name": "UnusedItemParameters",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "newCounter",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "offerer",
"type": "address"
}
],
"name": "CounterIncremented",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "offerer",
"type": "address"
}
],
"name": "OrderBroken",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "offerer",
"type": "address"
}
],
"name": "OrderCancelled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "offerer",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "fulfiller",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "shadowId",
"type": "uint256"
}
],
"name": "OrderFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "uint256",
"name": "payTimes",
"type": "uint256"
},
{
"indexed": false,
"internalType": "bool",
"name": "finalized",
"type": "bool"
}
],
"name": "OrderRepaid",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "offerer",
"type": "address"
}
],
"name": "OrderValidated",
"type": "event"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "offerer",
"type": "address"
},
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "identifier",
"type": "uint256"
},
{
"internalType": "address",
"name": "currency",
"type": "address"
},
{
"internalType": "address",
"name": "artist",
"type": "address"
},
{
"internalType": "address",
"name": "platform",
"type": "address"
},
{
"internalType": "uint256",
"name": "startTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "endTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "duration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "periods",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ratio",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "royalty",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "conduitKey",
"type": "bytes32"
}
],
"internalType": "struct OrderParameters",
"name": "parameters",
"type": "tuple"
}
],
"name": "breakOrder",
"outputs": [
{
"internalType": "bool",
"name": "broken",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "offerer",
"type": "address"
},
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "identifier",
"type": "uint256"
},
{
"internalType": "address",
"name": "currency",
"type": "address"
},
{
"internalType": "address",
"name": "artist",
"type": "address"
},
{
"internalType": "address",
"name": "platform",
"type": "address"
},
{
"internalType": "uint256",
"name": "startTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "endTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "duration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "periods",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ratio",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "royalty",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "conduitKey",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "counter",
"type": "uint256"
}
],
"internalType": "struct OrderComponents[]",
"name": "orders",
"type": "tuple[]"
}
],
"name": "cancel",
"outputs": [
{
"internalType": "bool",
"name": "cancelled",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "offerer",
"type": "address"
},
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "identifier",
"type": "uint256"
},
{
"internalType": "address",
"name": "currency",
"type": "address"
},
{
"internalType": "address",
"name": "artist",
"type": "address"
},
{
"internalType": "address",
"name": "platform",
"type": "address"
},
{
"internalType": "uint256",
"name": "startTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "endTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "duration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "periods",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ratio",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "royalty",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "conduitKey",
"type": "bytes32"
}
],
"internalType": "struct OrderParameters",
"name": "parameters",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"internalType": "struct Order",
"name": "order",
"type": "tuple"
},
{
"internalType": "bytes32",
"name": "fulfillerConduitKey",
"type": "bytes32"
}
],
"name": "fulfillOrder",
"outputs": [
{
"internalType": "bool",
"name": "fulfilled",
"type": "bool"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "offerer",
"type": "address"
}
],
"name": "getCounter",
"outputs": [
{
"internalType": "uint256",
"name": "counter",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "offerer",
"type": "address"
},
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "identifier",
"type": "uint256"
},
{
"internalType": "address",
"name": "currency",
"type": "address"
},
{
"internalType": "address",
"name": "artist",
"type": "address"
},
{
"internalType": "address",
"name": "platform",
"type": "address"
},
{
"internalType": "uint256",
"name": "startTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "endTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "duration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "periods",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ratio",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "royalty",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "conduitKey",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "counter",
"type": "uint256"
}
],
"internalType": "struct OrderComponents",
"name": "order",
"type": "tuple"
}
],
"name": "getOrderHash",
"outputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "orderHash",
"type": "bytes32"
}
],
"name": "getOrderStatus",
"outputs": [
{
"internalType": "bool",
"name": "isValidated",
"type": "bool"
},
{
"internalType": "bool",
"name": "isCancelled",
"type": "bool"
},
{
"internalType": "bool",
"name": "isFinalized",
"type": "bool"
},
{
"internalType": "bool",
"name": "isBroken",
"type": "bool"
},
{
"internalType": "address",
"name": "fulfiller",
"type": "address"
},
{
"internalType": "uint256",
"name": "startedAt",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "shadowId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "paidTimes",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "incrementCounter",
"outputs": [
{
"internalType": "uint256",
"name": "newCounter",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "information",
"outputs": [
{
"internalType": "string",
"name": "version",
"type": "string"
},
{
"internalType": "bytes32",
"name": "domainSeparator",
"type": "bytes32"
},
{
"internalType": "address",
"name": "conduitController",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "offerer",
"type": "address"
},
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "identifier",
"type": "uint256"
},
{
"internalType": "address",
"name": "currency",
"type": "address"
},
{
"internalType": "address",
"name": "artist",
"type": "address"
},
{
"internalType": "address",
"name": "platform",
"type": "address"
},
{
"internalType": "uint256",
"name": "startTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "endTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "duration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "periods",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ratio",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "royalty",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "conduitKey",
"type": "bytes32"
}
],
"internalType": "struct OrderParameters",
"name": "parameters",
"type": "tuple"
},
{
"internalType": "bytes32",
"name": "fulfillerConduitKey",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "payTimes",
"type": "uint256"
}
],
"name": "repayOrder",
"outputs": [
{
"internalType": "bool",
"name": "repaid",
"type": "bool"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "shadowToken",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"components": [
{
"internalType": "address",
"name": "offerer",
"type": "address"
},
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "identifier",
"type": "uint256"
},
{
"internalType": "address",
"name": "currency",
"type": "address"
},
{
"internalType": "address",
"name": "artist",
"type": "address"
},
{
"internalType": "address",
"name": "platform",
"type": "address"
},
{
"internalType": "uint256",
"name": "startTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "endTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "duration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "periods",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ratio",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "royalty",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "withdrawFee",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salt",
"type": "uint256"
},
{
"internalType": "bytes32",
"name": "conduitKey",
"type": "bytes32"
}
],
"internalType": "struct OrderParameters",
"name": "parameters",
"type": "tuple"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"internalType": "struct Order[]",
"name": "orders",
"type": "tuple[]"
}
],
"name": "validate",
"outputs": [
{
"internalType": "bool",
"name": "validated",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x6101a06040523480156200001257600080fd5b506040516200380d3803806200380d8339810160408190526200003591620004aa565b818181818082808080806200004962000137565b60e05260c081815260a0838152608085815246610100819052604080516020818101979097528082019890985260608801969096529086015230858201528351808603909101815293019091528151910120610120526001600160a01b03811661014081905260408051630a96ad3960e01b81528151630a96ad39926004808401939192918290030181865afa158015620000e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200010e9190620004e2565b5061016052505060016000555050506001600160a01b0316610180525062000507945050505050565b60008080806200016760408051808201909152600d81526c21b7b739b4b232b930ba34b7b760991b602082015290565b805160209182012060408051808201825260038152620312e360ec1b90840152519095507fe6bbd6277e1bf288eed5e8d1780f9a50b239e86b153736bceebccf4ea79d90b39450600091620003c291016f09ee4c8cae486dedae0dedccadce8e6560831b81526f1859191c995cdcc81bd999995c995c8b60821b60108201526d1859191c995cdcc81d1bdad95b8b60921b60208201527f75696e74323536206964656e7469666965722c00000000000000000000000000602e820152701859191c995cdcc818dd5c9c995b98de4b607a1b60418201526e1859191c995cdcc8185c9d1a5cdd0b608a1b6052820152701859191c995cdcc81c1b185d199bdc9b4b607a1b6061820152711d5a5b9d0c8d4d881cdd185c9d151a5b594b60721b60728201526f1d5a5b9d0c8d4d88195b99151a5b594b60821b6084820152701d5a5b9d0c8d4d88191d5c985d1a5bdb8b607a1b60948201526f1d5a5b9d0c8d4d881c195c9a5bd91ccb60821b60a58201526e1d5a5b9d0c8d4d88185b5bdd5b9d0b608a1b60b58201526d1d5a5b9d0c8d4d881c985d1a5bcb60921b60c48201526f1d5a5b9d0c8d4d881c9bde585b1d1e4b60821b60d28201526b1d5a5b9d0c8d4d881999594b60a21b60e28201527f75696e743235362077697468647261774665652c00000000000000000000000060ee8201526c1d5a5b9d0c8d4d881cd85b1d0b609a1b6101028201527f6279746573333220636f6e647569744b65792c0000000000000000000000000061010f8201526e3ab4b73a191a9b1031b7bab73a32b960891b610122820152602960f81b6101318201526101320190565b60408051601f19818403018152908290526c08a92a06e626488dedac2d2dc5609b1b60208301526b1cdd1c9a5b99c81b985b594b60a21b602d8301526e1cdd1c9a5b99c81d995c9cda5bdb8b608a1b60398301526f1d5a5b9d0c8d4d8818da185a5b92590b60821b60488301527f6164647265737320766572696679696e67436f6e7472616374000000000000006058830152602960f81b60718301529150607201604051602081830303815290604052805190602001209250808051906020012091505090919293565b80516001600160a01b0381168114620004a557600080fd5b919050565b60008060408385031215620004be57600080fd5b620004c9836200048d565b9150620004d9602084016200048d565b90509250929050565b60008060408385031215620004f657600080fd5b505080516020909101519092909150565b60805160a05160c05160e051610100516101205161014051610160516101805161326b620005a26000396000818161026e015281816120280152818161270c0152818161279201526129da015260006120e4015260008181610ef801526120a201526000611dbe01526000611cee01526000818161051d01526107c701526000611d1c01526000611d6a01526000611d42015261326b6000f3fe6080604052600436106100bc5760003560e01c8063b86ae9e111610074578063f07ec3731161004e578063f07ec37314610218578063f47b774014610238578063ffc5d97a1461025c57600080fd5b8063b86ae9e1146101d2578063be92d18e146101f2578063d9e534111461020557600080fd5b80635b34b966116100a55780635b34b9661461016f5780639432cc1d14610192578063a3210e7c146101b257600080fd5b806322378003146100c157806346423aa7146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc366004612c48565b6102b5565b60405190151581526020015b60405180910390f35b34801561010257600080fd5b50610116610111366004612cbd565b6102c8565b604080519815158952961515602089015294151595870195909552911515606086015273ffffffffffffffffffffffffffffffffffffffff16608085015260a084015260c083019190915260e0820152610100016100ed565b34801561017b57600080fd5b5061018461035b565b6040519081526020016100ed565b34801561019e57600080fd5b506100e16101ad366004612cd6565b61036a565b3480156101be57600080fd5b506100e16101cd366004612d53565b610376565b3480156101de57600080fd5b506101846101ed366004612d83565b610387565b6100e1610200366004612da0565b610556565b6100e1610213366004612de5565b610562565b34801561022457600080fd5b50610184610233366004612e45565b610577565b34801561024457600080fd5b5061024d6105a2565b6040516100ed93929190612e60565b34801561026857600080fd5b506102907f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b60006102c183836105ba565b9392505050565b600080600080600080600080610340896000908152600260208190526040909120805460018201549282015460039092015460ff8083169561010084048216956201000085048316956301000000860490931694640100000000900473ffffffffffffffffffffffffffffffffffffffff1693909291565b97509750975097509750975097509750919395975091939597565b600061036561090a565b905090565b60006102c18383610967565b600061038182610b27565b92915050565b60408051610220810190915260009061038190806103a86020860186612e45565b73ffffffffffffffffffffffffffffffffffffffff1681526020018460200160208101906103d69190612e45565b73ffffffffffffffffffffffffffffffffffffffff16815260408086013560208301520161040a6080860160608701612e45565b73ffffffffffffffffffffffffffffffffffffffff16815260200161043560a0860160808701612e45565b73ffffffffffffffffffffffffffffffffffffffff16815260200161046060c0860160a08701612e45565b73ffffffffffffffffffffffffffffffffffffffff1681526020018460c0013581526020018460e00135815260200184610100013581526020018461012001358152602001846101400135815260200184610160013581526020018461018001358152602001846101a001358152602001846101c001358152602001846101e0013581526020018461020001358152508361022001357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517f0000000000000000000000000000000000000000000000000000000000000000825261022090930180519281526102608220939091525290565b60006102c18383610c2c565b600061056f848484610daf565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812054610381565b60606000806105af610ed7565b925092509250909192565b60006105c4610f52565b6000808084815b818110156108fc57368888838181106105e6576105e6612ef9565b90506020028101906105f89190612f28565b9050806106086020820182612e45565b94506108006040518061022001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018360200160208101906106489190612e45565b73ffffffffffffffffffffffffffffffffffffffff16815260408085013560208301520161067c6080850160608601612e45565b73ffffffffffffffffffffffffffffffffffffffff1681526020016106a760a0850160808601612e45565b73ffffffffffffffffffffffffffffffffffffffff1681526020016106d260c0850160a08601612e45565b73ffffffffffffffffffffffffffffffffffffffff1681526020018360c0013581526020018360e00135815260200183610100013581526020018361012001358152602001836101400135815260200183610160013581526020018361018001358152602001836101a001358152602001836101c001358152602001836101e0013581526020018361020001358152506107a08360000160208101906107789190612e45565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820180517f0000000000000000000000000000000000000000000000000000000000000000825261022090930180519281526102608220939091525290565b60008181526002602052604090209750955061081f8688600180610f90565b50865460ff166108f257610876858761083c610220860186612f66565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110d292505050565b86547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117875560405173ffffffffffffffffffffffffffffffffffffffff8616907f09e126c208c7c6b8de91fb519ff46ef1f6eb471f6376862ca4de42ea000026d6906108e99089815260200190565b60405180910390a25b50506001016105cb565b506001979650505050505050565b6000610914610f52565b503360008181526001602081815260409283902080549092019182905591518181529092917f721c20121297512b72821b97f5326877ea8ecf4bb9948fea5bfcb6453074d37f910160405180910390a290565b6000610971610f52565b60008083815b81811015610b1a573687878381811061099257610992612ef9565b610240029190910191506109ab90506020820182612e45565b93503373ffffffffffffffffffffffffffffffffffffffff8516146109fc576040517f80ec737400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610a3c6040518061022001604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018460200160208101906103d69190612e45565b6000818152600260205260409020600181015490975090915015610a94576040517f9633f278000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b85547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010017865560405173ffffffffffffffffffffffffffffffffffffffff8616907fa6eb7cdc219e1518ced964e9a34e61d68a94e4f1569db3e84256ba981ba5275390610b089084815260200190565b60405180910390a25050600101610977565b5060019695505050505050565b600080600080610b3885600161114f565b92509250925080610b4e57506000949350505050565b610b7f6002610b636040880160208901612e45565b30610b7160208a018a612e45565b60408a01356001600061129b565b6000610b916080870160608801612e45565b73ffffffffffffffffffffffffffffffffffffffff1603610bbb57610bb6858361138a565b610bc5565b610bc58583611427565b610bd26020860186612e45565b73ffffffffffffffffffffffffffffffffffffffff167fe68e1577ba456c32a752dbe4fa63fbaa46841e7e54bc9667d021b9af64a1cada84604051610c1991815260200190565b60405180910390a2506001949350505050565b600080600080610c3d8660016114df565b92509250925081610c545760009350505050610381565b856000610c648260018084611656565b90506000610c786080840160608501612e45565b73ffffffffffffffffffffffffffffffffffffffff1603610cd757610cc86002610ca86040850160208601612e45565b610cb56020860186612e45565b308660400135600188610200013561129b565b610cd28282611845565b610d3a565b604080516020808252818301909252600091602082018180368337019050509050610d2c610d0b6040850160208601612e45565b610d186020860186612e45565b3086604001356001886102000135876118fe565b610d3883838a84611964565b505b610d476020830183612e45565b6040805187815233602082015290810185905273ffffffffffffffffffffffffffffffffffffffff91909116907fe8b2cfa73a11bd60479d92890aeb77bc5f502014ec530c3f0c1774d51680f0a69060600160405180910390a2506001979650505050505050565b6000806000806000610dc388876001611a85565b929650909450909250905080610de05760009450505050506102c1565b506000610df08887600085611656565b90506000610e0460808a0160608b01612e45565b73ffffffffffffffffffffffffffffffffffffffff1603610e2e57610e298882611845565b610e5d565b604080516020808252818301909252600091602082018180368337019050509050610e5b89838a84611964565b505b8115610e8857610e886002610e7860408b0160208c01612e45565b308660408d01356001600061129b565b60408051858152602081018890528315158183015290517f6cb64aa506cc92732fc83160c8ea61203b5a13a8cf92e5b5c7ccc4ba6bb41d389181900360600190a1506001979650505050505050565b6060600080610ee4611cea565b6040805160038082528183019092529193507f0000000000000000000000000000000000000000000000000000000000000000925060208201818036833750507f312e3100000000000000000000000000000000000000000000000000000000006020830152509391925090565b600160005414610f8e576040517f7fa8a98700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b8254600090610100900460ff1615610fe5578115610fdd576040517f1a51557400000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b50600061056f565b835462010000900460ff1615611030578115610fdd576040517f836f8ef900000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b82156110805760038401541561107b578115610fdd576040517f9633f27800000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b6110c7565b83600301546000036110c7578115610fdd576040517fe567c93e00000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b506001949350505050565b3373ffffffffffffffffffffffffffffffffffffffff8416036110f457505050565b600061113c611101611cea565b7f1901000000000000000000000000000000000000000000000000000000000000600090815260029190915260228581526042822091905290565b9050611149848284611de0565b50505050565b6000808061117561116536879003870187613023565b6107a06107786020890189612e45565b600081815260026020526040902080549194509060ff166111d55784156111cb576040517fa4c58ff600000000000000000000000000000000000000000000000000000000815260048101859052602401610a8b565b5060009050611294565b806003015492506111e98482600088610f90565b6111f7575060009050611294565b4261120761010088013585613146565b82600101546112169190613183565b11156112575784156111cb576040517f031ea4cb00000000000000000000000000000000000000000000000000000000815260048101859052602401610a8b565b6112648160020154611ff9565b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff1663010100001790555060015b9250925092565b801561131057600060405190507f4ce34aa200000000000000000000000000000000000000000000000000000000815260206004820152600160248201528760448201528660648201528560848201528460a48201528360c48201528260e482015261130a828261010461209c565b50611381565b60028760038111156113245761132461319b565b036113745781600114611363576040517fefcc00b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136f86868686612238565b611381565b6113818686868686612347565b50505050505050565b6113be61139a6020840184612e45565b826113af6101208601356101808701356131ca565b6113b99190613146565b612479565b6000816113d56101208501356101408601356131ca565b6113df9190613146565b90506127106113f361016085013583613146565b6113fd91906131ca565b6114079082613205565b905061142261141c60c0850160a08601612e45565b82612479565b505050565b61146b61143a6080840160608501612e45565b6114476020850185612e45565b8361145c6101208701356101808801356131ca565b6114669190613146565b6124ee565b6000816114826101208501356101408601356131ca565b61148c9190613146565b90506127106114a061016085013583613146565b6114aa91906131ca565b6114b49082613205565b90506114226114c96080850160608601612e45565b6114d960c0860160a08701612e45565b836124ee565b60008080846114f760c082013560e083013587612656565b61150b575060009250829150819050611294565b60028161012001351015611561578415611551576040517f0a199cb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060009250829150819050611294565b61158361157336839003830183613023565b6107a06107786020850185612e45565b60008181526002602052604090209094506115a18582600189610f90565b6115b45750600092508291506112949050565b805460ff166115dc576115dc6115cd6020840184612e45565b8661083c6102208b018b612f66565b611600336115f06040850160208601612e45565b84604001358561010001356126b5565b815460017fffffffffffffffff000000000000000000000000000000000000000000ff00009091163364010000000002178117835542818401556002830182905560039092018290559497909650939450505050565b6116816040518060800160405280600081526020016000815260200160008152602001600081525090565b60008061169386610120890135613205565b6101c088013560408501529050831561177f576116ba6101208801356101808901356131ca565b6116c49082613146565b6116d390610180890135613205565b91506116e96101208801356101408901356131ca565b6116f39082613146565b61170290610140890135613205565b835260408301518290826127106101608b01356117296101208d01356101408e01356131ca565b6117339190613146565b61173d91906131ca565b6117479190613146565b611756906101408b0135613205565b6117609190613205565b61176a9190613205565b6020840152610180870135606084015261183b565b6117936101208801356101808901356131ca565b61179d9087613146565b91506117b36101208801356101408901356131ca565b6117bd9087613146565b80845260408401518391612710906117db906101608c013590613146565b6117e591906131ca565b6117ef9190613205565b6117f99190613205565b6020840152841561183b57866101a001358360000181815161181b9190613183565b9052506040830180516101a08901359190611837908390613183565b9052505b5050949350505050565b80513490811015611882576040517f1a783b8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61189c6118926020850185612e45565b8360200151612479565b6118b96118af60c0850160a08601612e45565b8360400151612479565b6060820151156118e0576118e06118d660a0850160808601612e45565b8360600151612479565b81516118ec9082613205565b90508015611422576114223382612479565b6119088183612862565b816119535782600114611947576040517fefcc00b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136f87878787612238565b611381828260028a8a8a8a8a612881565b3360006119776080870160608801612e45565b905061199a818361198e60c08a0160a08b01612e45565b8860400151888861291a565b6060850151156119c5576119c581836119b960a08a0160808b01612e45565b8860600151888861291a565b606085015160408601518651600092916119de91613205565b6119e89190613205565b905085602001518110611a4157611a138284611a0760208b018b612e45565b8960200151898961291a565b6020860151611a229082613205565b90508015611a3857611a3882843084898961291a565b61136f84612955565b611a5b8284611a5360208b018b612e45565b84898961291a565b611a6484612955565b61138182611a7560208a018a612e45565b8389602001516114669190613205565b6000808080611aac611a9c36899003890189613023565b6107a061077860208b018b612e45565b600081815260026020526040902080549195509060ff16611b12578515611b02576040517fa4c58ff600000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b5060009250829150819050611ce1565b611b1f8582600089610f90565b611b33575060009250829150819050611ce1565b876101200135878260030154611b499190613183565b1180611b555750600187105b15611b95578515611b02576040517fc8910ec000000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b428861010001358260030154611bab9190613146565b8260010154611bba9190613183565b1015611bfb578515611b02576040517f2e775cae00000000000000000000000000000000000000000000000000000000815260048101869052602401610a8b565b86816003016000828254611c0f9190613183565b909155505060038101546101208901359003611c675780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000178155600281015460019250611c6290611ff9565b611cbb565b805460028201546003830154611cbb92640100000000900473ffffffffffffffffffffffffffffffffffffffff169190611ca7906101008d013590613146565b8460010154611cb69190613183565b61297e565b54640100000000900473ffffffffffffffffffffffffffffffffffffffff169250600191505b93509350935093565b60007f00000000000000000000000000000000000000000000000000000000000000004614611dbb57610365604080517f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f00000000000000