ETH Price: $2,229.81 (-2.19%)

Token

The Kiss Precise (KISS)
 

Overview

Max Total Supply

1,024 KISS

Holders

553

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 KISS
0x45a2053b72564772dcd50d15658225c495499fe7
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Kiss is a 1024-piece art collection generated entirely by the smart-contract code, by divergence (the team behind Brotchain and PROOF OF {ART}WORK) & Etheseus.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheKissPrecise

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 32 : TheKissPrecise.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// Copyright 2022 Arran Schlosberg
pragma solidity >=0.8.0 <0.9.0;
import "./IKissRenderer.sol";
import "./IPublicMintable.sol";
import "@divergencetech/ethier/contracts/crypto/SignatureChecker.sol";
import "@divergencetech/ethier/contracts/erc721/ERC721Common.sol";
import "@divergencetech/ethier/contracts/erc721/ERC721Redeemer.sol";
import "@divergencetech/ethier/contracts/sales/ArbitraryPriceSeller.sol";
import "@divergencetech/ethier/contracts/utils/Monotonic.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
import "@openzeppelin/contracts/interfaces/IERC721.sol";
import "@openzeppelin/contracts/interfaces/IERC2981.sol";
/**
@notice A pure-Solidity generative-art NFT, The Kiss Precise: www.thekiss.xyz
*/
contract TheKissPrecise is
ERC721Common,
ArbitraryPriceSeller,
IERC2981,
IPublicMintable
{
using EnumerableSet for EnumerableSet.AddressSet;
using ERC165Checker for address;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 2 of 32 : IPublicMintable.sol
1
2
3
4
5
6
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;
interface IPublicMintable {
function mintPublic(address to, uint256 n) external payable;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 3 of 32 : IKissRenderer.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: UNLICENSED
// Copyright 2022 Arran Schlosberg
pragma solidity >=0.8.0 <0.9.0;
import "@openzeppelin/contracts/interfaces/IERC165.sol";
interface IKissRenderer is IERC165 {
/**
@notice Returns an image for an arbitrary seed.
*/
function draw(bytes32 seed) external pure returns (string memory);
/**
@notice Returns an image for an arbitrary string, which should be hashed and
propagated to draw(bytes32).
*/
function draw(string memory seed) external pure returns (string memory);
/**
@notice Returns a full token JSON metadata object, with image, as a data
URI.
*/
function tokenURI(uint256 tokenId, bytes32 seed)
external
view
returns (string memory);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 4 of 32 : EnumerableSet.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 5 of 32 : Math.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 6 of 32 : IERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 7 of 32 : ERC165Checker.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Library used to query support of an interface declared via {IERC165}.
*
* Note that these functions return the actual result of the query: they do not
* `revert` if an interface is not supported. It is up to the caller to decide
* what to do in these cases.
*/
library ERC165Checker {
// As per the EIP-165 spec, no interface should ever match 0xffffffff
bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;
/**
* @dev Returns true if `account` supports the {IERC165} interface,
*/
function supportsERC165(address account) internal view returns (bool) {
// Any contract that implements ERC165 must explicitly indicate support of
// InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
return
_supportsERC165Interface(account, type(IERC165).interfaceId) &&
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 8 of 32 : ERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 9 of 32 : ECDSA.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.0;
import "../Strings.sol";
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 10 of 32 : Strings.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 11 of 32 : Context.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^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 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) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 12 of 32 : Address.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @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
* ====
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 13 of 32 : IERC721Metadata.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 14 of 32 : ERC721Pausable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol)
pragma solidity ^0.8.0;
import "../ERC721.sol";
import "../../../security/Pausable.sol";
/**
* @dev ERC721 token with pausable token transfers, minting and burning.
*
* Useful for scenarios such as preventing trades until the end of an evaluation
* period, or having an emergency switch for freezing all token transfers in the
* event of a large bug.
*/
abstract contract ERC721Pausable is ERC721, Pausable {
/**
* @dev See {ERC721-_beforeTokenTransfer}.
*
* Requirements:
*
* - the contract must not be paused.
*/
function _beforeTokenTransfer(
address from,
address to,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 15 of 32 : IERC721Receiver.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity ^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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 16 of 32 : IERC721.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 17 of 32 : ERC721.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)
pragma solidity ^0.8.0;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 18 of 32 : ReentrancyGuard.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 19 of 32 : Pausable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 20 of 32 : IERC721.sol
1
2
3
4
5
6
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol)
pragma solidity ^0.8.0;
import "../token/ERC721/IERC721.sol";
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 21 of 32 : IERC2981.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Interface for the NFT Royalty Standard
*/
interface IERC2981 is IERC165 {
/**
* @dev 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 `salePrice`
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 22 of 32 : IERC165.sol
1
2
3
4
5
6
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)
pragma solidity ^0.8.0;
import "../utils/introspection/IERC165.sol";
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 23 of 32 : Ownable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^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.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 24 of 32 : OwnerPausable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier)
pragma solidity >=0.8.0 <0.9.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
/// @notice A Pausable contract that can only be toggled by the Owner.
contract OwnerPausable is Ownable, Pausable {
/// @notice Pauses the contract.
function pause() public onlyOwner {
Pausable._pause();
}
/// @notice Unpauses the contract.
function unpause() public onlyOwner {
Pausable._unpause();
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 25 of 32 : Monotonic.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier)
pragma solidity >=0.8.0 <0.9.0;
/**
@notice Provides monotonic increasing and decreasing values, similar to
OpenZeppelin's Counter but (a) limited in direction, and (b) allowing for steps
> 1.
*/
library Monotonic {
/**
@notice Holds a value that can only increase.
@dev The internal value MUST NOT be accessed directly. Instead use current()
and add().
*/
struct Increaser {
uint256 value;
}
/// @notice Returns the current value of the Increaser.
function current(Increaser storage incr) internal view returns (uint256) {
return incr.value;
}
/// @notice Adds x to the Increaser's value.
function add(Increaser storage incr, uint256 x) internal {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 26 of 32 : ProxyRegistry.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier)
pragma solidity >=0.8.0 <0.9.0;
/// @notice A minimal interface describing OpenSea's Wyvern proxy registry.
contract ProxyRegistry {
mapping(address => OwnableDelegateProxy) public proxies;
}
/**
@dev This pattern of using an empty contract is cargo-culted directly from
OpenSea's example code. TODO: it's likely that the above mapping can be changed
to address => address without affecting anything, but further investigation is
needed (i.e. is there a subtle reason that OpenSea released it like this?).
*/
contract OwnableDelegateProxy {
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 27 of 32 : OpenSeaGasFreeListing.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier)
pragma solidity >=0.8.0 <0.9.0;
// Inspired by BaseOpenSea by Simon Fremaux (@dievardump) but without the need
// to pass specific addresses depending on deployment network.
// https://gist.github.com/dievardump/483eb43bc6ed30b14f01e01842e3339b/
import "./ProxyRegistry.sol";
/// @notice Library to achieve gas-free listings on OpenSea.
library OpenSeaGasFreeListing {
/**
@notice Returns whether the operator is an OpenSea proxy for the owner, thus
allowing it to list without the token owner paying gas.
@dev ERC{721,1155}.isApprovedForAll should be overriden to also check if
this function returns true.
*/
function isApprovedForAll(address owner, address operator)
internal
view
returns (bool)
{
address proxy = proxyFor(owner);
return proxy != address(0) && proxy == operator;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 28 of 32 : Seller.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier)
pragma solidity >=0.8.0 <0.9.0;
import "../utils/Monotonic.sol";
import "../utils/OwnerPausable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
/**
@notice An abstract contract providing the _purchase() function to:
- Enforce per-wallet / per-transaction limits
- Calculate required cost, forwarding to a beneficiary, and refunding extra
*/
abstract contract Seller is OwnerPausable, ReentrancyGuard {
using Address for address payable;
using Monotonic for Monotonic.Increaser;
using Strings for uint256;
/**
@dev Note that the address limits are vulnerable to wallet farming.
@param maxPerAddress Unlimited if zero.
@param maxPerTex Unlimited if zero.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 29 of 32 : ArbitraryPriceSeller.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 the ethier authors (github.com/divergencetech/ethier)
pragma solidity >=0.8.0 <0.9.0;
import "./Seller.sol";
/**
@dev The Seller base contract has a convenience function _purchase(to,n) that
calls the standard function as _purchase(to,n,0). This would result in a free
purchase, to the convenience variant is overriden and always reverts with this
error.
*/
error ImplicitFreePurchase();
/**
@notice A Seller with an arbitrary price passed in externally.
*/
abstract contract ArbitraryPriceSeller is Seller {
constructor(
Seller.SellerConfig memory sellerConfig,
address payable _beneficiary
) Seller(sellerConfig, _beneficiary) {}
/**
@notice Block accidental usage of the convenience function that would
default to a free sale.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 30 of 32 : ERC721Redeemer.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// Copyright (c) 2022 the ethier authors (github.com/divergencetech/ethier)
pragma solidity >=0.8.0 <0.9.0;
import "@openzeppelin/contracts/interfaces/IERC721.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
/**
@notice Allows holders of ERC721 tokens to redeem rights to some claim; for
example, the right to mint a token of some other collection.
*/
library ERC721Redeemer {
using Strings for uint256;
/**
@notice Storage value to track already-claimed redemptions for a specific
token collection.
*/
struct Claims {
/**
@dev This field MUST NOT be considered part of the public API. Instead,
prefer `using ERC721Redeemer for ERC721Redeemer.Claims` and utilise the
provided functions.
*/
mapping(uint256 => uint256) _total;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 31 of 32 : ERC721Common.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier)
pragma solidity >=0.8.0 <0.9.0;
import "../thirdparty/opensea/OpenSeaGasFreeListing.sol";
import "../utils/OwnerPausable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol";
import "@openzeppelin/contracts/utils/Context.sol";
/**
@notice An ERC721 contract with common functionality:
- OpenSea gas-free listings
- OpenZeppelin Pausable
- OpenZeppelin Pausable with functions exposed to Owner only
*/
contract ERC721Common is Context, ERC721Pausable, OwnerPausable {
constructor(string memory name, string memory symbol)
ERC721(name, symbol)
{}
/// @notice Requires that the token exists.
modifier tokenExists(uint256 tokenId) {
require(ERC721._exists(tokenId), "ERC721Common: Token doesn't exist");
_;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 32 of 32 : SignatureChecker.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier)
pragma solidity >=0.8.0 <0.9.0;
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
/**
@title SignatureChecker
@notice Additional functions for EnumerableSet.Addresset that require a valid
ECDSA signature of a standardized message, signed by any member of the set.
*/
library SignatureChecker {
using EnumerableSet for EnumerableSet.AddressSet;
/**
@notice Requires that the message has not been used previously and that the
recovered signer is contained in the signers AddressSet.
@dev Convenience wrapper for message generation + signature verification
+ marking message as used
@param signers Set of addresses from which signatures are accepted.
@param usedMessages Set of already-used messages.
@param signature ECDSA signature of message.
*/
function requireValidSignature(
EnumerableSet.AddressSet storage signers,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"remappings": [],
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "london",
"libraries": {},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_renderer","type":"address"},{"internalType":"contract IERC721","name":"_poaw","type":"address"},{"internalType":"contract IERC721","name":"_brotchain","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"numPurchased","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Revenue","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"addSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"brot","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"brotchainClaimsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"poawIds","type":"uint256[]"},{"internalType":"uint256[]","name":"brotIds","type":"uint256[]"}],"name":"claimCollectorMints","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"collectorMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectorPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"},{"internalType":"uint256","name":"costEach","type":"uint256"}],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockRenderer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockSeeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"n","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintWithSignature","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poaw","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"poawClaimsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"n","type":"uint256"}],"name":"purchaseFreeOfCharge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"removeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renderer","outputs":[{"internalType":"contract IKissRenderer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rendererLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"renewSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seeds","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seedsLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellerConfig","outputs":[{"internalType":"uint256","name":"totalInventory","type":"uint256"},{"internalType":"uint256","name":"maxPerAddress","type":"uint256"},{"internalType":"uint256","name":"maxPerTx","type":"uint256"},{"internalType":"uint248","name":"freeQuota","type":"uint248"},{"internalType":"bool","name":"reserveFreeQuota","type":"bool"},{"internalType":"bool","name":"lockFreeQuota","type":"bool"},{"internalType":"bool","name":"lockTotalInventory","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_collectorMinting","type":"bool"}],"name":"setCollectorMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"public_","type":"uint256"},{"internalType":"uint256","name":"collectors","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_publicMinter","type":"address"}],"name":"setPublicMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_renderer","type":"address"}],"name":"setRenderer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"basisPoints","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"totalInventory","type":"uint256"},{"internalType":"uint256","name":"maxPerAddress","type":"uint256"},{"internalType":"uint256","name":"maxPerTx","type":"uint256"},{"internalType":"uint248","name":"freeQuota","type":"uint248"},{"internalType":"bool","name":"reserveFreeQuota","type":"bool"},{"internalType":"bool","name":"lockFreeQuota","type":"bool"},{"internalType":"bool","name":"lockTotalInventory","type":"bool"}],"internalType":"struct Seller.SellerConfig","name":"config","type":"tuple"}],"name":"setSellerConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedMessages","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c060405267045c1df22dfdf00060115567038d7ea4c68000006012556013805460ff60a01b19169055601b805460ff60ff60a81b01191690556103e8601c553480156200004c57600080fd5b5060405162004a9b38038062004a9b8339810160408190526200006f916200062b565b6040805160e0810182526104008152600060208083018290528284018290526014606084015260016080840181905260a0840183905260c084015283518085018552601081526f546865204b697373205072656369736560801b818301908152855180870190965260048652634b49535360e01b9286019290925280519394735d484c0546679aace24c330b301cc6badfa60259948694869484928492620001199290916200056c565b5080516200012f9060019060208401906200056c565b5050506200014c62000146620001a160201b60201c565b620001a5565b50506006805460ff60a01b1916905560016007556200016b82620001f7565b62000176816200043a565b5050506001600160a01b03808416608052821660a052506200019883620004a7565b505050620006bc565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b03163314620002465760405162461bcd60e51b8152602060048201819052602482015260008051602062004a7b83398151915260448201526064015b60405180910390fd5b80606001516001600160f81b031681600001511015620002a95760405162461bcd60e51b815260206004820152601c60248201527f53656c6c65723a2065786365737369766520667265652071756f74610000000060448201526064016200023d565b620002c0600e6200056860201b62001b5b1760201c565b81511015620003125760405162461bcd60e51b815260206004820181905260248201527f53656c6c65723a20696e76656e746f7279203c20616c726561647920736f6c6460448201526064016200023d565b6200032960106200056860201b62001b5b1760201c565b81606001516001600160f81b03161015620003915760405162461bcd60e51b815260206004820152602160248201527f53656c6c65723a20667265652071756f7461203c20616c7265616479207573656044820152601960fa1b60648201526084016200023d565b600c54610100900460ff1615620003af57600160c082015260085481525b600c5460ff1615620003d457600160a0820152600b546001600160f81b031660608201525b805160085560208101516009556040810151600a55606081015160808201511515600160f81b026001600160f81b0390911617600b5560a0810151600c805460c09093015115156101000261ff00199215159290921661ffff1990931692909217179055565b6006546001600160a01b03163314620004855760405162461bcd60e51b8152602060048201819052602482015260008051602062004a7b83398151915260448201526064016200023d565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314620004f25760405162461bcd60e51b8152602060048201819052602482015260008051602062004a7b83398151915260448201526064016200023d565b601b54600160a81b900460ff1615620005405760405162461bcd60e51b815260206004820152600f60248201526e14995b99195c995c881b1bd8dad959608a1b60448201526064016200023d565b601b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b5490565b8280546200057a906200067f565b90600052602060002090601f0160209004810192826200059e5760008555620005e9565b82601f10620005b957805160ff1916838001178555620005e9565b82800160010185558215620005e9579182015b82811115620005e9578251825591602001919060010190620005cc565b50620005f7929150620005fb565b5090565b5b80821115620005f75760008155600101620005fc565b6001600160a01b03811681146200062857600080fd5b50565b6000806000606084860312156200064157600080fd5b83516200064e8162000612565b6020850151909350620006618162000612565b6040850151909250620006748162000612565b809150509250925092565b600181811c908216806200069457607f821691505b60208210811415620006b657634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05161437d620006fe600039600081816108210152818161116c01526117aa01526000818161099701528181611114015261143e015261437d6000f3fe6080604052600436106103505760003560e01c806376997548116101c6578063a945bf80116100f7578063d6c878c511610095578063ec9e1c331161006f578063ec9e1c3314610a19578063f0503e8014610a39578063f2fde38b14610a66578063f7d9757714610a8657600080fd5b8063d6c878c5146109b9578063e985e9c5146109d9578063eb12d61e146109f957600080fd5b8063bf62e21d116100d1578063bf62e21d14610925578063c4ec98cc14610945578063c87b56dd14610965578063cc70813b1461098557600080fd5b8063a945bf8014610864578063b88d4fde1461087a578063bb69b7ef1461089a57600080fd5b80639560a90e116101645780639f93f7791161013e5780639f93f779146107dc578063a22cb465146107ef578063a3246b8d1461080f578063a52526991461084357600080fd5b80639560a90e1461079c57806395d89b41146107b25780639c8a2bfd146107c757600080fd5b8063891c77ec116101a0578063891c77ec1461072f5780638ada6b0f146107445780638da5cb5b146107695780639106d7ba1461078757600080fd5b806376997548146106e7578063774a2f6f146106fa5780638456cb591461071a57600080fd5b806338af3eed116102a05780635a0284001161023e5780636352211e116102185780636352211e146106725780636e6ca9581461069257806370a08231146106b2578063715018a6146106d257600080fd5b80635a028400146106025780635c975abb146106325780636094a0701461065157600080fd5b806342260b5d1161027a57806342260b5d1461059257806342842e0e146105a8578063551ba053146105c857806356d3163d146105e257600080fd5b806338af3eed1461053d5780633ec02e141461055d5780633f4ba83a1461057d57600080fd5b806318160ddd1161030d5780632a55205a116102e75780632a55205a146104ab5780632b80183f146104ea5780632f274bd41461050a578063368412ee1461052a57600080fd5b806318160ddd146104465780631c31f7101461046b57806323b872dd1461048b57600080fd5b806301ffc9a71461035557806306fdde031461038a578063081812fc146103ac578063095ea7b3146103e45780630e316ab71461040657806313e7c1d514610426575b600080fd5b34801561036157600080fd5b50610375610370366004613919565b610aa6565b60405190151581526020015b60405180910390f35b34801561039657600080fd5b5061039f610ad1565b604051610381919061398e565b3480156103b857600080fd5b506103cc6103c73660046139a1565b610b63565b6040516001600160a01b039091168152602001610381565b3480156103f057600080fd5b506104046103ff3660046139cf565b610bfd565b005b34801561041257600080fd5b506104046104213660046139fb565b610d13565b34801561043257600080fd5b506104046104413660046139fb565b610d4c565b34801561045257600080fd5b5060195461045d9081565b604051908152602001610381565b34801561047757600080fd5b506104046104863660046139fb565b610d98565b34801561049757600080fd5b506104046104a6366004613a18565b610de4565b3480156104b757600080fd5b506104cb6104c6366004613a59565b610e15565b604080516001600160a01b039093168352602083019190915201610381565b3480156104f657600080fd5b506104046105053660046139a1565b610e50565b34801561051657600080fd5b50610404610525366004613b09565b610eb9565b610404610538366004613bd9565b6110a7565b34801561054957600080fd5b50600d546103cc906001600160a01b031681565b34801561056957600080fd5b5061045d610578366004613a59565b6111a0565b34801561058957600080fd5b506104046111b3565b34801561059e57600080fd5b5061045d601c5481565b3480156105b457600080fd5b506104046105c3366004613a18565b6111e7565b3480156105d457600080fd5b50601b546103759060ff1681565b3480156105ee57600080fd5b506104046105fd3660046139fb565b611202565b34801561060e57600080fd5b5061037561061d3660046139a1565b60186020526000908152604090205460ff1681565b34801561063e57600080fd5b50600654600160a01b900460ff16610375565b34801561065d57600080fd5b50601b5461037590600160a81b900460ff1681565b34801561067e57600080fd5b506103cc61068d3660046139a1565b6112a0565b34801561069e57600080fd5b506013546103cc906001600160a01b031681565b3480156106be57600080fd5b5061045d6106cd3660046139fb565b611317565b3480156106de57600080fd5b5061040461139e565b6104046106f5366004613c45565b6113d2565b34801561070657600080fd5b5061045d6107153660046139a1565b611437565b34801561072657600080fd5b50610404611467565b34801561073b57600080fd5b50610404611499565b34801561075057600080fd5b50601b546103cc9061010090046001600160a01b031681565b34801561077557600080fd5b506006546001600160a01b03166103cc565b34801561079357600080fd5b5061045d6114d2565b3480156107a857600080fd5b5061045d60125481565b3480156107be57600080fd5b5061039f6114e2565b3480156107d357600080fd5b506104046114f1565b6104046107ea3660046139cf565b611592565b3480156107fb57600080fd5b5061040461080a366004613cd2565b6115f1565b34801561081b57600080fd5b506103cc7f000000000000000000000000000000000000000000000000000000000000000081565b34801561084f57600080fd5b5060135461037590600160a01b900460ff1681565b34801561087057600080fd5b5061045d60115481565b34801561088657600080fd5b50610404610895366004613d33565b6115fc565b3480156108a657600080fd5b50600854600954600a54600b54600c546108e2949392916001600160f81b0381169160ff600160f81b9092048216918181169161010090041687565b604080519788526020880196909652948601939093526001600160f81b03909116606085015215156080840152151560a0830152151560c082015260e001610381565b34801561093157600080fd5b506104046109403660046139cf565b61162e565b34801561095157600080fd5b5061045d6109603660046139a1565b6117a3565b34801561097157600080fd5b5061039f6109803660046139a1565b6117d3565b34801561099157600080fd5b506103cc7f000000000000000000000000000000000000000000000000000000000000000081565b3480156109c557600080fd5b506104046109d43660046139a1565b6118f4565b3480156109e557600080fd5b506103756109f4366004613de2565b6119d3565b348015610a0557600080fd5b50610404610a143660046139fb565b611a0e565b348015610a2557600080fd5b50610404610a34366004613e10565b611a43565b348015610a4557600080fd5b5061045d610a543660046139a1565b601a6020526000908152604090205481565b348015610a7257600080fd5b50610404610a813660046139fb565b611a8b565b348015610a9257600080fd5b50610404610aa1366004613a59565b611b26565b60006001600160e01b0319821663152a902d60e11b1480610acb5750610acb82611b5f565b92915050565b606060008054610ae090613e2d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0c90613e2d565b8015610b595780601f10610b2e57610100808354040283529160200191610b59565b820191906000526020600020905b815481529060010190602001808311610b3c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610be15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c08826112a0565b9050806001600160a01b0316836001600160a01b03161415610c765760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bd8565b336001600160a01b0382161480610c925750610c9281336119d3565b610d045760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bd8565b610d0e8383611b6a565b505050565b6006546001600160a01b03163314610d3d5760405162461bcd60e51b8152600401610bd890613e62565b610d48601682611bd8565b5050565b6006546001600160a01b03163314610d765760405162461bcd60e51b8152600401610bd890613e62565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610dc25760405162461bcd60e51b8152600401610bd890613e62565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b610dee3382611bed565b610e0a5760405162461bcd60e51b8152600401610bd890613e97565b610d0e838383611cc4565b600d54601c5460009182916001600160a01b039091169061271090610e3a9086613efe565b610e449190613f33565b915091505b9250929050565b6006546001600160a01b03163314610e7a5760405162461bcd60e51b8152600401610bd890613e62565b612710811115610eb45760405162461bcd60e51b81526020600482015260056024820152643e3130302560d81b6044820152606401610bd8565b601c55565b6006546001600160a01b03163314610ee35760405162461bcd60e51b8152600401610bd890613e62565b80606001516001600160f81b031681600001511015610f445760405162461bcd60e51b815260206004820152601c60248201527f53656c6c65723a2065786365737369766520667265652071756f7461000000006044820152606401610bd8565b600e5481511015610f975760405162461bcd60e51b815260206004820181905260248201527f53656c6c65723a20696e76656e746f7279203c20616c726561647920736f6c646044820152606401610bd8565b60105481606001516001600160f81b031610156110005760405162461bcd60e51b815260206004820152602160248201527f53656c6c65723a20667265652071756f7461203c20616c7265616479207573656044820152601960fa1b6064820152608401610bd8565b600c54610100900460ff161561101d57600160c082015260085481525b600c5460ff161561104157600160a0820152600b546001600160f81b031660608201525b805160085560208101516009556040810151600a55606081015160808201511515600160f81b026001600160f81b0390911617600b5560a0810151600c805460c09093015115156101000261ff00199215159290921661ffff1990931692909217179055565b601354600160a01b900460ff166111005760405162461bcd60e51b815260206004820152601860248201527f436f6c6c6563746f72206d696e74696e6720636c6f73656400000000000000006044820152606401610bd8565b821561115e576111593361113a60146001837f00000000000000000000000000000000000000000000000000000000000000008a8a611e6f565b611145906002613efe565b60026012546111549190613f33565b612118565b61119a565b61119a3361119260156001837f00000000000000000000000000000000000000000000000000000000000000008888611e6f565b601254612118565b50505050565b60006111ac8284613efe565b9392505050565b6006546001600160a01b031633146111dd5760405162461bcd60e51b8152600401610bd890613e62565b6111e56125f6565b565b610d0e838383604051806020016040528060008152506115fc565b6006546001600160a01b0316331461122c5760405162461bcd60e51b8152600401610bd890613e62565b601b54600160a81b900460ff16156112785760405162461bcd60e51b815260206004820152600f60248201526e14995b99195c995c881b1bd8dad959608a1b6044820152606401610bd8565b601b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000818152600260205260408120546001600160a01b031680610acb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bd8565b60006001600160a01b0382166113825760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bd8565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146113c85760405162461bcd60e51b8152600401610bd890613e62565b6111e56000612693565b6040516bffffffffffffffffffffffff193360601b1660208201526034810186905260548101859052607481018490526114259060940160408051601f19818403018152919052601690848460186126e5565b611430338686612118565b5050505050565b6000610acb7f0000000000000000000000000000000000000000000000000000000000000000601460018561278e565b6006546001600160a01b031633146114915760405162461bcd60e51b8152600401610bd890613e62565b6111e561280f565b6006546001600160a01b031633146114c35760405162461bcd60e51b8152600401610bd890613e62565b601b805460ff19166001179055565b60006114dd600e5490565b905090565b606060018054610ae090613e2d565b6006546001600160a01b0316331461151b5760405162461bcd60e51b8152600401610bd890613e62565b601b5461153d9061010090046001600160a01b0316630e94d5cf60e21b612874565b61157d5760405162461bcd60e51b81526020600482015260116024820152702737ba1024a5b4b9b9a932b73232b932b960791b6044820152606401610bd8565b601b805460ff60a81b1916600160a81b179055565b6013546001600160a01b031633146115e45760405162461bcd60e51b8152602060048201526015602482015274446972656374207075626c6963206d696e74696e6760581b6044820152606401610bd8565b610d488282601154612118565b610d48338383612890565b6116063383611bed565b6116225760405162461bcd60e51b8152600401610bd890613e97565b61119a8484848461295f565b6006546001600160a01b031633146116585760405162461bcd60e51b8152600401610bd890613e62565b600654600160a01b900460ff16156116825760405162461bcd60e51b8152600401610bd890613f47565b600b546001600160f81b03166116aa8261169b60105490565b6116a59084613f71565b612992565b9150600082116116fc5760405162461bcd60e51b815260206004820152601b60248201527f53656c6c65723a20467265652071756f746120657863656564656400000000006044820152606401610bd8565b60085461170c8361169b600e5490565b9250600083116117515760405162461bcd60e51b815260206004820152601060248201526f14d95b1b195c8e8814dbdb19081bdd5d60821b6044820152606401610bd8565b61175d848460016129a8565b611768600e84612a74565b611773601084612a74565b8061177d600e5490565b111561178b5761178b613f88565b8161179560105490565b111561119a5761119a613f88565b6000610acb7f0000000000000000000000000000000000000000000000000000000000000000601560018561278e565b6060816117f7816000908152600260205260409020546001600160a01b0316151590565b6118135760405162461bcd60e51b8152600401610bd890613f9e565b601b5461010090046001600160a01b031661185e5760405162461bcd60e51b815260206004820152600b60248201526a2737903932b73232b932b960a91b6044820152606401610bd8565b601b546000848152601a602052604090819020549051631ecf701b60e31b81526004810186905260248101919091526101009091046001600160a01b03169063f67b80d890604401600060405180830381865afa1580156118c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118eb9190810190613fdf565b91505b50919050565b60008181526002602052604090205481906001600160a01b031661192a5760405162461bcd60e51b8152600401610bd890613f9e565b6006546001600160a01b031633146119545760405162461bcd60e51b8152600401610bd890613e62565b601b5460ff16156119965760405162461bcd60e51b815260206004820152600c60248201526b14d959591cc81b1bd8dad95960a21b6044820152606401610bd8565b506000818152601a602081815260408084208054825180850191909152825180820385018152908301909252815191830191909120949093525255565b6001600160a01b03808316600090815260056020908152604080832093851683529290529081205460ff16806111ac57506111ac8383612a91565b6006546001600160a01b03163314611a385760405162461bcd60e51b8152600401610bd890613e62565b610d48601682612ad0565b6006546001600160a01b03163314611a6d5760405162461bcd60e51b8152600401610bd890613e62565b60138054911515600160a01b0260ff60a01b19909216919091179055565b6006546001600160a01b03163314611ab55760405162461bcd60e51b8152600401610bd890613e62565b6001600160a01b038116611b1a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bd8565b611b2381612693565b50565b6006546001600160a01b03163314611b505760405162461bcd60e51b8152600401610bd890613e62565b601191909155601255565b5490565b6000610acb82612ae5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b9f826112a0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006111ac836001600160a01b038416612b35565b6000818152600260205260408120546001600160a01b0316611c665760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bd8565b6000611c71836112a0565b9050806001600160a01b0316846001600160a01b03161480611cac5750836001600160a01b0316611ca184610b63565b6001600160a01b0316145b80611cbc5750611cbc81856119d3565b949350505050565b826001600160a01b0316611cd7826112a0565b6001600160a01b031614611d3f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bd8565b6001600160a01b038216611da15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bd8565b611dac838383612c28565b611db7600082611b6a565b6001600160a01b0383166000908152600360205260408120805460019290611de0908490613f71565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e0e90849061404d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000851580611e7c575081155b15611e895750600061210e565b6001861160005b83811015612108576000858583818110611eac57611eac614065565b905060200201359050876001600160a01b0316876001600160a01b0316636352211e836040518263ffffffff1660e01b8152600401611eed91815260200190565b602060405180830381865afa158015611f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2e919061407b565b6001600160a01b031614158015611fba575060405163020604bf60e21b8152600481018290526001600160a01b03808a16919089169063081812fc90602401602060405180830381865afa158015611f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fae919061407b565b6001600160a01b031614155b15611fe157611fe16040518060600160405280602981526020016142fd6029913982612c33565b60018315612044576000611ff684600161404d565b90505b868110801561201f57508288888381811061201657612016614065565b90506020020135145b15612036578061202e81614098565b915050611ff9565b6120408482613f71565b9150505b600082815260208c905260408120805483929061206290849061404d565b9091555050600082815260208c905260409020548a101561209f5761209f6040518060600160405280602281526020016143266022913983612c33565b6120a9818461404d565b9250886001600160a01b0316886001600160a01b03167fa28d80c9910787c0c058ed9b50c577f1389264bf61563fa45529e0771976f56284846040516120f9929190918252602082015260400190565b60405180910390a35050611e90565b50829150505b9695505050505050565b6002600754141561216b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bd8565b6002600755600654600160a01b900460ff161561219a5760405162461bcd60e51b8152600401610bd890613f47565b6040805160e08101825260085481526009546020820152600a54918101829052600b546001600160f81b038116606083015260ff600160f81b909104811615156080830152600c54808216151560a0840152610100900416151560c0820152906000901561221557612210848360400151612992565b612217565b835b905060008083608001511561225f5760608401518451612240916001600160f81b031690613f71565b915061224b60105490565b600e546122589190613f71565b905061226f565b8351915061226c600e5490565b90505b61227d836116a58385613f71565b9250600083116122c25760405162461bcd60e51b815260206004820152601060248201526f14d95b1b195c8e8814dbdb19081bdd5d60821b6044820152606401610bd8565b60208401511561241e57336001600160a01b0388168114159060009032148015906122f65750326001600160a01b038a1614155b9050612326858a6040518060400160405280600b81526020016a109d5e595c881b1a5b5a5d60aa1b815250612c4e565b945081156123605761235d85336040518060400160405280600c81526020016b14d95b99195c881b1a5b5a5d60a21b815250612c4e565b94505b80156123985761239585326040518060400160405280600c81526020016b13dc9a59da5b881b1a5b5a5d60a21b815250612c4e565b94505b6001600160a01b0389166000908152600f6020526040812080548792906123c090849061404d565b909155505081156123f057336000908152600f6020526040812080548792906123ea90849061404d565b90915550505b801561241b57326000908152600f60205260408120805487929061241590849061404d565b90915550505b50505b600061242a84876111a0565b9050803410156124805761244a612445633b9aca0083613f33565b612c97565b60405160200161245a91906140b3565b60408051601f198184030181529082905262461bcd60e51b8252610bd89160040161398e565b61248c888560006129a8565b612497600e85612a74565b8451600e5411156124aa576124aa613f88565b801561250f57600d546124c6906001600160a01b031682612d95565b600d5460408051868152602081018490526001600160a01b03909216917f01f51b99bd1c3cca301836178e5dee13aadfe44eff06dc3ddcbf3c9d058454f8910160405180910390a25b803411156125e7573360006125248334613f71565b9050600080836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612574576040519150601f19603f3d011682016040523d82523d6000602084013e612579565b606091505b509150915081819061259e5760405162461bcd60e51b8152600401610bd8919061398e565b50836001600160a01b03167fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d846040516125da91815260200190565b60405180910390a2505050505b50506001600755505050505050565b600654600160a01b900460ff166126465760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bd8565b6006805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006126f085612eae565b60008181526020849052604090205490915060ff16156127615760405162461bcd60e51b815260206004820152602660248201527f5369676e6174757265436865636b65723a204d65737361676520616c726561646044820152651e481d5cd95960d21b6064820152608401610bd8565b6000818152602083905260409020805460ff1916600117905561278686828686612eb9565b505050505050565b6040516331a9108f60e11b8152600481018290526000906001600160a01b03861690636352211e90602401602060405180830381865afa1580156127d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fa919061407b565b50612806848484612f1d565b95945050505050565b600654600160a01b900460ff16156128395760405162461bcd60e51b8152600401610bd890613f47565b6006805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126763390565b600061287f83612f36565b80156111ac57506111ac8383612f69565b816001600160a01b0316836001600160a01b031614156128f25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bd8565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61296a848484611cc4565b61297684848484613048565b61119a5760405162461bcd60e51b8152600401610bd8906140f8565b60008183106129a157816111ac565b5090919050565b60006129b360195490565b905060006129c1848361404d565b6040516bffffffffffffffffffffffff1930606090811b8216602084015241811b8216603484015243604884015288901b166068820152909150600090607c0160405160208183030381529060405290505b81831015612a6d57612a258684613143565b8083604051602001612a3892919061414a565b60408051601f1981840301815291815281516020928301206000868152601a909352912055612a6683614098565b9250612a13565b6127866019865b80826000016000828254612a88919061404d565b90915550505050565b600080612a9d8461315d565b90506001600160a01b03811615801590611cbc5750826001600160a01b0316816001600160a01b03161491505092915050565b60006111ac836001600160a01b0384166132b4565b60006001600160e01b031982166380ac58cd60e01b1480612b1657506001600160e01b03198216635b5e139f60e01b145b80610acb57506301ffc9a760e01b6001600160e01b0319831614610acb565b60008181526001830160205260408120548015612c1e576000612b59600183613f71565b8554909150600090612b6d90600190613f71565b9050818114612bd2576000866000018281548110612b8d57612b8d614065565b9060005260206000200154905080876000018481548110612bb057612bb0614065565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612be357612be361416c565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610acb565b6000915050610acb565b610d0e838383613303565b81612c3d82612c97565b60405160200161245a929190614182565b6001600160a01b0382166000908152600f60205260408120546009548291612c7591613f71565b905080612c8d578260405160200161245a91906141be565b6128068582612992565b606081612cbb5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612ce55780612ccf81614098565b9150612cde9050600a83613f33565b9150612cbf565b60008167ffffffffffffffff811115612d0057612d00613a7b565b6040519080825280601f01601f191660200182016040528015612d2a576020820181803683370190505b5090505b8415611cbc57612d3f600183613f71565b9150612d4c600a866141ee565b612d5790603061404d565b60f81b818381518110612d6c57612d6c614065565b60200101906001600160f81b031916908160001a905350612d8e600a86613f33565b9450612d2e565b80471015612de55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bd8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612e32576040519150601f19603f3d011682016040523d82523d6000602084013e612e37565b606091505b5050905080610d0e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bd8565b6000610acb82613371565b612ec5848484846133ac565b61119a5760405162461bcd60e51b815260206004820152602360248201527f5369676e6174757265436865636b65723a20496e76616c6964207369676e617460448201526275726560e81b6064820152608401610bd8565b600081815260208490526040812054611cbc9084613f71565b6000612f49826301ffc9a760e01b612f69565b8015610acb5750612f62826001600160e01b0319612f69565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b179052905160009190829081906001600160a01b0387169061753090612fd0908690614202565b6000604051808303818686fa925050503d806000811461300c576040519150601f19603f3d011682016040523d82523d6000602084013e613011565b606091505b509150915060208151101561302c5760009350505050610acb565b81801561210e57508080602001905181019061210e919061421e565b60006001600160a01b0384163b1561313b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061308c90339089908890889060040161423b565b6020604051808303816000875af19250505080156130c7575060408051601f3d908101601f191682019092526130c49181019061426e565b60015b613121573d8080156130f5576040519150601f19603f3d011682016040523d82523d6000602084013e6130fa565b606091505b5080516131195760405162461bcd60e51b8152600401610bd8906140f8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611cbc565b506001611cbc565b610d488282604051806020016040528060008152506133f8565b60008046806001811461319257608981146131ae57600481146131ca576201388181146131e65761053981146132025761321a565b73a5409ec958c83c3f309868babaca7c86dcb077c1925061321a565b7358807bad0b376efc12f5ad86aac70e78ed67deae925061321a565b73f57b2c51ded3a29e6891aba85459d600256cf317925061321a565b73ff7ca10af37178bdd056628ef42fd7f799fac77c925061321a565b73e1a2bbc877b29adbc56d2659dbcb0ae14ee6207192505b506001600160a01b03821615806132315750806089145b8061323e57508062013881145b1561324a575092915050565b60405163c455279160e01b81526001600160a01b03858116600483015283169063c455279190602401602060405180830381865afa158015613290573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbc919061407b565b60008181526001830160205260408120546132fb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610acb565b506000610acb565b600654600160a01b900460ff1615610d0e5760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b6064820152608401610bd8565b600061337d8251612c97565b8260405160200161338f92919061428b565b604051602081830303815290604052805190602001209050919050565b60006128066133f18585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061342b92505050565b869061344f565b6134028383613471565b61340f6000848484613048565b610d0e5760405162461bcd60e51b8152600401610bd8906140f8565b600080600061343a85856135bf565b915091506134478161362c565b509392505050565b6001600160a01b038116600090815260018301602052604081205415156111ac565b6001600160a01b0382166134c75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bd8565b6000818152600260205260409020546001600160a01b03161561352c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bd8565b61353860008383612c28565b6001600160a01b038216600090815260036020526040812080546001929061356190849061404d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000808251604114156135f65760208301516040840151606085015160001a6135ea878285856137e7565b94509450505050610e49565b82516040141561362057602083015160408401516136158683836138d4565b935093505050610e49565b50600090506002610e49565b6000816004811115613640576136406142e6565b14156136495750565b600181600481111561365d5761365d6142e6565b14156136ab5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bd8565b60028160048111156136bf576136bf6142e6565b141561370d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bd8565b6003816004811115613721576137216142e6565b141561377a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bd8565b600481600481111561378e5761378e6142e6565b1415611b235760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610bd8565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561381e57506000905060036138cb565b8460ff16601b1415801561383657508460ff16601c14155b1561384757506000905060046138cb565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561389b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166138c4576000600192509250506138cb565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016138f5878288856137e7565b935093505050935093915050565b6001600160e01b031981168114611b2357600080fd5b60006020828403121561392b57600080fd5b81356111ac81613903565b60005b83811015613951578181015183820152602001613939565b8381111561119a5750506000910152565b6000815180845261397a816020860160208601613936565b601f01601f19169290920160200192915050565b6020815260006111ac6020830184613962565b6000602082840312156139b357600080fd5b5035919050565b6001600160a01b0381168114611b2357600080fd5b600080604083850312156139e257600080fd5b82356139ed816139ba565b946020939093013593505050565b600060208284031215613a0d57600080fd5b81356111ac816139ba565b600080600060608486031215613a2d57600080fd5b8335613a38816139ba565b92506020840135613a48816139ba565b929592945050506040919091013590565b60008060408385031215613a6c57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715613ab457613ab4613a7b565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ae357613ae3613a7b565b604052919050565b8015158114611b2357600080fd5b8035613b0481613aeb565b919050565b600060e08284031215613b1b57600080fd5b613b23613a91565b82358152602080840135908201526040808401359082015260608301356001600160f81b0381168114613b5557600080fd5b6060820152613b6660808401613af9565b6080820152613b7760a08401613af9565b60a0820152613b8860c08401613af9565b60c08201529392505050565b60008083601f840112613ba657600080fd5b50813567ffffffffffffffff811115613bbe57600080fd5b6020830191508360208260051b8501011115610e4957600080fd5b60008060008060408587031215613bef57600080fd5b843567ffffffffffffffff80821115613c0757600080fd5b613c1388838901613b94565b90965094506020870135915080821115613c2c57600080fd5b50613c3987828801613b94565b95989497509550505050565b600080600080600060808688031215613c5d57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff80821115613c8a57600080fd5b818801915088601f830112613c9e57600080fd5b813581811115613cad57600080fd5b896020828501011115613cbf57600080fd5b9699959850939650602001949392505050565b60008060408385031215613ce557600080fd5b8235613cf0816139ba565b91506020830135613d0081613aeb565b809150509250929050565b600067ffffffffffffffff821115613d2557613d25613a7b565b50601f01601f191660200190565b60008060008060808587031215613d4957600080fd5b8435613d54816139ba565b93506020850135613d64816139ba565b925060408501359150606085013567ffffffffffffffff811115613d8757600080fd5b8501601f81018713613d9857600080fd5b8035613dab613da682613d0b565b613aba565b818152886020838501011115613dc057600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215613df557600080fd5b8235613e00816139ba565b91506020830135613d00816139ba565b600060208284031215613e2257600080fd5b81356111ac81613aeb565b600181811c90821680613e4157607f821691505b602082108114156118ee57634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613f1857613f18613ee8565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613f4257613f42613f1d565b500490565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b600082821015613f8357613f83613ee8565b500390565b634e487b7160e01b600052600160045260246000fd5b60208082526021908201527f455243373231436f6d6d6f6e3a20546f6b656e20646f65736e277420657869736040820152601d60fa1b606082015260800190565b600060208284031215613ff157600080fd5b815167ffffffffffffffff81111561400857600080fd5b8201601f8101841361401957600080fd5b8051614027613da682613d0b565b81815285602083850101111561403c57600080fd5b612806826020830160208601613936565b6000821982111561406057614060613ee8565b500190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561408d57600080fd5b81516111ac816139ba565b60006000198214156140ac576140ac613ee8565b5060010190565b6d029b2b63632b91d1021b7b9ba39960951b8152600082516140dc81600e850160208701613936565b64204757656960d81b600e939091019283015250601301919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000835161415c818460208801613936565b9190910191825250602001919050565b634e487b7160e01b600052603160045260246000fd5b60008351614194818460208801613936565b600160fd1b90830190815283516141b2816001840160208801613936565b01600101949350505050565b67029b2b63632b91d160c51b8152600082516141e1816008850160208701613936565b9190910160080192915050565b6000826141fd576141fd613f1d565b500690565b60008251614214818460208701613936565b9190910192915050565b60006020828403121561423057600080fd5b81516111ac81613aeb565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061210e90830184613962565b60006020828403121561428057600080fd5b81516111ac81613903565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152600083516142c381601a850160208801613936565b8351908301906142da81601a840160208801613936565b01601a01949350505050565b634e487b7160e01b600052602160045260246000fdfe45524337323152656465656d65723a206e6f7420617070726f766564206e6f72206f776e6572206f6645524337323152656465656d65723a206f76657220616c6c6f77616e636520666f72a26469706673582212200d95baee1b5e229bb31530e91708cee8aaed6e187d578914d4bf09b99808a71464736f6c634300080b00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000d119e58b5761932a39c0d15103539b5dfec2386500000000000000000000000047ccad36ae77ab963746c8db8ad301d48235ce81000000000000000000000000d31fc221d2b0e0321c43e9f6824b26ebfff01d7d

Deployed Bytecode

0x6080604052600436106103505760003560e01c806376997548116101c6578063a945bf80116100f7578063d6c878c511610095578063ec9e1c331161006f578063ec9e1c3314610a19578063f0503e8014610a39578063f2fde38b14610a66578063f7d9757714610a8657600080fd5b8063d6c878c5146109b9578063e985e9c5146109d9578063eb12d61e146109f957600080fd5b8063bf62e21d116100d1578063bf62e21d14610925578063c4ec98cc14610945578063c87b56dd14610965578063cc70813b1461098557600080fd5b8063a945bf8014610864578063b88d4fde1461087a578063bb69b7ef1461089a57600080fd5b80639560a90e116101645780639f93f7791161013e5780639f93f779146107dc578063a22cb465146107ef578063a3246b8d1461080f578063a52526991461084357600080fd5b80639560a90e1461079c57806395d89b41146107b25780639c8a2bfd146107c757600080fd5b8063891c77ec116101a0578063891c77ec1461072f5780638ada6b0f146107445780638da5cb5b146107695780639106d7ba1461078757600080fd5b806376997548146106e7578063774a2f6f146106fa5780638456cb591461071a57600080fd5b806338af3eed116102a05780635a0284001161023e5780636352211e116102185780636352211e146106725780636e6ca9581461069257806370a08231146106b2578063715018a6146106d257600080fd5b80635a028400146106025780635c975abb146106325780636094a0701461065157600080fd5b806342260b5d1161027a57806342260b5d1461059257806342842e0e146105a8578063551ba053146105c857806356d3163d146105e257600080fd5b806338af3eed1461053d5780633ec02e141461055d5780633f4ba83a1461057d57600080fd5b806318160ddd1161030d5780632a55205a116102e75780632a55205a146104ab5780632b80183f146104ea5780632f274bd41461050a578063368412ee1461052a57600080fd5b806318160ddd146104465780631c31f7101461046b57806323b872dd1461048b57600080fd5b806301ffc9a71461035557806306fdde031461038a578063081812fc146103ac578063095ea7b3146103e45780630e316ab71461040657806313e7c1d514610426575b600080fd5b34801561036157600080fd5b50610375610370366004613919565b610aa6565b60405190151581526020015b60405180910390f35b34801561039657600080fd5b5061039f610ad1565b604051610381919061398e565b3480156103b857600080fd5b506103cc6103c73660046139a1565b610b63565b6040516001600160a01b039091168152602001610381565b3480156103f057600080fd5b506104046103ff3660046139cf565b610bfd565b005b34801561041257600080fd5b506104046104213660046139fb565b610d13565b34801561043257600080fd5b506104046104413660046139fb565b610d4c565b34801561045257600080fd5b5060195461045d9081565b604051908152602001610381565b34801561047757600080fd5b506104046104863660046139fb565b610d98565b34801561049757600080fd5b506104046104a6366004613a18565b610de4565b3480156104b757600080fd5b506104cb6104c6366004613a59565b610e15565b604080516001600160a01b039093168352602083019190915201610381565b3480156104f657600080fd5b506104046105053660046139a1565b610e50565b34801561051657600080fd5b50610404610525366004613b09565b610eb9565b610404610538366004613bd9565b6110a7565b34801561054957600080fd5b50600d546103cc906001600160a01b031681565b34801561056957600080fd5b5061045d610578366004613a59565b6111a0565b34801561058957600080fd5b506104046111b3565b34801561059e57600080fd5b5061045d601c5481565b3480156105b457600080fd5b506104046105c3366004613a18565b6111e7565b3480156105d457600080fd5b50601b546103759060ff1681565b3480156105ee57600080fd5b506104046105fd3660046139fb565b611202565b34801561060e57600080fd5b5061037561061d3660046139a1565b60186020526000908152604090205460ff1681565b34801561063e57600080fd5b50600654600160a01b900460ff16610375565b34801561065d57600080fd5b50601b5461037590600160a81b900460ff1681565b34801561067e57600080fd5b506103cc61068d3660046139a1565b6112a0565b34801561069e57600080fd5b506013546103cc906001600160a01b031681565b3480156106be57600080fd5b5061045d6106cd3660046139fb565b611317565b3480156106de57600080fd5b5061040461139e565b6104046106f5366004613c45565b6113d2565b34801561070657600080fd5b5061045d6107153660046139a1565b611437565b34801561072657600080fd5b50610404611467565b34801561073b57600080fd5b50610404611499565b34801561075057600080fd5b50601b546103cc9061010090046001600160a01b031681565b34801561077557600080fd5b506006546001600160a01b03166103cc565b34801561079357600080fd5b5061045d6114d2565b3480156107a857600080fd5b5061045d60125481565b3480156107be57600080fd5b5061039f6114e2565b3480156107d357600080fd5b506104046114f1565b6104046107ea3660046139cf565b611592565b3480156107fb57600080fd5b5061040461080a366004613cd2565b6115f1565b34801561081b57600080fd5b506103cc7f000000000000000000000000d31fc221d2b0e0321c43e9f6824b26ebfff01d7d81565b34801561084f57600080fd5b5060135461037590600160a01b900460ff1681565b34801561087057600080fd5b5061045d60115481565b34801561088657600080fd5b50610404610895366004613d33565b6115fc565b3480156108a657600080fd5b50600854600954600a54600b54600c546108e2949392916001600160f81b0381169160ff600160f81b9092048216918181169161010090041687565b604080519788526020880196909652948601939093526001600160f81b03909116606085015215156080840152151560a0830152151560c082015260e001610381565b34801561093157600080fd5b506104046109403660046139cf565b61162e565b34801561095157600080fd5b5061045d6109603660046139a1565b6117a3565b34801561097157600080fd5b5061039f6109803660046139a1565b6117d3565b34801561099157600080fd5b506103cc7f00000000000000000000000047ccad36ae77ab963746c8db8ad301d48235ce8181565b3480156109c557600080fd5b506104046109d43660046139a1565b6118f4565b3480156109e557600080fd5b506103756109f4366004613de2565b6119d3565b348015610a0557600080fd5b50610404610a143660046139fb565b611a0e565b348015610a2557600080fd5b50610404610a34366004613e10565b611a43565b348015610a4557600080fd5b5061045d610a543660046139a1565b601a6020526000908152604090205481565b348015610a7257600080fd5b50610404610a813660046139fb565b611a8b565b348015610a9257600080fd5b50610404610aa1366004613a59565b611b26565b60006001600160e01b0319821663152a902d60e11b1480610acb5750610acb82611b5f565b92915050565b606060008054610ae090613e2d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0c90613e2d565b8015610b595780601f10610b2e57610100808354040283529160200191610b59565b820191906000526020600020905b815481529060010190602001808311610b3c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610be15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c08826112a0565b9050806001600160a01b0316836001600160a01b03161415610c765760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bd8565b336001600160a01b0382161480610c925750610c9281336119d3565b610d045760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bd8565b610d0e8383611b6a565b505050565b6006546001600160a01b03163314610d3d5760405162461bcd60e51b8152600401610bd890613e62565b610d48601682611bd8565b5050565b6006546001600160a01b03163314610d765760405162461bcd60e51b8152600401610bd890613e62565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610dc25760405162461bcd60e51b8152600401610bd890613e62565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b610dee3382611bed565b610e0a5760405162461bcd60e51b8152600401610bd890613e97565b610d0e838383611cc4565b600d54601c5460009182916001600160a01b039091169061271090610e3a9086613efe565b610e449190613f33565b915091505b9250929050565b6006546001600160a01b03163314610e7a5760405162461bcd60e51b8152600401610bd890613e62565b612710811115610eb45760405162461bcd60e51b81526020600482015260056024820152643e3130302560d81b6044820152606401610bd8565b601c55565b6006546001600160a01b03163314610ee35760405162461bcd60e51b8152600401610bd890613e62565b80606001516001600160f81b031681600001511015610f445760405162461bcd60e51b815260206004820152601c60248201527f53656c6c65723a2065786365737369766520667265652071756f7461000000006044820152606401610bd8565b600e5481511015610f975760405162461bcd60e51b815260206004820181905260248201527f53656c6c65723a20696e76656e746f7279203c20616c726561647920736f6c646044820152606401610bd8565b60105481606001516001600160f81b031610156110005760405162461bcd60e51b815260206004820152602160248201527f53656c6c65723a20667265652071756f7461203c20616c7265616479207573656044820152601960fa1b6064820152608401610bd8565b600c54610100900460ff161561101d57600160c082015260085481525b600c5460ff161561104157600160a0820152600b546001600160f81b031660608201525b805160085560208101516009556040810151600a55606081015160808201511515600160f81b026001600160f81b0390911617600b5560a0810151600c805460c09093015115156101000261ff00199215159290921661ffff1990931692909217179055565b601354600160a01b900460ff166111005760405162461bcd60e51b815260206004820152601860248201527f436f6c6c6563746f72206d696e74696e6720636c6f73656400000000000000006044820152606401610bd8565b821561115e576111593361113a60146001837f00000000000000000000000047ccad36ae77ab963746c8db8ad301d48235ce818a8a611e6f565b611145906002613efe565b60026012546111549190613f33565b612118565b61119a565b61119a3361119260156001837f000000000000000000000000d31fc221d2b0e0321c43e9f6824b26ebfff01d7d8888611e6f565b601254612118565b50505050565b60006111ac8284613efe565b9392505050565b6006546001600160a01b031633146111dd5760405162461bcd60e51b8152600401610bd890613e62565b6111e56125f6565b565b610d0e838383604051806020016040528060008152506115fc565b6006546001600160a01b0316331461122c5760405162461bcd60e51b8152600401610bd890613e62565b601b54600160a81b900460ff16156112785760405162461bcd60e51b815260206004820152600f60248201526e14995b99195c995c881b1bd8dad959608a1b6044820152606401610bd8565b601b80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6000818152600260205260408120546001600160a01b031680610acb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bd8565b60006001600160a01b0382166113825760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bd8565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146113c85760405162461bcd60e51b8152600401610bd890613e62565b6111e56000612693565b6040516bffffffffffffffffffffffff193360601b1660208201526034810186905260548101859052607481018490526114259060940160408051601f19818403018152919052601690848460186126e5565b611430338686612118565b5050505050565b6000610acb7f00000000000000000000000047ccad36ae77ab963746c8db8ad301d48235ce81601460018561278e565b6006546001600160a01b031633146114915760405162461bcd60e51b8152600401610bd890613e62565b6111e561280f565b6006546001600160a01b031633146114c35760405162461bcd60e51b8152600401610bd890613e62565b601b805460ff19166001179055565b60006114dd600e5490565b905090565b606060018054610ae090613e2d565b6006546001600160a01b0316331461151b5760405162461bcd60e51b8152600401610bd890613e62565b601b5461153d9061010090046001600160a01b0316630e94d5cf60e21b612874565b61157d5760405162461bcd60e51b81526020600482015260116024820152702737ba1024a5b4b9b9a932b73232b932b960791b6044820152606401610bd8565b601b805460ff60a81b1916600160a81b179055565b6013546001600160a01b031633146115e45760405162461bcd60e51b8152602060048201526015602482015274446972656374207075626c6963206d696e74696e6760581b6044820152606401610bd8565b610d488282601154612118565b610d48338383612890565b6116063383611bed565b6116225760405162461bcd60e51b8152600401610bd890613e97565b61119a8484848461295f565b6006546001600160a01b031633146116585760405162461bcd60e51b8152600401610bd890613e62565b600654600160a01b900460ff16156116825760405162461bcd60e51b8152600401610bd890613f47565b600b546001600160f81b03166116aa8261169b60105490565b6116a59084613f71565b612992565b9150600082116116fc5760405162461bcd60e51b815260206004820152601b60248201527f53656c6c65723a20467265652071756f746120657863656564656400000000006044820152606401610bd8565b60085461170c8361169b600e5490565b9250600083116117515760405162461bcd60e51b815260206004820152601060248201526f14d95b1b195c8e8814dbdb19081bdd5d60821b6044820152606401610bd8565b61175d848460016129a8565b611768600e84612a74565b611773601084612a74565b8061177d600e5490565b111561178b5761178b613f88565b8161179560105490565b111561119a5761119a613f88565b6000610acb7f000000000000000000000000d31fc221d2b0e0321c43e9f6824b26ebfff01d7d601560018561278e565b6060816117f7816000908152600260205260409020546001600160a01b0316151590565b6118135760405162461bcd60e51b8152600401610bd890613f9e565b601b5461010090046001600160a01b031661185e5760405162461bcd60e51b815260206004820152600b60248201526a2737903932b73232b932b960a91b6044820152606401610bd8565b601b546000848152601a602052604090819020549051631ecf701b60e31b81526004810186905260248101919091526101009091046001600160a01b03169063f67b80d890604401600060405180830381865afa1580156118c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118eb9190810190613fdf565b91505b50919050565b60008181526002602052604090205481906001600160a01b031661192a5760405162461bcd60e51b8152600401610bd890613f9e565b6006546001600160a01b031633146119545760405162461bcd60e51b8152600401610bd890613e62565b601b5460ff16156119965760405162461bcd60e51b815260206004820152600c60248201526b14d959591cc81b1bd8dad95960a21b6044820152606401610bd8565b506000818152601a602081815260408084208054825180850191909152825180820385018152908301909252815191830191909120949093525255565b6001600160a01b03808316600090815260056020908152604080832093851683529290529081205460ff16806111ac57506111ac8383612a91565b6006546001600160a01b03163314611a385760405162461bcd60e51b8152600401610bd890613e62565b610d48601682612ad0565b6006546001600160a01b03163314611a6d5760405162461bcd60e51b8152600401610bd890613e62565b60138054911515600160a01b0260ff60a01b19909216919091179055565b6006546001600160a01b03163314611ab55760405162461bcd60e51b8152600401610bd890613e62565b6001600160a01b038116611b1a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bd8565b611b2381612693565b50565b6006546001600160a01b03163314611b505760405162461bcd60e51b8152600401610bd890613e62565b601191909155601255565b5490565b6000610acb82612ae5565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b9f826112a0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006111ac836001600160a01b038416612b35565b6000818152600260205260408120546001600160a01b0316611c665760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bd8565b6000611c71836112a0565b9050806001600160a01b0316846001600160a01b03161480611cac5750836001600160a01b0316611ca184610b63565b6001600160a01b0316145b80611cbc5750611cbc81856119d3565b949350505050565b826001600160a01b0316611cd7826112a0565b6001600160a01b031614611d3f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bd8565b6001600160a01b038216611da15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bd8565b611dac838383612c28565b611db7600082611b6a565b6001600160a01b0383166000908152600360205260408120805460019290611de0908490613f71565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e0e90849061404d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000851580611e7c575081155b15611e895750600061210e565b6001861160005b83811015612108576000858583818110611eac57611eac614065565b905060200201359050876001600160a01b0316876001600160a01b0316636352211e836040518263ffffffff1660e01b8152600401611eed91815260200190565b602060405180830381865afa158015611f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2e919061407b565b6001600160a01b031614158015611fba575060405163020604bf60e21b8152600481018290526001600160a01b03808a16919089169063081812fc90602401602060405180830381865afa158015611f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fae919061407b565b6001600160a01b031614155b15611fe157611fe16040518060600160405280602981526020016142fd6029913982612c33565b60018315612044576000611ff684600161404d565b90505b868110801561201f57508288888381811061201657612016614065565b90506020020135145b15612036578061202e81614098565b915050611ff9565b6120408482613f71565b9150505b600082815260208c905260408120805483929061206290849061404d565b9091555050600082815260208c905260409020548a101561209f5761209f6040518060600160405280602281526020016143266022913983612c33565b6120a9818461404d565b9250886001600160a01b0316886001600160a01b03167fa28d80c9910787c0c058ed9b50c577f1389264bf61563fa45529e0771976f56284846040516120f9929190918252602082015260400190565b60405180910390a35050611e90565b50829150505b9695505050505050565b6002600754141561216b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bd8565b6002600755600654600160a01b900460ff161561219a5760405162461bcd60e51b8152600401610bd890613f47565b6040805160e08101825260085481526009546020820152600a54918101829052600b546001600160f81b038116606083015260ff600160f81b909104811615156080830152600c54808216151560a0840152610100900416151560c0820152906000901561221557612210848360400151612992565b612217565b835b905060008083608001511561225f5760608401518451612240916001600160f81b031690613f71565b915061224b60105490565b600e546122589190613f71565b905061226f565b8351915061226c600e5490565b90505b61227d836116a58385613f71565b9250600083116122c25760405162461bcd60e51b815260206004820152601060248201526f14d95b1b195c8e8814dbdb19081bdd5d60821b6044820152606401610bd8565b60208401511561241e57336001600160a01b0388168114159060009032148015906122f65750326001600160a01b038a1614155b9050612326858a6040518060400160405280600b81526020016a109d5e595c881b1a5b5a5d60aa1b815250612c4e565b945081156123605761235d85336040518060400160405280600c81526020016b14d95b99195c881b1a5b5a5d60a21b815250612c4e565b94505b80156123985761239585326040518060400160405280600c81526020016b13dc9a59da5b881b1a5b5a5d60a21b815250612c4e565b94505b6001600160a01b0389166000908152600f6020526040812080548792906123c090849061404d565b909155505081156123f057336000908152600f6020526040812080548792906123ea90849061404d565b90915550505b801561241b57326000908152600f60205260408120805487929061241590849061404d565b90915550505b50505b600061242a84876111a0565b9050803410156124805761244a612445633b9aca0083613f33565b612c97565b60405160200161245a91906140b3565b60408051601f198184030181529082905262461bcd60e51b8252610bd89160040161398e565b61248c888560006129a8565b612497600e85612a74565b8451600e5411156124aa576124aa613f88565b801561250f57600d546124c6906001600160a01b031682612d95565b600d5460408051868152602081018490526001600160a01b03909216917f01f51b99bd1c3cca301836178e5dee13aadfe44eff06dc3ddcbf3c9d058454f8910160405180910390a25b803411156125e7573360006125248334613f71565b9050600080836001600160a01b03168360405160006040518083038185875af1925050503d8060008114612574576040519150601f19603f3d011682016040523d82523d6000602084013e612579565b606091505b509150915081819061259e5760405162461bcd60e51b8152600401610bd8919061398e565b50836001600160a01b03167fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d846040516125da91815260200190565b60405180910390a2505050505b50506001600755505050505050565b600654600160a01b900460ff166126465760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bd8565b6006805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006126f085612eae565b60008181526020849052604090205490915060ff16156127615760405162461bcd60e51b815260206004820152602660248201527f5369676e6174757265436865636b65723a204d65737361676520616c726561646044820152651e481d5cd95960d21b6064820152608401610bd8565b6000818152602083905260409020805460ff1916600117905561278686828686612eb9565b505050505050565b6040516331a9108f60e11b8152600481018290526000906001600160a01b03861690636352211e90602401602060405180830381865afa1580156127d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fa919061407b565b50612806848484612f1d565b95945050505050565b600654600160a01b900460ff16156128395760405162461bcd60e51b8152600401610bd890613f47565b6006805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126763390565b600061287f83612f36565b80156111ac57506111ac8383612f69565b816001600160a01b0316836001600160a01b031614156128f25760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bd8565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61296a848484611cc4565b61297684848484613048565b61119a5760405162461bcd60e51b8152600401610bd8906140f8565b60008183106129a157816111ac565b5090919050565b60006129b360195490565b905060006129c1848361404d565b6040516bffffffffffffffffffffffff1930606090811b8216602084015241811b8216603484015243604884015288901b166068820152909150600090607c0160405160208183030381529060405290505b81831015612a6d57612a258684613143565b8083604051602001612a3892919061414a565b60408051601f1981840301815291815281516020928301206000868152601a909352912055612a6683614098565b9250612a13565b6127866019865b80826000016000828254612a88919061404d565b90915550505050565b600080612a9d8461315d565b90506001600160a01b03811615801590611cbc5750826001600160a01b0316816001600160a01b03161491505092915050565b60006111ac836001600160a01b0384166132b4565b60006001600160e01b031982166380ac58cd60e01b1480612b1657506001600160e01b03198216635b5e139f60e01b145b80610acb57506301ffc9a760e01b6001600160e01b0319831614610acb565b60008181526001830160205260408120548015612c1e576000612b59600183613f71565b8554909150600090612b6d90600190613f71565b9050818114612bd2576000866000018281548110612b8d57612b8d614065565b9060005260206000200154905080876000018481548110612bb057612bb0614065565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612be357612be361416c565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610acb565b6000915050610acb565b610d0e838383613303565b81612c3d82612c97565b60405160200161245a929190614182565b6001600160a01b0382166000908152600f60205260408120546009548291612c7591613f71565b905080612c8d578260405160200161245a91906141be565b6128068582612992565b606081612cbb5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612ce55780612ccf81614098565b9150612cde9050600a83613f33565b9150612cbf565b60008167ffffffffffffffff811115612d0057612d00613a7b565b6040519080825280601f01601f191660200182016040528015612d2a576020820181803683370190505b5090505b8415611cbc57612d3f600183613f71565b9150612d4c600a866141ee565b612d5790603061404d565b60f81b818381518110612d6c57612d6c614065565b60200101906001600160f81b031916908160001a905350612d8e600a86613f33565b9450612d2e565b80471015612de55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bd8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612e32576040519150601f19603f3d011682016040523d82523d6000602084013e612e37565b606091505b5050905080610d0e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bd8565b6000610acb82613371565b612ec5848484846133ac565b61119a5760405162461bcd60e51b815260206004820152602360248201527f5369676e6174757265436865636b65723a20496e76616c6964207369676e617460448201526275726560e81b6064820152608401610bd8565b600081815260208490526040812054611cbc9084613f71565b6000612f49826301ffc9a760e01b612f69565b8015610acb5750612f62826001600160e01b0319612f69565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b179052905160009190829081906001600160a01b0387169061753090612fd0908690614202565b6000604051808303818686fa925050503d806000811461300c576040519150601f19603f3d011682016040523d82523d6000602084013e613011565b606091505b509150915060208151101561302c5760009350505050610acb565b81801561210e57508080602001905181019061210e919061421e565b60006001600160a01b0384163b1561313b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061308c90339089908890889060040161423b565b6020604051808303816000875af19250505080156130c7575060408051601f3d908101601f191682019092526130c49181019061426e565b60015b613121573d8080156130f5576040519150601f19603f3d011682016040523d82523d6000602084013e6130fa565b606091505b5080516131195760405162461bcd60e51b8152600401610bd8906140f8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611cbc565b506001611cbc565b610d488282604051806020016040528060008152506133f8565b60008046806001811461319257608981146131ae57600481146131ca576201388181146131e65761053981146132025761321a565b73a5409ec958c83c3f309868babaca7c86dcb077c1925061321a565b7358807bad0b376efc12f5ad86aac70e78ed67deae925061321a565b73f57b2c51ded3a29e6891aba85459d600256cf317925061321a565b73ff7ca10af37178bdd056628ef42fd7f799fac77c925061321a565b73e1a2bbc877b29adbc56d2659dbcb0ae14ee6207192505b506001600160a01b03821615806132315750806089145b8061323e57508062013881145b1561324a575092915050565b60405163c455279160e01b81526001600160a01b03858116600483015283169063c455279190602401602060405180830381865afa158015613290573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbc919061407b565b60008181526001830160205260408120546132fb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610acb565b506000610acb565b600654600160a01b900460ff1615610d0e5760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b6064820152608401610bd8565b600061337d8251612c97565b8260405160200161338f92919061428b565b604051602081830303815290604052805190602001209050919050565b60006128066133f18585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061342b92505050565b869061344f565b6134028383613471565b61340f6000848484613048565b610d0e5760405162461bcd60e51b8152600401610bd8906140f8565b600080600061343a85856135bf565b915091506134478161362c565b509392505050565b6001600160a01b038116600090815260018301602052604081205415156111ac565b6001600160a01b0382166134c75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bd8565b6000818152600260205260409020546001600160a01b03161561352c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bd8565b61353860008383612c28565b6001600160a01b038216600090815260036020526040812080546001929061356190849061404d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000808251604114156135f65760208301516040840151606085015160001a6135ea878285856137e7565b94509450505050610e49565b82516040141561362057602083015160408401516136158683836138d4565b935093505050610e49565b50600090506002610e49565b6000816004811115613640576136406142e6565b14156136495750565b600181600481111561365d5761365d6142e6565b14156136ab5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bd8565b60028160048111156136bf576136bf6142e6565b141561370d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bd8565b6003816004811115613721576137216142e6565b141561377a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bd8565b600481600481111561378e5761378e6142e6565b1415611b235760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610bd8565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561381e57506000905060036138cb565b8460ff16601b1415801561383657508460ff16601c14155b1561384757506000905060046138cb565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561389b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166138c4576000600192509250506138cb565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016138f5878288856137e7565b935093505050935093915050565b6001600160e01b031981168114611b2357600080fd5b60006020828403121561392b57600080fd5b81356111ac81613903565b60005b83811015613951578181015183820152602001613939565b8381111561119a5750506000910152565b6000815180845261397a816020860160208601613936565b601f01601f19169290920160200192915050565b6020815260006111ac6020830184613962565b6000602082840312156139b357600080fd5b5035919050565b6001600160a01b0381168114611b2357600080fd5b600080604083850312156139e257600080fd5b82356139ed816139ba565b946020939093013593505050565b600060208284031215613a0d57600080fd5b81356111ac816139ba565b600080600060608486031215613a2d57600080fd5b8335613a38816139ba565b92506020840135613a48816139ba565b929592945050506040919091013590565b60008060408385031215613a6c57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715613ab457613ab4613a7b565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613ae357613ae3613a7b565b604052919050565b8015158114611b2357600080fd5b8035613b0481613aeb565b919050565b600060e08284031215613b1b57600080fd5b613b23613a91565b82358152602080840135908201526040808401359082015260608301356001600160f81b0381168114613b5557600080fd5b6060820152613b6660808401613af9565b6080820152613b7760a08401613af9565b60a0820152613b8860c08401613af9565b60c08201529392505050565b60008083601f840112613ba657600080fd5b50813567ffffffffffffffff811115613bbe57600080fd5b6020830191508360208260051b8501011115610e4957600080fd5b60008060008060408587031215613bef57600080fd5b843567ffffffffffffffff80821115613c0757600080fd5b613c1388838901613b94565b90965094506020870135915080821115613c2c57600080fd5b50613c3987828801613b94565b95989497509550505050565b600080600080600060808688031215613c5d57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff80821115613c8a57600080fd5b818801915088601f830112613c9e57600080fd5b813581811115613cad57600080fd5b896020828501011115613cbf57600080fd5b9699959850939650602001949392505050565b60008060408385031215613ce557600080fd5b8235613cf0816139ba565b91506020830135613d0081613aeb565b809150509250929050565b600067ffffffffffffffff821115613d2557613d25613a7b565b50601f01601f191660200190565b60008060008060808587031215613d4957600080fd5b8435613d54816139ba565b93506020850135613d64816139ba565b925060408501359150606085013567ffffffffffffffff811115613d8757600080fd5b8501601f81018713613d9857600080fd5b8035613dab613da682613d0b565b613aba565b818152886020838501011115613dc057600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215613df557600080fd5b8235613e00816139ba565b91506020830135613d00816139ba565b600060208284031215613e2257600080fd5b81356111ac81613aeb565b600181811c90821680613e4157607f821691505b602082108114156118ee57634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613f1857613f18613ee8565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613f4257613f42613f1d565b500490565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b600082821015613f8357613f83613ee8565b500390565b634e487b7160e01b600052600160045260246000fd5b60208082526021908201527f455243373231436f6d6d6f6e3a20546f6b656e20646f65736e277420657869736040820152601d60fa1b606082015260800190565b600060208284031215613ff157600080fd5b815167ffffffffffffffff81111561400857600080fd5b8201601f8101841361401957600080fd5b8051614027613da682613d0b565b81815285602083850101111561403c57600080fd5b612806826020830160208601613936565b6000821982111561406057614060613ee8565b500190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561408d57600080fd5b81516111ac816139ba565b60006000198214156140ac576140ac613ee8565b5060010190565b6d029b2b63632b91d1021b7b9ba39960951b8152600082516140dc81600e850160208701613936565b64204757656960d81b600e939091019283015250601301919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000835161415c818460208801613936565b9190910191825250602001919050565b634e487b7160e01b600052603160045260246000fd5b60008351614194818460208801613936565b600160fd1b90830190815283516141b2816001840160208801613936565b01600101949350505050565b67029b2b63632b91d160c51b8152600082516141e1816008850160208701613936565b9190910160080192915050565b6000826141fd576141fd613f1d565b500690565b60008251614214818460208701613936565b9190910192915050565b60006020828403121561423057600080fd5b81516111ac81613aeb565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061210e90830184613962565b60006020828403121561428057600080fd5b81516111ac81613903565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152600083516142c381601a850160208801613936565b8351908301906142da81601a840160208801613936565b01601a01949350505050565b634e487b7160e01b600052602160045260246000fdfe45524337323152656465656d65723a206e6f7420617070726f766564206e6f72206f776e6572206f6645524337323152656465656d65723a206f76657220616c6c6f77616e636520666f72a26469706673582212200d95baee1b5e229bb31530e91708cee8aaed6e187d578914d4bf09b99808a71464736f6c634300080b0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d119e58b5761932a39c0d15103539b5dfec2386500000000000000000000000047ccad36ae77ab963746c8db8ad301d48235ce81000000000000000000000000d31fc221d2b0e0321c43e9f6824b26ebfff01d7d

-----Decoded View---------------
Arg [0] : _renderer (address): 0xD119E58b5761932A39C0D15103539b5DfEc23865
Arg [1] : _poaw (address): 0x47CcAD36Ae77aB963746c8Db8aD301d48235cE81
Arg [2] : _brotchain (address): 0xd31fC221D2b0E0321C43E9F6824b26ebfFf01D7D

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000d119e58b5761932a39c0d15103539b5dfec23865
Arg [1] : 00000000000000000000000047ccad36ae77ab963746c8db8ad301d48235ce81
Arg [2] : 000000000000000000000000d31fc221d2b0e0321c43e9f6824b26ebfff01d7d


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.