BEP-1155
Source Code
Overview
Max Total Supply
0REFI1155
Holders
11,120
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
RefinableERC1155Token
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at BscScan.com on 2021-10-20
*/
// File: @openzeppelin/contracts/cryptography/ECDSA.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @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 {
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
// Check the signature length
if (signature.length != 65) {
revert("ECDSA: invalid signature length");
}
// Divide the signature in r, s and v variables
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
// solhint-disable-next-line no-inline-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return recover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
require(signer != address(0), "ECDSA: invalid signature");
return signer;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* replicates the behavior of the
* https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
* JSON-RPC method.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
}
// File: @openzeppelin/contracts/introspection/IERC165.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/introspection/ERC165.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
abstract contract ERC165 is IERC165 {
/*
* bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
*/
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
/**
* @dev Mapping of interface ids to whether or not it's supported.
*/
mapping(bytes4 => bool) private _supportedInterfaces;
constructor () internal {
// Derived contracts need only register support for their own interfaces,
// we register support for ERC165 itself here
_registerInterface(_INTERFACE_ID_ERC165);
}
/**
* @dev See {IERC165-supportsInterface}.
*
* Time complexity O(1), guaranteed to always use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return _supportedInterfaces[interfaceId];
}
/**
* @dev Registers the contract as an implementer of the interface defined by
* `interfaceId`. Support of the actual ERC165 interface is automatic and
* registering its interface id is not required.
*
* See {IERC165-supportsInterface}.
*
* Requirements:
*
* - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
*/
function _registerInterface(bytes4 interfaceId) internal virtual {
require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
_supportedInterfaces[interfaceId] = true;
}
}
// File: contracts/tokens/HasSecondarySaleFees.sol
pragma solidity ^0.6.12;
abstract contract HasSecondarySaleFees is ERC165 {
event SecondarySaleFees(uint256 tokenId, address[] recipients, uint[] bps);
/*
* bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f
* bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb
*
* => 0x0ebd4c7f ^ 0xb9c4d9fb == 0xb7799584
*/
bytes4 private constant _INTERFACE_ID_FEES = 0xb7799584;
constructor() public {
_registerInterface(_INTERFACE_ID_FEES);
}
function getFeeRecipients(uint256 id) public virtual view returns (address payable[] memory);
function getFeeBps(uint256 id) public virtual view returns (uint[] memory);
}
// File: contracts/tokens/HasContractURI.sol
pragma solidity ^0.6.12;
contract HasContractURI is ERC165 {
string public contractURI;
/*
* bytes4(keccak256('contractURI()')) == 0xe8a3d485
*/
bytes4 private constant _INTERFACE_ID_CONTRACT_URI = 0xe8a3d485;
constructor(string memory _contractURI) public {
contractURI = _contractURI;
_registerInterface(_INTERFACE_ID_CONTRACT_URI);
}
/**
* @dev Internal function to set the contract URI
* @param _contractURI string URI prefix to assign
*/
function _setContractURI(string memory _contractURI) internal {
contractURI = _contractURI;
}
}
// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}
// File: @openzeppelin/contracts/token/ERC1155/IERC1155MetadataURI.sol
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Interface of the optional ERC1155MetadataExtension interface, as defined
* in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
*
* _Available since v3.1._
*/
interface IERC1155MetadataURI is IERC1155 {
/**
* @dev Returns the URI for token type `id`.
*
* If the `\{id\}` substring is present in the URI, it must be replaced by
* clients with the actual token type ID.
*/
function uri(uint256 id) external view returns (string memory);
}
// File: contracts/libs/UintLibrary.sol
pragma solidity ^0.6.12;
library UintLibrary {
function toString(uint256 _i) internal pure returns (string memory) {
if (_i == 0) {
return "0";
}
uint j = _i;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len - 1;
while (_i != 0) {
bstr[k--] = byte(uint8(48 + _i % 10));
_i /= 10;
}
return string(bstr);
}
}
// File: contracts/libs/StringLibrary.sol
pragma solidity ^0.6.12;
library StringLibrary {
using UintLibrary for uint256;
function append(string memory _a, string memory _b) internal pure returns (string memory) {
bytes memory _ba = bytes(_a);
bytes memory _bb = bytes(_b);
bytes memory bab = new bytes(_ba.length + _bb.length);
uint k = 0;
for (uint i = 0; i < _ba.length; i++) bab[k++] = _ba[i];
for (uint i = 0; i < _bb.length; i++) bab[k++] = _bb[i];
return string(bab);
}
function append(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) {
bytes memory _ba = bytes(_a);
bytes memory _bb = bytes(_b);
bytes memory _bc = bytes(_c);
bytes memory bbb = new bytes(_ba.length + _bb.length + _bc.length);
uint k = 0;
for (uint i = 0; i < _ba.length; i++) bbb[k++] = _ba[i];
for (uint i = 0; i < _bb.length; i++) bbb[k++] = _bb[i];
for (uint i = 0; i < _bc.length; i++) bbb[k++] = _bc[i];
return string(bbb);
}
function recover(string memory message, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
bytes memory msgBytes = bytes(message);
bytes memory fullMessage = concat(
bytes("\x19Ethereum Signed Message:\n"),
bytes(msgBytes.length.toString()),
msgBytes,
new bytes(0), new bytes(0), new bytes(0), new bytes(0)
);
return ecrecover(keccak256(fullMessage), v, r, s);
}
function concat(bytes memory _ba, bytes memory _bb, bytes memory _bc, bytes memory _bd, bytes memory _be, bytes memory _bf, bytes memory _bg) internal pure returns (bytes memory) {
bytes memory resultBytes = new bytes(_ba.length + _bb.length + _bc.length + _bd.length + _be.length + _bf.length + _bg.length);
uint k = 0;
for (uint i = 0; i < _ba.length; i++) resultBytes[k++] = _ba[i];
for (uint i = 0; i < _bb.length; i++) resultBytes[k++] = _bb[i];
for (uint i = 0; i < _bc.length; i++) resultBytes[k++] = _bc[i];
for (uint i = 0; i < _bd.length; i++) resultBytes[k++] = _bd[i];
for (uint i = 0; i < _be.length; i++) resultBytes[k++] = _be[i];
for (uint i = 0; i < _bf.length; i++) resultBytes[k++] = _bf[i];
for (uint i = 0; i < _bg.length; i++) resultBytes[k++] = _bg[i];
return resultBytes;
}
}
// File: contracts/tokens/HasTokenURI.sol
pragma solidity ^0.6.12;
contract HasTokenURI {
using StringLibrary for string;
//Token URI prefix
string public tokenURIPrefix;
// Optional mapping for token URIs
mapping(uint256 => string) private _tokenURIs;
constructor(string memory _tokenURIPrefix) public {
tokenURIPrefix = _tokenURIPrefix;
}
/**
* @dev Returns an URI for a given token ID.
* Throws if the token ID does not exist. May return an empty string.
* @param tokenId uint256 ID of the token to query
*/
function _tokenURI(uint256 tokenId) internal view returns (string memory) {
return tokenURIPrefix.append(_tokenURIs[tokenId]);
}
/**
* @dev Internal function to set the token URI for a given token.
* Reverts if the token ID does not exist.
* @param tokenId uint256 ID of the token to set its URI
* @param uri string URI to assign
*/
function _setTokenURI(uint256 tokenId, string memory uri) virtual internal {
_tokenURIs[tokenId] = uri;
}
/**
* @dev Internal function to set the token URI prefix.
* @param _tokenURIPrefix string URI prefix to assign
*/
function _setTokenURIPrefix(string memory _tokenURIPrefix) internal {
tokenURIPrefix = _tokenURIPrefix;
}
function _clearTokenURI(uint256 tokenId) internal {
if (bytes(_tokenURIs[tokenId]).length != 0) {
delete _tokenURIs[tokenId];
}
}
}
// File: contracts/tokens/ERC1155Metadata_URI.sol
pragma solidity ^0.6.12;
/**
Note: The ERC-165 identifier for this interface is 0x0e89341c.
*/
abstract contract ERC1155Metadata_URI is IERC1155MetadataURI, HasTokenURI {
constructor(string memory _tokenURIPrefix) HasTokenURI(_tokenURIPrefix) public {
}
function uri(uint256 _id) override virtual external view returns (string memory) {
return _tokenURI(_id);
}
}
// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
@dev Handles the receipt of a single ERC1155 token type. This function is
called at the end of a `safeTransferFrom` after the balance has been updated.
To accept the transfer, this must return
`bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
(i.e. 0xf23a6e61, or its own function selector).
@param operator The address which initiated the transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param id The ID of the token being transferred
@param value The amount of tokens being transferred
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
)
external
returns(bytes4);
/**
@dev Handles the receipt of a multiple ERC1155 token types. This function
is called at the end of a `safeBatchTransferFrom` after the balances have
been updated. To accept the transfer(s), this must return
`bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
(i.e. 0xbc197c81, or its own function selector).
@param operator The address which initiated the batch transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param ids An array containing ids of each token being transferred (order and length must match values array)
@param values An array containing amounts of each token being transferred (order and length must match ids array)
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
)
external
returns(bytes4);
}
// File: @openzeppelin/contracts/utils/Context.sol
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity >=0.6.2 <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
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol
pragma solidity >=0.6.0 <0.8.0;
/**
*
* @dev Implementation of the basic standard multi-token.
* See https://eips.ethereum.org/EIPS/eip-1155
* Originally based on code by Enjin: https://github.com/enjin/erc-1155
*
* _Available since v3.1._
*/
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
using SafeMath for uint256;
using Address for address;
// Mapping from token ID to account balances
mapping (uint256 => mapping(address => uint256)) private _balances;
// Mapping from account to operator approvals
mapping (address => mapping(address => bool)) private _operatorApprovals;
// Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
string private _uri;
/*
* bytes4(keccak256('balanceOf(address,uint256)')) == 0x00fdd58e
* bytes4(keccak256('balanceOfBatch(address[],uint256[])')) == 0x4e1273f4
* bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
* bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
* bytes4(keccak256('safeTransferFrom(address,address,uint256,uint256,bytes)')) == 0xf242432a
* bytes4(keccak256('safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)')) == 0x2eb2c2d6
*
* => 0x00fdd58e ^ 0x4e1273f4 ^ 0xa22cb465 ^
* 0xe985e9c5 ^ 0xf242432a ^ 0x2eb2c2d6 == 0xd9b67a26
*/
bytes4 private constant _INTERFACE_ID_ERC1155 = 0xd9b67a26;
/*
* bytes4(keccak256('uri(uint256)')) == 0x0e89341c
*/
bytes4 private constant _INTERFACE_ID_ERC1155_METADATA_URI = 0x0e89341c;
/**
* @dev See {_setURI}.
*/
constructor (string memory uri_) public {
_setURI(uri_);
// register the supported interfaces to conform to ERC1155 via ERC165
_registerInterface(_INTERFACE_ID_ERC1155);
// register the supported interfaces to conform to ERC1155MetadataURI via ERC165
_registerInterface(_INTERFACE_ID_ERC1155_METADATA_URI);
}
/**
* @dev See {IERC1155MetadataURI-uri}.
*
* This implementation returns the same URI for *all* token types. It relies
* on the token type ID substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256) external view virtual override returns (string memory) {
return _uri;
}
/**
* @dev See {IERC1155-balanceOf}.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
require(account != address(0), "ERC1155: balance query for the zero address");
return _balances[id][account];
}
/**
* @dev See {IERC1155-balanceOfBatch}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(
address[] memory accounts,
uint256[] memory ids
)
public
view
virtual
override
returns (uint256[] memory)
{
require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
/**
* @dev See {IERC1155-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(_msgSender() != operator, "ERC1155: setting approval status for self");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC1155-isApprovedForAll}.
*/
function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
return _operatorApprovals[account][operator];
}
/**
* @dev See {IERC1155-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
)
public
virtual
override
{
require(to != address(0), "ERC1155: transfer to the zero address");
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: caller is not owner nor approved"
);
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);
_balances[id][from] = _balances[id][from].sub(amount, "ERC1155: insufficient balance for transfer");
_balances[id][to] = _balances[id][to].add(amount);
emit TransferSingle(operator, from, to, id, amount);
_doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}
/**
* @dev See {IERC1155-safeBatchTransferFrom}.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
)
public
virtual
override
{
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
require(to != address(0), "ERC1155: transfer to the zero address");
require(
from == _msgSender() || isApprovedForAll(from, _msgSender()),
"ERC1155: transfer caller is not owner nor approved"
);
address operator = _msgSender();
_beforeTokenTransfer(operator, from, to, ids, amounts, data);
for (uint256 i = 0; i < ids.length; ++i) {
uint256 id = ids[i];
uint256 amount = amounts[i];
_balances[id][from] = _balances[id][from].sub(
amount,
"ERC1155: insufficient balance for transfer"
);
_balances[id][to] = _balances[id][to].add(amount);
}
emit TransferBatch(operator, from, to, ids, amounts);
_doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
}
/**
* @dev Sets a new URI for all token types, by relying on the token type ID
* substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* By this mechanism, any occurrence of the `\{id\}` substring in either the
* URI or any of the amounts in the JSON file at said URI will be replaced by
* clients with the token type ID.
*
* For example, the `https://token-cdn-domain/\{id\}.json` URI would be
* interpreted by clients as
* `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
* for token type ID 0x4cce0.
*
* See {uri}.
*
* Because these URIs cannot be meaningfully represented by the {URI} event,
* this function emits no events.
*/
function _setURI(string memory newuri) internal virtual {
_uri = newuri;
}
/**
* @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual {
require(account != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);
_balances[id][account] = _balances[id][account].add(amount);
emit TransferSingle(operator, address(0), account, id, amount);
_doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
for (uint i = 0; i < ids.length; i++) {
_balances[ids[i]][to] = amounts[i].add(_balances[ids[i]][to]);
}
emit TransferBatch(operator, address(0), to, ids, amounts);
_doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
}
/**
* @dev Destroys `amount` tokens of token type `id` from `account`
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens of token type `id`.
*/
function _burn(address account, uint256 id, uint256 amount) internal virtual {
require(account != address(0), "ERC1155: burn from the zero address");
address operator = _msgSender();
_beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");
_balances[id][account] = _balances[id][account].sub(
amount,
"ERC1155: burn amount exceeds balance"
);
emit TransferSingle(operator, account, address(0), id, amount);
}
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
*/
function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual {
require(account != address(0), "ERC1155: burn from the zero address");
require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
address operator = _msgSender();
_beforeTokenTransfer(operator, account, address(0), ids, amounts, "");
for (uint i = 0; i < ids.length; i++) {
_balances[ids[i]][account] = _balances[ids[i]][account].sub(
amounts[i],
"ERC1155: burn amount exceeds balance"
);
}
emit TransferBatch(operator, account, address(0), ids, amounts);
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning, as well as batched variants.
*
* The same hook is called on both single and batched variants. For single
* transfers, the length of the `id` and `amount` arrays will be 1.
*
* Calling conditions (for each `id` and `amount` pair):
*
* - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* of token type `id` will be transferred to `to`.
* - When `from` is zero, `amount` tokens of token type `id` will be minted
* for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
* will be burned.
* - `from` and `to` are never both zero.
* - `ids` and `amounts` have the same, non-zero length.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
)
internal
virtual
{ }
function _doSafeTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
)
private
{
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
if (response != IERC1155Receiver(to).onERC1155Received.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non ERC1155Receiver implementer");
}
}
}
function _doSafeBatchTransferAcceptanceCheck(
address operator,
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
)
private
{
if (to.isContract()) {
try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) {
if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
revert("ERC1155: ERC1155Receiver rejected tokens");
}
} catch Error(string memory reason) {
revert(reason);
} catch {
revert("ERC1155: transfer to non ERC1155Receiver implementer");
}
}
}
function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
uint256[] memory array = new uint256[](1);
array[0] = element;
return array;
}
}
// File: contracts/libs/Ownable.sol
pragma solidity ^0.6.12;
abstract contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() public {
_owner = msg.sender;
emit OwnershipTransferred(address(0), msg.sender);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == msg.sender, "Ownable: caller is not the owner");
_;
}
}
// File: contracts/tokens/ERC1155Base.sol
pragma solidity ^0.6.12;
abstract contract ERC1155Base is HasSecondarySaleFees, Ownable, ERC1155Metadata_URI, HasContractURI, ERC1155 {
struct Fee {
address payable recipient;
uint256 value;
}
// id => creator
mapping (uint256 => address) public creators;
// id => fees
mapping (uint256 => Fee[]) public fees;
// Max count of fees
uint256 maxFeesCount = 100;
constructor(string memory contractURI, string memory tokenURIPrefix, string memory uri) HasContractURI(contractURI) ERC1155Metadata_URI(tokenURIPrefix) ERC1155(uri) public {
}
function getFeeRecipients(uint256 id) public override view returns (address payable[] memory) {
Fee[] memory _fees = fees[id];
address payable[] memory result = new address payable[](_fees.length);
for (uint i = 0; i < _fees.length; i++) {
result[i] = _fees[i].recipient;
}
return result;
}
function getFeeBps(uint256 id) public override view returns (uint[] memory) {
Fee[] memory _fees = fees[id];
uint[] memory result = new uint[](_fees.length);
for (uint i = 0; i < _fees.length; i++) {
result[i] = _fees[i].value;
}
return result;
}
// Creates a new token type and assings _initialSupply to minter
function _mint(uint256 _id, Fee[] memory _fees, uint256 _supply, string memory _uri) internal {
require(
_fees.length <= maxFeesCount,
"Amount of fee recipients can't exceed 100"
);
uint256 sumFeeBps = 0;
for (uint256 i = 0; i < _fees.length; i++) {
sumFeeBps = sumFeeBps.add(_fees[i].value);
}
require(
sumFeeBps <= 10000,
"Total fee bps should not exceed 10000"
);
require(creators[_id] == address(0x0), "Token is already minted");
require(_supply != 0, "Supply should be positive");
require(bytes(_uri).length > 0, "uri should be set");
creators[_id] = msg.sender;
address[] memory recipients = new address[](_fees.length);
uint[] memory bps = new uint[](_fees.length);
for (uint i = 0; i < _fees.length; i++) {
require(_fees[i].recipient != address(0x0), "Recipient should be present");
require(_fees[i].value != 0, "Fee value should be positive");
fees[_id].push(_fees[i]);
recipients[i] = _fees[i].recipient;
bps[i] = _fees[i].value;
}
if (_fees.length > 0) {
emit SecondarySaleFees(_id, recipients, bps);
}
_mint(msg.sender, _id, _supply, "");
//balanceOf(msg.sender, _id) = _supply;
_setTokenURI(_id, _uri);
// Transfer event with mint semantic
emit TransferSingle(msg.sender, address(0x0), msg.sender, _id, _supply);
emit URI(_uri, _id);
}
function burn(address _owner, uint256 _id, uint256 _value) external {
require(_owner == msg.sender || isApprovedForAll(_owner, msg.sender) == true, "Need operator approval for 3rd party burns.");
_burn(_owner, _id, _value);
// SafeMath will throw with insuficient funds _owner
// or if _id is not valid (balance will be 0)
// balanceOf(_owner, _id) = balanceOf( _owner, _id).sub(_value);
// MUST emit event
// emit TransferSingle(msg.sender, _owner, address(0x0), _id, _value);
}
/**
* @dev Internal function to set the token URI for a given token.
* Reverts if the token ID does not exist.
* @param tokenId uint256 ID of the token to set its URI
* @param uri string URI to assign
*/
function _setTokenURI(uint256 tokenId, string memory uri) override virtual internal {
require(creators[tokenId] != address(0x0), "_setTokenURI: Token should exist");
super._setTokenURI(tokenId, uri);
}
function setTokenURIPrefix(string memory tokenURIPrefix) public onlyOwner {
_setTokenURIPrefix(tokenURIPrefix);
}
function setContractURI(string memory contractURI) public onlyOwner {
_setContractURI(contractURI);
}
function uri(uint256 _id) override(ERC1155Metadata_URI, ERC1155) external view returns (string memory) {
return _tokenURI(_id);
}
}
// File: @openzeppelin/contracts/utils/EnumerableSet.sol
pragma solidity >=0.6.0 <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;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
// File: @openzeppelin/contracts/access/AccessControl.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context {
using EnumerableSet for EnumerableSet.AddressSet;
using Address for address;
struct RoleData {
EnumerableSet.AddressSet members;
bytes32 adminRole;
}
mapping (bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view returns (bool) {
return _roles[role].members.contains(account);
}
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) public view returns (uint256) {
return _roles[role].members.length();
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
return _roles[role].members.at(index);
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual {
require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant");
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual {
require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke");
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, _roles[role].adminRole, adminRole);
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (_roles[role].members.add(account)) {
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (_roles[role].members.remove(account)) {
emit RoleRevoked(role, account, _msgSender());
}
}
}
// File: contracts/roles/SignerRole.sol
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
contract SignerRole is AccessControl {
bytes32 public constant SIGNER_ROLE = keccak256("SIGNER_ROLE");
modifier onlyAdmin() {
require(isAdmin(_msgSender()), "Ownable: caller is not the admin");
_;
}
modifier onlySigner() {
require(isSigner(_msgSender()), "Ownable: caller is not the signer");
_;
}
constructor() public {
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
}
function addAdmin(address _accont) internal onlyAdmin {
grantRole(DEFAULT_ADMIN_ROLE , _accont);
}
function removeAdmin(address _accont) internal onlyAdmin {
revokeRole(DEFAULT_ADMIN_ROLE , _accont);
}
function addSigner(address _account) public onlyAdmin {
grantRole(SIGNER_ROLE, _account);
}
function removeSigner(address _account) public onlyAdmin {
revokeRole(SIGNER_ROLE, _account);
}
function isSigner(address _account) internal virtual view returns(bool) {
return hasRole(SIGNER_ROLE, _account);
}
function isAdmin(address _account) internal virtual view returns(bool) {
return hasRole(DEFAULT_ADMIN_ROLE , _account);
}
}
// File: contracts/tokens/RefinableERC1155Token.sol
pragma solidity ^0.6.12;
contract RefinableERC1155Token is ERC1155Base, SignerRole {
using ECDSA for bytes32;
string public name;
string public symbol;
/**
* @dev Constructor Function
* @param _name name of the token ex: Rarible
* @param _symbol symbol of the token ex: RARI
* @param _signer address of signer account
* @param _contractURI URI of contract ex: https://api-mainnet.rarible.com/contractMetadata/{address}
* @param _tokenURIPrefix token URI Prefix
* @param _uri ex: https://ipfs.daonomic.com
*/
constructor(string memory _name, string memory _symbol, address _signer, string memory _contractURI, string memory _tokenURIPrefix, string memory _uri) ERC1155Base(_contractURI, _tokenURIPrefix, _uri) public {
name = _name;
symbol = _symbol;
addAdmin(_msgSender());
addSigner(_msgSender());
addSigner(_signer);
_registerInterface(bytes4(keccak256('MINT_WITH_ADDRESS')));
}
function mint(uint256 _tokenId, bytes memory _signature, Fee[] memory _fees, uint256 _supply, string memory _uri) public {
require(
isSigner(
keccak256(abi.encodePacked(address(this), _tokenId, _msgSender()))
.toEthSignedMessageHash()
.recover(_signature)
)
,"invalid signature"
);
_mint(_tokenId, _fees, _supply, _uri);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_signer","type":"address"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"string","name":"_tokenURIPrefix","type":"string"},{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"name":"SecondarySaleFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"fees","outputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"components":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct ERC1155Base.Fee[]","name":"_fees","type":"tuple[]"},{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURIPrefix","type":"string"}],"name":"setTokenURIPrefix","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":[],"name":"tokenURIPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040526064600a553480156200001657600080fd5b506040516200653c3803806200653c83398181016040528101906200003c919062000858565b828282808383806200005b6301ffc9a760e01b6200028560201b60201c565b6200007363b779958460e01b6200028560201b60201c565b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38060029080519060200190620001279291906200073f565b5050508060049080519060200190620001429291906200073f565b506200015b63e8a3d48560e01b6200028560201b60201c565b506200016d816200035d60201b60201c565b6200018563d9b67a2660e01b6200028560201b60201c565b6200019d630e89341c60e01b6200028560201b60201c565b50505050620001c56000801b620001b96200037960201b60201c565b6200038160201b60201c565b85600c9080519060200190620001dd9291906200073f565b5084600d9080519060200190620001f69291906200073f565b50620002176200020b6200037960201b60201c565b6200039760201b60201c565b620002376200022b6200037960201b60201c565b6200041160201b60201c565b62000248846200041160201b60201c565b620002797fe37243f27916e395706434720b54132b80ef5cc8c56f39b0df6485e8dfb697cf6200028560201b60201c565b50505050505062000bad565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e89062000a79565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8060079080519060200190620003759291906200073f565b5050565b600033905090565b620003938282620004a860201b60201c565b5050565b620003b7620003ab6200037960201b60201c565b6200054c60201b60201c565b620003f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003f09062000a9b565b60405180910390fd5b6200040e6000801b826200056a60201b60201c565b50565b62000431620004256200037960201b60201c565b6200054c60201b60201c565b62000473576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046a9062000a9b565b60405180910390fd5b620004a57fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f70826200056a60201b60201c565b50565b620004d781600b6000858152602001908152602001600020600001620005f960201b62001d761790919060201c565b156200054857620004ed6200037960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620005636000801b836200063160201b60201c565b9050919050565b620005a1600b600084815260200190815260200160002060020154620005956200037960201b60201c565b6200063160201b60201c565b620005e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005da9062000a57565b60405180910390fd5b620005f58282620004a860201b60201c565b5050565b600062000629836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200066a60201b60201c565b905092915050565b60006200066282600b6000868152602001908152602001600020600001620006e460201b62001da61790919060201c565b905092915050565b60006200067e83836200071c60201b60201c565b620006d9578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620006de565b600090505b92915050565b600062000714836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200071c60201b60201c565b905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200078257805160ff1916838001178555620007b3565b82800160010185558215620007b3579182015b82811115620007b257825182559160200191906001019062000795565b5b509050620007c29190620007c6565b5090565b5b80821115620007e1576000816000905550600101620007c7565b5090565b600081519050620007f68162000b93565b92915050565b600082601f8301126200080e57600080fd5b8151620008256200081f8262000aeb565b62000abd565b915080825260208301602083018583830111156200084257600080fd5b6200084f83828462000b5d565b50505092915050565b60008060008060008060c087890312156200087257600080fd5b600087015167ffffffffffffffff8111156200088d57600080fd5b6200089b89828a01620007fc565b965050602087015167ffffffffffffffff811115620008b957600080fd5b620008c789828a01620007fc565b9550506040620008da89828a01620007e5565b945050606087015167ffffffffffffffff811115620008f857600080fd5b6200090689828a01620007fc565b935050608087015167ffffffffffffffff8111156200092457600080fd5b6200093289828a01620007fc565b92505060a087015167ffffffffffffffff8111156200095057600080fd5b6200095e89828a01620007fc565b9150509295509295509295565b60006200097a602f8362000b18565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f206772616e7400000000000000000000000000000000006020830152604082019050919050565b6000620009e2601c8362000b18565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600062000a2460208362000b18565b91507f4f776e61626c653a2063616c6c6572206973206e6f74207468652061646d696e6000830152602082019050919050565b6000602082019050818103600083015262000a72816200096b565b9050919050565b6000602082019050818103600083015262000a9481620009d3565b9050919050565b6000602082019050818103600083015262000ab68162000a15565b9050919050565b6000604051905081810181811067ffffffffffffffff8211171562000ae157600080fd5b8060405250919050565b600067ffffffffffffffff82111562000b0357600080fd5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b600062000b368262000b3d565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b8381101562000b7d57808201518184015260208101905062000b60565b8381111562000b8d576000848401525b50505050565b62000b9e8162000b29565b811462000baa57600080fd5b50565b61597f8062000bbd6000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c8063938e3d7b1161010f578063ca15c873116100a2578063e985e9c511610071578063e985e9c5146105da578063eb12d61e1461060a578063f242432a14610626578063f5298aca14610642576101e4565b8063ca15c87314610540578063cd53d08e14610570578063d547741f146105a0578063e8a3d485146105bc576101e4565b8063a217fddf116100de578063a217fddf146104b8578063a22cb465146104d6578063b9c4d9fb146104f2578063c0ac998314610522576101e4565b8063938e3d7b1461044457806395d89b411461046057806399e0dd7c1461047e578063a1ebf35d1461049a576101e4565b8063248a9ca3116101875780634e1273f4116101565780634e1273f4146103835780636308f1cd146103b35780639010d07c146103e457806391d1485414610414576101e4565b8063248a9ca3146102ff5780632eb2c2d61461032f5780632f2ff15d1461034b57806336568abe14610367576101e4565b80630d8ef6c1116101c35780630d8ef6c1146102675780630e316ab7146102835780630e89341c1461029f5780630ebd4c7f146102cf576101e4565b8062fdd58e146101e957806301ffc9a71461021957806306fdde0314610249575b600080fd5b61020360048036038101906101fe9190613c34565b61065e565b60405161021091906153f3565b60405180910390f35b610233600480360381019061022e9190613dcc565b610728565b6040516102409190614f56565b60405180910390f35b61025161078f565b60405161025e9190614fd1565b60405180910390f35b610281600480360381019061027c9190613e88565b61082d565b005b61029d60048036038101906102989190613a45565b6108d3565b005b6102b960048036038101906102b49190613e5f565b61094f565b6040516102c69190614fd1565b60405180910390f35b6102e960048036038101906102e49190613e5f565b610961565b6040516102f69190614efd565b60405180910390f35b61031960048036038101906103149190613d2b565b610acf565b6040516103269190614f71565b60405180910390f35b61034960048036038101906103449190613aaa565b610aef565b005b61036560048036038101906103609190613d54565b610eb0565b005b610381600480360381019061037c9190613d54565b610f24565b005b61039d60048036038101906103989190613cbf565b610fa7565b6040516103aa9190614efd565b60405180910390f35b6103cd60048036038101906103c89190613f47565b6110a3565b6040516103db929190614df0565b60405180910390f35b6103fe60048036038101906103f99190613d90565b611101565b60405161040b9190614dd5565b60405180910390f35b61042e60048036038101906104299190613d54565b611133565b60405161043b9190614f56565b60405180910390f35b61045e60048036038101906104599190613e1e565b611165565b005b610468611201565b6040516104759190614fd1565b60405180910390f35b61049860048036038101906104939190613e1e565b61129f565b005b6104a261133b565b6040516104af9190614f71565b60405180910390f35b6104c061135f565b6040516104cd9190614f71565b60405180910390f35b6104f060048036038101906104eb9190613bf8565b611366565b005b61050c60048036038101906105079190613e5f565b6114e7565b6040516105199190614edb565b60405180910390f35b61052a611683565b6040516105379190614fd1565b60405180910390f35b61055a60048036038101906105559190613d2b565b611721565b60405161056791906153f3565b60405180910390f35b61058a60048036038101906105859190613e5f565b611748565b6040516105979190614dd5565b60405180910390f35b6105ba60048036038101906105b59190613d54565b61177b565b005b6105c46117ef565b6040516105d19190614fd1565b60405180910390f35b6105f460048036038101906105ef9190613a6e565b61188d565b6040516106019190614f56565b60405180910390f35b610624600480360381019061061f9190613a45565b611921565b005b610640600480360381019061063b9190613b69565b61199d565b005b61065c60048036038101906106579190613c70565b611ce0565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c6906150f3565b60405180910390fd5b6005600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108255780601f106107fa57610100808354040283529160200191610825565b820191906000526020600020905b81548152906001019060200180831161080857829003601f168201915b505050505081565b61088161087c8561086e3089610841611dd6565b60405160200161085393929190614d72565b60405160208183030381529060405280519060200120611dde565b611e0e90919063ffffffff16565b611e88565b6108c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b7906150b3565b60405180910390fd5b6108cc85848484611ebb565b5050505050565b6108e36108de611dd6565b6124f9565b610922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091990615213565b60405180910390fd5b61094c7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f708261177b565b50565b606061095a8261250f565b9050919050565b60608060096000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610a2957838290600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190610997565b5050505090506060815167ffffffffffffffff81118015610a4957600080fd5b50604051908082528060200260200182016040528015610a785781602001602082028036833780820191505090505b50905060005b8251811015610ac457828181518110610a9357fe5b602002602001015160200151828281518110610aab57fe5b6020026020010181815250508080600101915050610a7e565b508092505050919050565b6000600b6000838152602001908152602001600020600201549050919050565b8151835114610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90615353565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a906151d3565b60405180910390fd5b610bab611dd6565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610bf15750610bf085610beb611dd6565b61188d565b5b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c27906151f3565b60405180910390fd5b6000610c3a611dd6565b9050610c4a818787878787612670565b60005b8451811015610e1b576000858281518110610c6457fe5b602002602001015190506000858381518110610c7c57fe5b60200260200101519050610d03816040518060600160405280602a8152602001615920602a91396005600086815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126789092919063ffffffff16565b6005600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610dba816005600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126cd90919063ffffffff16565b6005600084815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050806001019050610c4d565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610e92929190614f1f565b60405180910390a4610ea8818787878787612722565b505050505050565b610ed7600b600084815260200190815260200160002060020154610ed2611dd6565b611133565b610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90615093565b60405180910390fd5b610f2082826128f2565b5050565b610f2c611dd6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f90906153b3565b60405180910390fd5b610fa38282612986565b5050565b60608151835114610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe490615333565b60405180910390fd5b6060835167ffffffffffffffff8111801561100757600080fd5b506040519080825280602002602001820160405280156110365781602001602082028036833780820191505090505b50905060005b84518110156110985761107585828151811061105457fe5b602002602001015185838151811061106857fe5b602002602001015161065e565b82828151811061108157fe5b60200260200101818152505080600101905061103c565b508091505092915050565b600960205281600052604060002081815481106110bc57fe5b9060005260206000209060020201600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b600061112b82600b6000868152602001908152602001600020600001612a1a90919063ffffffff16565b905092915050565b600061115d82600b6000868152602001908152602001600020600001611da690919063ffffffff16565b905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90615293565b60405180910390fd5b6111fe81612a34565b50565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112975780601f1061126c57610100808354040283529160200191611297565b820191906000526020600020905b81548152906001019060200180831161127a57829003601f168201915b505050505081565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132690615293565b60405180910390fd5b61133881612a4e565b50565b7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7081565b6000801b81565b8173ffffffffffffffffffffffffffffffffffffffff16611385611dd6565b73ffffffffffffffffffffffffffffffffffffffff1614156113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390615313565b60405180910390fd5b80600660006113e9611dd6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611496611dd6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114db9190614f56565b60405180910390a35050565b60608060096000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156115af57838290600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815250508152602001906001019061151d565b5050505090506060815167ffffffffffffffff811180156115cf57600080fd5b506040519080825280602002602001820160405280156115fe5781602001602082028036833780820191505090505b50905060005b82518110156116785782818151811061161957fe5b60200260200101516000015182828151811061163157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050611604565b508092505050919050565b60028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117195780601f106116ee57610100808354040283529160200191611719565b820191906000526020600020905b8154815290600101906020018083116116fc57829003601f168201915b505050505081565b6000611741600b6000848152602001908152602001600020600001612a68565b9050919050565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117a2600b60008481526020019081526020016000206002015461179d611dd6565b611133565b6117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d8906151b3565b60405180910390fd5b6117eb8282612986565b5050565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118855780601f1061185a57610100808354040283529160200191611885565b820191906000526020600020905b81548152906001019060200180831161186857829003601f168201915b505050505081565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61193161192c611dd6565b6124f9565b611970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196790615213565b60405180910390fd5b61199a7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7082610eb0565b50565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a04906151d3565b60405180910390fd5b611a15611dd6565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611a5b5750611a5a85611a55611dd6565b61188d565b5b611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190615153565b60405180910390fd5b6000611aa4611dd6565b9050611ac4818787611ab588612a7d565b611abe88612a7d565b87612670565b611b41836040518060600160405280602a8152602001615920602a91396005600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126789092919063ffffffff16565b6005600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611bf8836005600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126cd90919063ffffffff16565b6005600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611cc2929190615453565b60405180910390a4611cd8818787878787612aed565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611d27575060011515611d23843361188d565b1515145b611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d90615233565b60405180910390fd5b611d71838383612cbd565b505050565b6000611d9e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612ebd565b905092915050565b6000611dce836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612f2d565b905092915050565b600033905090565b600081604051602001611df19190614daf565b604051602081830303815290604052805190602001209050919050565b60006041825114611e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4b906150d3565b60405180910390fd5b60008060006020850151925060408501519150606085015160001a9050611e7d86828585612f50565b935050505092915050565b6000611eb47fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7083611133565b9050919050565b600a5483511115611f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef890615193565b60405180910390fd5b6000805b8451811015611f4757611f38858281518110611f1d57fe5b602002602001015160200151836126cd90919063ffffffff16565b91508080600101915050611f05565b50612710811115611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f84906152d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166008600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461202f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612026906152b3565b60405180910390fd5b6000831415612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206a906152f3565b60405180910390fd5b60008251116120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae906153d3565b60405180910390fd5b336008600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060845167ffffffffffffffff8111801561212357600080fd5b506040519080825280602002602001820160405280156121525781602001602082028036833780820191505090505b5090506060855167ffffffffffffffff8111801561216f57600080fd5b5060405190808252806020026020018201604052801561219e5781602001602082028036833780820191505090505b50905060005b86518110156123cd57600073ffffffffffffffffffffffffffffffffffffffff168782815181106121d157fe5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161415612234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222b90615393565b60405180910390fd5b600087828151811061224257fe5b602002602001015160200151141561228f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228690615073565b60405180910390fd5b600960008981526020019081526020016000208782815181106122ae57fe5b6020026020010151908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505086818151811061233e57fe5b60200260200101516000015183828151811061235657fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505086818151811061239c57fe5b6020026020010151602001518282815181106123b457fe5b60200260200101818152505080806001019150506121a4565b50600086511115612414577f99aba1d63749cfd5ad1afda7c4663840924d54eb5f005bbbeadedc6ec13674b287838360405161240b9392919061540e565b60405180910390a15b61242f338887604051806020016040528060008152506130db565b61243987856132c2565b3373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a896040516124b0929190615453565b60405180910390a4867f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b856040516124e89190614fd1565b60405180910390a250505050505050565b60006125086000801b83611133565b9050919050565b6060612669600360008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125bb5780601f10612590576101008083540402835291602001916125bb565b820191906000526020600020905b81548152906001019060200180831161259e57829003601f168201915b505050505060028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126565780601f1061262b57610100808354040283529160200191612656565b820191906000526020600020905b81548152906001019060200180831161263957829003601f168201915b505050505061337390919063ffffffff16565b9050919050565b505050505050565b60008383111582906126c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b79190614fd1565b60405180910390fd5b5082840390509392505050565b600080828401905083811015612718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270f90615113565b60405180910390fd5b8091505092915050565b6127418473ffffffffffffffffffffffffffffffffffffffff166134c3565b156128ea578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612787959493929190614e19565b602060405180830381600087803b1580156127a157600080fd5b505af19250505080156127d257506040513d601f19601f820116820180604052508101906127cf9190613df5565b60015b612861576127de6157bb565b806127e95750612826565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d9190614fd1565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285890615013565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df90615053565b60405180910390fd5b505b505050505050565b61291a81600b6000858152602001908152602001600020600001611d7690919063ffffffff16565b1561298257612927611dd6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6129ae81600b60008581526020019081526020016000206000016134d690919063ffffffff16565b15612a16576129bb611dd6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612a298360000183613506565b60001c905092915050565b8060049080519060200190612a4a929190613698565b5050565b8060029080519060200190612a64929190613698565b5050565b6000612a7682600001613573565b9050919050565b606080600167ffffffffffffffff81118015612a9857600080fd5b50604051908082528060200260200182016040528015612ac75781602001602082028036833780820191505090505b5090508281600081518110612ad857fe5b60200260200101818152505080915050919050565b612b0c8473ffffffffffffffffffffffffffffffffffffffff166134c3565b15612cb5578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612b52959493929190614e81565b602060405180830381600087803b158015612b6c57600080fd5b505af1925050508015612b9d57506040513d601f19601f82011682018060405250810190612b9a9190613df5565b60015b612c2c57612ba96157bb565b80612bb45750612bf1565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be89190614fd1565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2390615013565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612caa90615053565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2490615273565b60405180910390fd5b6000612d37611dd6565b9050612d6781856000612d4987612a7d565b612d5287612a7d565b60405180602001604052806000815250612670565b612de4826040518060600160405280602481526020016158fc602491396005600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126789092919063ffffffff16565b6005600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051612eaf929190615453565b60405180910390a450505050565b6000612ec98383612f2d565b612f22578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612f27565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115612fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf90615173565b60405180910390fd5b601b8460ff161480612fcd5750601c8460ff16145b61300c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300390615253565b60405180910390fd5b6000600186868686604051600081526020016040526040516130319493929190614f8c565b6020604051602081039080840390855afa158015613053573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156130cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c690614ff3565b60405180910390fd5b80915050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561314b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314290615373565b60405180910390fd5b6000613155611dd6565b90506131768160008761316788612a7d565b61317088612a7d565b87612670565b6131d9836005600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126cd90919063ffffffff16565b6005600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516132a4929190615453565b60405180910390a46132bb81600087878787612aed565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335c90615133565b60405180910390fd5b61336f8282613584565b5050565b60608083905060608390506060815183510167ffffffffffffffff8111801561339b57600080fd5b506040519080825280601f01601f1916602001820160405280156133ce5781602001600182028036833780820191505090505b5090506000805b8451811015613443578481815181106133ea57fe5b602001015160f81c60f81b83838060010194508151811061340757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506133d5565b5060005b83518110156134b55783818151811061345c57fe5b602001015160f81c60f81b83838060010194508151811061347957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613447565b508194505050505092915050565b600080823b905060008111915050919050565b60006134fe836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6135b0565b905092915050565b600081836000018054905011613551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354890615033565b60405180910390fd5b82600001828154811061356057fe5b9060005260206000200154905092915050565b600081600001805490509050919050565b806003600084815260200190815260200160002090805190602001906135ab929190613698565b505050565b6000808360010160008481526020019081526020016000205490506000811461368c57600060018203905060006001866000018054905003905060008660000182815481106135fb57fe5b906000526020600020015490508087600001848154811061361857fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061365057fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613692565b60009150505b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106136d957805160ff1916838001178555613707565b82800160010185558215613707579182015b828111156137065782518255916020019190600101906136eb565b5b5090506137149190613718565b5090565b5b80821115613731576000816000905550600101613719565b5090565b60008135905061374481615871565b92915050565b60008135905061375981615888565b92915050565b600082601f83011261377057600080fd5b813561378361377e826154a9565b61547c565b915081818352602084019350602081019050838560208402820111156137a857600080fd5b60005b838110156137d857816137be8882613735565b8452602084019350602083019250506001810190506137ab565b5050505092915050565b600082601f8301126137f357600080fd5b8135613806613801826154d1565b61547c565b9150818183526020840193506020810190508385604084028201111561382b57600080fd5b60005b8381101561385b578161384188826139e4565b84526020840193506040830192505060018101905061382e565b5050505092915050565b600082601f83011261387657600080fd5b8135613889613884826154f9565b61547c565b915081818352602084019350602081019050838560208402820111156138ae57600080fd5b60005b838110156138de57816138c48882613a30565b8452602084019350602083019250506001810190506138b1565b5050505092915050565b6000813590506138f78161589f565b92915050565b60008135905061390c816158b6565b92915050565b600081359050613921816158cd565b92915050565b600081519050613936816158cd565b92915050565b600082601f83011261394d57600080fd5b813561396061395b82615521565b61547c565b9150808252602083016020830185838301111561397c57600080fd5b613987838284615704565b50505092915050565b600082601f8301126139a157600080fd5b81356139b46139af8261554d565b61547c565b915080825260208301602083018583830111156139d057600080fd5b6139db838284615704565b50505092915050565b6000604082840312156139f657600080fd5b613a00604061547c565b90506000613a108482850161374a565b6000830152506020613a2484828501613a30565b60208301525092915050565b600081359050613a3f816158e4565b92915050565b600060208284031215613a5757600080fd5b6000613a6584828501613735565b91505092915050565b60008060408385031215613a8157600080fd5b6000613a8f85828601613735565b9250506020613aa085828601613735565b9150509250929050565b600080600080600060a08688031215613ac257600080fd5b6000613ad088828901613735565b9550506020613ae188828901613735565b945050604086013567ffffffffffffffff811115613afe57600080fd5b613b0a88828901613865565b935050606086013567ffffffffffffffff811115613b2757600080fd5b613b3388828901613865565b925050608086013567ffffffffffffffff811115613b5057600080fd5b613b5c8882890161393c565b9150509295509295909350565b600080600080600060a08688031215613b8157600080fd5b6000613b8f88828901613735565b9550506020613ba088828901613735565b9450506040613bb188828901613a30565b9350506060613bc288828901613a30565b925050608086013567ffffffffffffffff811115613bdf57600080fd5b613beb8882890161393c565b9150509295509295909350565b60008060408385031215613c0b57600080fd5b6000613c1985828601613735565b9250506020613c2a858286016138e8565b9150509250929050565b60008060408385031215613c4757600080fd5b6000613c5585828601613735565b9250506020613c6685828601613a30565b9150509250929050565b600080600060608486031215613c8557600080fd5b6000613c9386828701613735565b9350506020613ca486828701613a30565b9250506040613cb586828701613a30565b9150509250925092565b60008060408385031215613cd257600080fd5b600083013567ffffffffffffffff811115613cec57600080fd5b613cf88582860161375f565b925050602083013567ffffffffffffffff811115613d1557600080fd5b613d2185828601613865565b9150509250929050565b600060208284031215613d3d57600080fd5b6000613d4b848285016138fd565b91505092915050565b60008060408385031215613d6757600080fd5b6000613d75858286016138fd565b9250506020613d8685828601613735565b9150509250929050565b60008060408385031215613da357600080fd5b6000613db1858286016138fd565b9250506020613dc285828601613a30565b9150509250929050565b600060208284031215613dde57600080fd5b6000613dec84828501613912565b91505092915050565b600060208284031215613e0757600080fd5b6000613e1584828501613927565b91505092915050565b600060208284031215613e3057600080fd5b600082013567ffffffffffffffff811115613e4a57600080fd5b613e5684828501613990565b91505092915050565b600060208284031215613e7157600080fd5b6000613e7f84828501613a30565b91505092915050565b600080600080600060a08688031215613ea057600080fd5b6000613eae88828901613a30565b955050602086013567ffffffffffffffff811115613ecb57600080fd5b613ed78882890161393c565b945050604086013567ffffffffffffffff811115613ef457600080fd5b613f00888289016137e2565b9350506060613f1188828901613a30565b925050608086013567ffffffffffffffff811115613f2e57600080fd5b613f3a88828901613990565b9150509295509295909350565b60008060408385031215613f5a57600080fd5b6000613f6885828601613a30565b9250506020613f7985828601613a30565b9150509250929050565b6000613f8f8383613fcb565b60208301905092915050565b6000613fa78383614000565b60208301905092915050565b6000613fbf8383614d2e565b60208301905092915050565b613fd481615679565b82525050565b613fe381615679565b82525050565b613ffa613ff582615679565b615758565b82525050565b61400981615667565b82525050565b61401881615667565b82525050565b61402f61402a82615667565b615746565b82525050565b6000614040826155a9565b61404a8185615607565b935061405583615579565b8060005b8381101561408657815161406d8882613f9b565b9750614078836155e0565b925050600181019050614059565b5085935050505092915050565b600061409e826155b4565b6140a88185615618565b93506140b383615589565b8060005b838110156140e45781516140cb8882613f83565b97506140d6836155ed565b9250506001810190506140b7565b5085935050505092915050565b60006140fc826155bf565b6141068185615629565b935061411183615599565b8060005b838110156141425781516141298882613fb3565b9750614134836155fa565b925050600181019050614115565b5085935050505092915050565b6141588161568b565b82525050565b61416781615697565b82525050565b61417e61417982615697565b61576a565b82525050565b600061418f826155ca565b614199818561563a565b93506141a9818560208601615713565b6141b281615790565b840191505092915050565b60006141c8826155d5565b6141d2818561564b565b93506141e2818560208601615713565b6141eb81615790565b840191505092915050565b600061420360188361564b565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b600061424360348361564b565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b60006142a960228361564b565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061430f60288361564b565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614375601c8361564b565b91507f4665652076616c75652073686f756c6420626520706f736974697665000000006000830152602082019050919050565b60006143b5602f8361564b565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f206772616e7400000000000000000000000000000000006020830152604082019050919050565b600061441b60118361564b565b91507f696e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b600061445b601f8361564b565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b600061449b601c8361565c565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b60006144db602b8361564b565b91507f455243313135353a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000614541601b8361564b565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061458160208361564b565b91507f5f736574546f6b656e5552493a20546f6b656e2073686f756c642065786973746000830152602082019050919050565b60006145c160298361564b565b91507f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008301527f20617070726f76656400000000000000000000000000000000000000000000006020830152604082019050919050565b600061462760228361564b565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061468d60298361564b565b91507f416d6f756e74206f662066656520726563697069656e74732063616e2774206560008301527f78636565642031303000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146f360308361564b565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f207265766f6b65000000000000000000000000000000006020830152604082019050919050565b600061475960258361564b565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147bf60328361564b565b91507f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061482560208361564b565b91507f4f776e61626c653a2063616c6c6572206973206e6f74207468652061646d696e6000830152602082019050919050565b6000614865602b8361564b565b91507f4e656564206f70657261746f7220617070726f76616c20666f7220337264207060008301527f61727479206275726e732e0000000000000000000000000000000000000000006020830152604082019050919050565b60006148cb60228361564b565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061493160238361564b565b91507f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061499760208361564b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006149d760178361564b565b91507f546f6b656e20697320616c7265616479206d696e7465640000000000000000006000830152602082019050919050565b6000614a1760258361564b565b91507f546f74616c20666565206270732073686f756c64206e6f74206578636565642060008301527f31303030300000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a7d60198361564b565b91507f537570706c792073686f756c6420626520706f736974697665000000000000006000830152602082019050919050565b6000614abd60298361564b565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b2360298361564b565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b8960288361564b565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614bef60218361564b565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c55601b8361564b565b91507f526563697069656e742073686f756c642062652070726573656e7400000000006000830152602082019050919050565b6000614c95602f8361564b565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b6000614cfb60118361564b565b91507f7572692073686f756c64206265207365740000000000000000000000000000006000830152602082019050919050565b614d37816156ed565b82525050565b614d46816156ed565b82525050565b614d5d614d58826156ed565b615786565b82525050565b614d6c816156f7565b82525050565b6000614d7e828661401e565b601482019150614d8e8285614d4c565b602082019150614d9e8284613fe9565b601482019150819050949350505050565b6000614dba8261448e565b9150614dc6828461416d565b60208201915081905092915050565b6000602082019050614dea600083018461400f565b92915050565b6000604082019050614e056000830185613fda565b614e126020830184614d3d565b9392505050565b600060a082019050614e2e600083018861400f565b614e3b602083018761400f565b8181036040830152614e4d81866140f1565b90508181036060830152614e6181856140f1565b90508181036080830152614e758184614184565b90509695505050505050565b600060a082019050614e96600083018861400f565b614ea3602083018761400f565b614eb06040830186614d3d565b614ebd6060830185614d3d565b8181036080830152614ecf8184614184565b90509695505050505050565b60006020820190508181036000830152614ef58184614093565b905092915050565b60006020820190508181036000830152614f1781846140f1565b905092915050565b60006040820190508181036000830152614f3981856140f1565b90508181036020830152614f4d81846140f1565b90509392505050565b6000602082019050614f6b600083018461414f565b92915050565b6000602082019050614f86600083018461415e565b92915050565b6000608082019050614fa1600083018761415e565b614fae6020830186614d63565b614fbb604083018561415e565b614fc8606083018461415e565b95945050505050565b60006020820190508181036000830152614feb81846141bd565b905092915050565b6000602082019050818103600083015261500c816141f6565b9050919050565b6000602082019050818103600083015261502c81614236565b9050919050565b6000602082019050818103600083015261504c8161429c565b9050919050565b6000602082019050818103600083015261506c81614302565b9050919050565b6000602082019050818103600083015261508c81614368565b9050919050565b600060208201905081810360008301526150ac816143a8565b9050919050565b600060208201905081810360008301526150cc8161440e565b9050919050565b600060208201905081810360008301526150ec8161444e565b9050919050565b6000602082019050818103600083015261510c816144ce565b9050919050565b6000602082019050818103600083015261512c81614534565b9050919050565b6000602082019050818103600083015261514c81614574565b9050919050565b6000602082019050818103600083015261516c816145b4565b9050919050565b6000602082019050818103600083015261518c8161461a565b9050919050565b600060208201905081810360008301526151ac81614680565b9050919050565b600060208201905081810360008301526151cc816146e6565b9050919050565b600060208201905081810360008301526151ec8161474c565b9050919050565b6000602082019050818103600083015261520c816147b2565b9050919050565b6000602082019050818103600083015261522c81614818565b9050919050565b6000602082019050818103600083015261524c81614858565b9050919050565b6000602082019050818103600083015261526c816148be565b9050919050565b6000602082019050818103600083015261528c81614924565b9050919050565b600060208201905081810360008301526152ac8161498a565b9050919050565b600060208201905081810360008301526152cc816149ca565b9050919050565b600060208201905081810360008301526152ec81614a0a565b9050919050565b6000602082019050818103600083015261530c81614a70565b9050919050565b6000602082019050818103600083015261532c81614ab0565b9050919050565b6000602082019050818103600083015261534c81614b16565b9050919050565b6000602082019050818103600083015261536c81614b7c565b9050919050565b6000602082019050818103600083015261538c81614be2565b9050919050565b600060208201905081810360008301526153ac81614c48565b9050919050565b600060208201905081810360008301526153cc81614c88565b9050919050565b600060208201905081810360008301526153ec81614cee565b9050919050565b60006020820190506154086000830184614d3d565b92915050565b60006060820190506154236000830186614d3d565b81810360208301526154358185614035565b9050818103604083015261544981846140f1565b9050949350505050565b60006040820190506154686000830185614d3d565b6154756020830184614d3d565b9392505050565b6000604051905081810181811067ffffffffffffffff8211171561549f57600080fd5b8060405250919050565b600067ffffffffffffffff8211156154c057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156154e857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561551057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561553857600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561556457600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615672826156cd565b9050919050565b6000615684826156cd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615731578082015181840152602081019050615716565b83811115615740576000848401525b50505050565b600061575182615774565b9050919050565b600061576382615774565b9050919050565b6000819050919050565b600061577f826157a1565b9050919050565b6000819050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b600060443d10156157cb5761586e565b60046000803e6157dc6000516157ae565b6308c379a081146157ed575061586e565b60405160043d036004823e80513d602482011167ffffffffffffffff821117156158195750505061586e565b808201805167ffffffffffffffff81111561583857505050505061586e565b8060208301013d85018111156158535750505050505061586e565b61585c82615790565b60208401016040528296505050505050505b90565b61587a81615667565b811461588557600080fd5b50565b61589181615679565b811461589c57600080fd5b50565b6158a88161568b565b81146158b357600080fd5b50565b6158bf81615697565b81146158ca57600080fd5b50565b6158d6816156a1565b81146158e157600080fd5b50565b6158ed816156ed565b81146158f857600080fd5b5056fe455243313135353a206275726e20616d6f756e7420657863656564732062616c616e6365455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e73666572a264697066735822122078d4cf8216ea9d361e2d33a54607bba341095e4a9ad62b1ae175db4fe575c20d64736f6c634300060c003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000d2e49cfd5c03a72a838a2fc6bb5f6b46927e731a000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000d526566696e61626c65313135350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085245464931313535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003368747470733a2f2f6170692e726566696e61626c652e636f2f636f6e74726163744d657461646174612f7b616464726573737d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005524546495f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001968747470733a2f2f697066732e726566696e61626c652e636f00000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e45760003560e01c8063938e3d7b1161010f578063ca15c873116100a2578063e985e9c511610071578063e985e9c5146105da578063eb12d61e1461060a578063f242432a14610626578063f5298aca14610642576101e4565b8063ca15c87314610540578063cd53d08e14610570578063d547741f146105a0578063e8a3d485146105bc576101e4565b8063a217fddf116100de578063a217fddf146104b8578063a22cb465146104d6578063b9c4d9fb146104f2578063c0ac998314610522576101e4565b8063938e3d7b1461044457806395d89b411461046057806399e0dd7c1461047e578063a1ebf35d1461049a576101e4565b8063248a9ca3116101875780634e1273f4116101565780634e1273f4146103835780636308f1cd146103b35780639010d07c146103e457806391d1485414610414576101e4565b8063248a9ca3146102ff5780632eb2c2d61461032f5780632f2ff15d1461034b57806336568abe14610367576101e4565b80630d8ef6c1116101c35780630d8ef6c1146102675780630e316ab7146102835780630e89341c1461029f5780630ebd4c7f146102cf576101e4565b8062fdd58e146101e957806301ffc9a71461021957806306fdde0314610249575b600080fd5b61020360048036038101906101fe9190613c34565b61065e565b60405161021091906153f3565b60405180910390f35b610233600480360381019061022e9190613dcc565b610728565b6040516102409190614f56565b60405180910390f35b61025161078f565b60405161025e9190614fd1565b60405180910390f35b610281600480360381019061027c9190613e88565b61082d565b005b61029d60048036038101906102989190613a45565b6108d3565b005b6102b960048036038101906102b49190613e5f565b61094f565b6040516102c69190614fd1565b60405180910390f35b6102e960048036038101906102e49190613e5f565b610961565b6040516102f69190614efd565b60405180910390f35b61031960048036038101906103149190613d2b565b610acf565b6040516103269190614f71565b60405180910390f35b61034960048036038101906103449190613aaa565b610aef565b005b61036560048036038101906103609190613d54565b610eb0565b005b610381600480360381019061037c9190613d54565b610f24565b005b61039d60048036038101906103989190613cbf565b610fa7565b6040516103aa9190614efd565b60405180910390f35b6103cd60048036038101906103c89190613f47565b6110a3565b6040516103db929190614df0565b60405180910390f35b6103fe60048036038101906103f99190613d90565b611101565b60405161040b9190614dd5565b60405180910390f35b61042e60048036038101906104299190613d54565b611133565b60405161043b9190614f56565b60405180910390f35b61045e60048036038101906104599190613e1e565b611165565b005b610468611201565b6040516104759190614fd1565b60405180910390f35b61049860048036038101906104939190613e1e565b61129f565b005b6104a261133b565b6040516104af9190614f71565b60405180910390f35b6104c061135f565b6040516104cd9190614f71565b60405180910390f35b6104f060048036038101906104eb9190613bf8565b611366565b005b61050c60048036038101906105079190613e5f565b6114e7565b6040516105199190614edb565b60405180910390f35b61052a611683565b6040516105379190614fd1565b60405180910390f35b61055a60048036038101906105559190613d2b565b611721565b60405161056791906153f3565b60405180910390f35b61058a60048036038101906105859190613e5f565b611748565b6040516105979190614dd5565b60405180910390f35b6105ba60048036038101906105b59190613d54565b61177b565b005b6105c46117ef565b6040516105d19190614fd1565b60405180910390f35b6105f460048036038101906105ef9190613a6e565b61188d565b6040516106019190614f56565b60405180910390f35b610624600480360381019061061f9190613a45565b611921565b005b610640600480360381019061063b9190613b69565b61199d565b005b61065c60048036038101906106579190613c70565b611ce0565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c6906150f3565b60405180910390fd5b6005600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108255780601f106107fa57610100808354040283529160200191610825565b820191906000526020600020905b81548152906001019060200180831161080857829003601f168201915b505050505081565b61088161087c8561086e3089610841611dd6565b60405160200161085393929190614d72565b60405160208183030381529060405280519060200120611dde565b611e0e90919063ffffffff16565b611e88565b6108c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b7906150b3565b60405180910390fd5b6108cc85848484611ebb565b5050505050565b6108e36108de611dd6565b6124f9565b610922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091990615213565b60405180910390fd5b61094c7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f708261177b565b50565b606061095a8261250f565b9050919050565b60608060096000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610a2957838290600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152505081526020019060010190610997565b5050505090506060815167ffffffffffffffff81118015610a4957600080fd5b50604051908082528060200260200182016040528015610a785781602001602082028036833780820191505090505b50905060005b8251811015610ac457828181518110610a9357fe5b602002602001015160200151828281518110610aab57fe5b6020026020010181815250508080600101915050610a7e565b508092505050919050565b6000600b6000838152602001908152602001600020600201549050919050565b8151835114610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90615353565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a906151d3565b60405180910390fd5b610bab611dd6565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610bf15750610bf085610beb611dd6565b61188d565b5b610c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c27906151f3565b60405180910390fd5b6000610c3a611dd6565b9050610c4a818787878787612670565b60005b8451811015610e1b576000858281518110610c6457fe5b602002602001015190506000858381518110610c7c57fe5b60200260200101519050610d03816040518060600160405280602a8152602001615920602a91396005600086815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126789092919063ffffffff16565b6005600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610dba816005600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126cd90919063ffffffff16565b6005600084815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050806001019050610c4d565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610e92929190614f1f565b60405180910390a4610ea8818787878787612722565b505050505050565b610ed7600b600084815260200190815260200160002060020154610ed2611dd6565b611133565b610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90615093565b60405180910390fd5b610f2082826128f2565b5050565b610f2c611dd6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f90906153b3565b60405180910390fd5b610fa38282612986565b5050565b60608151835114610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe490615333565b60405180910390fd5b6060835167ffffffffffffffff8111801561100757600080fd5b506040519080825280602002602001820160405280156110365781602001602082028036833780820191505090505b50905060005b84518110156110985761107585828151811061105457fe5b602002602001015185838151811061106857fe5b602002602001015161065e565b82828151811061108157fe5b60200260200101818152505080600101905061103c565b508091505092915050565b600960205281600052604060002081815481106110bc57fe5b9060005260206000209060020201600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b600061112b82600b6000868152602001908152602001600020600001612a1a90919063ffffffff16565b905092915050565b600061115d82600b6000868152602001908152602001600020600001611da690919063ffffffff16565b905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ec90615293565b60405180910390fd5b6111fe81612a34565b50565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112975780601f1061126c57610100808354040283529160200191611297565b820191906000526020600020905b81548152906001019060200180831161127a57829003601f168201915b505050505081565b3373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132690615293565b60405180910390fd5b61133881612a4e565b50565b7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7081565b6000801b81565b8173ffffffffffffffffffffffffffffffffffffffff16611385611dd6565b73ffffffffffffffffffffffffffffffffffffffff1614156113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390615313565b60405180910390fd5b80600660006113e9611dd6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611496611dd6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114db9190614f56565b60405180910390a35050565b60608060096000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156115af57838290600052602060002090600202016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815250508152602001906001019061151d565b5050505090506060815167ffffffffffffffff811180156115cf57600080fd5b506040519080825280602002602001820160405280156115fe5781602001602082028036833780820191505090505b50905060005b82518110156116785782818151811061161957fe5b60200260200101516000015182828151811061163157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050611604565b508092505050919050565b60028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117195780601f106116ee57610100808354040283529160200191611719565b820191906000526020600020905b8154815290600101906020018083116116fc57829003601f168201915b505050505081565b6000611741600b6000848152602001908152602001600020600001612a68565b9050919050565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117a2600b60008481526020019081526020016000206002015461179d611dd6565b611133565b6117e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d8906151b3565b60405180910390fd5b6117eb8282612986565b5050565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118855780601f1061185a57610100808354040283529160200191611885565b820191906000526020600020905b81548152906001019060200180831161186857829003601f168201915b505050505081565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61193161192c611dd6565b6124f9565b611970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196790615213565b60405180910390fd5b61199a7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7082610eb0565b50565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a04906151d3565b60405180910390fd5b611a15611dd6565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611a5b5750611a5a85611a55611dd6565b61188d565b5b611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190615153565b60405180910390fd5b6000611aa4611dd6565b9050611ac4818787611ab588612a7d565b611abe88612a7d565b87612670565b611b41836040518060600160405280602a8152602001615920602a91396005600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126789092919063ffffffff16565b6005600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611bf8836005600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126cd90919063ffffffff16565b6005600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611cc2929190615453565b60405180910390a4611cd8818787878787612aed565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611d27575060011515611d23843361188d565b1515145b611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d90615233565b60405180910390fd5b611d71838383612cbd565b505050565b6000611d9e836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612ebd565b905092915050565b6000611dce836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612f2d565b905092915050565b600033905090565b600081604051602001611df19190614daf565b604051602081830303815290604052805190602001209050919050565b60006041825114611e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4b906150d3565b60405180910390fd5b60008060006020850151925060408501519150606085015160001a9050611e7d86828585612f50565b935050505092915050565b6000611eb47fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7083611133565b9050919050565b600a5483511115611f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef890615193565b60405180910390fd5b6000805b8451811015611f4757611f38858281518110611f1d57fe5b602002602001015160200151836126cd90919063ffffffff16565b91508080600101915050611f05565b50612710811115611f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f84906152d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166008600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461202f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612026906152b3565b60405180910390fd5b6000831415612073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206a906152f3565b60405180910390fd5b60008251116120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae906153d3565b60405180910390fd5b336008600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060845167ffffffffffffffff8111801561212357600080fd5b506040519080825280602002602001820160405280156121525781602001602082028036833780820191505090505b5090506060855167ffffffffffffffff8111801561216f57600080fd5b5060405190808252806020026020018201604052801561219e5781602001602082028036833780820191505090505b50905060005b86518110156123cd57600073ffffffffffffffffffffffffffffffffffffffff168782815181106121d157fe5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff161415612234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222b90615393565b60405180910390fd5b600087828151811061224257fe5b602002602001015160200151141561228f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228690615073565b60405180910390fd5b600960008981526020019081526020016000208782815181106122ae57fe5b6020026020010151908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505086818151811061233e57fe5b60200260200101516000015183828151811061235657fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505086818151811061239c57fe5b6020026020010151602001518282815181106123b457fe5b60200260200101818152505080806001019150506121a4565b50600086511115612414577f99aba1d63749cfd5ad1afda7c4663840924d54eb5f005bbbeadedc6ec13674b287838360405161240b9392919061540e565b60405180910390a15b61242f338887604051806020016040528060008152506130db565b61243987856132c2565b3373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a896040516124b0929190615453565b60405180910390a4867f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b856040516124e89190614fd1565b60405180910390a250505050505050565b60006125086000801b83611133565b9050919050565b6060612669600360008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125bb5780601f10612590576101008083540402835291602001916125bb565b820191906000526020600020905b81548152906001019060200180831161259e57829003601f168201915b505050505060028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126565780601f1061262b57610100808354040283529160200191612656565b820191906000526020600020905b81548152906001019060200180831161263957829003601f168201915b505050505061337390919063ffffffff16565b9050919050565b505050505050565b60008383111582906126c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b79190614fd1565b60405180910390fd5b5082840390509392505050565b600080828401905083811015612718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270f90615113565b60405180910390fd5b8091505092915050565b6127418473ffffffffffffffffffffffffffffffffffffffff166134c3565b156128ea578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612787959493929190614e19565b602060405180830381600087803b1580156127a157600080fd5b505af19250505080156127d257506040513d601f19601f820116820180604052508101906127cf9190613df5565b60015b612861576127de6157bb565b806127e95750612826565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d9190614fd1565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285890615013565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df90615053565b60405180910390fd5b505b505050505050565b61291a81600b6000858152602001908152602001600020600001611d7690919063ffffffff16565b1561298257612927611dd6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6129ae81600b60008581526020019081526020016000206000016134d690919063ffffffff16565b15612a16576129bb611dd6565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612a298360000183613506565b60001c905092915050565b8060049080519060200190612a4a929190613698565b5050565b8060029080519060200190612a64929190613698565b5050565b6000612a7682600001613573565b9050919050565b606080600167ffffffffffffffff81118015612a9857600080fd5b50604051908082528060200260200182016040528015612ac75781602001602082028036833780820191505090505b5090508281600081518110612ad857fe5b60200260200101818152505080915050919050565b612b0c8473ffffffffffffffffffffffffffffffffffffffff166134c3565b15612cb5578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612b52959493929190614e81565b602060405180830381600087803b158015612b6c57600080fd5b505af1925050508015612b9d57506040513d601f19601f82011682018060405250810190612b9a9190613df5565b60015b612c2c57612ba96157bb565b80612bb45750612bf1565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be89190614fd1565b60405180910390fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2390615013565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612caa90615053565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2490615273565b60405180910390fd5b6000612d37611dd6565b9050612d6781856000612d4987612a7d565b612d5287612a7d565b60405180602001604052806000815250612670565b612de4826040518060600160405280602481526020016158fc602491396005600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126789092919063ffffffff16565b6005600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051612eaf929190615453565b60405180910390a450505050565b6000612ec98383612f2d565b612f22578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612f27565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115612fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612faf90615173565b60405180910390fd5b601b8460ff161480612fcd5750601c8460ff16145b61300c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300390615253565b60405180910390fd5b6000600186868686604051600081526020016040526040516130319493929190614f8c565b6020604051602081039080840390855afa158015613053573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156130cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c690614ff3565b60405180910390fd5b80915050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561314b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314290615373565b60405180910390fd5b6000613155611dd6565b90506131768160008761316788612a7d565b61317088612a7d565b87612670565b6131d9836005600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126cd90919063ffffffff16565b6005600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516132a4929190615453565b60405180910390a46132bb81600087878787612aed565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335c90615133565b60405180910390fd5b61336f8282613584565b5050565b60608083905060608390506060815183510167ffffffffffffffff8111801561339b57600080fd5b506040519080825280601f01601f1916602001820160405280156133ce5781602001600182028036833780820191505090505b5090506000805b8451811015613443578481815181106133ea57fe5b602001015160f81c60f81b83838060010194508151811061340757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506133d5565b5060005b83518110156134b55783818151811061345c57fe5b602001015160f81c60f81b83838060010194508151811061347957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613447565b508194505050505092915050565b600080823b905060008111915050919050565b60006134fe836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6135b0565b905092915050565b600081836000018054905011613551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354890615033565b60405180910390fd5b82600001828154811061356057fe5b9060005260206000200154905092915050565b600081600001805490509050919050565b806003600084815260200190815260200160002090805190602001906135ab929190613698565b505050565b6000808360010160008481526020019081526020016000205490506000811461368c57600060018203905060006001866000018054905003905060008660000182815481106135fb57fe5b906000526020600020015490508087600001848154811061361857fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061365057fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613692565b60009150505b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106136d957805160ff1916838001178555613707565b82800160010185558215613707579182015b828111156137065782518255916020019190600101906136eb565b5b5090506137149190613718565b5090565b5b80821115613731576000816000905550600101613719565b5090565b60008135905061374481615871565b92915050565b60008135905061375981615888565b92915050565b600082601f83011261377057600080fd5b813561378361377e826154a9565b61547c565b915081818352602084019350602081019050838560208402820111156137a857600080fd5b60005b838110156137d857816137be8882613735565b8452602084019350602083019250506001810190506137ab565b5050505092915050565b600082601f8301126137f357600080fd5b8135613806613801826154d1565b61547c565b9150818183526020840193506020810190508385604084028201111561382b57600080fd5b60005b8381101561385b578161384188826139e4565b84526020840193506040830192505060018101905061382e565b5050505092915050565b600082601f83011261387657600080fd5b8135613889613884826154f9565b61547c565b915081818352602084019350602081019050838560208402820111156138ae57600080fd5b60005b838110156138de57816138c48882613a30565b8452602084019350602083019250506001810190506138b1565b5050505092915050565b6000813590506138f78161589f565b92915050565b60008135905061390c816158b6565b92915050565b600081359050613921816158cd565b92915050565b600081519050613936816158cd565b92915050565b600082601f83011261394d57600080fd5b813561396061395b82615521565b61547c565b9150808252602083016020830185838301111561397c57600080fd5b613987838284615704565b50505092915050565b600082601f8301126139a157600080fd5b81356139b46139af8261554d565b61547c565b915080825260208301602083018583830111156139d057600080fd5b6139db838284615704565b50505092915050565b6000604082840312156139f657600080fd5b613a00604061547c565b90506000613a108482850161374a565b6000830152506020613a2484828501613a30565b60208301525092915050565b600081359050613a3f816158e4565b92915050565b600060208284031215613a5757600080fd5b6000613a6584828501613735565b91505092915050565b60008060408385031215613a8157600080fd5b6000613a8f85828601613735565b9250506020613aa085828601613735565b9150509250929050565b600080600080600060a08688031215613ac257600080fd5b6000613ad088828901613735565b9550506020613ae188828901613735565b945050604086013567ffffffffffffffff811115613afe57600080fd5b613b0a88828901613865565b935050606086013567ffffffffffffffff811115613b2757600080fd5b613b3388828901613865565b925050608086013567ffffffffffffffff811115613b5057600080fd5b613b5c8882890161393c565b9150509295509295909350565b600080600080600060a08688031215613b8157600080fd5b6000613b8f88828901613735565b9550506020613ba088828901613735565b9450506040613bb188828901613a30565b9350506060613bc288828901613a30565b925050608086013567ffffffffffffffff811115613bdf57600080fd5b613beb8882890161393c565b9150509295509295909350565b60008060408385031215613c0b57600080fd5b6000613c1985828601613735565b9250506020613c2a858286016138e8565b9150509250929050565b60008060408385031215613c4757600080fd5b6000613c5585828601613735565b9250506020613c6685828601613a30565b9150509250929050565b600080600060608486031215613c8557600080fd5b6000613c9386828701613735565b9350506020613ca486828701613a30565b9250506040613cb586828701613a30565b9150509250925092565b60008060408385031215613cd257600080fd5b600083013567ffffffffffffffff811115613cec57600080fd5b613cf88582860161375f565b925050602083013567ffffffffffffffff811115613d1557600080fd5b613d2185828601613865565b9150509250929050565b600060208284031215613d3d57600080fd5b6000613d4b848285016138fd565b91505092915050565b60008060408385031215613d6757600080fd5b6000613d75858286016138fd565b9250506020613d8685828601613735565b9150509250929050565b60008060408385031215613da357600080fd5b6000613db1858286016138fd565b9250506020613dc285828601613a30565b9150509250929050565b600060208284031215613dde57600080fd5b6000613dec84828501613912565b91505092915050565b600060208284031215613e0757600080fd5b6000613e1584828501613927565b91505092915050565b600060208284031215613e3057600080fd5b600082013567ffffffffffffffff811115613e4a57600080fd5b613e5684828501613990565b91505092915050565b600060208284031215613e7157600080fd5b6000613e7f84828501613a30565b91505092915050565b600080600080600060a08688031215613ea057600080fd5b6000613eae88828901613a30565b955050602086013567ffffffffffffffff811115613ecb57600080fd5b613ed78882890161393c565b945050604086013567ffffffffffffffff811115613ef457600080fd5b613f00888289016137e2565b9350506060613f1188828901613a30565b925050608086013567ffffffffffffffff811115613f2e57600080fd5b613f3a88828901613990565b9150509295509295909350565b60008060408385031215613f5a57600080fd5b6000613f6885828601613a30565b9250506020613f7985828601613a30565b9150509250929050565b6000613f8f8383613fcb565b60208301905092915050565b6000613fa78383614000565b60208301905092915050565b6000613fbf8383614d2e565b60208301905092915050565b613fd481615679565b82525050565b613fe381615679565b82525050565b613ffa613ff582615679565b615758565b82525050565b61400981615667565b82525050565b61401881615667565b82525050565b61402f61402a82615667565b615746565b82525050565b6000614040826155a9565b61404a8185615607565b935061405583615579565b8060005b8381101561408657815161406d8882613f9b565b9750614078836155e0565b925050600181019050614059565b5085935050505092915050565b600061409e826155b4565b6140a88185615618565b93506140b383615589565b8060005b838110156140e45781516140cb8882613f83565b97506140d6836155ed565b9250506001810190506140b7565b5085935050505092915050565b60006140fc826155bf565b6141068185615629565b935061411183615599565b8060005b838110156141425781516141298882613fb3565b9750614134836155fa565b925050600181019050614115565b5085935050505092915050565b6141588161568b565b82525050565b61416781615697565b82525050565b61417e61417982615697565b61576a565b82525050565b600061418f826155ca565b614199818561563a565b93506141a9818560208601615713565b6141b281615790565b840191505092915050565b60006141c8826155d5565b6141d2818561564b565b93506141e2818560208601615713565b6141eb81615790565b840191505092915050565b600061420360188361564b565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b600061424360348361564b565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b60006142a960228361564b565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061430f60288361564b565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614375601c8361564b565b91507f4665652076616c75652073686f756c6420626520706f736974697665000000006000830152602082019050919050565b60006143b5602f8361564b565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f206772616e7400000000000000000000000000000000006020830152604082019050919050565b600061441b60118361564b565b91507f696e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b600061445b601f8361564b565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b600061449b601c8361565c565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b60006144db602b8361564b565b91507f455243313135353a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000614541601b8361564b565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061458160208361564b565b91507f5f736574546f6b656e5552493a20546f6b656e2073686f756c642065786973746000830152602082019050919050565b60006145c160298361564b565b91507f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008301527f20617070726f76656400000000000000000000000000000000000000000000006020830152604082019050919050565b600061462760228361564b565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061468d60298361564b565b91507f416d6f756e74206f662066656520726563697069656e74732063616e2774206560008301527f78636565642031303000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146f360308361564b565b91507f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008301527f2061646d696e20746f207265766f6b65000000000000000000000000000000006020830152604082019050919050565b600061475960258361564b565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147bf60328361564b565b91507f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061482560208361564b565b91507f4f776e61626c653a2063616c6c6572206973206e6f74207468652061646d696e6000830152602082019050919050565b6000614865602b8361564b565b91507f4e656564206f70657261746f7220617070726f76616c20666f7220337264207060008301527f61727479206275726e732e0000000000000000000000000000000000000000006020830152604082019050919050565b60006148cb60228361564b565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061493160238361564b565b91507f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061499760208361564b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006149d760178361564b565b91507f546f6b656e20697320616c7265616479206d696e7465640000000000000000006000830152602082019050919050565b6000614a1760258361564b565b91507f546f74616c20666565206270732073686f756c64206e6f74206578636565642060008301527f31303030300000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a7d60198361564b565b91507f537570706c792073686f756c6420626520706f736974697665000000000000006000830152602082019050919050565b6000614abd60298361564b565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b2360298361564b565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b8960288361564b565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614bef60218361564b565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c55601b8361564b565b91507f526563697069656e742073686f756c642062652070726573656e7400000000006000830152602082019050919050565b6000614c95602f8361564b565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b6000614cfb60118361564b565b91507f7572692073686f756c64206265207365740000000000000000000000000000006000830152602082019050919050565b614d37816156ed565b82525050565b614d46816156ed565b82525050565b614d5d614d58826156ed565b615786565b82525050565b614d6c816156f7565b82525050565b6000614d7e828661401e565b601482019150614d8e8285614d4c565b602082019150614d9e8284613fe9565b601482019150819050949350505050565b6000614dba8261448e565b9150614dc6828461416d565b60208201915081905092915050565b6000602082019050614dea600083018461400f565b92915050565b6000604082019050614e056000830185613fda565b614e126020830184614d3d565b9392505050565b600060a082019050614e2e600083018861400f565b614e3b602083018761400f565b8181036040830152614e4d81866140f1565b90508181036060830152614e6181856140f1565b90508181036080830152614e758184614184565b90509695505050505050565b600060a082019050614e96600083018861400f565b614ea3602083018761400f565b614eb06040830186614d3d565b614ebd6060830185614d3d565b8181036080830152614ecf8184614184565b90509695505050505050565b60006020820190508181036000830152614ef58184614093565b905092915050565b60006020820190508181036000830152614f1781846140f1565b905092915050565b60006040820190508181036000830152614f3981856140f1565b90508181036020830152614f4d81846140f1565b90509392505050565b6000602082019050614f6b600083018461414f565b92915050565b6000602082019050614f86600083018461415e565b92915050565b6000608082019050614fa1600083018761415e565b614fae6020830186614d63565b614fbb604083018561415e565b614fc8606083018461415e565b95945050505050565b60006020820190508181036000830152614feb81846141bd565b905092915050565b6000602082019050818103600083015261500c816141f6565b9050919050565b6000602082019050818103600083015261502c81614236565b9050919050565b6000602082019050818103600083015261504c8161429c565b9050919050565b6000602082019050818103600083015261506c81614302565b9050919050565b6000602082019050818103600083015261508c81614368565b9050919050565b600060208201905081810360008301526150ac816143a8565b9050919050565b600060208201905081810360008301526150cc8161440e565b9050919050565b600060208201905081810360008301526150ec8161444e565b9050919050565b6000602082019050818103600083015261510c816144ce565b9050919050565b6000602082019050818103600083015261512c81614534565b9050919050565b6000602082019050818103600083015261514c81614574565b9050919050565b6000602082019050818103600083015261516c816145b4565b9050919050565b6000602082019050818103600083015261518c8161461a565b9050919050565b600060208201905081810360008301526151ac81614680565b9050919050565b600060208201905081810360008301526151cc816146e6565b9050919050565b600060208201905081810360008301526151ec8161474c565b9050919050565b6000602082019050818103600083015261520c816147b2565b9050919050565b6000602082019050818103600083015261522c81614818565b9050919050565b6000602082019050818103600083015261524c81614858565b9050919050565b6000602082019050818103600083015261526c816148be565b9050919050565b6000602082019050818103600083015261528c81614924565b9050919050565b600060208201905081810360008301526152ac8161498a565b9050919050565b600060208201905081810360008301526152cc816149ca565b9050919050565b600060208201905081810360008301526152ec81614a0a565b9050919050565b6000602082019050818103600083015261530c81614a70565b9050919050565b6000602082019050818103600083015261532c81614ab0565b9050919050565b6000602082019050818103600083015261534c81614b16565b9050919050565b6000602082019050818103600083015261536c81614b7c565b9050919050565b6000602082019050818103600083015261538c81614be2565b9050919050565b600060208201905081810360008301526153ac81614c48565b9050919050565b600060208201905081810360008301526153cc81614c88565b9050919050565b600060208201905081810360008301526153ec81614cee565b9050919050565b60006020820190506154086000830184614d3d565b92915050565b60006060820190506154236000830186614d3d565b81810360208301526154358185614035565b9050818103604083015261544981846140f1565b9050949350505050565b60006040820190506154686000830185614d3d565b6154756020830184614d3d565b9392505050565b6000604051905081810181811067ffffffffffffffff8211171561549f57600080fd5b8060405250919050565b600067ffffffffffffffff8211156154c057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156154e857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561551057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561553857600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561556457600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615672826156cd565b9050919050565b6000615684826156cd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615731578082015181840152602081019050615716565b83811115615740576000848401525b50505050565b600061575182615774565b9050919050565b600061576382615774565b9050919050565b6000819050919050565b600061577f826157a1565b9050919050565b6000819050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b600060443d10156157cb5761586e565b60046000803e6157dc6000516157ae565b6308c379a081146157ed575061586e565b60405160043d036004823e80513d602482011167ffffffffffffffff821117156158195750505061586e565b808201805167ffffffffffffffff81111561583857505050505061586e565b8060208301013d85018111156158535750505050505061586e565b61585c82615790565b60208401016040528296505050505050505b90565b61587a81615667565b811461588557600080fd5b50565b61589181615679565b811461589c57600080fd5b50565b6158a88161568b565b81146158b357600080fd5b50565b6158bf81615697565b81146158ca57600080fd5b50565b6158d6816156a1565b81146158e157600080fd5b50565b6158ed816156ed565b81146158f857600080fd5b5056fe455243313135353a206275726e20616d6f756e7420657863656564732062616c616e6365455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e73666572a264697066735822122078d4cf8216ea9d361e2d33a54607bba341095e4a9ad62b1ae175db4fe575c20d64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000d2e49cfd5c03a72a838a2fc6bb5f6b46927e731a000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000d526566696e61626c65313135350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000085245464931313535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003368747470733a2f2f6170692e726566696e61626c652e636f2f636f6e74726163744d657461646174612f7b616464726573737d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005524546495f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001968747470733a2f2f697066732e726566696e61626c652e636f00000000000000
-----Decoded View---------------
Arg [0] : _name (string): Refinable1155
Arg [1] : _symbol (string): REFI1155
Arg [2] : _signer (address): 0xD2E49cfd5c03a72a838a2fC6bB5f6b46927e731A
Arg [3] : _contractURI (string): https://api.refinable.co/contractMetadata/{address}
Arg [4] : _tokenURIPrefix (string): REFI_
Arg [5] : _uri (string): https://ipfs.refinable.co
-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 000000000000000000000000d2e49cfd5c03a72a838a2fc6bb5f6b46927e731a
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [7] : 526566696e61626c653131353500000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [9] : 5245464931313535000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000033
Arg [11] : 68747470733a2f2f6170692e726566696e61626c652e636f2f636f6e74726163
Arg [12] : 744d657461646174612f7b616464726573737d00000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [14] : 524546495f000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [16] : 68747470733a2f2f697066732e726566696e61626c652e636f00000000000000
Deployed Bytecode Sourcemap
75079:1461:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39659:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5908:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75182:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76085:452;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74593:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56235:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52937:309;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70435:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42302:1220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70811:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72020:209;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40056:549;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52278:38;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;70108:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69069:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56112:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75207:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55977:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73818:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67814:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40678:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52576:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15973:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69382:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52208:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71283:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7559:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41061:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74480:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41301:924;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54945:553;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39659:231;39745:7;39792:1;39773:21;;:7;:21;;;;39765:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;39860:9;:13;39870:2;39860:13;;;;;;;;;;;:22;39874:7;39860:22;;;;;;;;;;;;;;;;39853:29;;39659:231;;;;:::o;5908:150::-;5993:4;6017:20;:33;6038:11;6017:33;;;;;;;;;;;;;;;;;;;;;;;;;;;6010:40;;5908:150;;;:::o;75182:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76085:452::-;76239:197;76266:155;76410:10;76266:113;76301:4;76308:8;76318:12;:10;:12::i;:::-;76276:55;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76266:66;;;;;;:111;:113::i;:::-;:143;;:155;;;;:::i;:::-;76239:8;:197::i;:::-;76217:264;;;;;;;;;;;;:::i;:::-;;;;;;;;;76492:37;76498:8;76508:5;76515:7;76524:4;76492:5;:37::i;:::-;76085:452;;;;;:::o;74593:109::-;73929:21;73937:12;:10;:12::i;:::-;73929:7;:21::i;:::-;73921:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;74661:33:::1;73856:24;74685:8;74661:10;:33::i;:::-;74593:109:::0;:::o;56235:143::-;56323:13;56356:14;56366:3;56356:9;:14::i;:::-;56349:21;;56235:143;;;:::o;52937:309::-;52998:13;53024:18;53045:4;:8;53050:2;53045:8;;;;;;;;;;;53024:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53064:20;53098:5;:12;53087:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53064:47;;53127:6;53122:93;53143:5;:12;53139:1;:16;53122:93;;;53189:5;53195:1;53189:8;;;;;;;;;;;;;;:14;;;53177:6;53184:1;53177:9;;;;;;;;;;;;;:26;;;;;53157:3;;;;;;;53122:93;;;;53232:6;53225:13;;;;52937:309;;;:::o;70435:114::-;70492:7;70519:6;:12;70526:4;70519:12;;;;;;;;;;;:22;;;70512:29;;70435:114;;;:::o;42302:1220::-;42567:7;:14;42553:3;:10;:28;42545:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42659:1;42645:16;;:2;:16;;;;42637:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;42744:12;:10;:12::i;:::-;42736:20;;:4;:20;;;:60;;;;42760:36;42777:4;42783:12;:10;:12::i;:::-;42760:16;:36::i;:::-;42736:60;42714:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;42887:16;42906:12;:10;:12::i;:::-;42887:31;;42931:60;42952:8;42962:4;42968:2;42972:3;42977:7;42986:4;42931:20;:60::i;:::-;43009:9;43004:358;43028:3;:10;43024:1;:14;43004:358;;;43060:10;43073:3;43077:1;43073:6;;;;;;;;;;;;;;43060:19;;43094:14;43111:7;43119:1;43111:10;;;;;;;;;;;;;;43094:27;;43160:126;43202:6;43160:126;;;;;;;;;;;;;;;;;:9;:13;43170:2;43160:13;;;;;;;;;;;:19;43174:4;43160:19;;;;;;;;;;;;;;;;:23;;:126;;;;;:::i;:::-;43138:9;:13;43148:2;43138:13;;;;;;;;;;;:19;43152:4;43138:19;;;;;;;;;;;;;;;:148;;;;43321:29;43343:6;43321:9;:13;43331:2;43321:13;;;;;;;;;;;:17;43335:2;43321:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;43301:9;:13;43311:2;43301:13;;;;;;;;;;;:17;43315:2;43301:17;;;;;;;;;;;;;;;:49;;;;43004:358;;43040:3;;;;;43004:358;;;;43409:2;43379:47;;43403:4;43379:47;;43393:8;43379:47;;;43413:3;43418:7;43379:47;;;;;;;:::i;:::-;;;;;;;;43439:75;43475:8;43485:4;43491:2;43495:3;43500:7;43509:4;43439:35;:75::i;:::-;42302:1220;;;;;;:::o;70811:227::-;70895:45;70903:6;:12;70910:4;70903:12;;;;;;;;;;;:22;;;70927:12;:10;:12::i;:::-;70895:7;:45::i;:::-;70887:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;71005:25;71016:4;71022:7;71005:10;:25::i;:::-;70811:227;;:::o;72020:209::-;72118:12;:10;:12::i;:::-;72107:23;;:7;:23;;;72099:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;72195:26;72207:4;72213:7;72195:11;:26::i;:::-;72020:209;;:::o;40056:549::-;40237:16;40298:3;:10;40279:8;:15;:29;40271:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;40367:30;40414:8;:15;40400:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40367:63;;40448:9;40443:122;40467:8;:15;40463:1;:19;40443:122;;;40523:30;40533:8;40542:1;40533:11;;;;;;;;;;;;;;40546:3;40550:1;40546:6;;;;;;;;;;;;;;40523:9;:30::i;:::-;40504:13;40518:1;40504:16;;;;;;;;;;;;;:49;;;;;40484:3;;;;;40443:122;;;;40584:13;40577:20;;;40056:549;;;;:::o;52278:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70108:138::-;70181:7;70208:30;70232:5;70208:6;:12;70215:4;70208:12;;;;;;;;;;;:20;;:23;;:30;;;;:::i;:::-;70201:37;;70108:138;;;;:::o;69069:139::-;69138:4;69162:38;69192:7;69162:6;:12;69169:4;69162:12;;;;;;;;;;;:20;;:29;;:38;;;;:::i;:::-;69155:45;;69069:139;;;;:::o;56112:115::-;51822:10;51812:20;;:6;;;;;;;;;;;:20;;;51804:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56191:28:::1;56207:11;56191:15;:28::i;:::-;56112:115:::0;:::o;75207:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55977:127::-;51822:10;51812:20;;:6;;;;;;;;;;;:20;;;51804:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56062:34:::1;56081:14;56062:18;:34::i;:::-;55977:127:::0;:::o;73818:62::-;73856:24;73818:62;:::o;67814:49::-;67859:4;67814:49;;;:::o;40678:311::-;40797:8;40781:24;;:12;:10;:12::i;:::-;:24;;;;40773:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;40909:8;40864:18;:32;40883:12;:10;:12::i;:::-;40864:32;;;;;;;;;;;;;;;:42;40897:8;40864:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;40962:8;40933:48;;40948:12;:10;:12::i;:::-;40933:48;;;40972:8;40933:48;;;;;;:::i;:::-;;;;;;;;40678:311;;:::o;52576:353::-;52644:24;52681:18;52702:4;:8;52707:2;52702:8;;;;;;;;;;;52681:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52721:31;52777:5;:12;52755:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52721:69;;52806:6;52801:97;52822:5;:12;52818:1;:16;52801:97;;;52868:5;52874:1;52868:8;;;;;;;;;;;;;;:18;;;52856:6;52863:1;52856:9;;;;;;;;;;;;;:30;;;;;;;;;;;52836:3;;;;;;;52801:97;;;;52915:6;52908:13;;;;52576:353;;;:::o;15973:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69382:127::-;69445:7;69472:29;:6;:12;69479:4;69472:12;;;;;;;;;;;:20;;:27;:29::i;:::-;69465:36;;69382:127;;;:::o;52208:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;71283:230::-;71368:45;71376:6;:12;71383:4;71376:12;;;;;;;;;;;:22;;;71400:12;:10;:12::i;:::-;71368:7;:45::i;:::-;71360:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;71479:26;71491:4;71497:7;71479:11;:26::i;:::-;71283:230;;:::o;7559:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41061:168::-;41160:4;41184:18;:27;41203:7;41184:27;;;;;;;;;;;;;;;:37;41212:8;41184:37;;;;;;;;;;;;;;;;;;;;;;;;;41177:44;;41061:168;;;;:::o;74480:105::-;73929:21;73937:12;:10;:12::i;:::-;73929:7;:21::i;:::-;73921:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;74545:32:::1;73856:24;74568:8;74545:9;:32::i;:::-;74480:105:::0;:::o;41301:924::-;41541:1;41527:16;;:2;:16;;;;41519:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41626:12;:10;:12::i;:::-;41618:20;;:4;:20;;;:60;;;;41642:36;41659:4;41665:12;:10;:12::i;:::-;41642:16;:36::i;:::-;41618:60;41596:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;41760:16;41779:12;:10;:12::i;:::-;41760:31;;41804:96;41825:8;41835:4;41841:2;41845:21;41863:2;41845:17;:21::i;:::-;41868:25;41886:6;41868:17;:25::i;:::-;41895:4;41804:20;:96::i;:::-;41935:77;41959:6;41935:77;;;;;;;;;;;;;;;;;:9;:13;41945:2;41935:13;;;;;;;;;;;:19;41949:4;41935:19;;;;;;;;;;;;;;;;:23;;:77;;;;;:::i;:::-;41913:9;:13;41923:2;41913:13;;;;;;;;;;;:19;41927:4;41913:19;;;;;;;;;;;;;;;:99;;;;42043:29;42065:6;42043:9;:13;42053:2;42043:13;;;;;;;;;;;:17;42057:2;42043:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;42023:9;:13;42033:2;42023:13;;;;;;;;;;;:17;42037:2;42023:17;;;;;;;;;;;;;;;:49;;;;42121:2;42090:46;;42115:4;42090:46;;42105:8;42090:46;;;42125:2;42129:6;42090:46;;;;;;;:::i;:::-;;;;;;;;42149:68;42180:8;42190:4;42196:2;42200;42204:6;42212:4;42149:30;:68::i;:::-;41301:924;;;;;;:::o;54945:553::-;55044:10;55034:20;;:6;:20;;;:68;;;;55098:4;55058:44;;:36;55075:6;55083:10;55058:16;:36::i;:::-;:44;;;55034:68;55026:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;55163:26;55169:6;55177:3;55182:6;55163:5;:26::i;:::-;54945:553;;;:::o;63043:152::-;63113:4;63137:50;63142:3;:10;;63178:5;63162:23;;63154:32;;63137:4;:50::i;:::-;63130:57;;63043:152;;;;:::o;63615:167::-;63695:4;63719:55;63729:3;:10;;63765:5;63749:23;;63741:32;;63719:9;:55::i;:::-;63712:62;;63615:167;;;;:::o;20948:106::-;21001:15;21036:10;21029:17;;20948:106;:::o;3777:269::-;3846:7;4032:4;3979:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;3969:69;;;;;;3962:76;;3777:269;;;:::o;1156:761::-;1234:7;1317:2;1297:9;:16;:22;1293:96;;1336:41;;;;;;;;;;:::i;:::-;;;;;;;;1293:96;1458:9;1478;1498:7;1750:4;1739:9;1735:20;1729:27;1724:32;;1796:4;1785:9;1781:20;1775:27;1770:32;;1850:4;1839:9;1835:20;1829:27;1826:1;1821:36;1816:41;;1887:22;1895:4;1901:1;1904;1907;1887:7;:22::i;:::-;1880:29;;;;;1156:761;;;;:::o;74710:128::-;74776:4;74800:30;73856:24;74821:8;74800:7;:30::i;:::-;74793:37;;74710:128;;;:::o;53324:1613::-;53467:12;;53451:5;:12;:28;;53429:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;53561:17;53598:9;53593:111;53617:5;:12;53613:1;:16;53593:111;;;53663:29;53677:5;53683:1;53677:8;;;;;;;;;;;;;;:14;;;53663:9;:13;;:29;;;;:::i;:::-;53651:41;;53631:3;;;;;;;53593:111;;;;53751:5;53738:9;:18;;53716:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;53867:3;53842:29;;:8;:13;53851:3;53842:13;;;;;;;;;;;;;;;;;;;;;:29;;;53834:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53929:1;53918:7;:12;;53910:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;54000:1;53985:4;53979:18;:22;53971:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;54052:10;54036:8;:13;54045:3;54036:13;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;54073:27;54117:5;:12;54103:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54073:57;;54141:17;54172:5;:12;54161:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54141:44;;54201:6;54196:342;54217:5;:12;54213:1;:16;54196:342;;;54289:3;54259:34;;:5;54265:1;54259:8;;;;;;;;;;;;;;:18;;;:34;;;;54251:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;54366:1;54348:5;54354:1;54348:8;;;;;;;;;;;;;;:14;;;:19;;54340:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;54415:4;:9;54420:3;54415:9;;;;;;;;;;;54430:5;54436:1;54430:8;;;;;;;;;;;;;;54415:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54470:5;54476:1;54470:8;;;;;;;;;;;;;;:18;;;54454:10;54465:1;54454:13;;;;;;;;;;;;;:34;;;;;;;;;;;54512:5;54518:1;54512:8;;;;;;;;;;;;;;:14;;;54503:3;54507:1;54503:6;;;;;;;;;;;;;:23;;;;;54231:3;;;;;;;54196:342;;;;54567:1;54552:5;:12;:16;54548:93;;;54590:39;54608:3;54613:10;54625:3;54590:39;;;;;;;;:::i;:::-;;;;;;;;54548:93;54651:35;54657:10;54669:3;54674:7;54651:35;;;;;;;;;;;;:5;:35::i;:::-;54746:23;54759:3;54764:4;54746:12;:23::i;:::-;54874:10;54833:66;;54868:3;54833:66;;54848:10;54833:66;;;54886:3;54891:7;54833:66;;;;;;;:::i;:::-;;;;;;;;54925:3;54915:14;54919:4;54915:14;;;;;;:::i;:::-;;;;;;;;53324:1613;;;;;;;:::o;74846:135::-;74911:4;74935:38;67859:4;74943:18;;74964:8;74935:7;:38::i;:::-;74928:45;;74846:135;;;:::o;16412:142::-;16471:13;16504:42;16526:10;:19;16537:7;16526:19;;;;;;;;;;;16504:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;16497:49;;16412:142;;;:::o;49199:245::-;;;;;;;:::o;26926:166::-;27012:7;27045:1;27040;:6;;27048:12;27032:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27083:1;27079;:5;27072:12;;26926:166;;;;;:::o;24099:179::-;24157:7;24177:9;24193:1;24189;:5;24177:17;;24218:1;24213;:6;;24205:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;24269:1;24262:8;;;24099:179;;;;:::o;50222:799::-;50476:15;:2;:13;;;:15::i;:::-;50472:542;;;50529:2;50512:43;;;50556:8;50566:4;50572:3;50577:7;50586:4;50512:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50508:495;;;;:::i;:::-;;;;;;;;50876:6;50869:14;;;;;;;;;;;:::i;:::-;;;;;;;;50508:495;50925:62;;;;;;;;;;:::i;:::-;;;;;;;;50508:495;50653:52;;;50641:64;;;:8;:64;;;;50637:163;;50730:50;;;;;;;;;;:::i;:::-;;;;;;;;50637:163;50592:223;50472:542;50222:799;;;;;;:::o;73263:188::-;73337:33;73362:7;73337:6;:12;73344:4;73337:12;;;;;;;;;;;:20;;:24;;:33;;;;:::i;:::-;73333:111;;;73419:12;:10;:12::i;:::-;73392:40;;73410:7;73392:40;;73404:4;73392:40;;;;;;;;;;73333:111;73263:188;;:::o;73459:192::-;73534:36;73562:7;73534:6;:12;73541:4;73534:12;;;;;;;;;;;:20;;:27;;:36;;;;:::i;:::-;73530:114;;;73619:12;:10;:12::i;:::-;73592:40;;73610:7;73592:40;;73604:4;73592:40;;;;;;;;;;73530:114;73459:192;;:::o;64329:158::-;64403:7;64454:22;64458:3;:10;;64470:5;64454:3;:22::i;:::-;64446:31;;64423:56;;64329:158;;;;:::o;8025:107::-;8112:12;8098:11;:26;;;;;;;;;;;;:::i;:::-;;8025:107;:::o;17065:119::-;17161:15;17144:14;:32;;;;;;;;;;;;:::i;:::-;;17065:119;:::o;63868:117::-;63931:7;63958:19;63966:3;:10;;63958:7;:19::i;:::-;63951:26;;63868:117;;;:::o;51029:198::-;51095:16;51124:22;51163:1;51149:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51124:41;;51187:7;51176:5;51182:1;51176:8;;;;;;;;;;;;;:18;;;;;51214:5;51207:12;;;51029:198;;;:::o;49452:762::-;49681:15;:2;:13;;;:15::i;:::-;49677:530;;;49734:2;49717:38;;;49756:8;49766:4;49772:2;49776:6;49784:4;49717:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49713:483;;;;:::i;:::-;;;;;;;;50069:6;50062:14;;;;;;;;;;;:::i;:::-;;;;;;;;49713:483;50118:62;;;;;;;;;;:::i;:::-;;;;;;;;49713:483;49851:47;;;49839:59;;;:8;:59;;;;49835:158;;49923:50;;;;;;;;;;:::i;:::-;;;;;;;;49835:158;49790:218;49677:530;49452:762;;;;;;:::o;46768:551::-;46883:1;46864:21;;:7;:21;;;;46856:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;46938:16;46957:12;:10;:12::i;:::-;46938:31;;46982:105;47003:8;47013:7;47030:1;47034:21;47052:2;47034:17;:21::i;:::-;47057:25;47075:6;47057:17;:25::i;:::-;46982:105;;;;;;;;;;;;:20;:105::i;:::-;47125:111;47166:6;47125:111;;;;;;;;;;;;;;;;;:9;:13;47135:2;47125:13;;;;;;;;;;;:22;47139:7;47125:22;;;;;;;;;;;;;;;;:26;;:111;;;;;:::i;:::-;47100:9;:13;47110:2;47100:13;;;;;;;;;;;:22;47114:7;47100:22;;;;;;;;;;;;;;;:136;;;;47296:1;47254:57;;47279:7;47254:57;;47269:8;47254:57;;;47300:2;47304:6;47254:57;;;;;;;:::i;:::-;;;;;;;;46768:551;;;;:::o;58107:414::-;58170:4;58192:21;58202:3;58207:5;58192:9;:21::i;:::-;58187:327;;58230:3;:11;;58247:5;58230:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58413:3;:11;;:18;;;;58391:3;:12;;:19;58404:5;58391:19;;;;;;;;;;;:40;;;;58453:4;58446:11;;;;58187:327;58497:5;58490:12;;58107:414;;;;;:::o;60327:129::-;60400:4;60447:1;60424:3;:12;;:19;60437:5;60424:19;;;;;;;;;;;;:24;;60417:31;;60327:129;;;;:::o;2071:1432::-;2156:7;3081:66;3075:1;3067:10;;:80;;3059:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;3210:2;3205:1;:7;;;:18;;;;3221:2;3216:1;:7;;;3205:18;3197:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;3360:14;3377:24;3387:4;3393:1;3396;3399;3377:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3360:41;;3438:1;3420:20;;:6;:20;;;;3412:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3489:6;3482:13;;;2071:1432;;;;;;:::o;44855:583::-;44989:1;44970:21;;:7;:21;;;;44962:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45042:16;45061:12;:10;:12::i;:::-;45042:31;;45086:107;45107:8;45125:1;45129:7;45138:21;45156:2;45138:17;:21::i;:::-;45161:25;45179:6;45161:17;:25::i;:::-;45188:4;45086:20;:107::i;:::-;45231:34;45258:6;45231:9;:13;45241:2;45231:13;;;;;;;;;;;:22;45245:7;45231:22;;;;;;;;;;;;;;;;:26;;:34;;;;:::i;:::-;45206:9;:13;45216:2;45206:13;;;;;;;;;;;:22;45220:7;45206:22;;;;;;;;;;;;;;;:59;;;;45318:7;45281:57;;45314:1;45281:57;;45296:8;45281:57;;;45327:2;45331:6;45281:57;;;;;;;:::i;:::-;;;;;;;;45351:79;45382:8;45400:1;45404:7;45413:2;45417:6;45425:4;45351:30;:79::i;:::-;44855:583;;;;;:::o;55745:224::-;55877:3;55848:33;;:8;:17;55857:7;55848:17;;;;;;;;;;;;;;;;;;;;;:33;;;;55840:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;55929:32;55948:7;55957:3;55929:18;:32::i;:::-;55745:224;;:::o;13433:422::-;13508:13;13534:16;13559:2;13534:28;;13573:16;13598:2;13573:28;;13612:16;13654:3;:10;13641:3;:10;:23;13631:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13612:53;;13676:6;13702;13697:55;13718:3;:10;13714:1;:14;13697:55;;;13746:3;13750:1;13746:6;;;;;;;;;;;;;;;;13735:3;13739;;;;;;13735:8;;;;;;;;;;;:17;;;;;;;;;;;13730:3;;;;;;;13697:55;;;;13768:6;13763:55;13784:3;:10;13780:1;:14;13763:55;;;13812:3;13816:1;13812:6;;;;;;;;;;;;;;;;13801:3;13805;;;;;;13801:8;;;;;;;;;;;:17;;;;;;;;;;;13796:3;;;;;;;13763:55;;;;13843:3;13829:18;;;;;;13433:422;;;;:::o;29540:::-;29600:4;29808:12;29919:7;29907:20;29899:28;;29953:1;29946:4;:8;29939:15;;;29540:422;;;:::o;63371:158::-;63444:4;63468:53;63476:3;:10;;63512:5;63496:23;;63488:32;;63468:7;:53::i;:::-;63461:60;;63371:158;;;;:::o;60995:204::-;61062:7;61111:5;61090:3;:11;;:18;;;;:26;61082:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;61173:3;:11;;61185:5;61173:18;;;;;;;;;;;;;;;;61166:25;;60995:204;;;;:::o;60542:109::-;60598:7;60625:3;:11;;:18;;;;60618:25;;60542:109;;;:::o;16801:119::-;16909:3;16887:10;:19;16898:7;16887:19;;;;;;;;;;;:25;;;;;;;;;;;;:::i;:::-;;16801:119;;:::o;58697:1544::-;58763:4;58881:18;58902:3;:12;;:19;58915:5;58902:19;;;;;;;;;;;;58881:40;;58952:1;58938:10;:15;58934:1300;;59300:21;59337:1;59324:10;:14;59300:38;;59353:17;59394:1;59373:3;:11;;:18;;;;:22;59353:42;;59640:17;59660:3;:11;;59672:9;59660:22;;;;;;;;;;;;;;;;59640:42;;59806:9;59777:3;:11;;59789:13;59777:26;;;;;;;;;;;;;;;:38;;;;59925:1;59909:13;:17;59883:3;:12;;:23;59896:9;59883:23;;;;;;;;;;;:43;;;;60035:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;60130:3;:12;;:19;60143:5;60130:19;;;;;;;;;;;60123:26;;;60173:4;60166:11;;;;;;;;58934:1300;60217:5;60210:12;;;58697:1544;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:146::-;;230:6;217:20;208:29;;242:41;277:5;242:41;:::i;:::-;202:86;;;;:::o;313:707::-;;430:3;423:4;415:6;411:17;407:27;397:2;;448:1;445;438:12;397:2;485:6;472:20;507:80;522:64;579:6;522:64;:::i;:::-;507:80;:::i;:::-;498:89;;604:5;629:6;622:5;615:21;659:4;651:6;647:17;637:27;;681:4;676:3;672:14;665:21;;734:6;781:3;773:4;765:6;761:17;756:3;752:27;749:36;746:2;;;798:1;795;788:12;746:2;823:1;808:206;833:6;830:1;827:13;808:206;;;891:3;913:37;946:3;934:10;913:37;:::i;:::-;908:3;901:50;974:4;969:3;965:14;958:21;;1002:4;997:3;993:14;986:21;;865:149;855:1;852;848:9;843:14;;808:206;;;812:14;390:630;;;;;;;:::o;1061:770::-;;1199:3;1192:4;1184:6;1180:17;1176:27;1166:2;;1217:1;1214;1207:12;1166:2;1254:6;1241:20;1276:101;1291:85;1369:6;1291:85;:::i;:::-;1276:101;:::i;:::-;1267:110;;1394:5;1419:6;1412:5;1405:21;1449:4;1441:6;1437:17;1427:27;;1471:4;1466:3;1462:14;1455:21;;1524:6;1571:3;1563:4;1555:6;1551:17;1546:3;1542:27;1539:36;1536:2;;;1588:1;1585;1578:12;1536:2;1613:1;1598:227;1623:6;1620:1;1617:13;1598:227;;;1681:3;1703:58;1757:3;1745:10;1703:58;:::i;:::-;1698:3;1691:71;1785:4;1780:3;1776:14;1769:21;;1813:4;1808:3;1804:14;1797:21;;1655:170;1645:1;1642;1638:9;1633:14;;1598:227;;;1602:14;1159:672;;;;;;;:::o;1857:707::-;;1974:3;1967:4;1959:6;1955:17;1951:27;1941:2;;1992:1;1989;1982:12;1941:2;2029:6;2016:20;2051:80;2066:64;2123:6;2066:64;:::i;:::-;2051:80;:::i;:::-;2042:89;;2148:5;2173:6;2166:5;2159:21;2203:4;2195:6;2191:17;2181:27;;2225:4;2220:3;2216:14;2209:21;;2278:6;2325:3;2317:4;2309:6;2305:17;2300:3;2296:27;2293:36;2290:2;;;2342:1;2339;2332:12;2290:2;2367:1;2352:206;2377:6;2374:1;2371:13;2352:206;;;2435:3;2457:37;2490:3;2478:10;2457:37;:::i;:::-;2452:3;2445:50;2518:4;2513:3;2509:14;2502:21;;2546:4;2541:3;2537:14;2530:21;;2409:149;2399:1;2396;2392:9;2387:14;;2352:206;;;2356:14;1934:630;;;;;;;:::o;2572:124::-;;2649:6;2636:20;2627:29;;2661:30;2685:5;2661:30;:::i;:::-;2621:75;;;;:::o;2703:130::-;;2783:6;2770:20;2761:29;;2795:33;2822:5;2795:33;:::i;:::-;2755:78;;;;:::o;2840:128::-;;2919:6;2906:20;2897:29;;2931:32;2957:5;2931:32;:::i;:::-;2891:77;;;;:::o;2975:132::-;;3058:6;3052:13;3043:22;;3070:32;3096:5;3070:32;:::i;:::-;3037:70;;;;:::o;3115:440::-;;3216:3;3209:4;3201:6;3197:17;3193:27;3183:2;;3234:1;3231;3224:12;3183:2;3271:6;3258:20;3293:64;3308:48;3349:6;3308:48;:::i;:::-;3293:64;:::i;:::-;3284:73;;3377:6;3370:5;3363:21;3413:4;3405:6;3401:17;3446:4;3439:5;3435:16;3481:3;3472:6;3467:3;3463:16;3460:25;3457:2;;;3498:1;3495;3488:12;3457:2;3508:41;3542:6;3537:3;3532;3508:41;:::i;:::-;3176:379;;;;;;;:::o;3564:442::-;;3666:3;3659:4;3651:6;3647:17;3643:27;3633:2;;3684:1;3681;3674:12;3633:2;3721:6;3708:20;3743:65;3758:49;3800:6;3758:49;:::i;:::-;3743:65;:::i;:::-;3734:74;;3828:6;3821:5;3814:21;3864:4;3856:6;3852:17;3897:4;3890:5;3886:16;3932:3;3923:6;3918:3;3914:16;3911:25;3908:2;;;3949:1;3946;3939:12;3908:2;3959:41;3993:6;3988:3;3983;3959:41;:::i;:::-;3626:380;;;;;;;:::o;4043:477::-;;4153:4;4141:9;4136:3;4132:19;4128:30;4125:2;;;4171:1;4168;4161:12;4125:2;4189:20;4204:4;4189:20;:::i;:::-;4180:29;;4264:1;4296:57;4349:3;4340:6;4329:9;4325:22;4296:57;:::i;:::-;4289:4;4282:5;4278:16;4271:83;4219:146;4416:2;4449:49;4494:3;4485:6;4474:9;4470:22;4449:49;:::i;:::-;4442:4;4435:5;4431:16;4424:75;4375:135;4119:401;;;;:::o;4527:130::-;;4607:6;4594:20;4585:29;;4619:33;4646:5;4619:33;:::i;:::-;4579:78;;;;:::o;4664:241::-;;4768:2;4756:9;4747:7;4743:23;4739:32;4736:2;;;4784:1;4781;4774:12;4736:2;4819:1;4836:53;4881:7;4872:6;4861:9;4857:22;4836:53;:::i;:::-;4826:63;;4798:97;4730:175;;;;:::o;4912:366::-;;;5033:2;5021:9;5012:7;5008:23;5004:32;5001:2;;;5049:1;5046;5039:12;5001:2;5084:1;5101:53;5146:7;5137:6;5126:9;5122:22;5101:53;:::i;:::-;5091:63;;5063:97;5191:2;5209:53;5254:7;5245:6;5234:9;5230:22;5209:53;:::i;:::-;5199:63;;5170:98;4995:283;;;;;:::o;5285:1119::-;;;;;;5516:3;5504:9;5495:7;5491:23;5487:33;5484:2;;;5533:1;5530;5523:12;5484:2;5568:1;5585:53;5630:7;5621:6;5610:9;5606:22;5585:53;:::i;:::-;5575:63;;5547:97;5675:2;5693:53;5738:7;5729:6;5718:9;5714:22;5693:53;:::i;:::-;5683:63;;5654:98;5811:2;5800:9;5796:18;5783:32;5835:18;5827:6;5824:30;5821:2;;;5867:1;5864;5857:12;5821:2;5887:78;5957:7;5948:6;5937:9;5933:22;5887:78;:::i;:::-;5877:88;;5762:209;6030:2;6019:9;6015:18;6002:32;6054:18;6046:6;6043:30;6040:2;;;6086:1;6083;6076:12;6040:2;6106:78;6176:7;6167:6;6156:9;6152:22;6106:78;:::i;:::-;6096:88;;5981:209;6249:3;6238:9;6234:19;6221:33;6274:18;6266:6;6263:30;6260:2;;;6306:1;6303;6296:12;6260:2;6326:62;6380:7;6371:6;6360:9;6356:22;6326:62;:::i;:::-;6316:72;;6200:194;5478:926;;;;;;;;:::o;6411:847::-;;;;;;6592:3;6580:9;6571:7;6567:23;6563:33;6560:2;;;6609:1;6606;6599:12;6560:2;6644:1;6661:53;6706:7;6697:6;6686:9;6682:22;6661:53;:::i;:::-;6651:63;;6623:97;6751:2;6769:53;6814:7;6805:6;6794:9;6790:22;6769:53;:::i;:::-;6759:63;;6730:98;6859:2;6877:53;6922:7;6913:6;6902:9;6898:22;6877:53;:::i;:::-;6867:63;;6838:98;6967:2;6985:53;7030:7;7021:6;7010:9;7006:22;6985:53;:::i;:::-;6975:63;;6946:98;7103:3;7092:9;7088:19;7075:33;7128:18;7120:6;7117:30;7114:2;;;7160:1;7157;7150:12;7114:2;7180:62;7234:7;7225:6;7214:9;7210:22;7180:62;:::i;:::-;7170:72;;7054:194;6554:704;;;;;;;;:::o;7265:360::-;;;7383:2;7371:9;7362:7;7358:23;7354:32;7351:2;;;7399:1;7396;7389:12;7351:2;7434:1;7451:53;7496:7;7487:6;7476:9;7472:22;7451:53;:::i;:::-;7441:63;;7413:97;7541:2;7559:50;7601:7;7592:6;7581:9;7577:22;7559:50;:::i;:::-;7549:60;;7520:95;7345:280;;;;;:::o;7632:366::-;;;7753:2;7741:9;7732:7;7728:23;7724:32;7721:2;;;7769:1;7766;7759:12;7721:2;7804:1;7821:53;7866:7;7857:6;7846:9;7842:22;7821:53;:::i;:::-;7811:63;;7783:97;7911:2;7929:53;7974:7;7965:6;7954:9;7950:22;7929:53;:::i;:::-;7919:63;;7890:98;7715:283;;;;;:::o;8005:491::-;;;;8143:2;8131:9;8122:7;8118:23;8114:32;8111:2;;;8159:1;8156;8149:12;8111:2;8194:1;8211:53;8256:7;8247:6;8236:9;8232:22;8211:53;:::i;:::-;8201:63;;8173:97;8301:2;8319:53;8364:7;8355:6;8344:9;8340:22;8319:53;:::i;:::-;8309:63;;8280:98;8409:2;8427:53;8472:7;8463:6;8452:9;8448:22;8427:53;:::i;:::-;8417:63;;8388:98;8105:391;;;;;:::o;8503:638::-;;;8674:2;8662:9;8653:7;8649:23;8645:32;8642:2;;;8690:1;8687;8680:12;8642:2;8753:1;8742:9;8738:17;8725:31;8776:18;8768:6;8765:30;8762:2;;;8808:1;8805;8798:12;8762:2;8828:78;8898:7;8889:6;8878:9;8874:22;8828:78;:::i;:::-;8818:88;;8704:208;8971:2;8960:9;8956:18;8943:32;8995:18;8987:6;8984:30;8981:2;;;9027:1;9024;9017:12;8981:2;9047:78;9117:7;9108:6;9097:9;9093:22;9047:78;:::i;:::-;9037:88;;8922:209;8636:505;;;;;:::o;9148:241::-;;9252:2;9240:9;9231:7;9227:23;9223:32;9220:2;;;9268:1;9265;9258:12;9220:2;9303:1;9320:53;9365:7;9356:6;9345:9;9341:22;9320:53;:::i;:::-;9310:63;;9282:97;9214:175;;;;:::o;9396:366::-;;;9517:2;9505:9;9496:7;9492:23;9488:32;9485:2;;;9533:1;9530;9523:12;9485:2;9568:1;9585:53;9630:7;9621:6;9610:9;9606:22;9585:53;:::i;:::-;9575:63;;9547:97;9675:2;9693:53;9738:7;9729:6;9718:9;9714:22;9693:53;:::i;:::-;9683:63;;9654:98;9479:283;;;;;:::o;9769:366::-;;;9890:2;9878:9;9869:7;9865:23;9861:32;9858:2;;;9906:1;9903;9896:12;9858:2;9941:1;9958:53;10003:7;9994:6;9983:9;9979:22;9958:53;:::i;:::-;9948:63;;9920:97;10048:2;10066:53;10111:7;10102:6;10091:9;10087:22;10066:53;:::i;:::-;10056:63;;10027:98;9852:283;;;;;:::o;10142:239::-;;10245:2;10233:9;10224:7;10220:23;10216:32;10213:2;;;10261:1;10258;10251:12;10213:2;10296:1;10313:52;10357:7;10348:6;10337:9;10333:22;10313:52;:::i;:::-;10303:62;;10275:96;10207:174;;;;:::o;10388:261::-;;10502:2;10490:9;10481:7;10477:23;10473:32;10470:2;;;10518:1;10515;10508:12;10470:2;10553:1;10570:63;10625:7;10616:6;10605:9;10601:22;10570:63;:::i;:::-;10560:73;;10532:107;10464:185;;;;:::o;10656:347::-;;10770:2;10758:9;10749:7;10745:23;10741:32;10738:2;;;10786:1;10783;10776:12;10738:2;10849:1;10838:9;10834:17;10821:31;10872:18;10864:6;10861:30;10858:2;;;10904:1;10901;10894:12;10858:2;10924:63;10979:7;10970:6;10959:9;10955:22;10924:63;:::i;:::-;10914:73;;10800:193;10732:271;;;;:::o;11010:241::-;;11114:2;11102:9;11093:7;11089:23;11085:32;11082:2;;;11130:1;11127;11120:12;11082:2;11165:1;11182:53;11227:7;11218:6;11207:9;11203:22;11182:53;:::i;:::-;11172:63;;11144:97;11076:175;;;;:::o;11258:1131::-;;;;;;11495:3;11483:9;11474:7;11470:23;11466:33;11463:2;;;11512:1;11509;11502:12;11463:2;11547:1;11564:53;11609:7;11600:6;11589:9;11585:22;11564:53;:::i;:::-;11554:63;;11526:97;11682:2;11671:9;11667:18;11654:32;11706:18;11698:6;11695:30;11692:2;;;11738:1;11735;11728:12;11692:2;11758:62;11812:7;11803:6;11792:9;11788:22;11758:62;:::i;:::-;11748:72;;11633:193;11885:2;11874:9;11870:18;11857:32;11909:18;11901:6;11898:30;11895:2;;;11941:1;11938;11931:12;11895:2;11961:99;12052:7;12043:6;12032:9;12028:22;11961:99;:::i;:::-;11951:109;;11836:230;12097:2;12115:53;12160:7;12151:6;12140:9;12136:22;12115:53;:::i;:::-;12105:63;;12076:98;12233:3;12222:9;12218:19;12205:33;12258:18;12250:6;12247:30;12244:2;;;12290:1;12287;12280:12;12244:2;12310:63;12365:7;12356:6;12345:9;12341:22;12310:63;:::i;:::-;12300:73;;12184:195;11457:932;;;;;;;;:::o;12396:366::-;;;12517:2;12505:9;12496:7;12492:23;12488:32;12485:2;;;12533:1;12530;12523:12;12485:2;12568:1;12585:53;12630:7;12621:6;12610:9;12606:22;12585:53;:::i;:::-;12575:63;;12547:97;12675:2;12693:53;12738:7;12729:6;12718:9;12714:22;12693:53;:::i;:::-;12683:63;;12654:98;12479:283;;;;;:::o;12770:205::-;;12873:62;12931:3;12923:6;12873:62;:::i;:::-;12964:4;12959:3;12955:14;12941:28;;12866:109;;;;:::o;12984:173::-;;13071:46;13113:3;13105:6;13071:46;:::i;:::-;13146:4;13141:3;13137:14;13123:28;;13064:93;;;;:::o;13166:173::-;;13253:46;13295:3;13287:6;13253:46;:::i;:::-;13328:4;13323:3;13319:14;13305:28;;13246:93;;;;:::o;13347:127::-;13436:32;13462:5;13436:32;:::i;:::-;13431:3;13424:45;13418:56;;:::o;13481:137::-;13580:32;13606:5;13580:32;:::i;:::-;13575:3;13568:45;13562:56;;:::o;13625:184::-;13742:61;13770:32;13796:5;13770:32;:::i;:::-;13742:61;:::i;:::-;13737:3;13730:74;13724:85;;:::o;13816:103::-;13889:24;13907:5;13889:24;:::i;:::-;13884:3;13877:37;13871:48;;:::o;13926:113::-;14009:24;14027:5;14009:24;:::i;:::-;14004:3;13997:37;13991:48;;:::o;14046:152::-;14147:45;14167:24;14185:5;14167:24;:::i;:::-;14147:45;:::i;:::-;14142:3;14135:58;14129:69;;:::o;14236:690::-;;14381:54;14429:5;14381:54;:::i;:::-;14448:86;14527:6;14522:3;14448:86;:::i;:::-;14441:93;;14555:56;14605:5;14555:56;:::i;:::-;14631:7;14659:1;14644:260;14669:6;14666:1;14663:13;14644:260;;;14736:6;14730:13;14757:63;14816:3;14801:13;14757:63;:::i;:::-;14750:70;;14837:60;14890:6;14837:60;:::i;:::-;14827:70;;14701:203;14691:1;14688;14684:9;14679:14;;14644:260;;;14648:14;14917:3;14910:10;;14360:566;;;;;;;:::o;14981:754::-;;15142:62;15198:5;15142:62;:::i;:::-;15217:94;15304:6;15299:3;15217:94;:::i;:::-;15210:101;;15332:64;15390:5;15332:64;:::i;:::-;15416:7;15444:1;15429:284;15454:6;15451:1;15448:13;15429:284;;;15521:6;15515:13;15542:79;15617:3;15602:13;15542:79;:::i;:::-;15535:86;;15638:68;15699:6;15638:68;:::i;:::-;15628:78;;15486:227;15476:1;15473;15469:9;15464:14;;15429:284;;;15433:14;15726:3;15719:10;;15121:614;;;;;;;:::o;15774:690::-;;15919:54;15967:5;15919:54;:::i;:::-;15986:86;16065:6;16060:3;15986:86;:::i;:::-;15979:93;;16093:56;16143:5;16093:56;:::i;:::-;16169:7;16197:1;16182:260;16207:6;16204:1;16201:13;16182:260;;;16274:6;16268:13;16295:63;16354:3;16339:13;16295:63;:::i;:::-;16288:70;;16375:60;16428:6;16375:60;:::i;:::-;16365:70;;16239:203;16229:1;16226;16222:9;16217:14;;16182:260;;;16186:14;16455:3;16448:10;;15898:566;;;;;;;:::o;16472:104::-;16549:21;16564:5;16549:21;:::i;:::-;16544:3;16537:34;16531:45;;:::o;16583:113::-;16666:24;16684:5;16666:24;:::i;:::-;16661:3;16654:37;16648:48;;:::o;16703:152::-;16804:45;16824:24;16842:5;16824:24;:::i;:::-;16804:45;:::i;:::-;16799:3;16792:58;16786:69;;:::o;16862:343::-;;16972:38;17004:5;16972:38;:::i;:::-;17022:70;17085:6;17080:3;17022:70;:::i;:::-;17015:77;;17097:52;17142:6;17137:3;17130:4;17123:5;17119:16;17097:52;:::i;:::-;17170:29;17192:6;17170:29;:::i;:::-;17165:3;17161:39;17154:46;;16952:253;;;;;:::o;17212:347::-;;17324:39;17357:5;17324:39;:::i;:::-;17375:71;17439:6;17434:3;17375:71;:::i;:::-;17368:78;;17451:52;17496:6;17491:3;17484:4;17477:5;17473:16;17451:52;:::i;:::-;17524:29;17546:6;17524:29;:::i;:::-;17519:3;17515:39;17508:46;;17304:255;;;;;:::o;17567:324::-;;17727:67;17791:2;17786:3;17727:67;:::i;:::-;17720:74;;17827:26;17823:1;17818:3;17814:11;17807:47;17882:2;17877:3;17873:12;17866:19;;17713:178;;;:::o;17900:389::-;;18060:67;18124:2;18119:3;18060:67;:::i;:::-;18053:74;;18160:34;18156:1;18151:3;18147:11;18140:55;18229:22;18224:2;18219:3;18215:12;18208:44;18280:2;18275:3;18271:12;18264:19;;18046:243;;;:::o;18298:371::-;;18458:67;18522:2;18517:3;18458:67;:::i;:::-;18451:74;;18558:34;18554:1;18549:3;18545:11;18538:55;18627:4;18622:2;18617:3;18613:12;18606:26;18660:2;18655:3;18651:12;18644:19;;18444:225;;;:::o;18678:377::-;;18838:67;18902:2;18897:3;18838:67;:::i;:::-;18831:74;;18938:34;18934:1;18929:3;18925:11;18918:55;19007:10;19002:2;18997:3;18993:12;18986:32;19046:2;19041:3;19037:12;19030:19;;18824:231;;;:::o;19064:328::-;;19224:67;19288:2;19283:3;19224:67;:::i;:::-;19217:74;;19324:30;19320:1;19315:3;19311:11;19304:51;19383:2;19378:3;19374:12;19367:19;;19210:182;;;:::o;19401:384::-;;19561:67;19625:2;19620:3;19561:67;:::i;:::-;19554:74;;19661:34;19657:1;19652:3;19648:11;19641:55;19730:17;19725:2;19720:3;19716:12;19709:39;19776:2;19771:3;19767:12;19760:19;;19547:238;;;:::o;19794:317::-;;19954:67;20018:2;20013:3;19954:67;:::i;:::-;19947:74;;20054:19;20050:1;20045:3;20041:11;20034:40;20102:2;20097:3;20093:12;20086:19;;19940:171;;;:::o;20120:331::-;;20280:67;20344:2;20339:3;20280:67;:::i;:::-;20273:74;;20380:33;20376:1;20371:3;20367:11;20360:54;20442:2;20437:3;20433:12;20426:19;;20266:185;;;:::o;20460:400::-;;20638:85;20720:2;20715:3;20638:85;:::i;:::-;20631:92;;20756:66;20752:1;20747:3;20743:11;20736:87;20851:2;20846:3;20842:12;20835:19;;20624:236;;;:::o;20869:380::-;;21029:67;21093:2;21088:3;21029:67;:::i;:::-;21022:74;;21129:34;21125:1;21120:3;21116:11;21109:55;21198:13;21193:2;21188:3;21184:12;21177:35;21240:2;21235:3;21231:12;21224:19;;21015:234;;;:::o;21258:327::-;;21418:67;21482:2;21477:3;21418:67;:::i;:::-;21411:74;;21518:29;21514:1;21509:3;21505:11;21498:50;21576:2;21571:3;21567:12;21560:19;;21404:181;;;:::o;21594:332::-;;21754:67;21818:2;21813:3;21754:67;:::i;:::-;21747:74;;21854:34;21850:1;21845:3;21841:11;21834:55;21917:2;21912:3;21908:12;21901:19;;21740:186;;;:::o;21935:378::-;;22095:67;22159:2;22154:3;22095:67;:::i;:::-;22088:74;;22195:34;22191:1;22186:3;22182:11;22175:55;22264:11;22259:2;22254:3;22250:12;22243:33;22304:2;22299:3;22295:12;22288:19;;22081:232;;;:::o;22322:371::-;;22482:67;22546:2;22541:3;22482:67;:::i;:::-;22475:74;;22582:34;22578:1;22573:3;22569:11;22562:55;22651:4;22646:2;22641:3;22637:12;22630:26;22684:2;22679:3;22675:12;22668:19;;22468:225;;;:::o;22702:378::-;;22862:67;22926:2;22921:3;22862:67;:::i;:::-;22855:74;;22962:34;22958:1;22953:3;22949:11;22942:55;23031:11;23026:2;23021:3;23017:12;23010:33;23071:2;23066:3;23062:12;23055:19;;22848:232;;;:::o;23089:385::-;;23249:67;23313:2;23308:3;23249:67;:::i;:::-;23242:74;;23349:34;23345:1;23340:3;23336:11;23329:55;23418:18;23413:2;23408:3;23404:12;23397:40;23465:2;23460:3;23456:12;23449:19;;23235:239;;;:::o;23483:374::-;;23643:67;23707:2;23702:3;23643:67;:::i;:::-;23636:74;;23743:34;23739:1;23734:3;23730:11;23723:55;23812:7;23807:2;23802:3;23798:12;23791:29;23848:2;23843:3;23839:12;23832:19;;23629:228;;;:::o;23866:387::-;;24026:67;24090:2;24085:3;24026:67;:::i;:::-;24019:74;;24126:34;24122:1;24117:3;24113:11;24106:55;24195:20;24190:2;24185:3;24181:12;24174:42;24244:2;24239:3;24235:12;24228:19;;24012:241;;;:::o;24262:332::-;;24422:67;24486:2;24481:3;24422:67;:::i;:::-;24415:74;;24522:34;24518:1;24513:3;24509:11;24502:55;24585:2;24580:3;24576:12;24569:19;;24408:186;;;:::o;24603:380::-;;24763:67;24827:2;24822:3;24763:67;:::i;:::-;24756:74;;24863:34;24859:1;24854:3;24850:11;24843:55;24932:13;24927:2;24922:3;24918:12;24911:35;24974:2;24969:3;24965:12;24958:19;;24749:234;;;:::o;24992:371::-;;25152:67;25216:2;25211:3;25152:67;:::i;:::-;25145:74;;25252:34;25248:1;25243:3;25239:11;25232:55;25321:4;25316:2;25311:3;25307:12;25300:26;25354:2;25349:3;25345:12;25338:19;;25138:225;;;:::o;25372:372::-;;25532:67;25596:2;25591:3;25532:67;:::i;:::-;25525:74;;25632:34;25628:1;25623:3;25619:11;25612:55;25701:5;25696:2;25691:3;25687:12;25680:27;25735:2;25730:3;25726:12;25719:19;;25518:226;;;:::o;25753:332::-;;25913:67;25977:2;25972:3;25913:67;:::i;:::-;25906:74;;26013:34;26009:1;26004:3;26000:11;25993:55;26076:2;26071:3;26067:12;26060:19;;25899:186;;;:::o;26094:323::-;;26254:67;26318:2;26313:3;26254:67;:::i;:::-;26247:74;;26354:25;26350:1;26345:3;26341:11;26334:46;26408:2;26403:3;26399:12;26392:19;;26240:177;;;:::o;26426:374::-;;26586:67;26650:2;26645:3;26586:67;:::i;:::-;26579:74;;26686:34;26682:1;26677:3;26673:11;26666:55;26755:7;26750:2;26745:3;26741:12;26734:29;26791:2;26786:3;26782:12;26775:19;;26572:228;;;:::o;26809:325::-;;26969:67;27033:2;27028:3;26969:67;:::i;:::-;26962:74;;27069:27;27065:1;27060:3;27056:11;27049:48;27125:2;27120:3;27116:12;27109:19;;26955:179;;;:::o;27143:378::-;;27303:67;27367:2;27362:3;27303:67;:::i;:::-;27296:74;;27403:34;27399:1;27394:3;27390:11;27383:55;27472:11;27467:2;27462:3;27458:12;27451:33;27512:2;27507:3;27503:12;27496:19;;27289:232;;;:::o;27530:378::-;;27690:67;27754:2;27749:3;27690:67;:::i;:::-;27683:74;;27790:34;27786:1;27781:3;27777:11;27770:55;27859:11;27854:2;27849:3;27845:12;27838:33;27899:2;27894:3;27890:12;27883:19;;27676:232;;;:::o;27917:377::-;;28077:67;28141:2;28136:3;28077:67;:::i;:::-;28070:74;;28177:34;28173:1;28168:3;28164:11;28157:55;28246:10;28241:2;28236:3;28232:12;28225:32;28285:2;28280:3;28276:12;28269:19;;28063:231;;;:::o;28303:370::-;;28463:67;28527:2;28522:3;28463:67;:::i;:::-;28456:74;;28563:34;28559:1;28554:3;28550:11;28543:55;28632:3;28627:2;28622:3;28618:12;28611:25;28664:2;28659:3;28655:12;28648:19;;28449:224;;;:::o;28682:327::-;;28842:67;28906:2;28901:3;28842:67;:::i;:::-;28835:74;;28942:29;28938:1;28933:3;28929:11;28922:50;29000:2;28995:3;28991:12;28984:19;;28828:181;;;:::o;29018:384::-;;29178:67;29242:2;29237:3;29178:67;:::i;:::-;29171:74;;29278:34;29274:1;29269:3;29265:11;29258:55;29347:17;29342:2;29337:3;29333:12;29326:39;29393:2;29388:3;29384:12;29377:19;;29164:238;;;:::o;29411:317::-;;29571:67;29635:2;29630:3;29571:67;:::i;:::-;29564:74;;29671:19;29667:1;29662:3;29658:11;29651:40;29719:2;29714:3;29710:12;29703:19;;29557:171;;;:::o;29736:103::-;29809:24;29827:5;29809:24;:::i;:::-;29804:3;29797:37;29791:48;;:::o;29846:113::-;29929:24;29947:5;29929:24;:::i;:::-;29924:3;29917:37;29911:48;;:::o;29966:152::-;30067:45;30087:24;30105:5;30087:24;:::i;:::-;30067:45;:::i;:::-;30062:3;30055:58;30049:69;;:::o;30125:107::-;30204:22;30220:5;30204:22;:::i;:::-;30199:3;30192:35;30186:46;;:::o;30239:563::-;;30439:75;30510:3;30501:6;30439:75;:::i;:::-;30536:2;30531:3;30527:12;30520:19;;30550:75;30621:3;30612:6;30550:75;:::i;:::-;30647:2;30642:3;30638:12;30631:19;;30661:91;30748:3;30739:6;30661:91;:::i;:::-;30774:2;30769:3;30765:12;30758:19;;30794:3;30787:10;;30427:375;;;;;;:::o;30809:520::-;;31045:148;31189:3;31045:148;:::i;:::-;31038:155;;31204:75;31275:3;31266:6;31204:75;:::i;:::-;31301:2;31296:3;31292:12;31285:19;;31321:3;31314:10;;31026:303;;;;:::o;31336:222::-;;31463:2;31452:9;31448:18;31440:26;;31477:71;31545:1;31534:9;31530:17;31521:6;31477:71;:::i;:::-;31434:124;;;;:::o;31565:365::-;;31736:2;31725:9;31721:18;31713:26;;31750:87;31834:1;31823:9;31819:17;31810:6;31750:87;:::i;:::-;31848:72;31916:2;31905:9;31901:18;31892:6;31848:72;:::i;:::-;31707:223;;;;;:::o;31937:1048::-;;32294:3;32283:9;32279:19;32271:27;;32309:71;32377:1;32366:9;32362:17;32353:6;32309:71;:::i;:::-;32391:72;32459:2;32448:9;32444:18;32435:6;32391:72;:::i;:::-;32511:9;32505:4;32501:20;32496:2;32485:9;32481:18;32474:48;32536:108;32639:4;32630:6;32536:108;:::i;:::-;32528:116;;32692:9;32686:4;32682:20;32677:2;32666:9;32662:18;32655:48;32717:108;32820:4;32811:6;32717:108;:::i;:::-;32709:116;;32874:9;32868:4;32864:20;32858:3;32847:9;32843:19;32836:49;32899:76;32970:4;32961:6;32899:76;:::i;:::-;32891:84;;32265:720;;;;;;;;:::o;32992:752::-;;33249:3;33238:9;33234:19;33226:27;;33264:71;33332:1;33321:9;33317:17;33308:6;33264:71;:::i;:::-;33346:72;33414:2;33403:9;33399:18;33390:6;33346:72;:::i;:::-;33429;33497:2;33486:9;33482:18;33473:6;33429:72;:::i;:::-;33512;33580:2;33569:9;33565:18;33556:6;33512:72;:::i;:::-;33633:9;33627:4;33623:20;33617:3;33606:9;33602:19;33595:49;33658:76;33729:4;33720:6;33658:76;:::i;:::-;33650:84;;33220:524;;;;;;;;:::o;33751:402::-;;33944:2;33933:9;33929:18;33921:26;;33994:9;33988:4;33984:20;33980:1;33969:9;33965:17;33958:47;34019:124;34138:4;34129:6;34019:124;:::i;:::-;34011:132;;33915:238;;;;:::o;34160:370::-;;34337:2;34326:9;34322:18;34314:26;;34387:9;34381:4;34377:20;34373:1;34362:9;34358:17;34351:47;34412:108;34515:4;34506:6;34412:108;:::i;:::-;34404:116;;34308:222;;;;:::o;34537:629::-;;34792:2;34781:9;34777:18;34769:26;;34842:9;34836:4;34832:20;34828:1;34817:9;34813:17;34806:47;34867:108;34970:4;34961:6;34867:108;:::i;:::-;34859:116;;35023:9;35017:4;35013:20;35008:2;34997:9;34993:18;34986:48;35048:108;35151:4;35142:6;35048:108;:::i;:::-;35040:116;;34763:403;;;;;:::o;35173:210::-;;35294:2;35283:9;35279:18;35271:26;;35308:65;35370:1;35359:9;35355:17;35346:6;35308:65;:::i;:::-;35265:118;;;;:::o;35390:222::-;;35517:2;35506:9;35502:18;35494:26;;35531:71;35599:1;35588:9;35584:17;35575:6;35531:71;:::i;:::-;35488:124;;;;:::o;35619:548::-;;35826:3;35815:9;35811:19;35803:27;;35841:71;35909:1;35898:9;35894:17;35885:6;35841:71;:::i;:::-;35923:68;35987:2;35976:9;35972:18;35963:6;35923:68;:::i;:::-;36002:72;36070:2;36059:9;36055:18;36046:6;36002:72;:::i;:::-;36085;36153:2;36142:9;36138:18;36129:6;36085:72;:::i;:::-;35797:370;;;;;;;:::o;36174:310::-;;36321:2;36310:9;36306:18;36298:26;;36371:9;36365:4;36361:20;36357:1;36346:9;36342:17;36335:47;36396:78;36469:4;36460:6;36396:78;:::i;:::-;36388:86;;36292:192;;;;:::o;36491:416::-;;36691:2;36680:9;36676:18;36668:26;;36741:9;36735:4;36731:20;36727:1;36716:9;36712:17;36705:47;36766:131;36892:4;36766:131;:::i;:::-;36758:139;;36662:245;;;:::o;36914:416::-;;37114:2;37103:9;37099:18;37091:26;;37164:9;37158:4;37154:20;37150:1;37139:9;37135:17;37128:47;37189:131;37315:4;37189:131;:::i;:::-;37181:139;;37085:245;;;:::o;37337:416::-;;37537:2;37526:9;37522:18;37514:26;;37587:9;37581:4;37577:20;37573:1;37562:9;37558:17;37551:47;37612:131;37738:4;37612:131;:::i;:::-;37604:139;;37508:245;;;:::o;37760:416::-;;37960:2;37949:9;37945:18;37937:26;;38010:9;38004:4;38000:20;37996:1;37985:9;37981:17;37974:47;38035:131;38161:4;38035:131;:::i;:::-;38027:139;;37931:245;;;:::o;38183:416::-;;38383:2;38372:9;38368:18;38360:26;;38433:9;38427:4;38423:20;38419:1;38408:9;38404:17;38397:47;38458:131;38584:4;38458:131;:::i;:::-;38450:139;;38354:245;;;:::o;38606:416::-;;38806:2;38795:9;38791:18;38783:26;;38856:9;38850:4;38846:20;38842:1;38831:9;38827:17;38820:47;38881:131;39007:4;38881:131;:::i;:::-;38873:139;;38777:245;;;:::o;39029:416::-;;39229:2;39218:9;39214:18;39206:26;;39279:9;39273:4;39269:20;39265:1;39254:9;39250:17;39243:47;39304:131;39430:4;39304:131;:::i;:::-;39296:139;;39200:245;;;:::o;39452:416::-;;39652:2;39641:9;39637:18;39629:26;;39702:9;39696:4;39692:20;39688:1;39677:9;39673:17;39666:47;39727:131;39853:4;39727:131;:::i;:::-;39719:139;;39623:245;;;:::o;39875:416::-;;40075:2;40064:9;40060:18;40052:26;;40125:9;40119:4;40115:20;40111:1;40100:9;40096:17;40089:47;40150:131;40276:4;40150:131;:::i;:::-;40142:139;;40046:245;;;:::o;40298:416::-;;40498:2;40487:9;40483:18;40475:26;;40548:9;40542:4;40538:20;40534:1;40523:9;40519:17;40512:47;40573:131;40699:4;40573:131;:::i;:::-;40565:139;;40469:245;;;:::o;40721:416::-;;40921:2;40910:9;40906:18;40898:26;;40971:9;40965:4;40961:20;40957:1;40946:9;40942:17;40935:47;40996:131;41122:4;40996:131;:::i;:::-;40988:139;;40892:245;;;:::o;41144:416::-;;41344:2;41333:9;41329:18;41321:26;;41394:9;41388:4;41384:20;41380:1;41369:9;41365:17;41358:47;41419:131;41545:4;41419:131;:::i;:::-;41411:139;;41315:245;;;:::o;41567:416::-;;41767:2;41756:9;41752:18;41744:26;;41817:9;41811:4;41807:20;41803:1;41792:9;41788:17;41781:47;41842:131;41968:4;41842:131;:::i;:::-;41834:139;;41738:245;;;:::o;41990:416::-;;42190:2;42179:9;42175:18;42167:26;;42240:9;42234:4;42230:20;42226:1;42215:9;42211:17;42204:47;42265:131;42391:4;42265:131;:::i;:::-;42257:139;;42161:245;;;:::o;42413:416::-;;42613:2;42602:9;42598:18;42590:26;;42663:9;42657:4;42653:20;42649:1;42638:9;42634:17;42627:47;42688:131;42814:4;42688:131;:::i;:::-;42680:139;;42584:245;;;:::o;42836:416::-;;43036:2;43025:9;43021:18;43013:26;;43086:9;43080:4;43076:20;43072:1;43061:9;43057:17;43050:47;43111:131;43237:4;43111:131;:::i;:::-;43103:139;;43007:245;;;:::o;43259:416::-;;43459:2;43448:9;43444:18;43436:26;;43509:9;43503:4;43499:20;43495:1;43484:9;43480:17;43473:47;43534:131;43660:4;43534:131;:::i;:::-;43526:139;;43430:245;;;:::o;43682:416::-;;43882:2;43871:9;43867:18;43859:26;;43932:9;43926:4;43922:20;43918:1;43907:9;43903:17;43896:47;43957:131;44083:4;43957:131;:::i;:::-;43949:139;;43853:245;;;:::o;44105:416::-;;44305:2;44294:9;44290:18;44282:26;;44355:9;44349:4;44345:20;44341:1;44330:9;44326:17;44319:47;44380:131;44506:4;44380:131;:::i;:::-;44372:139;;44276:245;;;:::o;44528:416::-;;44728:2;44717:9;44713:18;44705:26;;44778:9;44772:4;44768:20;44764:1;44753:9;44749:17;44742:47;44803:131;44929:4;44803:131;:::i;:::-;44795:139;;44699:245;;;:::o;44951:416::-;;45151:2;45140:9;45136:18;45128:26;;45201:9;45195:4;45191:20;45187:1;45176:9;45172:17;45165:47;45226:131;45352:4;45226:131;:::i;:::-;45218:139;;45122:245;;;:::o;45374:416::-;;45574:2;45563:9;45559:18;45551:26;;45624:9;45618:4;45614:20;45610:1;45599:9;45595:17;45588:47;45649:131;45775:4;45649:131;:::i;:::-;45641:139;;45545:245;;;:::o;45797:416::-;;45997:2;45986:9;45982:18;45974:26;;46047:9;46041:4;46037:20;46033:1;46022:9;46018:17;46011:47;46072:131;46198:4;46072:131;:::i;:::-;46064:139;;45968:245;;;:::o;46220:416::-;;46420:2;46409:9;46405:18;46397:26;;46470:9;46464:4;46460:20;46456:1;46445:9;46441:17;46434:47;46495:131;46621:4;46495:131;:::i;:::-;46487:139;;46391:245;;;:::o;46643:416::-;;46843:2;46832:9;46828:18;46820:26;;46893:9;46887:4;46883:20;46879:1;46868:9;46864:17;46857:47;46918:131;47044:4;46918:131;:::i;:::-;46910:139;;46814:245;;;:::o;47066:416::-;;47266:2;47255:9;47251:18;47243:26;;47316:9;47310:4;47306:20;47302:1;47291:9;47287:17;47280:47;47341:131;47467:4;47341:131;:::i;:::-;47333:139;;47237:245;;;:::o;47489:416::-;;47689:2;47678:9;47674:18;47666:26;;47739:9;47733:4;47729:20;47725:1;47714:9;47710:17;47703:47;47764:131;47890:4;47764:131;:::i;:::-;47756:139;;47660:245;;;:::o;47912:416::-;;48112:2;48101:9;48097:18;48089:26;;48162:9;48156:4;48152:20;48148:1;48137:9;48133:17;48126:47;48187:131;48313:4;48187:131;:::i;:::-;48179:139;;48083:245;;;:::o;48335:416::-;;48535:2;48524:9;48520:18;48512:26;;48585:9;48579:4;48575:20;48571:1;48560:9;48556:17;48549:47;48610:131;48736:4;48610:131;:::i;:::-;48602:139;;48506:245;;;:::o;48758:416::-;;48958:2;48947:9;48943:18;48935:26;;49008:9;49002:4;48998:20;48994:1;48983:9;48979:17;48972:47;49033:131;49159:4;49033:131;:::i;:::-;49025:139;;48929:245;;;:::o;49181:416::-;;49381:2;49370:9;49366:18;49358:26;;49431:9;49425:4;49421:20;49417:1;49406:9;49402:17;49395:47;49456:131;49582:4;49456:131;:::i;:::-;49448:139;;49352:245;;;:::o;49604:416::-;;49804:2;49793:9;49789:18;49781:26;;49854:9;49848:4;49844:20;49840:1;49829:9;49825:17;49818:47;49879:131;50005:4;49879:131;:::i;:::-;49871:139;;49775:245;;;:::o;50027:222::-;;50154:2;50143:9;50139:18;50131:26;;50168:71;50236:1;50225:9;50221:17;50212:6;50168:71;:::i;:::-;50125:124;;;;:::o;50256:740::-;;50539:2;50528:9;50524:18;50516:26;;50553:71;50621:1;50610:9;50606:17;50597:6;50553:71;:::i;:::-;50672:9;50666:4;50662:20;50657:2;50646:9;50642:18;50635:48;50697:108;50800:4;50791:6;50697:108;:::i;:::-;50689:116;;50853:9;50847:4;50843:20;50838:2;50827:9;50823:18;50816:48;50878:108;50981:4;50972:6;50878:108;:::i;:::-;50870:116;;50510:486;;;;;;:::o;51003:333::-;;51158:2;51147:9;51143:18;51135:26;;51172:71;51240:1;51229:9;51225:17;51216:6;51172:71;:::i;:::-;51254:72;51322:2;51311:9;51307:18;51298:6;51254:72;:::i;:::-;51129:207;;;;;:::o;51343:256::-;;51405:2;51399:9;51389:19;;51443:4;51435:6;51431:17;51542:6;51530:10;51527:22;51506:18;51494:10;51491:34;51488:62;51485:2;;;51563:1;51560;51553:12;51485:2;51583:10;51579:2;51572:22;51383:216;;;;:::o;51606:304::-;;51765:18;51757:6;51754:30;51751:2;;;51797:1;51794;51787:12;51751:2;51832:4;51824:6;51820:17;51812:25;;51895:4;51889;51885:15;51877:23;;51688:222;;;:::o;51917:325::-;;52097:18;52089:6;52086:30;52083:2;;;52129:1;52126;52119:12;52083:2;52164:4;52156:6;52152:17;52144:25;;52227:4;52221;52217:15;52209:23;;52020:222;;;:::o;52249:304::-;;52408:18;52400:6;52397:30;52394:2;;;52440:1;52437;52430:12;52394:2;52475:4;52467:6;52463:17;52455:25;;52538:4;52532;52528:15;52520:23;;52331:222;;;:::o;52560:321::-;;52703:18;52695:6;52692:30;52689:2;;;52735:1;52732;52725:12;52689:2;52802:4;52798:9;52791:4;52783:6;52779:17;52775:33;52767:41;;52866:4;52860;52856:15;52848:23;;52626:255;;;:::o;52888:322::-;;53032:18;53024:6;53021:30;53018:2;;;53064:1;53061;53054:12;53018:2;53131:4;53127:9;53120:4;53112:6;53108:17;53104:33;53096:41;;53195:4;53189;53185:15;53177:23;;52955:255;;;:::o;53217:151::-;;53303:3;53295:11;;53341:4;53336:3;53332:14;53324:22;;53289:79;;;:::o;53375:159::-;;53469:3;53461:11;;53507:4;53502:3;53498:14;53490:22;;53455:79;;;:::o;53541:151::-;;53627:3;53619:11;;53665:4;53660:3;53656:14;53648:22;;53613:79;;;:::o;53699:137::-;;53808:5;53802:12;53792:22;;53773:63;;;:::o;53843:145::-;;53960:5;53954:12;53944:22;;53925:63;;;:::o;53995:137::-;;54104:5;54098:12;54088:22;;54069:63;;;:::o;54139:121::-;;54232:5;54226:12;54216:22;;54197:63;;;:::o;54267:122::-;;54361:5;54355:12;54345:22;;54326:63;;;:::o;54396:108::-;;54494:4;54489:3;54485:14;54477:22;;54471:33;;;:::o;54511:116::-;;54617:4;54612:3;54608:14;54600:22;;54594:33;;;:::o;54634:108::-;;54732:4;54727:3;54723:14;54715:22;;54709:33;;;:::o;54750:178::-;;54880:6;54875:3;54868:19;54917:4;54912:3;54908:14;54893:29;;54861:67;;;;:::o;54937:186::-;;55075:6;55070:3;55063:19;55112:4;55107:3;55103:14;55088:29;;55056:67;;;;:::o;55132:178::-;;55262:6;55257:3;55250:19;55299:4;55294:3;55290:14;55275:29;;55243:67;;;;:::o;55319:162::-;;55433:6;55428:3;55421:19;55470:4;55465:3;55461:14;55446:29;;55414:67;;;;:::o;55490:163::-;;55605:6;55600:3;55593:19;55642:4;55637:3;55633:14;55618:29;;55586:67;;;;:::o;55662:145::-;;55798:3;55783:18;;55776:31;;;;:::o;55815:91::-;;55877:24;55895:5;55877:24;:::i;:::-;55866:35;;55860:46;;;:::o;55913:99::-;;55983:24;56001:5;55983:24;:::i;:::-;55972:35;;55966:46;;;:::o;56019:85::-;;56092:5;56085:13;56078:21;56067:32;;56061:43;;;:::o;56111:72::-;;56173:5;56162:16;;56156:27;;;:::o;56190:144::-;;56262:66;56255:5;56251:78;56240:89;;56234:100;;;:::o;56341:121::-;;56414:42;56407:5;56403:54;56392:65;;56386:76;;;:::o;56469:72::-;;56531:5;56520:16;;56514:27;;;:::o;56548:81::-;;56619:4;56612:5;56608:16;56597:27;;56591:38;;;:::o;56637:145::-;56718:6;56713:3;56708;56695:30;56774:1;56765:6;56760:3;56756:16;56749:27;56688:94;;;:::o;56791:268::-;56856:1;56863:101;56877:6;56874:1;56871:13;56863:101;;;56953:1;56948:3;56944:11;56938:18;56934:1;56929:3;56925:11;56918:39;56899:2;56896:1;56892:10;56887:15;;56863:101;;;56979:6;56976:1;56973:13;56970:2;;;57044:1;57035:6;57030:3;57026:16;57019:27;56970:2;56840:219;;;;:::o;57067:95::-;;57131:26;57151:5;57131:26;:::i;:::-;57120:37;;57114:48;;;:::o;57169:103::-;;57241:26;57261:5;57241:26;:::i;:::-;57230:37;;57224:48;;;:::o;57279:74::-;;57343:5;57332:16;;57326:27;;;:::o;57360:89::-;;57424:20;57438:5;57424:20;:::i;:::-;57413:31;;57407:42;;;:::o;57456:74::-;;57520:5;57509:16;;57503:27;;;:::o;57537:97::-;;57625:2;57621:7;57616:2;57609:5;57605:14;57601:28;57591:38;;57585:49;;;:::o;57642:94::-;;57720:5;57716:2;57712:14;57690:36;;57684:52;;;:::o;57744:106::-;;57834:5;57829:3;57825:15;57803:37;;57797:53;;;:::o;57858:739::-;;57931:4;57913:16;57910:26;57907:2;;;57939:5;;57907:2;57973:1;57970;57967;57952:23;57991:34;58022:1;58016:8;57991:34;:::i;:::-;58048:10;58043:3;58040:19;58030:2;;58063:5;;;58030:2;58094;58088:9;58148:1;58130:16;58126:24;58123:1;58117:4;58102:49;58177:4;58171:11;58258:16;58251:4;58243:6;58239:17;58236:39;58210:18;58202:6;58199:30;58190:91;58187:2;;;58289:5;;;;;58187:2;58327:6;58321:4;58317:17;58359:3;58353:10;58382:18;58374:6;58371:30;58368:2;;;58404:5;;;;;;;58368:2;58448:6;58441:4;58436:3;58432:14;58428:27;58481:16;58475:4;58471:27;58466:3;58463:36;58460:2;;;58502:5;;;;;;;;58460:2;58546:29;58568:6;58546:29;:::i;:::-;58539:4;58534:3;58530:14;58526:50;58522:2;58515:62;58589:3;58582:10;;57901:696;;;;;;;;:::o;58604:117::-;58673:24;58691:5;58673:24;:::i;:::-;58666:5;58663:35;58653:2;;58712:1;58709;58702:12;58653:2;58647:74;:::o;58728:133::-;58805:32;58831:5;58805:32;:::i;:::-;58798:5;58795:43;58785:2;;58852:1;58849;58842:12;58785:2;58779:82;:::o;58868:111::-;58934:21;58949:5;58934:21;:::i;:::-;58927:5;58924:32;58914:2;;58970:1;58967;58960:12;58914:2;58908:71;:::o;58986:117::-;59055:24;59073:5;59055:24;:::i;:::-;59048:5;59045:35;59035:2;;59094:1;59091;59084:12;59035:2;59029:74;:::o;59110:115::-;59178:23;59195:5;59178:23;:::i;:::-;59171:5;59168:34;59158:2;;59216:1;59213;59206:12;59158:2;59152:73;:::o;59232:117::-;59301:24;59319:5;59301:24;:::i;:::-;59294:5;59291:35;59281:2;;59340:1;59337;59330:12;59281:2;59275:74;:::o
Swarm Source
ipfs://78d4cf8216ea9d361e2d33a54607bba341095e4a9ad62b1ae175db4fe575c20d
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.