Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- RaribleExchangeWrapper
- Optimization enabled
- true
- Compiler version
- v0.7.6+commit.7338295f
- Optimization runs
- 200
- EVM Version
- istanbul
- Verified at
- 2024-02-09T13:56:08.594991Z
Constructor Arguments
0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005faf16a85028be138a7178b222dec98092feef9700000000000000000000000000000000006c3852cbef3e08e8df289169ede58100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000248b46beb66b3078d771a9e7e5a0a0216d0d07ba
@rarible/exchange-wrapper/contracts/RaribleExchangeWrapper.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "@rarible/transfer-manager/contracts/lib/LibTransfer.sol";import "@rarible/lib-bp/contracts/BpLibrary.sol";import "@rarible/lib-part/contracts/LibPart.sol";import "@openzeppelin/contracts/math/SafeMath.sol";import "@openzeppelin/contracts/token/ERC721/ERC721Holder.sol";import "@openzeppelin/contracts/token/ERC1155/ERC1155Holder.sol";import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";import "./interfaces/IWyvernExchange.sol";import "./interfaces/IExchangeV2.sol";import "./interfaces/ISeaPort.sol";import "./interfaces/Ix2y2.sol";import "./interfaces/ILooksRare.sol";import "./interfaces/IBlur.sol";import "./libraries/IsPausable.sol";contract RaribleExchangeWrapper is Ownable, ERC721Holder, ERC1155Holder, IsPausable {using LibTransfer for address;using BpLibrary for uint;using SafeMath for uint;//marketplacesaddress public immutable wyvernExchange;address public immutable exchangeV2;address public immutable seaPort_1_1;address public immutable x2y2;address public immutable looksRare;address public immutable sudoswap;address public immutable seaPort_1_4;address public immutable looksRareV2;address public immutable blur;address public immutable seaPort_1_5;
@rarible/exchange-v2/contracts/libraries/LibOrderDataV2.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "@rarible/lib-part/contracts/LibPart.sol";library LibOrderDataV2 {bytes4 constant public V2 = bytes4(keccak256("V2"));struct DataV2 {LibPart.Part[] payouts;LibPart.Part[] originFees;bool isMakeFill;}}
@rarible/exchange-v2/contracts/libraries/LibOrderDataV3.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "@rarible/lib-part/contracts/LibPart.sol";/// @dev deprecatedlibrary LibOrderDataV3 {bytes4 constant public V3_SELL = bytes4(keccak256("V3_SELL"));bytes4 constant public V3_BUY = bytes4(keccak256("V3_BUY"));struct DataV3_SELL {uint payouts;uint originFeeFirst;uint originFeeSecond;uint maxFeesBasePoint;bytes32 marketplaceMarker;}struct DataV3_BUY {uint payouts;uint originFeeFirst;uint originFeeSecond;bytes32 marketplaceMarker;}}
@rarible/transfer-manager/contracts/lib/LibTransfer.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;library LibTransfer {function transferEth(address to, uint value) internal {(bool success,) = to.call{ value: value }("");require(success, "transfer failed");}}
@rarible/lib-part/contracts/LibPart.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;library LibPart {bytes32 public constant TYPE_HASH = keccak256("Part(address account,uint96 value)");struct Part {address payable account;uint96 value;}function hash(Part memory part) internal pure returns (bytes32) {return keccak256(abi.encode(TYPE_HASH, part.account, part.value));}}
@rarible/exchange-v2/contracts/ExchangeV2.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "./ExchangeV2Core.sol";import "@rarible/transfer-manager/contracts/RaribleTransferManager.sol";contract ExchangeV2 is ExchangeV2Core, RaribleTransferManager {function __ExchangeV2_init(address _transferProxy,address _erc20TransferProxy,uint newProtocolFee,address newDefaultFeeReceiver,IRoyaltiesProvider newRoyaltiesProvider) external initializer {__Context_init_unchained();__Ownable_init_unchained();__TransferExecutor_init_unchained(_transferProxy, _erc20TransferProxy);__RaribleTransferManager_init_unchained(newProtocolFee, newDefaultFeeReceiver, newRoyaltiesProvider);__OrderValidator_init_unchained();}}
@rarible/royalties-registry/contracts/RoyaltiesRegistry.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;pragma abicoder v2;import "@rarible/exchange-interfaces/contracts/IRoyaltiesProvider.sol";import "@rarible/royalties/contracts/LibRoyaltiesV2.sol";import "@rarible/royalties/contracts/LibRoyaltiesV1.sol";import "@rarible/royalties/contracts/LibRoyalties2981.sol";import "@rarible/royalties/contracts/RoyaltiesV1.sol";import "@rarible/royalties/contracts/RoyaltiesV2.sol";import "@rarible/royalties/contracts/IERC2981.sol";import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol";import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";contract RoyaltiesRegistry is IRoyaltiesProvider, OwnableUpgradeable {/// @dev deprecatedevent RoyaltiesSetForToken(address indexed token, uint indexed tokenId, LibPart.Part[] royalties);/// @dev emitted when royalties set for token inevent RoyaltiesSetForContract(address indexed token, LibPart.Part[] royalties);/// @dev struct to store royalties in royaltiesByTokenstruct RoyaltiesSet {bool initialized;LibPart.Part[] royalties;}/// @dev deprecatedmapping(bytes32 => RoyaltiesSet) public royaltiesByTokenAndTokenId;/// @dev stores royalties for token contract, set in setRoyaltiesByToken() methodmapping(address => RoyaltiesSet) public royaltiesByToken;/// @dev stores external provider and royalties type for token contractmapping(address => uint) public royaltiesProviders;/// @dev total amount or supported royalties types// 0 - royalties type is unset// 1 - royaltiesByToken, 2 - v2, 3 - v1,// 4 - external provider, 5 - EIP-2981// 6 - unsupported/nonexistent royalties typeuint constant royaltiesTypesAmount = 6;
@rarible/transfer-proxy/contracts/proxy/ERC20TransferProxy.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.9 <0.8.0;import "@rarible/role-operator/contracts/OperatorRole.sol";import "@rarible/exchange-interfaces/contracts/IERC20TransferProxy.sol";contract ERC20TransferProxy is IERC20TransferProxy, Initializable, OperatorRole {function __ERC20TransferProxy_init() external initializer {__Ownable_init();}function erc20safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) override external onlyOperator {require(token.transferFrom(from, to, value), "failure while transferring");}}
@openzeppelin/contracts/introspection/IERC165.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/*** @dev Interface of the ERC165 standard, as defined in the* https://eips.ethereum.org/EIPS/eip-165[EIP].** Implementers can declare support of contract interfaces, which can then be* queried by others ({ERC165Checker}).** For an implementation, see {ERC165}.*/interface IERC165 {/*** @dev Returns true if this contract implements the interface defined by* `interfaceId`. See the corresponding* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]* to learn more about how these ids are created.** This function call must use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) external view returns (bool);}
@rarible/exchange-interfaces/contracts/ITransferProxy.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.9 <0.8.0;pragma abicoder v2;import "@rarible/lib-asset/contracts/LibAsset.sol";interface ITransferProxy {function transfer(LibAsset.Asset calldata asset, address from, address to) external;}
@openzeppelin/contracts/token/ERC1155/ERC1155Holder.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;import "./ERC1155Receiver.sol";/*** @dev _Available since v3.1._*/contract ERC1155Holder is ERC1155Receiver {function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) {return this.onERC1155Received.selector;}function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {return this.onERC1155BatchReceived.selector;}}
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/** @dev Provides information about the current execution context, including the* sender of the transaction and its data. While these are generally available* via msg.sender and msg.data, they should not be accessed in such a direct* manner, since when dealing with GSN meta-transactions the account sending and* paying for execution may not be the actual sender (as far as an application* is concerned).** This contract is only required for intermediate, library-like contracts.*/abstract contract Context {function _msgSender() internal view virtual returns (address payable) {return msg.sender;}function _msgData() internal view virtual returns (bytes memory) {this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691return msg.data;}}
@rarible/exchange-interfaces/contracts/IRoyaltiesProvider.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;pragma abicoder v2;import "@rarible/lib-part/contracts/LibPart.sol";interface IRoyaltiesProvider {function getRoyalties(address token, uint tokenId) external returns (LibPart.Part[] memory);}
@rarible/exchange-wrapper/contracts/libraries/LibSeaPort.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;library LibSeaPort {/*** @dev For basic orders involving ETH / native / ERC20 <=> ERC721 / ERC1155* matching, a group of six functions may be called that only requires a* subset of the usual order arguments. Note the use of a "basicOrderType"* enum; this represents both the usual order type as well as the "route"* of the basic order (a simple derivation function for the basic order* type is `basicOrderType = orderType + (4 * basicOrderRoute)`.)*/struct BasicOrderParameters {address considerationToken; // 0x24uint256 considerationIdentifier; // 0x44uint256 considerationAmount; // 0x64address payable offerer; // 0x84address zone; // 0xa4address offerToken; // 0xc4uint256 offerIdentifier; // 0xe4uint256 offerAmount; // 0x104BasicOrderType basicOrderType; // 0x124uint256 startTime; // 0x144uint256 endTime; // 0x164bytes32 zoneHash; // 0x184uint256 salt; // 0x1a4bytes32 offererConduitKey; // 0x1c4bytes32 fulfillerConduitKey; // 0x1e4uint256 totalOriginalAdditionalRecipients; // 0x204AdditionalRecipient[] additionalRecipients; // 0x224bytes signature; // 0x244}/*** @dev Basic orders can supply any number of additional recipients, with the* implied assumption that they are supplied from the offered ETH (or other* native token) or ERC20 token for the order.*/struct AdditionalRecipient {uint256 amount;
@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/*** @dev Interface of the ERC165 standard, as defined in the* https://eips.ethereum.org/EIPS/eip-165[EIP].** Implementers can declare support of contract interfaces, which can then be* queried by others ({ERC165Checker}).** For an implementation, see {ERC165}.*/interface IERC165Upgradeable {/*** @dev Returns true if this contract implements the interface defined by* `interfaceId`. See the corresponding* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]* to learn more about how these ids are created.** This function call must use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) external view returns (bool);}
@rarible/exchange-interfaces/contracts/INftTransferProxy.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.9 <0.8.0;pragma abicoder v2;import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol";import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol";interface INftTransferProxy {function erc721safeTransferFrom(IERC721Upgradeable token, address from, address to, uint256 tokenId) external;function erc1155safeTransferFrom(IERC1155Upgradeable token, address from, address to, uint256 id, uint256 value, bytes calldata data) external;}
@rarible/role-operator/contracts/OperatorRole.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.9 <0.8.0;import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";contract OperatorRole is OwnableUpgradeable {mapping (address => bool) operators;function __OperatorRole_init() external initializer {__Context_init_unchained();__Ownable_init_unchained();}function addOperator(address operator) external onlyOwner {operators[operator] = true;}function removeOperator(address operator) external onlyOwner {operators[operator] = false;}modifier onlyOperator() {require(operators[_msgSender()], "OperatorRole: caller is not the operator");_;}}
@rarible/exchange-v2/contracts/libraries/LibOrder.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;import "@rarible/lib-asset/contracts/LibAsset.sol";import "./LibMath.sol";import "./LibOrderDataV3.sol";import "./LibOrderDataV2.sol";import "./LibOrderDataV1.sol";library LibOrder {using SafeMathUpgradeable for uint;bytes32 constant ORDER_TYPEHASH = keccak256("Order(address maker,Asset makeAsset,address taker,Asset takeAsset,uint256 salt,uint256 start,uint256 end,bytes4 dataType,bytes data)Asset(AssetType assetType,uint256 value)AssetType(bytes4 assetClass,bytes data)");bytes4 constant DEFAULT_ORDER_TYPE = 0xffffffff;struct Order {address maker;LibAsset.Asset makeAsset;address taker;LibAsset.Asset takeAsset;uint salt;uint start;uint end;bytes4 dataType;bytes data;}/*** @dev Calculate remaining make and take values of the order (after partial filling real make and take decrease)* @param order initial order to calculate remaining values for* @param fill current fill of the left order (0 if order is unfilled)* @param isMakeFill true if order fill is calculated from the make side, false if from the take side* @return makeValue remaining make value of the order. if fill = 0 then it's order's make value* @return takeValue remaining take value of the order. if fill = 0 then it's order's take value*/function calculateRemaining(Order memory order, uint fill, bool isMakeFill) internal pure returns (uint makeValue, uint takeValue) {
@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;/*** @dev Collection of functions related to the address type*/library AddressUpgradeable {/*** @dev Returns true if `account` is a contract.** [IMPORTANT]* ====* It is unsafe to assume that an address for which this function returns* false is an externally-owned account (EOA) and not a contract.** Among others, `isContract` will return false for the following* types of addresses:** - an externally-owned account* - a contract in construction* - an address where a contract will be created* - an address where a contract lived, but was destroyed* ====*/function isContract(address account) internal view returns (bool) {// This method relies on extcodesize, which returns 0 for contracts in// construction, since the code is only stored at the end of the// constructor execution.uint256 size;// solhint-disable-next-line no-inline-assemblyassembly { size := extcodesize(account) }return size > 0;}/*** @dev Replacement for Solidity's `transfer`: sends `amount` wei to* `recipient`, forwarding all available gas and reverting on errors.** https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
@rarible/royalties/contracts/RoyaltiesV1.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;interface RoyaltiesV1 {event SecondarySaleFees(uint256 tokenId, address[] recipients, uint[] bps);function getFeeRecipients(uint256 id) external view returns (address payable[] memory);function getFeeBps(uint256 id) external view returns (uint[] memory);}
@openzeppelin/contracts-upgradeable/proxy/Initializable.sol
// SPDX-License-Identifier: MIT// solhint-disable-next-line compiler-versionpragma solidity >=0.4.24 <0.8.0;import "../utils/AddressUpgradeable.sol";/*** @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.** TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as* possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.** CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.*/abstract contract Initializable {/*** @dev Indicates that the contract has been initialized.*/bool private _initialized;/*** @dev Indicates that the contract is in the process of being initialized.*/bool private _initializing;/*** @dev Modifier to protect an initializer function from being invoked twice.*/modifier initializer() {require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized");bool isTopLevelCall = !_initializing;if (isTopLevelCall) {_initializing = true;_initialized = true;
@rarible/lib-signature/contracts/LibSignature.sol
// SPDX-License-Identifier: MITpragma solidity ^0.7.0;library LibSignature {/*** @dev Returns the address that signed a hashed message (`hash`) with* `signature`. This address can then be used for verification purposes.** The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:* this function rejects them by requiring the `s` value to be in the lower* half order, and the `v` value to be either 27 or 28.** IMPORTANT: `hash` _must_ be the result of a hash operation for the* verification to be secure: it is possible to craft signatures that* recover to arbitrary addresses for non-hashed data. A safe way to ensure* this is by receiving a hash of the original message (which may otherwise* be too long), and then calling {toEthSignedMessageHash} on it.*/function recover(bytes32 hash, bytes memory signature)internalpurereturns (address){// Check the signature lengthif (signature.length != 65) {revert("ECDSA: invalid signature length");}// Divide the signature in r, s and v variablesbytes32 r;bytes32 s;uint8 v;// ecrecover takes the signature parameters, and the only way to get them// currently is to use assembly.// solhint-disable-next-line no-inline-assemblyassembly {r := mload(add(signature, 0x20))s := mload(add(signature, 0x40))v := byte(0, mload(add(signature, 0x60)))
@rarible/exchange-wrapper/contracts/libraries/LibLooksRare.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;library LibLooksRare {struct MakerOrder {bool isOrderAsk; // true --> ask / false --> bidaddress signer; // signer of the maker orderaddress collection; // collection addressuint256 price; // price (used as )uint256 tokenId; // id of the tokenuint256 amount; // amount of tokens to sell/purchase (must be 1 for ERC721, 1+ for ERC1155)address strategy; // strategy for trade execution (e.g., DutchAuction, StandardSaleForFixedPrice)address currency; // currency (e.g., WETH)uint256 nonce; // order nonce (must be unique unless new maker order is meant to override existing one e.g., lower ask price)uint256 startTime; // startTime in timestampuint256 endTime; // endTime in timestampuint256 minPercentageToAsk; // slippage protection (9000 --> 90% of the final price must return to ask)bytes params; // additional parametersuint8 v; // v: parameter (27 or 28)bytes32 r; // r: parameterbytes32 s; // s: parameter}struct TakerOrder {bool isOrderAsk; // true --> ask / false --> bidaddress taker; // msg.senderuint256 price; // final price for the purchaseuint256 tokenId;uint256 minPercentageToAsk; // // slippage protection (9000 --> 90% of the final price must return to ask)bytes params; // other params (e.g., tokenId)}/*** @notice CollectionType is used in OrderStructs.Maker's collectionType to determine the collection type being traded.*/enum CollectionType {ERC721,ERC1155}
@rarible/exchange-wrapper/contracts/libraries/IsPausable.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;import "@openzeppelin/contracts/access/Ownable.sol";abstract contract IsPausable is Ownable {bool public paused;event Paused(bool paused);function pause(bool _paused) external onlyOwner {paused = _paused;emit Paused(_paused);}function requireNotPaused() internal view {require (!paused, "the contract is paused");}}
@rarible/exchange-wrapper/contracts/interfaces/Ix2y2.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.9 <0.8.0;pragma abicoder v2;interface Ix2y2 {struct OrderItem {uint256 price;bytes data;}struct Pair721 {address token;uint256 tokenId;}struct Pair1155 {address token;uint256 tokenId;uint256 amount;}struct Order {uint256 salt;address user;uint256 network;uint256 intent;uint256 delegateType;uint256 deadline;address currency;bytes dataMask;OrderItem[] items;// signaturebytes32 r;bytes32 s;uint8 v;uint8 signVersion;}struct Fee {
@rarible/royalties/contracts/LibRoyaltiesV1.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;library LibRoyaltiesV1 {/** bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f* bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb** => 0x0ebd4c7f ^ 0xb9c4d9fb == 0xb7799584*/bytes4 constant _INTERFACE_ID_FEES = 0xb7799584;}
@rarible/transfer-manager/contracts/TransferExecutor.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "@rarible/exchange-interfaces/contracts/ITransferProxy.sol";import "@rarible/exchange-interfaces/contracts/INftTransferProxy.sol";import "@rarible/exchange-interfaces/contracts/IERC20TransferProxy.sol";import "./interfaces/ITransferExecutor.sol";import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";import "./lib/LibTransfer.sol";abstract contract TransferExecutor is Initializable, OwnableUpgradeable, ITransferExecutor {using LibTransfer for address;mapping (bytes4 => address) internal proxies;event ProxyChange(bytes4 indexed assetType, address proxy);function __TransferExecutor_init_unchained(address transferProxy, address erc20TransferProxy) internal {proxies[LibAsset.ERC20_ASSET_CLASS] = address(erc20TransferProxy);proxies[LibAsset.ERC721_ASSET_CLASS] = address(transferProxy);proxies[LibAsset.ERC1155_ASSET_CLASS] = address(transferProxy);}function setTransferProxy(bytes4 assetType, address proxy) external onlyOwner {proxies[assetType] = proxy;emit ProxyChange(assetType, proxy);}function transfer(LibAsset.Asset memory asset,address from,address to,address proxy) internal override {if (asset.assetType.assetClass == LibAsset.ERC721_ASSET_CLASS) {//not using transfer proxy when transfering from this contract
@rarible/transfer-manager/contracts/interfaces/ITransferManager.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "../lib/LibDeal.sol";import "./ITransferExecutor.sol";abstract contract ITransferManager is ITransferExecutor {function doTransfers(LibDeal.DealSide memory left,LibDeal.DealSide memory right,LibFeeSide.FeeSide feeSide) internal virtual returns (uint totalMakeValue, uint totalTakeValue);}
@rarible/exchange-wrapper/contracts/interfaces/IBlur.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;interface IBlur {enum Side { Buy, Sell }enum SignatureVersion { Single, Bulk }enum AssetType { ERC721, ERC1155 }struct Fee {uint16 rate;address payable recipient;}struct Order {address trader;Side side;address matchingPolicy;address collection;uint256 tokenId;uint256 amount;address paymentToken;uint256 price;uint256 listingTime;/* Order expiration timestamp - 0 for oracle cancellations. */uint256 expirationTime;Fee[] fees;uint256 salt;bytes extraParams;}struct Input {Order order;uint8 v;bytes32 r;bytes32 s;bytes extraSignature;SignatureVersion signatureVersion;uint256 blockNumber;
@rarible/exchange-v2/contracts/libraries/LibDirectTransfer.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;import "@rarible/lib-asset/contracts/LibAsset.sol";library LibDirectTransfer { //LibDirectTransfers/*All buy parameters need for create buyOrder and sellOrder*/struct Purchase {address sellOrderMaker; //uint256 sellOrderNftAmount;bytes4 nftAssetClass;bytes nftData;uint256 sellOrderPaymentAmount;address paymentToken;uint256 sellOrderSalt;uint sellOrderStart;uint sellOrderEnd;bytes4 sellOrderDataType;bytes sellOrderData;bytes sellOrderSignature;uint256 buyOrderPaymentAmount;uint256 buyOrderNftAmount;bytes buyOrderData;}/*All accept bid parameters need for create buyOrder and sellOrder*/struct AcceptBid {address bidMaker; //uint256 bidNftAmount;bytes4 nftAssetClass;bytes nftData;uint256 bidPaymentAmount;address paymentToken;uint256 bidSalt;uint bidStart;uint bidEnd;bytes4 bidDataType;bytes bidData;bytes bidSignature;
@rarible/lib-bp/contracts/BpLibrary.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";library BpLibrary {using SafeMathUpgradeable for uint;function bp(uint value, uint bpValue) internal pure returns (uint) {return value.mul(bpValue).div(10000);}}
@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/*** @title ERC721 token receiver interface* @dev Interface for any contract that wants to support safeTransfers* from ERC721 asset contracts.*/interface IERC721Receiver {/*** @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}* by `operator` from `from`, this function is called.** It must return its Solidity selector to confirm the token transfer.* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.** The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.*/function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);}
@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;import "../proxy/Initializable.sol";/*** @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.** The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,* thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding* they need in their contracts using a combination of `abi.encode` and `keccak256`.** This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA* ({_hashTypedDataV4}).** The implementation of the domain separator was designed to be as efficient as possible while still properly updating* the chain id to protect against replay attacks on an eventual fork of the chain.** NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].** _Available since v3.4._*/abstract contract EIP712Upgradeable is Initializable {/* solhint-disable var-name-mixedcase */bytes32 private _HASHED_NAME;bytes32 private _HASHED_VERSION;bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");/* solhint-enable var-name-mixedcase *//*** @dev Initializes the domain separator and parameter caches.** The meaning of `name` and `version` is specified in* https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:** - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.* - `version`: the current major version of the signing domain.** NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
@rarible/lib-asset/contracts/LibAsset.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;library LibAsset {bytes4 constant public ETH_ASSET_CLASS = bytes4(keccak256("ETH"));bytes4 constant public ERC20_ASSET_CLASS = bytes4(keccak256("ERC20"));bytes4 constant public ERC721_ASSET_CLASS = bytes4(keccak256("ERC721"));bytes4 constant public ERC1155_ASSET_CLASS = bytes4(keccak256("ERC1155"));bytes4 constant public COLLECTION = bytes4(keccak256("COLLECTION"));bytes4 constant public CRYPTO_PUNKS = bytes4(keccak256("CRYPTO_PUNKS"));bytes32 constant ASSET_TYPE_TYPEHASH = keccak256("AssetType(bytes4 assetClass,bytes data)");bytes32 constant ASSET_TYPEHASH = keccak256("Asset(AssetType assetType,uint256 value)AssetType(bytes4 assetClass,bytes data)");struct AssetType {bytes4 assetClass;bytes data;}struct Asset {AssetType assetType;uint value;}function hash(AssetType memory assetType) internal pure returns (bytes32) {return keccak256(abi.encode(ASSET_TYPE_TYPEHASH,assetType.assetClass,keccak256(assetType.data)));}function hash(Asset memory asset) internal pure returns (bytes32) {return keccak256(abi.encode(ASSET_TYPEHASH,
@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/*** @dev Wrappers over Solidity's arithmetic operations with added overflow* checks.** Arithmetic operations in Solidity wrap on overflow. This can easily result* in bugs, because programmers usually assume that an overflow raises an* error, which is the standard behavior in high level programming languages.* `SafeMath` restores this intuition by reverting the transaction when an* operation overflows.** Using this library instead of the unchecked operations eliminates an entire* class of bugs, so it's recommended to use it always.*/library SafeMathUpgradeable {/*** @dev Returns the addition of two unsigned integers, with an overflow flag.** _Available since v3.4._*/function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {uint256 c = a + b;if (c < a) return (false, 0);return (true, c);}/*** @dev Returns the substraction of two unsigned integers, with an overflow flag.** _Available since v3.4._*/function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {if (b > a) return (false, 0);return (true, a - b);}/*** @dev Returns the multiplication of two unsigned integers, with an overflow flag.
@rarible/lazy-mint/contracts/erc-721/LibERC721LazyMint.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;import "@rarible/lib-part/contracts/LibPart.sol";library LibERC721LazyMint {bytes4 constant public ERC721_LAZY_ASSET_CLASS = bytes4(keccak256("ERC721_LAZY"));bytes4 constant _INTERFACE_ID_MINT_AND_TRANSFER = 0x8486f69f;struct Mint721Data {uint tokenId;string tokenURI;LibPart.Part[] creators;LibPart.Part[] royalties;bytes[] signatures;}bytes32 public constant MINT_AND_TRANSFER_TYPEHASH = keccak256("Mint721(uint256 tokenId,string tokenURI,Part[] creators,Part[] royalties)Part(address account,uint96 value)");function hash(Mint721Data memory data) internal pure returns (bytes32) {bytes32[] memory royaltiesBytes = new bytes32[](data.royalties.length);for (uint i = 0; i < data.royalties.length; ++i) {royaltiesBytes[i] = LibPart.hash(data.royalties[i]);}bytes32[] memory creatorsBytes = new bytes32[](data.creators.length);for (uint i = 0; i < data.creators.length; ++i) {creatorsBytes[i] = LibPart.hash(data.creators[i]);}return keccak256(abi.encode(MINT_AND_TRANSFER_TYPEHASH,data.tokenId,keccak256(bytes(data.tokenURI)),keccak256(abi.encodePacked(creatorsBytes)),keccak256(abi.encodePacked(royaltiesBytes))));}}
@rarible/royalties/contracts/LibRoyalties2981.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;import "@rarible/lib-part/contracts/LibPart.sol";library LibRoyalties2981 {/** https://eips.ethereum.org/EIPS/eip-2981: bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;*/bytes4 constant _INTERFACE_ID_ROYALTIES = 0x2a55205a;uint96 constant _WEIGHT_VALUE = 1000000;/*Method for converting amount to percent and forming LibPart*/function calculateRoyalties(address to, uint256 amount) internal view returns (LibPart.Part[] memory) {LibPart.Part[] memory result;if (amount == 0) {return result;}uint256 percent = amount * 10000 / _WEIGHT_VALUE;require(percent < 10000, "Royalties 2981 exceeds 100%");result = new LibPart.Part[](1);result[0].account = payable(to);result[0].value = uint96(percent);return result;}}
@rarible/exchange-wrapper/contracts/interfaces/IExchangeV2.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.9 <0.8.0;pragma abicoder v2;import "@rarible/exchange-v2/contracts/ExchangeV2.sol";import {RoyaltiesRegistry} from "@rarible/royalties-registry/contracts/RoyaltiesRegistry.sol";import {TransferProxy} from "@rarible/transfer-proxy/contracts/proxy/TransferProxy.sol";import {ERC20TransferProxy} from "@rarible/transfer-proxy/contracts/proxy/ERC20TransferProxy.sol";interface IExchangeV2 {function matchOrders(LibOrder.Order memory orderLeft,bytes memory signatureLeft,LibOrder.Order memory orderRight,bytes memory signatureRight) external payable;function directPurchase(LibDirectTransfer.Purchase calldata direct) external payable;}
@rarible/lib-signature/contracts/IERC1271.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;interface IERC1271 {/*** @dev Should return whether the signature provided is valid for the provided data* @param _hash Hash of the data signed on the behalf of address(this)* @param _signature Signature byte array associated with _data** MUST return the bytes4 magic value 0x1626ba7e when function passes.* MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)* MUST allow external calls*/function isValidSignature(bytes32 _hash, bytes calldata _signature) virtual external view returns (bytes4 magicValue);}
@rarible/exchange-v2/contracts/libraries/LibFill.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;import "./LibOrder.sol";library LibFill {struct FillResult {uint leftValue;uint rightValue;}struct IsMakeFill {bool leftMake;bool rightMake;}/*** @dev Should return filled values* @param leftOrder left order* @param rightOrder right order* @param leftOrderFill current fill of the left order (0 if order is unfilled)* @param rightOrderFill current fill of the right order (0 if order is unfilled)* @param leftIsMakeFill true if left orders fill is calculated from the make side, false if from the take side* @param rightIsMakeFill true if right orders fill is calculated from the make side, false if from the take side* @return tuple representing fill of both assets*/function fillOrder(LibOrder.Order memory leftOrder, LibOrder.Order memory rightOrder, uint leftOrderFill, uint rightOrderFill, bool leftIsMakeFill, bool rightIsMakeFill) internal pure returns (FillResult memory) {(uint leftMakeValue, uint leftTakeValue) = LibOrder.calculateRemaining(leftOrder, leftOrderFill, leftIsMakeFill);(uint rightMakeValue, uint rightTakeValue) = LibOrder.calculateRemaining(rightOrder, rightOrderFill, rightIsMakeFill);//We have 3 cases here:if (rightTakeValue > leftMakeValue || (rightTakeValue == leftMakeValue && leftMakeValue == 0)) { //1nd: left order should be fully filledreturn fillLeft(leftMakeValue, leftTakeValue, rightOrder.makeAsset.value, rightOrder.takeAsset.value);}//2st: right order should be fully filled or 3d: both should be fully filled if required values are the samereturn fillRight(leftOrder.makeAsset.value, leftOrder.takeAsset.value, rightMakeValue, rightTakeValue);}function fillRight(uint leftMakeValue, uint leftTakeValue, uint rightMakeValue, uint rightTakeValue) internal pure returns (FillResult memory result) {uint makerValue = LibMath.safeGetPartialAmountFloor(rightTakeValue, leftMakeValue, leftTakeValue);require(makerValue <= rightMakeValue, "fillRight: unable to fill");
@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/*** @dev Interface of the ERC20 standard as defined in the EIP.*/interface IERC20Upgradeable {/*** @dev Returns the amount of tokens in existence.*/function totalSupply() external view returns (uint256);/*** @dev Returns the amount of tokens owned by `account`.*/function balanceOf(address account) external view returns (uint256);/*** @dev Moves `amount` tokens from the caller's account to `recipient`.** Returns a boolean value indicating whether the operation succeeded.** Emits a {Transfer} event.*/function transfer(address recipient, uint256 amount) external returns (bool);/*** @dev Returns the remaining number of tokens that `spender` will be* allowed to spend on behalf of `owner` through {transferFrom}. This is* zero by default.** This value changes when {approve} or {transferFrom} are called.*/function allowance(address owner, address spender) external view returns (uint256);/*** @dev Sets `amount` as the allowance of `spender` over the caller's tokens.** Returns a boolean value indicating whether the operation succeeded.*
@rarible/exchange-v2/contracts/libraries/LibOrderData.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "./LibOrder.sol";library LibOrderData {struct GenericOrderData {LibPart.Part[] payouts;LibPart.Part[] originFees;bool isMakeFill;}function parse(LibOrder.Order memory order) pure internal returns (GenericOrderData memory dataOrder) {if (order.dataType == LibOrderDataV1.V1) {LibOrderDataV1.DataV1 memory data = abi.decode(order.data, (LibOrderDataV1.DataV1));dataOrder.payouts = data.payouts;dataOrder.originFees = data.originFees;} else if (order.dataType == LibOrderDataV2.V2) {LibOrderDataV2.DataV2 memory data = abi.decode(order.data, (LibOrderDataV2.DataV2));dataOrder.payouts = data.payouts;dataOrder.originFees = data.originFees;dataOrder.isMakeFill = data.isMakeFill;} else if (order.dataType == 0xffffffff) {} else {revert("Unknown Order data type");}if (dataOrder.payouts.length == 0) {dataOrder.payouts = payoutSet(order.maker);}}function payoutSet(address orderAddress) pure internal returns (LibPart.Part[] memory) {LibPart.Part[] memory payout = new LibPart.Part[](1);payout[0].account = payable(orderAddress);payout[0].value = 10000;return payout;}
@rarible/lazy-mint/contracts/erc-1155/LibERC1155LazyMint.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;import "@rarible/lib-part/contracts/LibPart.sol";library LibERC1155LazyMint {bytes4 constant public ERC1155_LAZY_ASSET_CLASS = bytes4(keccak256("ERC1155_LAZY"));bytes4 constant _INTERFACE_ID_MINT_AND_TRANSFER = 0x6db15a0f;struct Mint1155Data {uint tokenId;string tokenURI;uint supply;LibPart.Part[] creators;LibPart.Part[] royalties;bytes[] signatures;}bytes32 public constant MINT_AND_TRANSFER_TYPEHASH = keccak256("Mint1155(uint256 tokenId,uint256 supply,string tokenURI,Part[] creators,Part[] royalties)Part(address account,uint96 value)");function hash(Mint1155Data memory data) internal pure returns (bytes32) {bytes32[] memory royaltiesBytes = new bytes32[](data.royalties.length);for (uint i = 0; i < data.royalties.length; ++i) {royaltiesBytes[i] = LibPart.hash(data.royalties[i]);}bytes32[] memory creatorsBytes = new bytes32[](data.creators.length);for (uint i = 0; i < data.creators.length; ++i) {creatorsBytes[i] = LibPart.hash(data.creators[i]);}return keccak256(abi.encode(MINT_AND_TRANSFER_TYPEHASH,data.tokenId,data.supply,keccak256(bytes(data.tokenURI)),keccak256(abi.encodePacked(creatorsBytes)),keccak256(abi.encodePacked(royaltiesBytes))));}}
@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;import "../../introspection/IERC165.sol";/*** _Available since v3.1._*/interface IERC1155Receiver is IERC165 {/**@dev Handles the receipt of a single ERC1155 token type. This function iscalled at the end of a `safeTransferFrom` after the balance has been updated.To accept the transfer, this must return`bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`(i.e. 0xf23a6e61, or its own function selector).@param operator The address which initiated the transfer (i.e. msg.sender)@param from The address which previously owned the token@param id The ID of the token being transferred@param value The amount of tokens being transferred@param data Additional data with no specified format@return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed*/function onERC1155Received(address operator,address from,uint256 id,uint256 value,bytes calldata data)externalreturns(bytes4);/**@dev Handles the receipt of a multiple ERC1155 token types. This functionis called at the end of a `safeBatchTransferFrom` after the balances havebeen updated. To accept the transfer(s), this must return`bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`(i.e. 0xbc197c81, or its own function selector).@param operator The address which initiated the batch transfer (i.e. msg.sender)
@rarible/exchange-v2/contracts/ExchangeV2Core.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "./libraries/LibFill.sol";import "./libraries/LibOrderData.sol";import "./libraries/LibDirectTransfer.sol";import "./OrderValidator.sol";import "./AssetMatcher.sol";import "@rarible/transfer-manager/contracts/TransferExecutor.sol";import "@rarible/transfer-manager/contracts/interfaces/ITransferManager.sol";import "@rarible/transfer-manager/contracts/lib/LibDeal.sol";abstract contract ExchangeV2Core is Initializable, OwnableUpgradeable, AssetMatcher, TransferExecutor, OrderValidator, ITransferManager {using SafeMathUpgradeable for uint;using LibTransfer for address;uint256 private constant UINT256_MAX = type(uint256).max;//state of the ordersmapping(bytes32 => uint) public fills;//eventsevent Cancel(bytes32 hash);event Match(bytes32 leftHash, bytes32 rightHash, uint newLeftFill, uint newRightFill);function cancel(LibOrder.Order memory order) external {require(_msgSender() == order.maker, "not a maker");require(order.salt != 0, "0 salt can't be used");bytes32 orderKeyHash = LibOrder.hashKey(order);fills[orderKeyHash] = UINT256_MAX;emit Cancel(orderKeyHash);}/*** @dev function, generate sellOrder and buyOrder from parameters and call validateAndMatch() for purchase transaction*/
@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;import "../../introspection/IERC165Upgradeable.sol";/*** @dev Required interface of an ERC721 compliant contract.*/interface IERC721Upgradeable is IERC165Upgradeable {/*** @dev Emitted when `tokenId` token is transferred from `from` to `to`.*/event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);/*** @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.*/event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);/*** @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.*/event ApprovalForAll(address indexed owner, address indexed operator, bool approved);/*** @dev Returns the number of tokens in ``owner``'s account.*/function balanceOf(address owner) external view returns (uint256 balance);/*** @dev Returns the owner of the `tokenId` token.** Requirements:** - `tokenId` must exist.*/function ownerOf(uint256 tokenId) external view returns (address owner);/*** @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;import "../utils/ContextUpgradeable.sol";import "../proxy/Initializable.sol";/*** @dev Contract module which provides a basic access control mechanism, where* there is an account (an owner) that can be granted exclusive access to* specific functions.** By default, the owner account will be the one that deploys the contract. This* can later be changed with {transferOwnership}.** This module is used through inheritance. It will make available the modifier* `onlyOwner`, which can be applied to your functions to restrict their use to* the owner.*/abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {address private _owner;event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);/*** @dev Initializes the contract setting the deployer as the initial owner.*/function __Ownable_init() internal initializer {__Context_init_unchained();__Ownable_init_unchained();}function __Ownable_init_unchained() internal initializer {address msgSender = _msgSender();_owner = msgSender;emit OwnershipTransferred(address(0), msgSender);}/*** @dev Returns the address of the current owner.*/function owner() public view virtual returns (address) {
@openzeppelin/contracts/token/ERC721/ERC721Holder.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;import "./IERC721Receiver.sol";/*** @dev Implementation of the {IERC721Receiver} interface.** Accepts all token transfers.* Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.*/contract ERC721Holder is IERC721Receiver {/*** @dev See {IERC721Receiver-onERC721Received}.** Always returns `IERC721Receiver.onERC721Received.selector`.*/function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {return this.onERC721Received.selector;}}
@rarible/transfer-manager/contracts/lib/LibFeeSide.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;import "@rarible/lib-asset/contracts/LibAsset.sol";library LibFeeSide {enum FeeSide {NONE, LEFT, RIGHT}function getFeeSide(bytes4 leftClass, bytes4 rightClass) internal pure returns (FeeSide) {if (leftClass == LibAsset.ETH_ASSET_CLASS) {return FeeSide.LEFT;}if (rightClass == LibAsset.ETH_ASSET_CLASS) {return FeeSide.RIGHT;}if (leftClass == LibAsset.ERC20_ASSET_CLASS) {return FeeSide.LEFT;}if (rightClass == LibAsset.ERC20_ASSET_CLASS) {return FeeSide.RIGHT;}if (leftClass == LibAsset.ERC1155_ASSET_CLASS) {return FeeSide.LEFT;}if (rightClass == LibAsset.ERC1155_ASSET_CLASS) {return FeeSide.RIGHT;}return FeeSide.NONE;}}
@rarible/exchange-v2/contracts/libraries/LibMath.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";library LibMath {using SafeMathUpgradeable for uint;/// @dev Calculates partial value given a numerator and denominator rounded down./// Reverts if rounding error is >= 0.1%/// @param numerator Numerator./// @param denominator Denominator./// @param target Value to calculate partial of./// @return partialAmount value of target rounded down.function safeGetPartialAmountFloor(uint256 numerator,uint256 denominator,uint256 target) internal pure returns (uint256 partialAmount) {if (isRoundingErrorFloor(numerator, denominator, target)) {revert("rounding error");}partialAmount = numerator.mul(target).div(denominator);}/// @dev Checks if rounding error >= 0.1% when rounding down./// @param numerator Numerator./// @param denominator Denominator./// @param target Value to multiply with numerator/denominator./// @return isError Rounding error is present.function isRoundingErrorFloor(uint256 numerator,uint256 denominator,uint256 target) internal pure returns (bool isError) {if (denominator == 0) {revert("division by zero");}// The absolute rounding error is the difference between the rounded
@rarible/exchange-wrapper/contracts/interfaces/ILooksRare.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "../libraries/LibLooksRare.sol";interface ILooksRare {function matchAskWithTakerBidUsingETHAndWETH(LibLooksRare.TakerOrder calldata takerBid, LibLooksRare.MakerOrder calldata makerAsk) external payable;/*** @notice This function allows a user to execute a taker bid (against a maker ask).* @param takerBid Taker bid struct* @param makerAsk Maker ask struct* @param makerSignature Maker signature* @param merkleTree Merkle tree struct (if the signature contains multiple maker orders)* @param affiliate Affiliate address*/function executeTakerBid(LibLooksRare.Taker calldata takerBid, LibLooksRare.Maker calldata makerAsk, bytes calldata makerSignature, LibLooksRare.MerkleTree calldata merkleTree, address affiliate) external payable;}
@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;import "../proxy/Initializable.sol";/** @dev Provides information about the current execution context, including the* sender of the transaction and its data. While these are generally available* via msg.sender and msg.data, they should not be accessed in such a direct* manner, since when dealing with GSN meta-transactions the account sending and* paying for execution may not be the actual sender (as far as an application* is concerned).** This contract is only required for intermediate, library-like contracts.*/abstract contract ContextUpgradeable is Initializable {function __Context_init() internal initializer {__Context_init_unchained();}function __Context_init_unchained() internal initializer {}function _msgSender() internal view virtual returns (address payable) {return msg.sender;}function _msgData() internal view virtual returns (bytes memory) {this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691return msg.data;}uint256[50] private __gap;}
@rarible/exchange-interfaces/contracts/IAssetMatcher.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "@rarible/lib-asset/contracts/LibAsset.sol";interface IAssetMatcher {function matchAssets(LibAsset.AssetType memory leftAssetType,LibAsset.AssetType memory rightAssetType) external view returns (LibAsset.AssetType memory);}
@rarible/royalties/contracts/IERC2981.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;import "@rarible/lib-part/contracts/LibPart.sol";////// @dev Interface for the NFT Royalty Standard/////interface IERC2981 is IERC165 {interface IERC2981 {/// ERC165 bytes to add to interface array - set in parent contract/// implementing this standard////// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a/// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;/// _registerInterface(_INTERFACE_ID_ERC2981);/// @notice Called with the sale price to determine how much royalty// is owed and to whom./// @param _tokenId - the NFT asset queried for royalty information/// @param _salePrice - the sale price of the NFT asset specified by _tokenId/// @return receiver - address of who should be sent the royalty payment/// @return royaltyAmount - the royalty payment amount for _salePricefunction royaltyInfo(uint256 _tokenId,uint256 _salePrice) external view returns (address receiver,uint256 royaltyAmount);}
@rarible/exchange-v2/contracts/libraries/LibOrderDataV1.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "@rarible/lib-part/contracts/LibPart.sol";library LibOrderDataV1 {bytes4 constant public V1 = bytes4(keccak256("V1"));struct DataV1 {LibPart.Part[] payouts;LibPart.Part[] originFees;}}
@openzeppelin/contracts/math/SafeMath.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;/*** @dev Wrappers over Solidity's arithmetic operations with added overflow* checks.** Arithmetic operations in Solidity wrap on overflow. This can easily result* in bugs, because programmers usually assume that an overflow raises an* error, which is the standard behavior in high level programming languages.* `SafeMath` restores this intuition by reverting the transaction when an* operation overflows.** Using this library instead of the unchecked operations eliminates an entire* class of bugs, so it's recommended to use it always.*/library SafeMath {/*** @dev Returns the addition of two unsigned integers, with an overflow flag.** _Available since v3.4._*/function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {uint256 c = a + b;if (c < a) return (false, 0);return (true, c);}/*** @dev Returns the substraction of two unsigned integers, with an overflow flag.** _Available since v3.4._*/function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {if (b > a) return (false, 0);return (true, a - b);}/*** @dev Returns the multiplication of two unsigned integers, with an overflow flag.
@rarible/exchange-v2/contracts/OrderValidator.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;import "./libraries/LibOrder.sol";import "@rarible/lib-signature/contracts/IERC1271.sol";import "@rarible/lib-signature/contracts/LibSignature.sol";import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";import "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol";abstract contract OrderValidator is Initializable, ContextUpgradeable, EIP712Upgradeable {using LibSignature for bytes32;using AddressUpgradeable for address;bytes4 constant internal MAGICVALUE = 0x1626ba7e;function __OrderValidator_init_unchained() internal initializer {__EIP712_init_unchained("Exchange", "2");}function validate(LibOrder.Order memory order, bytes memory signature) internal view {if (order.salt == 0) {if (order.maker != address(0)) {require(_msgSender() == order.maker, "maker is not tx sender");}} else {if (_msgSender() != order.maker) {bytes32 hash = LibOrder.hash(order);// if maker is contract checking ERC1271 signatureif (order.maker.isContract()) {require(IERC1271(order.maker).isValidSignature(_hashTypedDataV4(hash), signature) == MAGICVALUE,"contract order signature verification error");} else {// if maker is not contract then checking ECDSA signatureif (_hashTypedDataV4(hash).recover(signature) != order.maker) {revert("order signature verification error");
@rarible/exchange-wrapper/contracts/interfaces/IWyvernExchange.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.9 <0.8.0;pragma abicoder v2;interface IWyvernExchange {function atomicMatch_(address[14] memory addrs,uint[18] memory uints,uint8[8] memory feeMethodsSidesKindsHowToCalls,bytes memory calldataBuy,bytes memory calldataSell,bytes memory replacementPatternBuy,bytes memory replacementPatternSell,bytes memory staticExtradataBuy,bytes memory staticExtradataSell,uint8[2] memory vs,bytes32[5] memory rssMetadata)externalpayable;enum Side {Buy,Sell}enum SaleKind {FixedPrice,DutchAuction}function calculateFinalPrice(Side side,SaleKind saleKind,uint256 basePrice,uint256 extra,uint256 listingTime,uint256 expirationTime) external view returns (uint256);}
@rarible/transfer-manager/contracts/interfaces/ITransferExecutor.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "@rarible/lib-asset/contracts/LibAsset.sol";abstract contract ITransferExecutor {function transfer(LibAsset.Asset memory asset,address from,address to,address proxy) internal virtual;}
@openzeppelin/contracts/introspection/ERC165.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;import "./IERC165.sol";/*** @dev Implementation of the {IERC165} interface.** Contracts may inherit from this and call {_registerInterface} to declare* their support of an interface.*/abstract contract ERC165 is IERC165 {/** bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7*/bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;/*** @dev Mapping of interface ids to whether or not it's supported.*/mapping(bytes4 => bool) private _supportedInterfaces;constructor () internal {// Derived contracts need only register support for their own interfaces,// we register support for ERC165 itself here_registerInterface(_INTERFACE_ID_ERC165);}/*** @dev See {IERC165-supportsInterface}.** Time complexity O(1), guaranteed to always use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {return _supportedInterfaces[interfaceId];}/*** @dev Registers the contract as an implementer of the interface defined by* `interfaceId`. Support of the actual ERC165 interface is automatic and
@rarible/exchange-interfaces/contracts/IERC20TransferProxy.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.9 <0.8.0;pragma abicoder v2;import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";interface IERC20TransferProxy {function erc20safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) external;}
@rarible/transfer-manager/contracts/RaribleTransferManager.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";import "@rarible/lazy-mint/contracts/erc-721/LibERC721LazyMint.sol";import "@rarible/lazy-mint/contracts/erc-1155/LibERC1155LazyMint.sol";import "@rarible/exchange-interfaces/contracts/IRoyaltiesProvider.sol";import "@rarible/lib-bp/contracts/BpLibrary.sol";import "./interfaces/ITransferManager.sol";abstract contract RaribleTransferManager is OwnableUpgradeable, ITransferManager {using BpLibrary for uint;using SafeMathUpgradeable for uint;ProtocolFeeData public protocolFee;IRoyaltiesProvider public royaltiesRegistry;//deprecatedaddress private defaultFeeReceiver;// deprecatedmapping(address => address) private feeReceivers;/// @dev event that's emitted when ProtocolFeeData buyerAmount changesevent BuyerFeeAmountChanged(uint oldValue, uint newValue);/// @dev event that's emitted when ProtocolFeeData sellerAmount changesevent SellerFeeAmountChanged(uint oldValue, uint newValue);/// @dev event that's emitted when ProtocolFeeData receiver changesevent FeeReceiverChanged(address oldValue, address newValue);/// @dev struct to store protocol fee - receiver address, buyer fee amount (in bp), seller fee amount (in bp)struct ProtocolFeeData {address receiver;uint48 buyerAmount;
@rarible/royalties/contracts/LibRoyaltiesV2.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;library LibRoyaltiesV2 {/** bytes4(keccak256('getRaribleV2Royalties(uint256)')) == 0xcad96cca*/bytes4 constant _INTERFACE_ID_ROYALTIES = 0xcad96cca;}
@rarible/exchange-v2/contracts/AssetMatcher.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "@rarible/exchange-interfaces/contracts/IAssetMatcher.sol";import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";abstract contract AssetMatcher is Initializable, OwnableUpgradeable {bytes constant EMPTY = "";mapping(bytes4 => address) internal matchers;event MatcherChange(bytes4 indexed assetType, address matcher);function setAssetMatcher(bytes4 assetType, address matcher) external onlyOwner {matchers[assetType] = matcher;emit MatcherChange(assetType, matcher);}function matchAssets(LibAsset.AssetType memory leftAssetType, LibAsset.AssetType memory rightAssetType) internal view returns (LibAsset.AssetType memory) {LibAsset.AssetType memory result = matchAssetOneSide(leftAssetType, rightAssetType);if (result.assetClass == 0) {return matchAssetOneSide(rightAssetType, leftAssetType);} else {return result;}}function matchAssetOneSide(LibAsset.AssetType memory leftAssetType, LibAsset.AssetType memory rightAssetType) private view returns (LibAsset.AssetType memory) {bytes4 classLeft = leftAssetType.assetClass;bytes4 classRight = rightAssetType.assetClass;if (classLeft == LibAsset.ETH_ASSET_CLASS) {if (classRight == LibAsset.ETH_ASSET_CLASS) {return leftAssetType;}return LibAsset.AssetType(0, EMPTY);}if (classLeft == LibAsset.ERC20_ASSET_CLASS) {if (classRight == LibAsset.ERC20_ASSET_CLASS) {
@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;import "../../introspection/IERC165Upgradeable.sol";/*** @dev Required interface of an ERC1155 compliant contract, as defined in the* https://eips.ethereum.org/EIPS/eip-1155[EIP].** _Available since v3.1._*/interface IERC1155Upgradeable is IERC165Upgradeable {/*** @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.*/event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);/*** @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all* transfers.*/event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);/*** @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to* `approved`.*/event ApprovalForAll(address indexed account, address indexed operator, bool approved);/*** @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.** If an {URI} event was emitted for `id`, the standard* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value* returned by {IERC1155MetadataURI-uri}.*/event URI(string value, uint256 indexed id);/*** @dev Returns the amount of tokens of token type `id` owned by `account`.
@openzeppelin/contracts/access/Ownable.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;import "../utils/Context.sol";/*** @dev Contract module which provides a basic access control mechanism, where* there is an account (an owner) that can be granted exclusive access to* specific functions.** By default, the owner account will be the one that deploys the contract. This* can later be changed with {transferOwnership}.** This module is used through inheritance. It will make available the modifier* `onlyOwner`, which can be applied to your functions to restrict their use to* the owner.*/abstract contract Ownable is Context {address private _owner;event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);/*** @dev Initializes the contract setting the deployer as the initial owner.*/constructor () internal {address msgSender = _msgSender();_owner = msgSender;emit OwnershipTransferred(address(0), msgSender);}/*** @dev Returns the address of the current owner.*/function owner() public view virtual returns (address) {return _owner;}/*** @dev Throws if called by any account other than the owner.*/
@openzeppelin/contracts/token/ERC1155/ERC1155Receiver.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.0 <0.8.0;import "./IERC1155Receiver.sol";import "../../introspection/ERC165.sol";/*** @dev _Available since v3.1._*/abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {constructor() internal {_registerInterface(ERC1155Receiver(address(0)).onERC1155Received.selector ^ERC1155Receiver(address(0)).onERC1155BatchReceived.selector);}}
@rarible/transfer-manager/contracts/lib/LibDeal.sol
// SPDX-License-Identifier: MITpragma solidity 0.7.6;pragma abicoder v2;import "@rarible/lib-part/contracts/LibPart.sol";import "@rarible/lib-asset/contracts/LibAsset.sol";import "./LibFeeSide.sol";library LibDeal {struct DealSide {LibAsset.Asset asset;LibPart.Part[] payouts;LibPart.Part[] originFees;address proxy;address from;}}
@rarible/transfer-proxy/contracts/proxy/TransferProxy.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.9 <0.8.0;import "@rarible/role-operator/contracts/OperatorRole.sol";import "@rarible/exchange-interfaces/contracts/INftTransferProxy.sol";contract TransferProxy is INftTransferProxy, Initializable, OperatorRole {function __TransferProxy_init() external initializer {__Ownable_init();}function erc721safeTransferFrom(IERC721Upgradeable token, address from, address to, uint256 tokenId) override external onlyOperator {token.safeTransferFrom(from, to, tokenId);}function erc1155safeTransferFrom(IERC1155Upgradeable token, address from, address to, uint256 id, uint256 value, bytes calldata data) override external onlyOperator {token.safeTransferFrom(from, to, id, value, data);}}
@rarible/exchange-wrapper/contracts/interfaces/ISeaPort.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.9 <0.8.0;pragma abicoder v2;import "../libraries/LibSeaPort.sol";interface ISeaPort {function fulfillAdvancedOrder(LibSeaPort.AdvancedOrder calldata advancedOrder,LibSeaPort.CriteriaResolver[] calldata criteriaResolvers,bytes32 fulfillerConduitKey,address recipient) external payable returns (bool fulfilled);function fulfillAvailableAdvancedOrders(LibSeaPort.AdvancedOrder[] memory advancedOrders,LibSeaPort.CriteriaResolver[] calldata criteriaResolvers,LibSeaPort.FulfillmentComponent[][] calldata offerFulfillments,LibSeaPort.FulfillmentComponent[][] calldata considerationFulfillments,bytes32 fulfillerConduitKey,address recipient,uint256 maximumFulfilled) external payable returns (bool[] memory availableOrders, LibSeaPort.Execution[] memory executions);function fulfillBasicOrder(LibSeaPort.BasicOrderParameters calldata parameters)externalpayablereturns (bool fulfilled);}
@rarible/royalties/contracts/RoyaltiesV2.sol
// SPDX-License-Identifier: MITpragma solidity >=0.6.2 <0.8.0;pragma abicoder v2;import "@rarible/lib-part/contracts/LibPart.sol";interface RoyaltiesV2 {event RoyaltiesSet(uint256 tokenId, LibPart.Part[] royalties);function getRaribleV2Royalties(uint256 id) external view returns (LibPart.Part[] memory);}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"useLiteralContent":true,"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address[10]","name":"marketplaces","internalType":"address[10]"},{"type":"address","name":"_weth","internalType":"address"},{"type":"address[]","name":"transferProxies","internalType":"address[]"}]},{"type":"event","name":"Execution","inputs":[{"type":"bool","name":"result","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"bool","name":"paused","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approveWETH","inputs":[{"type":"address[]","name":"transferProxies","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"blur","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"bulkPurchase","inputs":[{"type":"tuple[]","name":"purchaseDetails","internalType":"struct RaribleExchangeWrapper.PurchaseDetails[]","components":[{"type":"uint8","name":"marketId","internalType":"enum RaribleExchangeWrapper.Markets"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"fees","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"address","name":"feeRecipientFirst","internalType":"address"},{"type":"address","name":"feeRecipientSecond","internalType":"address"},{"type":"bool","name":"allowFail","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"exchangeV2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"looksRare","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"looksRareV2","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"onERC1155BatchReceived","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"},{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"},{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"onERC1155Received","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"onERC721Received","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"bytes","name":"","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[{"type":"bool","name":"_paused","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"seaPort_1_1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"seaPort_1_4","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"seaPort_1_5","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"singlePurchase","inputs":[{"type":"tuple","name":"purchaseDetails","internalType":"struct RaribleExchangeWrapper.PurchaseDetails","components":[{"type":"uint8","name":"marketId","internalType":"enum RaribleExchangeWrapper.Markets"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"fees","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"address","name":"feeRecipientFirst","internalType":"address"},{"type":"address","name":"feeRecipientSecond","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"sudoswap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"weth","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"wyvernExchange","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"x2y2","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x6101e06040523480156200001257600080fd5b5060405162004cd538038062004cd5833981016040819052620000359162000344565b60006200004162000210565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200009d6301ffc9a760e01b62000214565b620000af630271189760e51b62000214565b82516001600160601b0319606091821b811660809081526020860151831b821660a09081526040870151841b831660c090815284880151851b841660e090815292880151851b841661010090815291880151851b841661012090815290880151851b84166101405291870151841b831661016052860151831b821661018052850151821b81166101a0529083901b166101c05260005b815181101562000206576001600160a01b03831615620001fd57826001600160a01b031663095ea7b38383815181106200017b57fe5b60200260200101516000196040518363ffffffff1660e01b8152600401620001a592919062000429565b602060405180830381600087803b158015620001c057600080fd5b505af1158015620001d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fb919062000400565b505b60010162000145565b5050505062000466565b3390565b6001600160e01b0319808216141562000274576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b80516001600160a01b0381168114620002b457600080fd5b919050565b600082601f830112620002ca578081fd5b815160206001600160401b03821115620002e057fe5b808202620002f082820162000442565b8381528281019086840183880185018910156200030b578687fd5b8693505b85841015620003385762000323816200029c565b8352600193909301929184019184016200030f565b50979650505050505050565b600080600061018084860312156200035a578283fd5b84601f85011262000369578283fd5b610140620003778162000442565b908501908086888411156200038a578687fd5b865b600a811015620003b757620003a1826200029c565b845260209384019391909101906001016200038c565b50508095505050620003c9816200029c565b61016086015190935090506001600160401b03811115620003e8578182fd5b620003f686828701620002b9565b9150509250925092565b60006020828403121562000412578081fd5b8151801515811462000422578182fd5b9392505050565b6001600160a01b03929092168252602082015260400190565b6040518181016001600160401b03811182821017156200045e57fe5b604052919050565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160601c6101405160601c6101605160601c6101805160601c6101a05160601c6101c05160601c61475f62000576600039806104f7528061060f528061082c528061099f52806121fd52806122b452806123435250806104af5280611cd852806120c5525080610c355280611af35280611b8d5250806104d352806119e9525080610bed52806119175280611ff5525080610524528061184552508061090b528061161952806116b3525080610d6c52806111c052806112565250806103af5280610f0e5280611e4a52508061092f52806110bd5280611f25525080610c115280610feb525061475f6000f3fe6080604052600436106101435760003560e01c806386dcbd27116100b6578063bd4486ee1161006f578063bd4486ee14610319578063c9f0a2fa1461032e578063df6c255814610343578063f23a6e6114610358578063f2fde38b14610378578063fc40c9c7146103985761014a565b806386dcbd27146102875780638da5cb5b146102a75780639110c777146102bc578063a05f32dc146102d1578063b94ee332146102e6578063bc197c81146102f95761014a565b80633733b82b116101085780633733b82b1461020b5780633fc8cef3146102205780635c975abb146102355780635ea1e4c91461024a578063715018a61461025f57806386496e7a146102745761014a565b80628534f71461014f57806301ffc9a71461017a57806302329a29146101a7578063150b7a02146101c9578063349d6a85146101f65761014a565b3661014a57005b600080fd5b34801561015b57600080fd5b506101646103ad565b6040516101719190613e85565b60405180910390f35b34801561018657600080fd5b5061019a6101953660046136e6565b6103d1565b6040516101719190613f0e565b3480156101b357600080fd5b506101c76101c23660046136ae565b6103f4565b005b3480156101d557600080fd5b506101e96101e4366004613318565b61049d565b6040516101719190613f19565b34801561020257600080fd5b506101646104ad565b34801561021757600080fd5b506101646104d1565b34801561022c57600080fd5b506101646104f5565b34801561024157600080fd5b5061019a610519565b34801561025657600080fd5b50610164610522565b34801561026b57600080fd5b506101c7610546565b6101c761028236600461386a565b6105f2565b34801561029357600080fd5b506101c76102a23660046133e7565b6107bd565b3480156102b357600080fd5b506101646108fa565b3480156102c857600080fd5b50610164610909565b3480156102dd57600080fd5b5061016461092d565b6101c76102f43660046135f3565b610951565b34801561030557600080fd5b506101e961031436600461326f565b610bda565b34801561032557600080fd5b50610164610beb565b34801561033a57600080fd5b50610164610c0f565b34801561034f57600080fd5b50610164610c33565b34801561036457600080fd5b506101e9610373366004613381565b610c57565b34801561038457600080fd5b506101c7610393366004613253565b610c68565b3480156103a457600080fd5b50610164610d6a565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b6103fc610d8e565b6001600160a01b031661040d6108fa565b6001600160a01b031614610456576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b6002805482151560ff19909116811790915560408051918252517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd29181900360200190a150565b630a85bd0160e11b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b61054e610d8e565b6001600160a01b031661055f6108fa565b6001600160a01b0316146105a8576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6105fa610d92565b600061060584610de5565b905080156106b8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd610644610d8e565b30846040518463ffffffff1660e01b815260040161066493929190613e99565b602060405180830381600087803b15801561067e57600080fd5b505af1158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906136ca565b505b60006106c78560400151610eb0565b905060008080808460018111156106da57fe5b141561070b576106eb886000610ecc565b919450925090506106fc8288611de2565b6107068187611de2565b610766565b600184600181111561071957fe5b14156107455761072a886000611e0d565b9194509250905061073b82886121c9565b61070681876121c9565b60405162461bcd60e51b815260040161075d906140a2565b60405180910390fd5b7fcc54b89ca2d75d5612023b14f0a477212b0e08bc0c5b8ad2804e2f8e2e401fc0836040516107959190613f0e565b60405180910390a16107a5612286565b84156107b3576107b361229a565b5050505050505050565b6107c5610d8e565b6001600160a01b03166107d66108fa565b6001600160a01b03161461081f576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b60005b818110156108f5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b384848481811061086557fe5b905060200201602081019061087a9190613253565b6000196040518363ffffffff1660e01b815260040161089a929190613ef5565b602060405180830381600087803b1580156108b457600080fd5b505af11580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec91906136ca565b50600101610822565b505050565b6000546001600160a01b031690565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b610959610d92565b60008060008060008060005b8a518110156109965761098a8b828151811061097d57fe5b6020026020010151610de5565b90910190600101610965565b508015610a48577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd6109d4610d8e565b30846040518463ffffffff1660e01b81526004016109f493929190613e99565b602060405180830381600087803b158015610a0e57600080fd5b505af1158015610a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4691906136ca565b505b60005b8a51811015610b72576000610a768c8381518110610a6557fe5b602002602001015160400151610eb0565b90506000808080846001811115610a8957fe5b1415610ad057610aac8f8681518110610a9e57fe5b60200260200101518d610ecc565b91945092509050610abd8b836123e8565b9a50610ac98a826123e8565b9950610b21565b6001846001811115610ade57fe5b141561074557610b018f8681518110610af357fe5b60200260200101518d611e0d565b91945092509050610b1289836123e8565b9850610b1e88826123e8565b97505b8680610b2a5750825b96507fcc54b89ca2d75d5612023b14f0a477212b0e08bc0c5b8ad2804e2f8e2e401fc083604051610b5b9190613f0e565b60405180910390a150505050806001019050610a4b565b5081610b905760405162461bcd60e51b815260040161075d906142b3565b610b9a868a611de2565b610ba48589611de2565b610bae848a6121c9565b610bb883896121c9565b610bc0612286565b8015610bce57610bce61229a565b50505050505050505050565b63bc197c8160e01b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b63f23a6e6160e01b95945050505050565b610c70610d8e565b6001600160a01b0316610c816108fa565b6001600160a01b031614610cca576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b6001600160a01b038116610d0f5760405162461bcd60e51b81526004018080602001828103825260268152602001806146c36026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b3390565b60025460ff1615610de3576040805162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b604482015290519081900360640190fd5b565b600080600090506000610dfb8460400151610eb0565b90506001816001811115610e0b57fe5b1415610ea95760208401516040850151928101926000918291610e2d91612449565b91509150808285010193506000610e5187606001518860400151896000015161247a565b91505060005b8151811015610ea457600060a0838381518110610e7057fe5b6020026020010151901c90506000610e95828b6020015161253390919063ffffffff16565b97909701965050600101610e57565b505050505b5092915050565b6000603082901c61ffff166001811115610ec657fe5b92915050565b6000806000806000610eeb87606001518860400151896000015161247a565b60208901519193509150600288516009811115610f0457fe5b1415610fd25760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168285604051610f459190613e69565b60006040518083038185875af1925050503d8060008114610f82576040519150601f19603f3d011682016040523d82523d6000602084013e610f87565b606091505b505090508715610faf5780610faa57600080600096509650965050505050611ddb565b610fcc565b80610fcc5760405162461bcd60e51b815260040161075d90614108565b50611da9565b600188516009811115610fe157fe5b14156110a45760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682856040516110229190613e69565b60006040518083038185875af1925050503d806000811461105f576040519150601f19603f3d011682016040523d82523d6000602084013e611064565b606091505b5050905087156110875780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90613f98565b6000885160098111156110b357fe5b14156111765760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682856040516110f49190613e69565b60006040518083038185875af1925050503d8060008114611131576040519150601f19603f3d011682016040523d82523d6000602084013e611136565b606091505b5050905087156111595780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90614006565b60038851600981111561118557fe5b14156115c8576000838060200190518101906111a191906138c0565b9050871561123f5760405163357a150b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063357a150b9084906111f7908590600401614318565b6000604051808303818588803b15801561121057600080fd5b505af193505050508015611222575060015b61123a57600080600096509650965050505050611ddb565b6112c0565b60405163357a150b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063357a150b90849061128d908590600401614318565b6000604051808303818588803b1580156112a657600080fd5b505af11580156112ba573d6000803e3d6000fd5b50505050505b60005b8160200151518110156115c1576000826020015182815181106112e257fe5b602002602001015160200151905060008360200151838151811061130257fe5b602002602001015160400151905060008460000151838151811061132257fe5b60200260200101516101000151828151811061133a57fe5b602002602001015160200151905060008560000151848151811061135a57fe5b602002602001015160e0015151118015611390575060008560200151858151811061138157fe5b602002602001015160c0015151115b156113d6576113d681866020015186815181106113a957fe5b602002602001015160c00151876000015186815181106113c557fe5b602002602001015160e0015161254b565b84518051849081106113e457fe5b602002602001015160800151600114156114b95760008180602001905181019061140e9190613532565b905060005b81518110156114b257600082828151811061142a57fe5b6020026020010151905080600001516001600160a01b03166342842e0e30611450610d8e565b84602001516040518463ffffffff1660e01b815260040161147393929190613e99565b600060405180830381600087803b15801561148d57600080fd5b505af11580156114a1573d6000803e3d6000fd5b505060019093019250611413915050565b50506115b3565b84518051849081106114c757fe5b6020026020010151608001516002141561159b576000818060200190518101906114f19190613455565b905060005b81518110156114b257600082828151811061150d57fe5b6020026020010151905080600001516001600160a01b031663f242432a30611533610d8e565b846020015185604001516040518563ffffffff1660e01b815260040161155c9493929190613ebd565b600060405180830381600087803b15801561157657600080fd5b505af115801561158a573d6000803e3d6000fd5b5050600190930192506114f6915050565b60405162461bcd60e51b815260040161075d906141e2565b5050508060010190506112c3565b5050611da9565b6004885160098111156115d757fe5b141561182c576000806000858060200190518101906115f69190613988565b925092509250891561169c57604051635a72594b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b4e4b296908690611652908790879060040161449f565b6000604051808303818588803b15801561166b57600080fd5b505af19350505050801561167d575060015b611697576000806000985098509850505050505050611ddb565b61171f565b604051635a72594b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b4e4b2969086906116ec908790879060040161449f565b6000604051808303818588803b15801561170557600080fd5b505af1158015611719573d6000803e3d6000fd5b50505050505b6001600160e01b031981166339d690a360e11b14156117ae5781604001516001600160a01b03166342842e0e30611754610d8e565b85608001516040518463ffffffff1660e01b815260040161177793929190613e99565b600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b50505050611824565b6001600160e01b0319811663025ceed960e61b141561180c5781604001516001600160a01b031663f242432a306117e3610d8e565b85608001518660a001516040518563ffffffff1660e01b81526004016117779493929190613ebd565b60405162461bcd60e51b815260040161075d90614250565b505050611da9565b60058851600981111561183b57fe5b14156118fe5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316828560405161187c9190613e69565b60006040518083038185875af1925050503d80600081146118b9576040519150601f19603f3d011682016040523d82523d6000602084013e6118be565b606091505b5050905087156118e15780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d906141ab565b60068851600981111561190d57fe5b14156119d05760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316828560405161194e9190613e69565b60006040518083038185875af1925050503d806000811461198b576040519150601f19603f3d011682016040523d82523d6000602084013e611990565b606091505b5050905087156119b35780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90613fcf565b6007885160098111156119df57fe5b1415611aa25760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168285604051611a209190613e69565b60006040518083038185875af1925050503d8060008114611a5d576040519150601f19603f3d011682016040523d82523d6000602084013e611a62565b606091505b505090508715611a855780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90614219565b600888516009811115611ab157fe5b1415611cbf57600080600085806020019051810190611ad091906137f6565b9250925092508915611b7657604051639a1fc3a760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a1fc3a7908690611b2c90879087906004016142ea565b6000604051808303818588803b158015611b4557600080fd5b505af193505050508015611b57575060015b611b71576000806000985098509850505050505050611ddb565b611bf9565b604051639a1fc3a760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a1fc3a7908690611bc690879087906004016142ea565b6000604051808303818588803b158015611bdf57600080fd5b505af1158015611bf3573d6000803e3d6000fd5b50505050505b6001600160e01b031981166339d690a360e11b1415611c58578251606001516001600160a01b03166342842e0e30611c2f610d8e565b8651608001516040516001600160e01b031960e086901b16815261177793929190600401613e99565b6001600160e01b0319811663025ceed960e61b141561180c578251606001516001600160a01b031663f242432a30611c8e610d8e565b8651608081015160a0909101516040516001600160e01b031960e087901b1681526117779493929190600401613ebd565b600988516009811115611cce57fe5b1415611d915760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168285604051611d0f9190613e69565b60006040518083038185875af1925050503d8060008114611d4c576040519150601f19603f3d011682016040523d82523d6000602084013e611d51565b606091505b505090508715611d745780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d9061413f565b60405162461bcd60e51b815260040161075d90614074565b611db78289602001516125dc565b600080611dcc8a604001518b60200151612449565b60019950909750955050505050505b9250925092565b600082118015611dfa57506001600160a01b03811615155b15611e0957611e098183612665565b5050565b6000806000806000611e2c87606001518860400151896000015161247a565b9092509050600287516009811115611e4057fe5b1415611f0c5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031683604051611e809190613e69565b6000604051808303816000865af19150503d8060008114611ebd576040519150601f19603f3d011682016040523d82523d6000602084013e611ec2565b606091505b505090508615611ee95780611ee4576000806000955095509550505050611ddb565b611f06565b80611f065760405162461bcd60e51b815260040161075d90614176565b50612194565b600087516009811115611f1b57fe5b1415611fdc5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031683604051611f5b9190613e69565b6000604051808303816000865af19150503d8060008114611f98576040519150601f19603f3d011682016040523d82523d6000602084013e611f9d565b606091505b505090508615611fbf5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d9061403d565b600687516009811115611feb57fe5b14156120ac5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168360405161202b9190613e69565b6000604051808303816000865af19150503d8060008114612068576040519150601f19603f3d011682016040523d82523d6000602084013e61206d565b606091505b50509050861561208f5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d90613f2e565b6009875160098111156120bb57fe5b141561217c5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836040516120fb9190613e69565b6000604051808303816000865af19150503d8060008114612138576040519150601f19603f3d011682016040523d82523d6000602084013e61213d565b606091505b50509050861561215f5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d90613f63565b60405162461bcd60e51b815260040161075d906140d9565b6121a28188602001516126fd565b6000806121b789604001518a60200151612449565b60019b919a5098509650505050505050565b6000821180156121e157506001600160a01b03811615155b15611e095760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906122349084908690600401613ef5565b602060405180830381600087803b15801561224e57600080fd5b505af1158015612262573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f591906136ca565b478015612297576122973382612665565b50565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906122e9903090600401613e85565b60206040518083038186803b15801561230157600080fd5b505afa158015612315573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123399190613a75565b90508015612297577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612378610d8e565b836040518363ffffffff1660e01b8152600401612396929190613ef5565b602060405180830381600087803b1580156123b057600080fd5b505af11580156123c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0991906136ca565b600082820183811015612442576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008061ffff601085901c81169085166124638583612533565b61246d8683612533565b9350935050509250929050565b6060806000602085901c61ffff16600181111561249357fe5b9050606060008260018111156124a557fe5b14156124b757869350915061252b9050565b60018260018111156124c557fe5b1415612513576000878060200190518101906124e19190613702565b90506124ec86612786565b1561250757806000015181602001519450945050505061252b565b519350915061252b9050565b60405162461bcd60e51b815260040161075d9061427c565b935093915050565b600061244261271061254585856127d8565b90612831565b815183511461255957600080fd5b805183511461256757600080fd5b60005b83518110156125d65781818151811061257f57fe5b01602001516001600160f81b031916156125ce5782818151811061259f57fe5b602001015160f81c60f81b8482815181106125b657fe5b60200101906001600160f81b031916908160001a9053505b60010161256a565b50505050565b60005b82518110156108f55760008382815181106125f657fe5b6020026020010151111561265d57600083828151811061261257fe5b60200260200101519050600060a085848151811061262c57fe5b6020026020010151901c9050600061264d828661253390919063ffffffff16565b90506126598184611de2565b5050505b6001016125df565b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146126b0576040519150601f19603f3d011682016040523d82523d6000602084013e6126b5565b606091505b50509050806108f5576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60005b82518110156108f557600083828151811061271757fe5b6020026020010151111561277e57600083828151811061273357fe5b60200260200101519050600060a085848151811061274d57fe5b6020026020010151901c9050600061276e828661253390919063ffffffff16565b905061277a81846121c9565b5050505b600101612700565b6000600582600981111561279657fe5b14806127ad575060048260098111156127ab57fe5b145b806127c3575060078260098111156127c157fe5b145b156127d0575060016103ef565b506000919050565b6000826127e757506000610ec6565b828202828482816127f457fe5b04146124425760405162461bcd60e51b81526004018080602001828103825260218152602001806146e96021913960400191505060405180910390fd5b6000808211612887576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161289057fe5b049392505050565b80356103ef81614689565b80516103ef81614689565b600082601f8301126128be578081fd5b815160206128d36128ce8361461f565b6145fc565b828152818101908583016040808602880185018910156128f1578687fd5b865b8681101561295b5781838b031215612909578788fd5b81518281018181106001600160401b038211171561292357fe5b8352835161ffff8116811461293657898afd5b81528387015161294581614689565b81880152855293850193918101916001016128f3565b509198975050505050505050565b600082601f830112612979578081fd5b815160206129896128ce8361461f565b828152818101908583016040808602880185018910156129a7578687fd5b865b8681101561295b5781838b0312156129bf578788fd5b81518281018181106001600160401b03821117156129d957fe5b835283518152868401516129ec81614689565b81880152855293850193918101916001016129a9565b600082601f830112612a12578081fd5b81516020612a226128ce8361461f565b82815281810190858301855b85811015612aab5781518801604080601f19838d03011215612a4e578889fd5b80518181016001600160401b038282108183111715612a6957fe5b818452848a01518352928401519280841115612a83578b8cfd5b5050612a938c8984860101612df9565b81890152865250509284019290840190600101612a2e565b5090979650505050505050565b600082601f830112612ac8578081fd5b81516020612ad86128ce8361461f565b82815281810190858301855b85811015612aab57815188016101a080601f19838d03011215612b05578889fd5b612b0e816145fc565b878301518152612b20604084016128a3565b88820152606083015160408201526080830151606082015260a0830151608082015260c083015160a0820152612b5860e084016128a3565b60c08201526101008301516001600160401b0380821115612b77578b8cfd5b612b858e8b84880101612df9565b60e084015261012091508185015181811115612b9f578c8dfd5b612bad8f8c83890101612a02565b610100850152505061014080850151828401526101609150818501518184015250610180612bdc818601613242565b82840152612beb848601613242565b9083015250865250509284019290840190600101612ae4565b600082601f830112612c14578081fd5b81516020612c246128ce8361461f565b82815281810190858301855b85811015612aab578151880161016080601f19838d03011215612c51578889fd5b612c5a816145fc565b612c65888401612e44565b815260408084015189830152606080850151828401526080915081850151818401525060a0808501518284015260c09150612ca18286016128a3565b9083015260e08401516001600160401b0380821115612cbe578c8dfd5b612ccc8f8c84890101612df9565b8385015261010092508286015160e0850152610120915081860151838501526101409250828601518285015284860151945080851115612d0a578c8dfd5b5050612d1a8d8a85870101612969565b90820152865250509284019290840190600101612c30565b600082601f830112612d42578081fd5b81356020612d526128ce8361461f565b8281528181019085830183850287018401881015612d6e578586fd5b855b85811015612aab57813584529284019290840190600101612d70565b80356103ef8161469e565b80516103ef8161469e565b80516103ef816146ac565b600082601f830112612dbd578081fd5b8135612dcb6128ce8261463c565b818152846020838601011115612ddf578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112612e09578081fd5b8151612e176128ce8261463c565b818152846020838601011115612e2b578283fd5b612e3c82602083016020870161465d565b949350505050565b8051600881106103ef57600080fd5b8051600281106103ef57600080fd5b600060e08284031215612e73578081fd5b612e7d60e06145fc565b905081516001600160401b0380821115612e9657600080fd5b612ea285838601613026565b8352612eb060208501613242565b602084015260408401516040840152606084015160608401526080840151915080821115612edd57600080fd5b50612eea84828501612df9565b608083015250612efc60a08301612e53565b60a082015260c082015160c082015292915050565b6000610200808385031215612f24578182fd5b612f2d816145fc565b915050612f3982612d97565b8152612f47602083016128a3565b6020820152612f58604083016128a3565b6040820152606082015160608201526080820151608082015260a082015160a0820152612f8760c083016128a3565b60c0820152612f9860e083016128a3565b60e08201526101008281015190820152610120808301519082015261014080830151908201526101608083015190820152610180808301516001600160401b03811115612fe457600080fd5b612ff085828601612df9565b8284015250506101a0613004818401613242565b908201526101c082810151908201526101e09182015191810191909152919050565b60006101a0808385031215613039578182fd5b613042816145fc565b91505061304e826128a3565b815261305c60208301612e53565b602082015261306d604083016128a3565b604082015261307e606083016128a3565b60608201526080820151608082015260a082015160a08201526130a360c083016128a3565b60c082015260e0828101519082015261010080830151908201526101208083015190820152610140808301516001600160401b03808211156130e457600080fd5b6130f0868387016128ae565b838501526101609250828501518385015261018092508285015191508082111561311957600080fd5b5061312685828601612df9565b82840152505092915050565b600060808284031215613143578081fd5b604051608081016001600160401b03828210818311171561316057fe5b8160405282935084359150600a821061317857600080fd5b818352602085013560208401526040850135604084015260608501359150808211156131a357600080fd5b506131b085828601612dad565b6060830152505092915050565b600060c082840312156131ce578081fd5b60405160c081018181106001600160401b03821117156131ea57fe5b806040525080915082518152602083015160208201526040830151604082015260608301516060820152608083015161322281614689565b608082015260a08301516132358161469e565b60a0919091015292915050565b805160ff811681146103ef57600080fd5b600060208284031215613264578081fd5b813561244281614689565b600080600080600060a08688031215613286578081fd5b853561329181614689565b945060208601356132a181614689565b935060408601356001600160401b03808211156132bc578283fd5b6132c889838a01612d32565b945060608801359150808211156132dd578283fd5b6132e989838a01612d32565b935060808801359150808211156132fe578283fd5b5061330b88828901612dad565b9150509295509295909350565b6000806000806080858703121561332d578182fd5b843561333881614689565b9350602085013561334881614689565b92506040850135915060608501356001600160401b03811115613369578182fd5b61337587828801612dad565b91505092959194509250565b600080600080600060a08688031215613398578283fd5b85356133a381614689565b945060208601356133b381614689565b9350604086013592506060860135915060808601356001600160401b038111156133db578182fd5b61330b88828901612dad565b600080602083850312156133f9578182fd5b82356001600160401b038082111561340f578384fd5b818501915085601f830112613422578384fd5b813581811115613430578485fd5b8660208083028501011115613443578485fd5b60209290920196919550909350505050565b60006020808385031215613467578182fd5b82516001600160401b038082111561347d578384fd5b818501915085601f830112613490578384fd5b815161349e6128ce8261461f565b818152848101908486016060808502870188018b10156134bc578889fd5b8896505b848710156135235780828c0312156134d6578889fd5b6040805182810181811089821117156134eb57fe5b825283516134f881614689565b8152838a01518a820152818401519181019190915284526001969096019592870192908101906134c0565b50909998505050505050505050565b60006020808385031215613544578182fd5b82516001600160401b038082111561355a578384fd5b818501915085601f83011261356d578384fd5b815161357b6128ce8261461f565b818152848101908486016040808502870188018b1015613599578889fd5b8896505b848710156135235780828c0312156135b3578889fd5b805181810181811088821117156135c657fe5b825282516135d381614689565b81528289015189820152845260019690960195928701929081019061359d565b60008060008060808587031215613608578182fd5b84356001600160401b0381111561361d578283fd5b8501601f8101871361362d578283fd5b8035602061363d6128ce8361461f565b82815281810190848301875b85811015613672576136608d8684358a0101613132565b84529284019290840190600101613649565b50508098505050613684818901612898565b955050505061369560408601612898565b91506136a360608601612d8c565b905092959194509250565b6000602082840312156136bf578081fd5b81356124428161469e565b6000602082840312156136db578081fd5b81516124428161469e565b6000602082840312156136f7578081fd5b8135612442816146ac565b60006020808385031215613714578182fd5b82516001600160401b038082111561372a578384fd5b908401906040828703121561373d578384fd5b60405160408101818110838211171561375257fe5b604052825182811115613763578586fd5b61376f88828601612df9565b8252508383015182811115613782578586fd5b80840193505086601f840112613796578485fd5b825191506137a66128ce8361461f565b82815284810190848601868502860187018a10156137c2578788fd5b8795505b848610156137e45780518352600195909501949186019186016137c6565b50948201949094529695505050505050565b60008060006060848603121561380a578081fd5b83516001600160401b0380821115613820578283fd5b61382c87838801612e62565b94506020860151915080821115613841578283fd5b5061384e86828701612e62565b925050604084015161385f816146ac565b809150509250925092565b60008060006060848603121561387e578081fd5b83356001600160401b03811115613893578182fd5b61389f86828701613132565b93505060208401356138b081614689565b9150604084013561385f81614689565b6000602082840312156138d1578081fd5b81516001600160401b03808211156138e7578283fd5b9083019061016082860312156138fb578283fd5b61390560c06145fc565b825182811115613913578485fd5b61391f87828601612ab8565b825250602083015182811115613933578485fd5b61393f87828601612c04565b60208301525061395286604085016131bd565b60408201526101008301516060820152610120830151608082015261397a6101408401613242565b60a082015295945050505050565b60008060006060848603121561399c578081fd5b83516001600160401b03808211156139b2578283fd5b9085019060c082880312156139c5578283fd5b60405160c0810181811083821117156139da57fe5b6040526139e683612d97565b81526139f4602084016128a3565b602082015260408301516040820152606083015160608201526080830151608082015260a083015182811115613a28578485fd5b613a3489828601612df9565b60a0830152506020870151909550915080821115613a50578283fd5b50613a5d86828701612f11565b925050613a6c60408501612da2565b90509250925092565b600060208284031215613a86578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015613ae1578151805161ffff1688528301516001600160a01b03168388015260409096019590820190600101613aad565b509495945050505050565b6000815180845260208085019450808401835b83811015613ae1578151805188528301516001600160a01b03168388015260409096019590820190600101613aff565b60008282518085526020808601955080818302840101818601855b84811015612aab57858303601f190189528151805184528401516040858501819052613b7881860183613c7e565b9a86019a9450505090830190600101613b4a565b6000815180845260208085018081965082840281019150828601855b85811015613c6b5782840389528151610160613bc5868351613caa565b818701518688015260408083015190870152606080830151908701526080808301519087015260a080830151613bfd82890182613a8d565b505060c0808301518282890152613c1683890182613c7e565b60e085810151908a015261010080860151908a015261012080860151908a015261014094850151898203958a01959095529250613c57915082905083613aec565b9a87019a9550505090840190600101613ba8565b5091979650505050505050565b15159052565b60008151808452613c9681602086016020860161465d565b601f01601f19169290920160200192915050565b60088110613cb457fe5b9052565b60028110613cb457fe5b6000815160e08452613cd860e085018251613a8d565b6020810151610100613cec81870183613cb8565b60408301519150610120613d0281880184613a8d565b60608401519250610140613d1881890185613a8d565b6080850151935061016084818a015260a0860151945061018085818b015260c087015195506101a0613d4c818c0188613a8d565b60e08801516101c08c0152858801516101e08c0152848801516102008c0152838801519650806102208c015250613d876102808b0187613a9a565b918701516102408b01529095015188860360df19016102608a0152949350613db59250839150849050613c7e565b9150506020830151613dca6020860182613e62565b50604083015160408501526060830151606085015260808301518482036080860152613df68282613c7e565b91505060a0830151613e0b60a0860182613cb8565b5060c083015160c08501528091505092915050565b805182526020808201519083015260408082015190830152606080820151908301526080808201516001600160a01b03169083015260a0908101511515910152565b60ff169052565b60008251613e7b81846020870161465d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6001600160e01b031991909116815260200190565b6020808252818101527f507572636861736520536561506f72745f315f34206661696c65642057455448604082015260600190565b6020808252818101527f507572636861736520536561506f72745f315f35206661696c65642057455448604082015260600190565b6020808252601e908201527f50757263686173652077797665726e45786368616e6765206661696c65640000604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f34206661696c65640000000000604082015260600190565b60208082526017908201527f50757263686173652072617269626c65206661696c6564000000000000000000604082015260600190565b6020808252601c908201527f50757263686173652072617269626c65206661696c6564205745544800000000604082015260600190565b6020808252601490820152730aadcd6dcdeeedc40dac2e4d6cae892c8408aa8960631b604082015260600190565b60208082526019908201527f556e6b6e6f776e2070757263686173652063757272656e637900000000000000604082015260600190565b6020808252601590820152740aadcd6dcdeeedc40dac2e4d6cae892c840ae8aa89605b1b604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f31206661696c65640000000000604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f35206661696c65640000000000604082015260600190565b6020808252818101527f507572636861736520536561506f72745f315f31206661696c65642057455448604082015260600190565b60208082526018908201527f5075726368617365207375646f73776170206661696c65640000000000000000604082015260600190565b60208082526019908201527f756e6b6e6f776e2064656c656761746554797065207832793200000000000000604082015260600190565b6020808252601b908201527f5075726368617365204c6f6f6b73526172655632206661696c65640000000000604082015260600190565b602080825260129082015271556e6b6e6f776e20746f6b656e207479706560701b604082015260600190565b6020808252601a908201527f756e6b6e6f776e206164646974696f6e616c4461746154797065000000000000604082015260600190565b60208082526018908201527f6e6f207375636365737366756c20657865637574696f6e730000000000000000604082015260600190565b6000604082526142fd6040830185613cc2565b828103602084015261430f8185613cc2565b95945050505050565b60006020808352610180808401855161016080858801528282518085526101a094508489019150848782028a01018785019450885b82811015614435578a820361019f19018452855180518352898101516143758b850182613a8d565b5060408181015190840152606080820151908401526080808201519084015260a0808201519084015260c0808201516143b082860182613a8d565b505060e08082015189828601526143c98a860182613c7e565b91505061010080830151858303828701526143e48382613b2f565b925050506101208083015181860152506101408083015181860152508682015161441088860182613e62565b509089015190614422848b0183613e62565b968a0196948a019492505060010161434d565b50968a0151898803601f190160408b0152966144518189613b8c565b97505050506040880151935061446a6060880185613e20565b6060880151610120880152608088015161014088015260a0880151935061449381880185613e62565b50929695505050505050565b60006040825261010084511515604084015260018060a01b03602086015116606084015260408501516080840152606085015160a0840152608085015160c084015260a085015160c060e08501526144f982850182613c7e565b90508381036020850152610200614511828751613c78565b60208601516145236020840182613a8d565b5060408601516145366040840182613a8d565b50606086015160608301526080860151608083015260a086015160a083015260c086015161456760c0840182613a8d565b5060e086015161457a60e0840182613a8d565b508583015192820192909252610120808601519082015261014080860151908201526101608086015190820152610180808601518183018490529092906145c382840182613c7e565b935050506101a0808601516145da82840182613e62565b50506101c085810151908201526101e094850151940193909352509092915050565b6040518181016001600160401b038111828210171561461757fe5b604052919050565b60006001600160401b0382111561463257fe5b5060209081020190565b60006001600160401b0382111561464f57fe5b50601f01601f191660200190565b60005b83811015614678578181015183820152602001614660565b838111156125d65750506000910152565b6001600160a01b038116811461229757600080fd5b801515811461229757600080fd5b6001600160e01b03198116811461229757600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212200757283dc07c411443b1e1b6d7a36c58c05c1c146251b1933ac518ad9dd4f82064736f6c6343000706003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000005faf16a85028be138a7178b222dec98092feef9700000000000000000000000000000000006c3852cbef3e08e8df289169ede58100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000248b46beb66b3078d771a9e7e5a0a0216d0d07ba
Deployed ByteCode
0x6080604052600436106101435760003560e01c806386dcbd27116100b6578063bd4486ee1161006f578063bd4486ee14610319578063c9f0a2fa1461032e578063df6c255814610343578063f23a6e6114610358578063f2fde38b14610378578063fc40c9c7146103985761014a565b806386dcbd27146102875780638da5cb5b146102a75780639110c777146102bc578063a05f32dc146102d1578063b94ee332146102e6578063bc197c81146102f95761014a565b80633733b82b116101085780633733b82b1461020b5780633fc8cef3146102205780635c975abb146102355780635ea1e4c91461024a578063715018a61461025f57806386496e7a146102745761014a565b80628534f71461014f57806301ffc9a71461017a57806302329a29146101a7578063150b7a02146101c9578063349d6a85146101f65761014a565b3661014a57005b600080fd5b34801561015b57600080fd5b506101646103ad565b6040516101719190613e85565b60405180910390f35b34801561018657600080fd5b5061019a6101953660046136e6565b6103d1565b6040516101719190613f0e565b3480156101b357600080fd5b506101c76101c23660046136ae565b6103f4565b005b3480156101d557600080fd5b506101e96101e4366004613318565b61049d565b6040516101719190613f19565b34801561020257600080fd5b506101646104ad565b34801561021757600080fd5b506101646104d1565b34801561022c57600080fd5b506101646104f5565b34801561024157600080fd5b5061019a610519565b34801561025657600080fd5b50610164610522565b34801561026b57600080fd5b506101c7610546565b6101c761028236600461386a565b6105f2565b34801561029357600080fd5b506101c76102a23660046133e7565b6107bd565b3480156102b357600080fd5b506101646108fa565b3480156102c857600080fd5b50610164610909565b3480156102dd57600080fd5b5061016461092d565b6101c76102f43660046135f3565b610951565b34801561030557600080fd5b506101e961031436600461326f565b610bda565b34801561032557600080fd5b50610164610beb565b34801561033a57600080fd5b50610164610c0f565b34801561034f57600080fd5b50610164610c33565b34801561036457600080fd5b506101e9610373366004613381565b610c57565b34801561038457600080fd5b506101c7610393366004613253565b610c68565b3480156103a457600080fd5b50610164610d6a565b7f00000000000000000000000000000000006c3852cbef3e08e8df289169ede58181565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b6103fc610d8e565b6001600160a01b031661040d6108fa565b6001600160a01b031614610456576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b6002805482151560ff19909116811790915560408051918252517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd29181900360200190a150565b630a85bd0160e11b949350505050565b7f00000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc81565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b61054e610d8e565b6001600160a01b031661055f6108fa565b6001600160a01b0316146105a8576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6105fa610d92565b600061060584610de5565b905080156106b8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd610644610d8e565b30846040518463ffffffff1660e01b815260040161066493929190613e99565b602060405180830381600087803b15801561067e57600080fd5b505af1158015610692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b691906136ca565b505b60006106c78560400151610eb0565b905060008080808460018111156106da57fe5b141561070b576106eb886000610ecc565b919450925090506106fc8288611de2565b6107068187611de2565b610766565b600184600181111561071957fe5b14156107455761072a886000611e0d565b9194509250905061073b82886121c9565b61070681876121c9565b60405162461bcd60e51b815260040161075d906140a2565b60405180910390fd5b7fcc54b89ca2d75d5612023b14f0a477212b0e08bc0c5b8ad2804e2f8e2e401fc0836040516107959190613f0e565b60405180910390a16107a5612286565b84156107b3576107b361229a565b5050505050505050565b6107c5610d8e565b6001600160a01b03166107d66108fa565b6001600160a01b03161461081f576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b60005b818110156108f5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b384848481811061086557fe5b905060200201602081019061087a9190613253565b6000196040518363ffffffff1660e01b815260040161089a929190613ef5565b602060405180830381600087803b1580156108b457600080fd5b505af11580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec91906136ca565b50600101610822565b505050565b6000546001600160a01b031690565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f0000000000000000000000005faf16a85028be138a7178b222dec98092feef9781565b610959610d92565b60008060008060008060005b8a518110156109965761098a8b828151811061097d57fe5b6020026020010151610de5565b90910190600101610965565b508015610a48577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd6109d4610d8e565b30846040518463ffffffff1660e01b81526004016109f493929190613e99565b602060405180830381600087803b158015610a0e57600080fd5b505af1158015610a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4691906136ca565b505b60005b8a51811015610b72576000610a768c8381518110610a6557fe5b602002602001015160400151610eb0565b90506000808080846001811115610a8957fe5b1415610ad057610aac8f8681518110610a9e57fe5b60200260200101518d610ecc565b91945092509050610abd8b836123e8565b9a50610ac98a826123e8565b9950610b21565b6001846001811115610ade57fe5b141561074557610b018f8681518110610af357fe5b60200260200101518d611e0d565b91945092509050610b1289836123e8565b9850610b1e88826123e8565b97505b8680610b2a5750825b96507fcc54b89ca2d75d5612023b14f0a477212b0e08bc0c5b8ad2804e2f8e2e401fc083604051610b5b9190613f0e565b60405180910390a150505050806001019050610a4b565b5081610b905760405162461bcd60e51b815260040161075d906142b3565b610b9a868a611de2565b610ba48589611de2565b610bae848a6121c9565b610bb883896121c9565b610bc0612286565b8015610bce57610bce61229a565b50505050505050505050565b63bc197c8160e01b95945050505050565b7f00000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd681565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b63f23a6e6160e01b95945050505050565b610c70610d8e565b6001600160a01b0316610c816108fa565b6001600160a01b031614610cca576040805162461bcd60e51b8152602060048201819052602482015260008051602061470a833981519152604482015290519081900360640190fd5b6001600160a01b038116610d0f5760405162461bcd60e51b81526004018080602001828103825260268152602001806146c36026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b3390565b60025460ff1615610de3576040805162461bcd60e51b81526020600482015260166024820152751d1a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b604482015290519081900360640190fd5b565b600080600090506000610dfb8460400151610eb0565b90506001816001811115610e0b57fe5b1415610ea95760208401516040850151928101926000918291610e2d91612449565b91509150808285010193506000610e5187606001518860400151896000015161247a565b91505060005b8151811015610ea457600060a0838381518110610e7057fe5b6020026020010151901c90506000610e95828b6020015161253390919063ffffffff16565b97909701965050600101610e57565b505050505b5092915050565b6000603082901c61ffff166001811115610ec657fe5b92915050565b6000806000806000610eeb87606001518860400151896000015161247a565b60208901519193509150600288516009811115610f0457fe5b1415610fd25760007f00000000000000000000000000000000006c3852cbef3e08e8df289169ede5816001600160a01b03168285604051610f459190613e69565b60006040518083038185875af1925050503d8060008114610f82576040519150601f19603f3d011682016040523d82523d6000602084013e610f87565b606091505b505090508715610faf5780610faa57600080600096509650965050505050611ddb565b610fcc565b80610fcc5760405162461bcd60e51b815260040161075d90614108565b50611da9565b600188516009811115610fe157fe5b14156110a45760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031682856040516110229190613e69565b60006040518083038185875af1925050503d806000811461105f576040519150601f19603f3d011682016040523d82523d6000602084013e611064565b606091505b5050905087156110875780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90613f98565b6000885160098111156110b357fe5b14156111765760007f0000000000000000000000005faf16a85028be138a7178b222dec98092feef976001600160a01b031682856040516110f49190613e69565b60006040518083038185875af1925050503d8060008114611131576040519150601f19603f3d011682016040523d82523d6000602084013e611136565b606091505b5050905087156111595780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90614006565b60038851600981111561118557fe5b14156115c8576000838060200190518101906111a191906138c0565b9050871561123f5760405163357a150b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063357a150b9084906111f7908590600401614318565b6000604051808303818588803b15801561121057600080fd5b505af193505050508015611222575060015b61123a57600080600096509650965050505050611ddb565b6112c0565b60405163357a150b60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063357a150b90849061128d908590600401614318565b6000604051808303818588803b1580156112a657600080fd5b505af11580156112ba573d6000803e3d6000fd5b50505050505b60005b8160200151518110156115c1576000826020015182815181106112e257fe5b602002602001015160200151905060008360200151838151811061130257fe5b602002602001015160400151905060008460000151838151811061132257fe5b60200260200101516101000151828151811061133a57fe5b602002602001015160200151905060008560000151848151811061135a57fe5b602002602001015160e0015151118015611390575060008560200151858151811061138157fe5b602002602001015160c0015151115b156113d6576113d681866020015186815181106113a957fe5b602002602001015160c00151876000015186815181106113c557fe5b602002602001015160e0015161254b565b84518051849081106113e457fe5b602002602001015160800151600114156114b95760008180602001905181019061140e9190613532565b905060005b81518110156114b257600082828151811061142a57fe5b6020026020010151905080600001516001600160a01b03166342842e0e30611450610d8e565b84602001516040518463ffffffff1660e01b815260040161147393929190613e99565b600060405180830381600087803b15801561148d57600080fd5b505af11580156114a1573d6000803e3d6000fd5b505060019093019250611413915050565b50506115b3565b84518051849081106114c757fe5b6020026020010151608001516002141561159b576000818060200190518101906114f19190613455565b905060005b81518110156114b257600082828151811061150d57fe5b6020026020010151905080600001516001600160a01b031663f242432a30611533610d8e565b846020015185604001516040518563ffffffff1660e01b815260040161155c9493929190613ebd565b600060405180830381600087803b15801561157657600080fd5b505af115801561158a573d6000803e3d6000fd5b5050600190930192506114f6915050565b60405162461bcd60e51b815260040161075d906141e2565b5050508060010190506112c3565b5050611da9565b6004885160098111156115d757fe5b141561182c576000806000858060200190518101906115f69190613988565b925092509250891561169c57604051635a72594b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b4e4b296908690611652908790879060040161449f565b6000604051808303818588803b15801561166b57600080fd5b505af19350505050801561167d575060015b611697576000806000985098509850505050505050611ddb565b61171f565b604051635a72594b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b4e4b2969086906116ec908790879060040161449f565b6000604051808303818588803b15801561170557600080fd5b505af1158015611719573d6000803e3d6000fd5b50505050505b6001600160e01b031981166339d690a360e11b14156117ae5781604001516001600160a01b03166342842e0e30611754610d8e565b85608001516040518463ffffffff1660e01b815260040161177793929190613e99565b600060405180830381600087803b15801561179157600080fd5b505af11580156117a5573d6000803e3d6000fd5b50505050611824565b6001600160e01b0319811663025ceed960e61b141561180c5781604001516001600160a01b031663f242432a306117e3610d8e565b85608001518660a001516040518563ffffffff1660e01b81526004016117779493929190613ebd565b60405162461bcd60e51b815260040161075d90614250565b505050611da9565b60058851600981111561183b57fe5b14156118fe5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316828560405161187c9190613e69565b60006040518083038185875af1925050503d80600081146118b9576040519150601f19603f3d011682016040523d82523d6000602084013e6118be565b606091505b5050905087156118e15780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d906141ab565b60068851600981111561190d57fe5b14156119d05760007f00000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd66001600160a01b0316828560405161194e9190613e69565b60006040518083038185875af1925050503d806000811461198b576040519150601f19603f3d011682016040523d82523d6000602084013e611990565b606091505b5050905087156119b35780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90613fcf565b6007885160098111156119df57fe5b1415611aa25760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168285604051611a209190613e69565b60006040518083038185875af1925050503d8060008114611a5d576040519150601f19603f3d011682016040523d82523d6000602084013e611a62565b606091505b505090508715611a855780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d90614219565b600888516009811115611ab157fe5b1415611cbf57600080600085806020019051810190611ad091906137f6565b9250925092508915611b7657604051639a1fc3a760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a1fc3a7908690611b2c90879087906004016142ea565b6000604051808303818588803b158015611b4557600080fd5b505af193505050508015611b57575060015b611b71576000806000985098509850505050505050611ddb565b611bf9565b604051639a1fc3a760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639a1fc3a7908690611bc690879087906004016142ea565b6000604051808303818588803b158015611bdf57600080fd5b505af1158015611bf3573d6000803e3d6000fd5b50505050505b6001600160e01b031981166339d690a360e11b1415611c58578251606001516001600160a01b03166342842e0e30611c2f610d8e565b8651608001516040516001600160e01b031960e086901b16815261177793929190600401613e99565b6001600160e01b0319811663025ceed960e61b141561180c578251606001516001600160a01b031663f242432a30611c8e610d8e565b8651608081015160a0909101516040516001600160e01b031960e087901b1681526117779493929190600401613ebd565b600988516009811115611cce57fe5b1415611d915760007f00000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc6001600160a01b03168285604051611d0f9190613e69565b60006040518083038185875af1925050503d8060008114611d4c576040519150601f19603f3d011682016040523d82523d6000602084013e611d51565b606091505b505090508715611d745780610faa57600080600096509650965050505050611ddb565b80610fcc5760405162461bcd60e51b815260040161075d9061413f565b60405162461bcd60e51b815260040161075d90614074565b611db78289602001516125dc565b600080611dcc8a604001518b60200151612449565b60019950909750955050505050505b9250925092565b600082118015611dfa57506001600160a01b03811615155b15611e0957611e098183612665565b5050565b6000806000806000611e2c87606001518860400151896000015161247a565b9092509050600287516009811115611e4057fe5b1415611f0c5760007f00000000000000000000000000000000006c3852cbef3e08e8df289169ede5816001600160a01b031683604051611e809190613e69565b6000604051808303816000865af19150503d8060008114611ebd576040519150601f19603f3d011682016040523d82523d6000602084013e611ec2565b606091505b505090508615611ee95780611ee4576000806000955095509550505050611ddb565b611f06565b80611f065760405162461bcd60e51b815260040161075d90614176565b50612194565b600087516009811115611f1b57fe5b1415611fdc5760007f0000000000000000000000005faf16a85028be138a7178b222dec98092feef976001600160a01b031683604051611f5b9190613e69565b6000604051808303816000865af19150503d8060008114611f98576040519150601f19603f3d011682016040523d82523d6000602084013e611f9d565b606091505b505090508615611fbf5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d9061403d565b600687516009811115611feb57fe5b14156120ac5760007f00000000000000000000000000000000000001ad428e4906ae43d8f9852d0dd66001600160a01b03168360405161202b9190613e69565b6000604051808303816000865af19150503d8060008114612068576040519150601f19603f3d011682016040523d82523d6000602084013e61206d565b606091505b50509050861561208f5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d90613f2e565b6009875160098111156120bb57fe5b141561217c5760007f00000000000000000000000000000000000000adc04c56bf30ac9d3c0aaf14dc6001600160a01b0316836040516120fb9190613e69565b6000604051808303816000865af19150503d8060008114612138576040519150601f19603f3d011682016040523d82523d6000602084013e61213d565b606091505b50509050861561215f5780611ee4576000806000955095509550505050611ddb565b80611f065760405162461bcd60e51b815260040161075d90613f63565b60405162461bcd60e51b815260040161075d906140d9565b6121a28188602001516126fd565b6000806121b789604001518a60200151612449565b60019b919a5098509650505050505050565b6000821180156121e157506001600160a01b03811615155b15611e095760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906122349084908690600401613ef5565b602060405180830381600087803b15801561224e57600080fd5b505af1158015612262573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f591906136ca565b478015612297576122973382612665565b50565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906122e9903090600401613e85565b60206040518083038186803b15801561230157600080fd5b505afa158015612315573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123399190613a75565b90508015612297577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612378610d8e565b836040518363ffffffff1660e01b8152600401612396929190613ef5565b602060405180830381600087803b1580156123b057600080fd5b505af11580156123c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0991906136ca565b600082820183811015612442576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008061ffff601085901c81169085166124638583612533565b61246d8683612533565b9350935050509250929050565b6060806000602085901c61ffff16600181111561249357fe5b9050606060008260018111156124a557fe5b14156124b757869350915061252b9050565b60018260018111156124c557fe5b1415612513576000878060200190518101906124e19190613702565b90506124ec86612786565b1561250757806000015181602001519450945050505061252b565b519350915061252b9050565b60405162461bcd60e51b815260040161075d9061427c565b935093915050565b600061244261271061254585856127d8565b90612831565b815183511461255957600080fd5b805183511461256757600080fd5b60005b83518110156125d65781818151811061257f57fe5b01602001516001600160f81b031916156125ce5782818151811061259f57fe5b602001015160f81c60f81b8482815181106125b657fe5b60200101906001600160f81b031916908160001a9053505b60010161256a565b50505050565b60005b82518110156108f55760008382815181106125f657fe5b6020026020010151111561265d57600083828151811061261257fe5b60200260200101519050600060a085848151811061262c57fe5b6020026020010151901c9050600061264d828661253390919063ffffffff16565b90506126598184611de2565b5050505b6001016125df565b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146126b0576040519150601f19603f3d011682016040523d82523d6000602084013e6126b5565b606091505b50509050806108f5576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60005b82518110156108f557600083828151811061271757fe5b6020026020010151111561277e57600083828151811061273357fe5b60200260200101519050600060a085848151811061274d57fe5b6020026020010151901c9050600061276e828661253390919063ffffffff16565b905061277a81846121c9565b5050505b600101612700565b6000600582600981111561279657fe5b14806127ad575060048260098111156127ab57fe5b145b806127c3575060078260098111156127c157fe5b145b156127d0575060016103ef565b506000919050565b6000826127e757506000610ec6565b828202828482816127f457fe5b04146124425760405162461bcd60e51b81526004018080602001828103825260218152602001806146e96021913960400191505060405180910390fd5b6000808211612887576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161289057fe5b049392505050565b80356103ef81614689565b80516103ef81614689565b600082601f8301126128be578081fd5b815160206128d36128ce8361461f565b6145fc565b828152818101908583016040808602880185018910156128f1578687fd5b865b8681101561295b5781838b031215612909578788fd5b81518281018181106001600160401b038211171561292357fe5b8352835161ffff8116811461293657898afd5b81528387015161294581614689565b81880152855293850193918101916001016128f3565b509198975050505050505050565b600082601f830112612979578081fd5b815160206129896128ce8361461f565b828152818101908583016040808602880185018910156129a7578687fd5b865b8681101561295b5781838b0312156129bf578788fd5b81518281018181106001600160401b03821117156129d957fe5b835283518152868401516129ec81614689565b81880152855293850193918101916001016129a9565b600082601f830112612a12578081fd5b81516020612a226128ce8361461f565b82815281810190858301855b85811015612aab5781518801604080601f19838d03011215612a4e578889fd5b80518181016001600160401b038282108183111715612a6957fe5b818452848a01518352928401519280841115612a83578b8cfd5b5050612a938c8984860101612df9565b81890152865250509284019290840190600101612a2e565b5090979650505050505050565b600082601f830112612ac8578081fd5b81516020612ad86128ce8361461f565b82815281810190858301855b85811015612aab57815188016101a080601f19838d03011215612b05578889fd5b612b0e816145fc565b878301518152612b20604084016128a3565b88820152606083015160408201526080830151606082015260a0830151608082015260c083015160a0820152612b5860e084016128a3565b60c08201526101008301516001600160401b0380821115612b77578b8cfd5b612b858e8b84880101612df9565b60e084015261012091508185015181811115612b9f578c8dfd5b612bad8f8c83890101612a02565b610100850152505061014080850151828401526101609150818501518184015250610180612bdc818601613242565b82840152612beb848601613242565b9083015250865250509284019290840190600101612ae4565b600082601f830112612c14578081fd5b81516020612c246128ce8361461f565b82815281810190858301855b85811015612aab578151880161016080601f19838d03011215612c51578889fd5b612c5a816145fc565b612c65888401612e44565b815260408084015189830152606080850151828401526080915081850151818401525060a0808501518284015260c09150612ca18286016128a3565b9083015260e08401516001600160401b0380821115612cbe578c8dfd5b612ccc8f8c84890101612df9565b8385015261010092508286015160e0850152610120915081860151838501526101409250828601518285015284860151945080851115612d0a578c8dfd5b5050612d1a8d8a85870101612969565b90820152865250509284019290840190600101612c30565b600082601f830112612d42578081fd5b81356020612d526128ce8361461f565b8281528181019085830183850287018401881015612d6e578586fd5b855b85811015612aab57813584529284019290840190600101612d70565b80356103ef8161469e565b80516103ef8161469e565b80516103ef816146ac565b600082601f830112612dbd578081fd5b8135612dcb6128ce8261463c565b818152846020838601011115612ddf578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112612e09578081fd5b8151612e176128ce8261463c565b818152846020838601011115612e2b578283fd5b612e3c82602083016020870161465d565b949350505050565b8051600881106103ef57600080fd5b8051600281106103ef57600080fd5b600060e08284031215612e73578081fd5b612e7d60e06145fc565b905081516001600160401b0380821115612e9657600080fd5b612ea285838601613026565b8352612eb060208501613242565b602084015260408401516040840152606084015160608401526080840151915080821115612edd57600080fd5b50612eea84828501612df9565b608083015250612efc60a08301612e53565b60a082015260c082015160c082015292915050565b6000610200808385031215612f24578182fd5b612f2d816145fc565b915050612f3982612d97565b8152612f47602083016128a3565b6020820152612f58604083016128a3565b6040820152606082015160608201526080820151608082015260a082015160a0820152612f8760c083016128a3565b60c0820152612f9860e083016128a3565b60e08201526101008281015190820152610120808301519082015261014080830151908201526101608083015190820152610180808301516001600160401b03811115612fe457600080fd5b612ff085828601612df9565b8284015250506101a0613004818401613242565b908201526101c082810151908201526101e09182015191810191909152919050565b60006101a0808385031215613039578182fd5b613042816145fc565b91505061304e826128a3565b815261305c60208301612e53565b602082015261306d604083016128a3565b604082015261307e606083016128a3565b60608201526080820151608082015260a082015160a08201526130a360c083016128a3565b60c082015260e0828101519082015261010080830151908201526101208083015190820152610140808301516001600160401b03808211156130e457600080fd5b6130f0868387016128ae565b838501526101609250828501518385015261018092508285015191508082111561311957600080fd5b5061312685828601612df9565b82840152505092915050565b600060808284031215613143578081fd5b604051608081016001600160401b03828210818311171561316057fe5b8160405282935084359150600a821061317857600080fd5b818352602085013560208401526040850135604084015260608501359150808211156131a357600080fd5b506131b085828601612dad565b6060830152505092915050565b600060c082840312156131ce578081fd5b60405160c081018181106001600160401b03821117156131ea57fe5b806040525080915082518152602083015160208201526040830151604082015260608301516060820152608083015161322281614689565b608082015260a08301516132358161469e565b60a0919091015292915050565b805160ff811681146103ef57600080fd5b600060208284031215613264578081fd5b813561244281614689565b600080600080600060a08688031215613286578081fd5b853561329181614689565b945060208601356132a181614689565b935060408601356001600160401b03808211156132bc578283fd5b6132c889838a01612d32565b945060608801359150808211156132dd578283fd5b6132e989838a01612d32565b935060808801359150808211156132fe578283fd5b5061330b88828901612dad565b9150509295509295909350565b6000806000806080858703121561332d578182fd5b843561333881614689565b9350602085013561334881614689565b92506040850135915060608501356001600160401b03811115613369578182fd5b61337587828801612dad565b91505092959194509250565b600080600080600060a08688031215613398578283fd5b85356133a381614689565b945060208601356133b381614689565b9350604086013592506060860135915060808601356001600160401b038111156133db578182fd5b61330b88828901612dad565b600080602083850312156133f9578182fd5b82356001600160401b038082111561340f578384fd5b818501915085601f830112613422578384fd5b813581811115613430578485fd5b8660208083028501011115613443578485fd5b60209290920196919550909350505050565b60006020808385031215613467578182fd5b82516001600160401b038082111561347d578384fd5b818501915085601f830112613490578384fd5b815161349e6128ce8261461f565b818152848101908486016060808502870188018b10156134bc578889fd5b8896505b848710156135235780828c0312156134d6578889fd5b6040805182810181811089821117156134eb57fe5b825283516134f881614689565b8152838a01518a820152818401519181019190915284526001969096019592870192908101906134c0565b50909998505050505050505050565b60006020808385031215613544578182fd5b82516001600160401b038082111561355a578384fd5b818501915085601f83011261356d578384fd5b815161357b6128ce8261461f565b818152848101908486016040808502870188018b1015613599578889fd5b8896505b848710156135235780828c0312156135b3578889fd5b805181810181811088821117156135c657fe5b825282516135d381614689565b81528289015189820152845260019690960195928701929081019061359d565b60008060008060808587031215613608578182fd5b84356001600160401b0381111561361d578283fd5b8501601f8101871361362d578283fd5b8035602061363d6128ce8361461f565b82815281810190848301875b85811015613672576136608d8684358a0101613132565b84529284019290840190600101613649565b50508098505050613684818901612898565b955050505061369560408601612898565b91506136a360608601612d8c565b905092959194509250565b6000602082840312156136bf578081fd5b81356124428161469e565b6000602082840312156136db578081fd5b81516124428161469e565b6000602082840312156136f7578081fd5b8135612442816146ac565b60006020808385031215613714578182fd5b82516001600160401b038082111561372a578384fd5b908401906040828703121561373d578384fd5b60405160408101818110838211171561375257fe5b604052825182811115613763578586fd5b61376f88828601612df9565b8252508383015182811115613782578586fd5b80840193505086601f840112613796578485fd5b825191506137a66128ce8361461f565b82815284810190848601868502860187018a10156137c2578788fd5b8795505b848610156137e45780518352600195909501949186019186016137c6565b50948201949094529695505050505050565b60008060006060848603121561380a578081fd5b83516001600160401b0380821115613820578283fd5b61382c87838801612e62565b94506020860151915080821115613841578283fd5b5061384e86828701612e62565b925050604084015161385f816146ac565b809150509250925092565b60008060006060848603121561387e578081fd5b83356001600160401b03811115613893578182fd5b61389f86828701613132565b93505060208401356138b081614689565b9150604084013561385f81614689565b6000602082840312156138d1578081fd5b81516001600160401b03808211156138e7578283fd5b9083019061016082860312156138fb578283fd5b61390560c06145fc565b825182811115613913578485fd5b61391f87828601612ab8565b825250602083015182811115613933578485fd5b61393f87828601612c04565b60208301525061395286604085016131bd565b60408201526101008301516060820152610120830151608082015261397a6101408401613242565b60a082015295945050505050565b60008060006060848603121561399c578081fd5b83516001600160401b03808211156139b2578283fd5b9085019060c082880312156139c5578283fd5b60405160c0810181811083821117156139da57fe5b6040526139e683612d97565b81526139f4602084016128a3565b602082015260408301516040820152606083015160608201526080830151608082015260a083015182811115613a28578485fd5b613a3489828601612df9565b60a0830152506020870151909550915080821115613a50578283fd5b50613a5d86828701612f11565b925050613a6c60408501612da2565b90509250925092565b600060208284031215613a86578081fd5b5051919050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015613ae1578151805161ffff1688528301516001600160a01b03168388015260409096019590820190600101613aad565b509495945050505050565b6000815180845260208085019450808401835b83811015613ae1578151805188528301516001600160a01b03168388015260409096019590820190600101613aff565b60008282518085526020808601955080818302840101818601855b84811015612aab57858303601f190189528151805184528401516040858501819052613b7881860183613c7e565b9a86019a9450505090830190600101613b4a565b6000815180845260208085018081965082840281019150828601855b85811015613c6b5782840389528151610160613bc5868351613caa565b818701518688015260408083015190870152606080830151908701526080808301519087015260a080830151613bfd82890182613a8d565b505060c0808301518282890152613c1683890182613c7e565b60e085810151908a015261010080860151908a015261012080860151908a015261014094850151898203958a01959095529250613c57915082905083613aec565b9a87019a9550505090840190600101613ba8565b5091979650505050505050565b15159052565b60008151808452613c9681602086016020860161465d565b601f01601f19169290920160200192915050565b60088110613cb457fe5b9052565b60028110613cb457fe5b6000815160e08452613cd860e085018251613a8d565b6020810151610100613cec81870183613cb8565b60408301519150610120613d0281880184613a8d565b60608401519250610140613d1881890185613a8d565b6080850151935061016084818a015260a0860151945061018085818b015260c087015195506101a0613d4c818c0188613a8d565b60e08801516101c08c0152858801516101e08c0152848801516102008c0152838801519650806102208c015250613d876102808b0187613a9a565b918701516102408b01529095015188860360df19016102608a0152949350613db59250839150849050613c7e565b9150506020830151613dca6020860182613e62565b50604083015160408501526060830151606085015260808301518482036080860152613df68282613c7e565b91505060a0830151613e0b60a0860182613cb8565b5060c083015160c08501528091505092915050565b805182526020808201519083015260408082015190830152606080820151908301526080808201516001600160a01b03169083015260a0908101511515910152565b60ff169052565b60008251613e7b81846020870161465d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6001600160e01b031991909116815260200190565b6020808252818101527f507572636861736520536561506f72745f315f34206661696c65642057455448604082015260600190565b6020808252818101527f507572636861736520536561506f72745f315f35206661696c65642057455448604082015260600190565b6020808252601e908201527f50757263686173652077797665726e45786368616e6765206661696c65640000604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f34206661696c65640000000000604082015260600190565b60208082526017908201527f50757263686173652072617269626c65206661696c6564000000000000000000604082015260600190565b6020808252601c908201527f50757263686173652072617269626c65206661696c6564205745544800000000604082015260600190565b6020808252601490820152730aadcd6dcdeeedc40dac2e4d6cae892c8408aa8960631b604082015260600190565b60208082526019908201527f556e6b6e6f776e2070757263686173652063757272656e637900000000000000604082015260600190565b6020808252601590820152740aadcd6dcdeeedc40dac2e4d6cae892c840ae8aa89605b1b604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f31206661696c65640000000000604082015260600190565b6020808252601b908201527f507572636861736520536561506f72745f315f35206661696c65640000000000604082015260600190565b6020808252818101527f507572636861736520536561506f72745f315f31206661696c65642057455448604082015260600190565b60208082526018908201527f5075726368617365207375646f73776170206661696c65640000000000000000604082015260600190565b60208082526019908201527f756e6b6e6f776e2064656c656761746554797065207832793200000000000000604082015260600190565b6020808252601b908201527f5075726368617365204c6f6f6b73526172655632206661696c65640000000000604082015260600190565b602080825260129082015271556e6b6e6f776e20746f6b656e207479706560701b604082015260600190565b6020808252601a908201527f756e6b6e6f776e206164646974696f6e616c4461746154797065000000000000604082015260600190565b60208082526018908201527f6e6f207375636365737366756c20657865637574696f6e730000000000000000604082015260600190565b6000604082526142fd6040830185613cc2565b828103602084015261430f8185613cc2565b95945050505050565b60006020808352610180808401855161016080858801528282518085526101a094508489019150848782028a01018785019450885b82811015614435578a820361019f19018452855180518352898101516143758b850182613a8d565b5060408181015190840152606080820151908401526080808201519084015260a0808201519084015260c0808201516143b082860182613a8d565b505060e08082015189828601526143c98a860182613c7e565b91505061010080830151858303828701526143e48382613b2f565b925050506101208083015181860152506101408083015181860152508682015161441088860182613e62565b509089015190614422848b0183613e62565b968a0196948a019492505060010161434d565b50968a0151898803601f190160408b0152966144518189613b8c565b97505050506040880151935061446a6060880185613e20565b6060880151610120880152608088015161014088015260a0880151935061449381880185613e62565b50929695505050505050565b60006040825261010084511515604084015260018060a01b03602086015116606084015260408501516080840152606085015160a0840152608085015160c084015260a085015160c060e08501526144f982850182613c7e565b90508381036020850152610200614511828751613c78565b60208601516145236020840182613a8d565b5060408601516145366040840182613a8d565b50606086015160608301526080860151608083015260a086015160a083015260c086015161456760c0840182613a8d565b5060e086015161457a60e0840182613a8d565b508583015192820192909252610120808601519082015261014080860151908201526101608086015190820152610180808601518183018490529092906145c382840182613c7e565b935050506101a0808601516145da82840182613e62565b50506101c085810151908201526101e094850151940193909352509092915050565b6040518181016001600160401b038111828210171561461757fe5b604052919050565b60006001600160401b0382111561463257fe5b5060209081020190565b60006001600160401b0382111561464f57fe5b50601f01601f191660200190565b60005b83811015614678578181015183820152602001614660565b838111156125d65750506000910152565b6001600160a01b038116811461229757600080fd5b801515811461229757600080fd5b6001600160e01b03198116811461229757600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212200757283dc07c411443b1e1b6d7a36c58c05c1c146251b1933ac518ad9dd4f82064736f6c63430007060033