ETH Price: $3,550.39 (+6.42%)

Token

DimWits (DWS)
 

Overview

Max Total Supply

1,378 DWS

Holders

328

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 DWS
0xc30571cbd05fa65932c54229b5795c774ff3e43b
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DimWits

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 16: DimWits.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./PaymentSplitter.sol";
import "./Delegated.sol";
import "./ERC721EnumerableB.sol";
import "./Strings.sol";

/****************************************
 * @author: Squeebo                     *
 * @team:   X-11                        *
 ****************************************
 *   Blimpie-ERC721 provides low-gas    *
 *           mints + transfers          *
 ****************************************/

contract DimWits is Delegated, ERC721EnumerableB, PaymentSplitter {
	using Strings for uint;

	uint public MAX_SUPPLY = 7777;

	bool public isActive   = false;
	bool public isActiveWL = false;
	uint public maxOrder   = 7;
	uint public wlPrice    = 0.04 ether;
	uint public price	   = 0.05 ether;

	string private _baseTokenURI = '';
	string private _tokenURISuffix = '';

	mapping(address => uint[]) private _balances;
	mapping(address => bool) public _whitelist;

	address[] private addressList = [
		0x7aa4720178a05654D48182aCF853b4eC1fe5f7E5,
		0xaC1F6F85c6e5Fc2C451e4f06fADAe1FF90077677,
		0xFa0f99C04a5E2fc967eb218E4e9678a0378bBD99,
		0xA6B0765819Fc970865660A31B1eB8F0e3a07F6a9,
		0x9B4146F5C28AAa1F6D66C93dcd042cF72bc8Ee85,
		0xC9312853bcD4662c316419aCd4A5552e8DEdEfe7
	];
	uint[] private shareList = [
		75,
		25,
		20,
		10,
		50,
		820
	];

	constructor()
		Delegated()
		ERC721B("DimWits", "DWS")
		PaymentSplitter(addressList, shareList)  {
	}

	//external
	fallback() external payable {}

	function mint( uint quantity ) external payable {
		require( isActive,        				"Sale is not active"		);
		require( quantity <= maxOrder,          "Order too big"             );
		require( msg.value >= price * quantity, "Ether sent is not correct" );

		uint256 supply = totalSupply();
		require( supply + quantity <= MAX_SUPPLY, "Mint/order exceeds supply" );
		for(uint i = 0; i < quantity; ++i){
			_safeMint( msg.sender, supply++, "" );
		}
	}

	function whitelistMint( uint quantity ) external payable {
		require( isActiveWL,        			"Whitelist sale is not active");
		require( _whitelist[msg.sender], 		"Not whitelisted"			  );
		require( quantity <= maxOrder,          "Order too big"               );
		require( msg.value >= wlPrice * quantity, "Ether sent is not correct" );

		uint256 supply = totalSupply();
		require( supply + quantity <= MAX_SUPPLY, "Mint/order exceeds supply" );
		for(uint i = 0; i < quantity; ++i){
			_safeMint( msg.sender, supply++, "" );
		}  
	}

	//external delegated
	function gift(uint[] calldata quantity, address[] calldata recipient) external onlyDelegates{
		require(quantity.length == recipient.length, "Must provide equal quantities and recipients" );

		uint totalQuantity = 0;
		uint256 supply = totalSupply();
		for(uint i = 0; i < quantity.length; ++i){
			totalQuantity += quantity[i];
		}
		require( supply + totalQuantity <= MAX_SUPPLY, "Mint/order exceeds supply" );
		delete totalQuantity;

		for(uint i = 0; i < recipient.length; ++i){
			for(uint j = 0; j < quantity[i]; ++j){
				_safeMint( recipient[i], supply++, "Sent with love" );
			}
		}
	}

	function setWhitelist(address[] memory _addresses) external onlyDelegates {
		for(uint i = 0; i < _addresses.length; ++i) {
			_whitelist[_addresses[i]] = true;
		}
	}

	function removeFromWhitelist(address[] memory _addresses) external onlyDelegates {
		for(uint i = 0; i < _addresses.length; ++i) {
			delete _whitelist[_addresses[i]];
		}
	}

	function setWhitelistActive(bool isActiveWL_) external onlyDelegates {
		if( isActiveWL != isActiveWL_ ) 
			isActiveWL = isActiveWL_;
	}

	function setActive(bool isActive_) external onlyDelegates{
		if( isActive != isActive_ )
			isActive = isActive_;
	}

	function setMaxOrder(uint maxOrder_) external onlyDelegates{
		if( maxOrder != maxOrder_ )
			maxOrder = maxOrder_;
	}

	function setPrice(uint price_, uint wlprice_) external onlyDelegates{
		if( price != price_ )
			price = price_;

		if( wlPrice != wlprice_)
			wlPrice = wlprice_;
	}

	function setBaseURI(string calldata _newBaseURI, string calldata _newSuffix) external onlyDelegates{
		_baseTokenURI = _newBaseURI;
		_tokenURISuffix = _newSuffix;
	}

	//external owner
	function setMaxSupply(uint maxSupply) external onlyOwner{
		if( MAX_SUPPLY != maxSupply ){
			require(maxSupply >= totalSupply(), "Specified supply is lower than current balance" );
			MAX_SUPPLY = maxSupply;
		}
	}

	//public
	function balanceOf(address owner) public view virtual override returns (uint256) {
		require(owner != address(0), "ERC721: balance query for the zero address");
		return _balances[owner].length;
	}

	function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) {
		require(index < ERC721B.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
		return _balances[owner][index];
	}

	function tokenURI(uint tokenId) external view virtual override returns (string memory) {
		require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
		return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), _tokenURISuffix));
	}

	//internal
	function _beforeTokenTransfer(
		address from,
		address to,
		uint256 tokenId
	) internal override virtual {
		address zero = address(0);
		if( from != zero || to == zero ){
			//find this token and remove it
			uint length = _balances[from].length;
			for( uint i; i < length; ++i ){
				if( _balances[from][i] == tokenId ){
					_balances[from][i] = _balances[from][length - 1];
					_balances[from].pop();
					break;
				}
			}

			delete length;
		}

		if( from == zero || to != zero ){
			_balances[to].push( tokenId );
		}
	}
}

File 1 of 16: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
	/**
	 * @dev Returns true if `account` is a contract.
	 *
	 * [IMPORTANT]
	 * ====
	 * It is unsafe to assume that an address for which this function returns
	 * false is an externally-owned account (EOA) and not a contract.
	 *
	 * Among others, `isContract` will return false for the following
	 * types of addresses:
	 *
	 *  - an externally-owned account
	 *  - a contract in construction
	 *  - an address where a contract will be created
	 *  - an address where a contract lived, but was destroyed
	 * ====
	 */
	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;
		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");

		(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");

		(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");

		(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");

		(bool success, bytes memory returndata) = target.delegatecall(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	/**
	 * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
	 * revert reason using the provided one.
	 *
	 * _Available since v4.3._
	 */
	function verifyCallResult(
		bool success,
		bytes memory returndata,
		string memory errorMessage
	) internal 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

				assembly {
					let returndata_size := mload(returndata)
					revert(add(32, returndata), returndata_size)
				}
			} else {
				revert(errorMessage);
			}
		}
	}
}

File 2 of 16: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
	function _msgSender() internal view virtual returns (address) {
		return msg.sender;
	}

	function _msgData() internal view virtual returns (bytes calldata) {
		return msg.data;
	}
}

File 3 of 16: Delegated.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Ownable.sol";

/*************************
* @author: Squeebo       *
* @license: BSD-3-Clause *
**************************/

contract Delegated is Ownable{
  mapping(address => bool) internal _delegates;

  constructor(){
	_delegates[owner()] = true;
  }

  modifier onlyDelegates {
	require(_delegates[msg.sender], "Invalid delegate" );
	_;
  }

  //onlyOwner
  function isDelegate( address addr ) external view onlyOwner returns ( bool ){
	return _delegates[addr];
  }

  function setDelegate( address addr, bool isDelegate_ ) external onlyOwner{
	_delegates[addr] = isDelegate_;
  }
}

File 5 of 16: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
	/**
	 * @dev See {IERC165-supportsInterface}.
	 */
	function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
		return interfaceId == type(IERC165).interfaceId;
	}
}

File 6 of 16: ERC721B.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";
import "./ERC165.sol";
import "./IERC721.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./IERC721Receiver.sol";

/*************************
* @author: Squeebo       *
* @license: BSD-3-Clause *
**************************/

abstract contract ERC721B is Context, ERC165, IERC721, IERC721Metadata {
	using Address for address;

	// Token name
	string private _name;

	// Token symbol
	string private _symbol;

	// Mapping from token ID to owner address
	address[] internal _owners;

	// Mapping from token ID to approved address
	mapping(uint256 => address) private _tokenApprovals;

	// Mapping from owner to operator approvals
	mapping(address => mapping(address => bool)) private _operatorApprovals;

	/**
	 * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
	 */
	constructor(string memory name_, string memory symbol_) {
		_name = name_;
		_symbol = symbol_;
	}

	/**
	 * @dev See {IERC165-supportsInterface}.
	 */
	function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
		return
			interfaceId == type(IERC721).interfaceId ||
			interfaceId == type(IERC721Metadata).interfaceId ||
			super.supportsInterface(interfaceId);
	}

	/**
	 * @dev See {IERC721-balanceOf}.
	 */
	function balanceOf(address owner) public view virtual override returns (uint256) {
		require(owner != address(0), "ERC721: balance query for the zero address");

		uint count = 0;
		uint length = _owners.length;
		for( uint i = 0; i < length; ++i ){
		  if( owner == _owners[i] ){
			++count;
		  }
		}

		delete length;
		return count;
	}

	/**
	 * @dev See {IERC721-ownerOf}.
	 */
	function ownerOf(uint256 tokenId) public view virtual override returns (address) {
		address owner = _owners[tokenId];
		require(owner != address(0), "ERC721: owner query for nonexistent token");
		return owner;
	}

	/**
	 * @dev See {IERC721Metadata-name}.
	 */
	function name() public view virtual override returns (string memory) {
		return _name;
	}

	/**
	 * @dev See {IERC721Metadata-symbol}.
	 */
	function symbol() public view virtual override returns (string memory) {
		return _symbol;
	}

	/**
	 * @dev See {IERC721-approve}.
	 */
	function approve(address to, uint256 tokenId) public virtual override {
		address owner = ERC721B.ownerOf(tokenId);
		require(to != owner, "ERC721: approval to current owner");

		require(
			_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
			"ERC721: approve caller is not owner nor approved for all"
		);

		_approve(to, tokenId);
	}

	/**
	 * @dev See {IERC721-getApproved}.
	 */
	function getApproved(uint256 tokenId) public view virtual override returns (address) {
		require(_exists(tokenId), "ERC721: approved query for nonexistent token");

		return _tokenApprovals[tokenId];
	}

	/**
	 * @dev See {IERC721-setApprovalForAll}.
	 */
	function setApprovalForAll(address operator, bool approved) public virtual override {
		require(operator != _msgSender(), "ERC721: approve to caller");

		_operatorApprovals[_msgSender()][operator] = approved;
		emit ApprovalForAll(_msgSender(), operator, approved);
	}

	/**
	 * @dev See {IERC721-isApprovedForAll}.
	 */
	function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
		return _operatorApprovals[owner][operator];
	}


	/**
	 * @dev See {IERC721-transferFrom}.
	 */
	function transferFrom(
		address from,
		address to,
		uint256 tokenId
	) public virtual override {
		//solhint-disable-next-line max-line-length
		require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

		_transfer(from, to, tokenId);
	}

	/**
	 * @dev See {IERC721-safeTransferFrom}.
	 */
	function safeTransferFrom(
		address from,
		address to,
		uint256 tokenId
	) public virtual override {
		safeTransferFrom(from, to, tokenId, "");
	}

	/**
	 * @dev See {IERC721-safeTransferFrom}.
	 */
	function safeTransferFrom(
		address from,
		address to,
		uint256 tokenId,
		bytes memory _data
	) public virtual override {
		require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
		_safeTransfer(from, to, tokenId, _data);
	}

	/**
	 * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
	 * are aware of the ERC721 protocol to prevent tokens from being forever locked.
	 *
	 * `_data` is additional data, it has no specified format and it is sent in call to `to`.
	 *
	 * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
	 * implement alternative mechanisms to perform token transfer, such as signature-based.
	 *
	 * Requirements:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must exist and be owned by `from`.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function _safeTransfer(
		address from,
		address to,
		uint256 tokenId,
		bytes memory _data
	) internal virtual {
		_transfer(from, to, tokenId);
		require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
	}

	/**
	 * @dev Returns whether `tokenId` exists.
	 *
	 * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
	 *
	 * Tokens start existing when they are minted (`_mint`),
	 * and stop existing when they are burned (`_burn`).
	 */
	function _exists(uint256 tokenId) internal view virtual returns (bool) {
		return tokenId < _owners.length && _owners[tokenId] != address(0);
	}

	/**
	 * @dev Returns whether `spender` is allowed to manage `tokenId`.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 */
	function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
		require(_exists(tokenId), "ERC721: operator query for nonexistent token");
		address owner = ERC721B.ownerOf(tokenId);
		return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
	}

	/**
	 * @dev Safely mints `tokenId` and transfers it to `to`.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must not exist.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function _safeMint(address to, uint256 tokenId) internal virtual {
		_safeMint(to, tokenId, "");
	}


	/**
	 * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
	 * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
	 */
	function _safeMint(
		address to,
		uint256 tokenId,
		bytes memory _data
	) internal virtual {
		_mint(to, tokenId);
		require(
			_checkOnERC721Received(address(0), to, tokenId, _data),
			"ERC721: transfer to non ERC721Receiver implementer"
		);
	}

	/**
	 * @dev Mints `tokenId` and transfers it to `to`.
	 *
	 * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
	 *
	 * Requirements:
	 *
	 * - `tokenId` must not exist.
	 * - `to` cannot be the zero address.
	 *
	 * Emits a {Transfer} event.
	 */
	function _mint(address to, uint256 tokenId) internal virtual {
		require(to != address(0), "ERC721: mint to the zero address");
		require(!_exists(tokenId), "ERC721: token already minted");

		_beforeTokenTransfer(address(0), to, tokenId);
		_owners.push(to);

		emit Transfer(address(0), to, tokenId);
	}

	/**
	 * @dev Destroys `tokenId`.
	 * The approval is cleared when the token is burned.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 *
	 * Emits a {Transfer} event.
	 */
	function _burn(uint256 tokenId) internal virtual {
		address owner = ERC721B.ownerOf(tokenId);

		_beforeTokenTransfer(owner, address(0), tokenId);

		// Clear approvals
		_approve(address(0), tokenId);
		_owners[tokenId] = address(0);

		emit Transfer(owner, address(0), tokenId);
	}

	/**
	 * @dev Transfers `tokenId` from `from` to `to`.
	 *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
	 *
	 * Requirements:
	 *
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must be owned by `from`.
	 *
	 * Emits a {Transfer} event.
	 */
	function _transfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual {
		require(ERC721B.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
		require(to != address(0), "ERC721: transfer to the zero address");

		_beforeTokenTransfer(from, to, tokenId);

		// Clear approvals from the previous owner
		_approve(address(0), tokenId);
		_owners[tokenId] = to;

		emit Transfer(from, to, tokenId);
	}

	/**
	 * @dev Approve `to` to operate on `tokenId`
	 *
	 * Emits a {Approval} event.
	 */
	function _approve(address to, uint256 tokenId) internal virtual {
		_tokenApprovals[tokenId] = to;
		emit Approval(ERC721B.ownerOf(tokenId), to, tokenId);
	}


	/**
	 * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
	 * The call is not executed if the target address is not a contract.
	 *
	 * @param from address representing the previous owner of the given token ID
	 * @param to target address that will receive the tokens
	 * @param tokenId uint256 ID of the token to be transferred
	 * @param _data bytes optional data to send along with the call
	 * @return bool whether the call correctly returned the expected magic value
	 */
	function _checkOnERC721Received(
		address from,
		address to,
		uint256 tokenId,
		bytes memory _data
	) private returns (bool) {
		if (to.isContract()) {
			try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
				return retval == IERC721Receiver.onERC721Received.selector;
			} catch (bytes memory reason) {
				if (reason.length == 0) {
					revert("ERC721: transfer to non ERC721Receiver implementer");
				} else {
					assembly {
						revert(add(32, reason), mload(reason))
					}
				}
			}
		} else {
			return true;
		}
	}

	/**
	 * @dev Hook that is called before any token transfer. This includes minting
	 * and burning.
	 *
	 * Calling conditions:
	 *
	 * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
	 * transferred to `to`.
	 * - When `from` is zero, `tokenId` will be minted for `to`.
	 * - When `to` is zero, ``from``'s `tokenId` will be burned.
	 * - `from` and `to` are never both zero.
	 *
	 * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
	 */
	function _beforeTokenTransfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual {}
}

File 7 of 16: ERC721EnumerableB.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721B.sol";
import "./IERC721Enumerable.sol";

/*************************
* @author: Squeebo       *
* @license: BSD-3-Clause *
**************************/

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721EnumerableB is ERC721B, IERC721Enumerable {
	/**
	 * @dev See {IERC165-supportsInterface}.
	 */
	function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721B) returns (bool) {
		return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
	}

	/**
	 * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
	 */
	function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) {
		require(index < ERC721B.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");

		uint count;
		uint length = _owners.length;
		for( uint i; i < length; ++i ){
			if( owner == _owners[i] ){
				if( count == index ){
					delete count;
					delete length;
					return i;
				}
				else
					++count;
			}
		}

		delete count;
		delete length;
		require(false, "ERC721Enumerable: owner index out of bounds");
	}

	/**
	 * @dev See {IERC721Enumerable-totalSupply}.
	 */
	function totalSupply() public view virtual override returns (uint256) {
		return _owners.length;
	}

	/**
	 * @dev See {IERC721Enumerable-tokenByIndex}.
	 */
	function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
		require(index < ERC721EnumerableB.totalSupply(), "ERC721Enumerable: global index out of bounds");
		return index;
	}
}

File 8 of 16: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
	/**
	 * @dev Returns true if this contract implements the interface defined by
	 * `interfaceId`. See the corresponding
	 * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
	 * to learn more about how these ids are created.
	 *
	 * This function call must use less than 30 000 gas.
	 */
	function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 9 of 16: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
	/**
	 * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
	 */
	event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

	/**
	 * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
	 */
	event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

	/**
	 * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
	 */
	event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

	/**
	 * @dev Returns the number of tokens in ``owner``'s account.
	 */
	function balanceOf(address owner) external view returns (uint256 balance);

	/**
	 * @dev Returns the owner of the `tokenId` token.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 */
	function ownerOf(uint256 tokenId) external view returns (address owner);

	/**
	 * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
	 * are aware of the ERC721 protocol to prevent tokens from being forever locked.
	 *
	 * Requirements:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must exist and be owned by `from`.
	 * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function safeTransferFrom(
		address from,
		address to,
		uint256 tokenId
	) external;

	/**
	 * @dev Transfers `tokenId` token from `from` to `to`.
	 *
	 * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
	 *
	 * Requirements:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must be owned by `from`.
	 * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
	 *
	 * Emits a {Transfer} event.
	 */
	function transferFrom(
		address from,
		address to,
		uint256 tokenId
	) external;

	/**
	 * @dev Gives permission to `to` to transfer `tokenId` token to another account.
	 * The approval is cleared when the token is transferred.
	 *
	 * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
	 *
	 * Requirements:
	 *
	 * - The caller must own the token or be an approved operator.
	 * - `tokenId` must exist.
	 *
	 * Emits an {Approval} event.
	 */
	function approve(address to, uint256 tokenId) external;

	/**
	 * @dev Returns the account approved for `tokenId` token.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 */
	function getApproved(uint256 tokenId) external view returns (address operator);

	/**
	 * @dev Approve or remove `operator` as an operator for the caller.
	 * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
	 *
	 * Requirements:
	 *
	 * - The `operator` cannot be the caller.
	 *
	 * Emits an {ApprovalForAll} event.
	 */
	function setApprovalForAll(address operator, bool _approved) external;

	/**
	 * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
	 *
	 * See {setApprovalForAll}
	 */
	function isApprovedForAll(address owner, address operator) external view returns (bool);

	/**
	 * @dev Safely transfers `tokenId` token from `from` to `to`.
	 *
	 * Requirements:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must exist and be owned by `from`.
	 * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function safeTransferFrom(
		address from,
		address to,
		uint256 tokenId,
		bytes calldata data
	) external;
}

File 10 of 16: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
	/**
	 * @dev Returns the total amount of tokens stored by the contract.
	 */
	function totalSupply() external view returns (uint256);

	/**
	 * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
	 * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
	 */
	function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

	/**
	 * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
	 * Use along with {totalSupply} to enumerate all tokens.
	 */
	function tokenByIndex(uint256 index) external view returns (uint256);
}

File 11 of 16: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
	/**
	 * @dev Returns the token collection name.
	 */
	function name() external view returns (string memory);

	/**
	 * @dev Returns the token collection symbol.
	 */
	function symbol() external view returns (string memory);

	/**
	 * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
	 */
	function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 12 of 16: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
	/**
	 * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
	 * by `operator` from `from`, this function is called.
	 *
	 * It must return its Solidity selector to confirm the token transfer.
	 * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
	 *
	 * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
	 */
	function onERC721Received(
		address operator,
		address from,
		uint256 tokenId,
		bytes calldata data
	) external returns (bytes4);
}

File 13 of 16: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
	address private _owner;

	event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

	/**
	 * @dev Initializes the contract setting the deployer as the initial owner.
	 */
	constructor() {
		_setOwner(_msgSender());
	}

	/**
	 * @dev Returns the address of the current owner.
	 */
	function owner() public view virtual returns (address) {
		return _owner;
	}

	/**
	 * @dev Throws if called by any account other than the owner.
	 */
	modifier onlyOwner() {
		require(owner() == _msgSender(), "Ownable: caller is not the owner");
		_;
	}

	/**
	 * @dev Leaves the contract without owner. It will not be possible to call
	 * `onlyOwner` functions anymore. Can only be called by the current owner.
	 *
	 * NOTE: Renouncing ownership will leave the contract without an owner,
	 * thereby removing any functionality that is only available to the owner.
	 */
	function renounceOwnership() public virtual onlyOwner {
		_setOwner(address(0));
	}

	/**
	 * @dev Transfers ownership of the contract to a new account (`newOwner`).
	 * Can only be called by the current owner.
	 */
	function transferOwnership(address newOwner) public virtual onlyOwner {
		require(newOwner != address(0), "Ownable: new owner is the zero address");
		_setOwner(newOwner);
	}

	function _setOwner(address newOwner) private {
		address oldOwner = _owner;
		_owner = newOwner;
		emit OwnershipTransferred(oldOwner, newOwner);
	}
}

File 14 of 16: PaymentSplitter.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";
import "./Address.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
	event PayeeAdded(address account, uint256 shares);
	event PaymentReleased(address to, uint256 amount);
	event PaymentReceived(address from, uint256 amount);

	uint256 private _totalShares;
	uint256 private _totalReleased;

	mapping(address => uint256) private _shares;
	mapping(address => uint256) private _released;
	address[] private _payees;

	/**
	 * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
	 * the matching position in the `shares` array.
	 *
	 * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
	 * duplicates in `payees`.
	 */
	constructor(address[] memory payees, uint256[] memory shares_) payable {
		require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
		require(payees.length > 0, "PaymentSplitter: no payees");

		for (uint256 i = 0; i < payees.length; i++) {
			_addPayee(payees[i], shares_[i]);
		}
	}

	/**
	 * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
	 * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
	 * reliability of the events, and not the actual splitting of Ether.
	 *
	 * To learn more about this see the Solidity documentation for
	 * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
	 * functions].
	 */
	receive() external payable virtual {
		emit PaymentReceived(_msgSender(), msg.value);
	}

	/**
	 * @dev Getter for the total shares held by payees.
	 */
	function totalShares() public view returns (uint256) {
		return _totalShares;
	}

	/**
	 * @dev Getter for the total amount of Ether already released.
	 */
	function totalReleased() public view returns (uint256) {
		return _totalReleased;
	}

	/**
	 * @dev Getter for the amount of shares held by an account.
	 */
	function shares(address account) public view returns (uint256) {
		return _shares[account];
	}

	/**
	 * @dev Getter for the amount of Ether already released to a payee.
	 */
	function released(address account) public view returns (uint256) {
		return _released[account];
	}

	/**
	 * @dev Getter for the address of the payee number `index`.
	 */
	function payee(uint256 index) public view returns (address) {
		return _payees[index];
	}

	/**
	 * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
	 * total shares and their previous withdrawals.
	 */
	function release(address payable account) public virtual {
		require(_shares[account] > 0, "PaymentSplitter: account has no shares");

		uint256 totalReceived = address(this).balance + _totalReleased;
		uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];

		require(payment != 0, "PaymentSplitter: account is not due payment");

		_released[account] = _released[account] + payment;
		_totalReleased = _totalReleased + payment;

		Address.sendValue(account, payment);
		emit PaymentReleased(account, payment);
	}

	/**
	 * @dev Add a new payee to the contract.
	 * @param account The address of the payee to add.
	 * @param shares_ The number of shares owned by the payee.
	 */
	function _addPayee(address account, uint256 shares_) private {
		require(account != address(0), "PaymentSplitter: account is the zero address");
		require(shares_ > 0, "PaymentSplitter: shares are 0");
		require(_shares[account] == 0, "PaymentSplitter: account already has shares");

		_payees.push(account);
		_shares[account] = shares_;
		_totalShares = _totalShares + shares_;
		emit PayeeAdded(account, shares_);
	}
}

File 15 of 16: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
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) {
		unchecked {
			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) {
		unchecked {
			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) {
		unchecked {
			// 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) {
		unchecked {
			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) {
		unchecked {
			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) {
		return a + b;
	}

	/**
	 * @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) {
		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) {
		return a * b;
	}

	/**
	 * @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.
	 *
	 * Requirements:
	 *
	 * - The divisor cannot be zero.
	 */
	function div(uint256 a, uint256 b) internal pure returns (uint256) {
		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) {
		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) {
		unchecked {
			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.
	 *
	 * 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) {
		unchecked {
			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) {
		unchecked {
			require(b > 0, errorMessage);
			return a % b;
		}
	}
}

File 16 of 16: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
	bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

	/**
	 * @dev Converts a `uint256` to its ASCII `string` decimal representation.
	 */
	function toString(uint256 value) internal pure returns (string memory) {
		// Inspired by OraclizeAPI's implementation - MIT licence
		// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

		if (value == 0) {
			return "0";
		}
		uint256 temp = value;
		uint256 digits;
		while (temp != 0) {
			digits++;
			temp /= 10;
		}
		bytes memory buffer = new bytes(digits);
		while (value != 0) {
			digits -= 1;
			buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
			value /= 10;
		}
		return string(buffer);
	}

	/**
	 * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
	 */
	function toHexString(uint256 value) internal pure returns (string memory) {
		if (value == 0) {
			return "0x00";
		}
		uint256 temp = value;
		uint256 length = 0;
		while (temp != 0) {
			length++;
			temp >>= 8;
		}
		return toHexString(value, length);
	}

	/**
	 * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
	 */
	function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
		bytes memory buffer = new bytes(2 * length + 2);
		buffer[0] = "0";
		buffer[1] = "x";
		for (uint256 i = 2 * length + 1; i > 1; --i) {
			buffer[i] = _HEX_SYMBOLS[value & 0xf];
			value >>= 4;
		}
		require(value == 0, "Strings: hex length insufficient");
		return string(buffer);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActiveWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive_","type":"bool"}],"name":"setActive","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":"_newBaseURI","type":"string"},{"internalType":"string","name":"_newSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxOrder_","type":"uint256"}],"name":"setMaxOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"},{"internalType":"uint256","name":"wlprice_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActiveWL_","type":"bool"}],"name":"setWhitelistActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052611e61600c556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506007600e55668e1bc9bf040000600f5566b1a2bc2ec5000060105560405180602001604052806000815250601190805190602001906200008292919062000957565b506040518060200160405280600081525060129080519060200190620000aa92919062000957565b506040518060c00160405280737aa4720178a05654d48182acf853b4ec1fe5f7e573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173ac1f6f85c6e5fc2c451e4f06fadae1ff9007767773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173fa0f99c04a5e2fc967eb218e4e9678a0378bbd9973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173a6b0765819fc970865660a31b1eb8f0e3a07f6a973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001739b4146f5c28aaa1f6d66c93dcd042cf72bc8ee8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c9312853bcd4662c316419acd4a5552e8dedefe773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060159060066200026a929190620009e8565b506040518060c00160405280604b61ffff168152602001601961ffff168152602001601461ffff168152602001600a61ffff168152602001603261ffff16815260200161033461ffff168152506016906006620002c992919062000a77565b50348015620002d757600080fd5b5060158054806020026020016040519081016040528092919081815260200182805480156200035c57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000311575b50505050506016805480602002602001604051908101604052809291908181526020018280548015620003af57602002820191906000526020600020905b8154815260200190600101908083116200039a575b50505050506040518060400160405280600781526020017f44696d57697473000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f445753000000000000000000000000000000000000000000000000000000000081525062000440620004346200062860201b60201c565b6200063060201b60201c565b600180600062000455620006f460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508160029080519060200190620004be92919062000957565b508060039080519060200190620004d792919062000957565b505050805182511462000521576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005189062000d1b565b60405180910390fd5b600082511162000568576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200055f9062000d5f565b60405180910390fd5b60005b82518110156200061f5762000609838281518110620005b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110620005f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516200071d60201b60201c565b8080620006169062000e85565b9150506200056b565b50505062000f31565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000790576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007879062000cf9565b60405180910390fd5b60008111620007d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007cd9062000d81565b60405180910390fd5b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146200085b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008529062000d3d565b60405180910390fd5b600b829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060075462000912919062000db4565b6007819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200094b92919062000ccc565b60405180910390a15050565b828054620009659062000e4f565b90600052602060002090601f016020900481019282620009895760008555620009d5565b82601f10620009a457805160ff1916838001178555620009d5565b82800160010185558215620009d5579182015b82811115620009d4578251825591602001919060010190620009b7565b5b509050620009e4919062000acf565b5090565b82805482825590600052602060002090810192821562000a64579160200282015b8281111562000a635782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000a09565b5b50905062000a73919062000acf565b5090565b82805482825590600052602060002090810192821562000abc579160200282015b8281111562000abb578251829061ffff1690559160200191906001019062000a98565b5b50905062000acb919062000acf565b5090565b5b8082111562000aea57600081600090555060010162000ad0565b5090565b62000af98162000e11565b82525050565b600062000b0e602c8362000da3565b91507f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008301527f7a65726f206164647265737300000000000000000000000000000000000000006020830152604082019050919050565b600062000b7660328362000da3565b91507f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008301527f6573206c656e677468206d69736d6174636800000000000000000000000000006020830152604082019050919050565b600062000bde602b8362000da3565b91507f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008301527f20686173207368617265730000000000000000000000000000000000000000006020830152604082019050919050565b600062000c46601a8362000da3565b91507f5061796d656e7453706c69747465723a206e6f207061796565730000000000006000830152602082019050919050565b600062000c88601d8362000da3565b91507f5061796d656e7453706c69747465723a207368617265732061726520300000006000830152602082019050919050565b62000cc68162000e45565b82525050565b600060408201905062000ce3600083018562000aee565b62000cf2602083018462000cbb565b9392505050565b6000602082019050818103600083015262000d148162000aff565b9050919050565b6000602082019050818103600083015262000d368162000b67565b9050919050565b6000602082019050818103600083015262000d588162000bcf565b9050919050565b6000602082019050818103600083015262000d7a8162000c37565b9050919050565b6000602082019050818103600083015262000d9c8162000c79565b9050919050565b600082825260208201905092915050565b600062000dc18262000e45565b915062000dce8362000e45565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000e065762000e0562000ed3565b5b828201905092915050565b600062000e1e8262000e25565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000e6857607f821691505b6020821081141562000e7f5762000e7e62000f02565b5b50919050565b600062000e928262000e45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000ec85762000ec762000ed3565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6158038062000f416000396000f3fe6080604052600436106102755760003560e01c8063715018a61161014f578063b88d4fde116100c1578063dde3d3131161007a578063dde3d313146109d7578063e33b7de314610a00578063e985e9c514610a2b578063f2fde38b14610a68578063f421764814610a91578063f7d9757714610aba576102bc565b8063b88d4fde146108a3578063c3b754dc146108cc578063c7f8d01a146108f5578063c87b56dd14610920578063ce7c2ac21461095d578063cfdb63ac1461099a576102bc565b806396ea3a471161011357806396ea3a47146107a45780639852595c146107cd578063a035b1fe1461080a578063a0712d6814610835578063a22cb46514610851578063acec338a1461087a576102bc565b8063715018a6146106de578063868ff4a2146106f55780638b83209b146107115780638da5cb5b1461074e57806395d89b4114610779576102bc565b806332cb6b0c116101e85780635306deaf116101ac5780635306deaf146105be578063548db174146105e95780636352211e146106125780636790a9de1461064f5780636f8b44b01461067857806370a08231146106a1576102bc565b806332cb6b0c146104d95780633a98ef391461050457806342842e0e1461052f5780634a994eef146105585780634f6ccce714610581576102bc565b8063095ea7b31161023a578063095ea7b3146103cb57806318160ddd146103f4578063191655871461041f57806322f3e2d41461044857806323b872dd146104735780632f745c591461049c576102bc565b8062451026146102be57806301ffc9a7146102e957806306fdde03146103265780630777962714610351578063081812fc1461038e576102bc565b366102bc577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a3610ae3565b346040516102b2929190614e7d565b60405180910390a1005b005b3480156102ca57600080fd5b506102d3610aeb565b6040516102e091906152c3565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190614071565b610af1565b60405161031d9190614ea6565b60405180910390f35b34801561033257600080fd5b5061033b610b6b565b6040516103489190614ec1565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613dc2565b610bfd565b6040516103859190614ea6565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614138565b610ccf565b6040516103c29190614ded565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613f56565b610d54565b005b34801561040057600080fd5b50610409610e6c565b60405161041691906152c3565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190613deb565b610e79565b005b34801561045457600080fd5b5061045d6110e1565b60405161046a9190614ea6565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190613e50565b6110f4565b005b3480156104a857600080fd5b506104c360048036038101906104be9190613f56565b611154565b6040516104d091906152c3565b60405180910390f35b3480156104e557600080fd5b506104ee61122a565b6040516104fb91906152c3565b60405180910390f35b34801561051057600080fd5b50610519611230565b60405161052691906152c3565b60405180910390f35b34801561053b57600080fd5b5061055660048036038101906105519190613e50565b61123a565b005b34801561056457600080fd5b5061057f600480360381019061057a9190613f1a565b61125a565b005b34801561058d57600080fd5b506105a860048036038101906105a39190614138565b611331565b6040516105b591906152c3565b60405180910390f35b3480156105ca57600080fd5b506105d3611384565b6040516105e09190614ea6565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b9190613f92565b611397565b005b34801561061e57600080fd5b5061063960048036038101906106349190614138565b6114d3565b6040516106469190614ded565b60405180910390f35b34801561065b57600080fd5b50610676600480360381019061067191906140c3565b6115b6565b005b34801561068457600080fd5b5061069f600480360381019061069a9190614138565b61166c565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613dc2565b611746565b6040516106d591906152c3565b60405180910390f35b3480156106ea57600080fd5b506106f3611801565b005b61070f600480360381019061070a9190614138565b611889565b005b34801561071d57600080fd5b5061073860048036038101906107339190614138565b611a9c565b6040516107459190614ded565b60405180910390f35b34801561075a57600080fd5b50610763611b0a565b6040516107709190614ded565b60405180910390f35b34801561078557600080fd5b5061078e611b33565b60405161079b9190614ec1565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613fd3565b611bc5565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613dc2565b611e84565b60405161080191906152c3565b60405180910390f35b34801561081657600080fd5b5061081f611ecd565b60405161082c91906152c3565b60405180910390f35b61084f600480360381019061084a9190614138565b611ed3565b005b34801561085d57600080fd5b5061087860048036038101906108739190613f1a565b61205a565b005b34801561088657600080fd5b506108a1600480360381019061089c9190614048565b6121db565b005b3480156108af57600080fd5b506108ca60048036038101906108c59190613e9f565b61229f565b005b3480156108d857600080fd5b506108f360048036038101906108ee9190614048565b612301565b005b34801561090157600080fd5b5061090a6123c5565b60405161091791906152c3565b60405180910390f35b34801561092c57600080fd5b5061094760048036038101906109429190614138565b6123cb565b6040516109549190614ec1565b60405180910390f35b34801561096957600080fd5b50610984600480360381019061097f9190613dc2565b61244a565b60405161099191906152c3565b60405180910390f35b3480156109a657600080fd5b506109c160048036038101906109bc9190613dc2565b612493565b6040516109ce9190614ea6565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f99190614138565b6124b3565b005b348015610a0c57600080fd5b50610a15612553565b604051610a2291906152c3565b60405180910390f35b348015610a3757600080fd5b50610a526004803603810190610a4d9190613e14565b61255d565b604051610a5f9190614ea6565b60405180910390f35b348015610a7457600080fd5b50610a8f6004803603810190610a8a9190613dc2565b6125f1565b005b348015610a9d57600080fd5b50610ab86004803603810190610ab39190613f92565b6126e9565b005b348015610ac657600080fd5b50610ae16004803603810190610adc9190614161565b61282e565b005b600033905090565b600e5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b645750610b63826128e0565b5b9050919050565b606060028054610b7a906155e1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba6906155e1565b8015610bf35780601f10610bc857610100808354040283529160200191610bf3565b820191906000526020600020905b815481529060010190602001808311610bd657829003601f168201915b5050505050905090565b6000610c07610ae3565b73ffffffffffffffffffffffffffffffffffffffff16610c25611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7290615183565b60405180910390fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610cda826129c2565b610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090615163565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d5f826114d3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc7906151e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610def610ae3565b73ffffffffffffffffffffffffffffffffffffffff161480610e1e5750610e1d81610e18610ae3565b61255d565b5b610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e54906150a3565b60405180910390fd5b610e678383612a70565b505050565b6000600480549050905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef290614f83565b60405180910390fd5b600060085447610f0b91906153ce565b90506000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600754600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610f9d9190615455565b610fa79190615424565b610fb191906154af565b90506000811415610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee90615083565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461104291906153ce565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060085461109391906153ce565b6008819055506110a38382612b29565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516110d4929190614e08565b60405180910390a1505050565b600d60009054906101000a900460ff1681565b6111056110ff610ae3565b82612c1d565b611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b90615223565b60405180910390fd5b61114f838383612cfb565b505050565b600061115f83612eda565b82106111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119790614f03565b60405180910390fd5b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611217577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600c5481565b6000600754905090565b6112558383836040518060200160405280600081525061229f565b505050565b611262610ae3565b73ffffffffffffffffffffffffffffffffffffffff16611280611b0a565b73ffffffffffffffffffffffffffffffffffffffff16146112d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cd90615183565b60405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061133b610e6c565b821061137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390615243565b60405180910390fd5b819050919050565b600d60019054906101000a900460ff1681565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a90614ee3565b60405180910390fd5b60005b81518110156114cf576014600083838151811061146c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055806114c890615613565b9050611426565b5050565b60008060048381548110611510577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a490615103565b60405180910390fd5b80915050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990614ee3565b60405180910390fd5b838360119190611653929190613ac5565b50818160129190611665929190613ac5565b5050505050565b611674610ae3565b73ffffffffffffffffffffffffffffffffffffffff16611692611b0a565b73ffffffffffffffffffffffffffffffffffffffff16146116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df90615183565b60405180910390fd5b80600c5414611743576116f9610e6c565b81101561173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290614fa3565b60405180910390fd5b80600c819055505b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae906150e3565b60405180910390fd5b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b611809610ae3565b73ffffffffffffffffffffffffffffffffffffffff16611827611b0a565b73ffffffffffffffffffffffffffffffffffffffff161461187d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187490615183565b60405180910390fd5b6118876000613026565b565b600d60019054906101000a900460ff166118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90615283565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b906150c3565b60405180910390fd5b600e548111156119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a090615123565b60405180910390fd5b80600f546119b79190615455565b3410156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f090615203565b60405180910390fd5b6000611a03610e6c565b9050600c548282611a1491906153ce565b1115611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c906152a3565b60405180910390fd5b60005b82811015611a9757611a86338380611a6f90615613565b9450604051806020016040528060008152506130ea565b80611a9090615613565b9050611a58565b505050565b6000600b8281548110611ad8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611b42906155e1565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6e906155e1565b8015611bbb5780601f10611b9057610100808354040283529160200191611bbb565b820191906000526020600020905b815481529060010190602001808311611b9e57829003601f168201915b5050505050905090565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4890614ee3565b60405180910390fd5b818190508484905014611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9090615263565b60405180910390fd5b600080611ca4610e6c565b905060005b86869050811015611d1257868682818110611ced577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013583611cff91906153ce565b925080611d0b90615613565b9050611ca9565b50600c548282611d2291906153ce565b1115611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a906152a3565b60405180910390fd5b6000915060005b84849050811015611e7b5760005b878783818110611db1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135811015611e6957611e58868684818110611dfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611e109190613dc2565b8480611e1b90615613565b95506040518060400160405280600e81526020017f53656e742077697468206c6f76650000000000000000000000000000000000008152506130ea565b80611e6290615613565b9050611d78565b5080611e7490615613565b9050611d6a565b50505050505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60105481565b600d60009054906101000a900460ff16611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1990615003565b60405180910390fd5b600e54811115611f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5e90615123565b60405180910390fd5b80601054611f759190615455565b341015611fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fae90615203565b60405180910390fd5b6000611fc1610e6c565b9050600c548282611fd291906153ce565b1115612013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200a906152a3565b60405180910390fd5b60005b828110156120555761204433838061202d90615613565b9450604051806020016040528060008152506130ea565b8061204e90615613565b9050612016565b505050565b612062610ae3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c790614fe3565b60405180910390fd5b80600660006120dd610ae3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661218a610ae3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121cf9190614ea6565b60405180910390a35050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e90614ee3565b60405180910390fd5b801515600d60009054906101000a900460ff1615151461229c5780600d60006101000a81548160ff0219169083151502179055505b50565b6122b06122aa610ae3565b83612c1d565b6122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690615223565b60405180910390fd5b6122fb84848484613145565b50505050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661238d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238490614ee3565b60405180910390fd5b801515600d60019054906101000a900460ff161515146123c25780600d60016101000a81548160ff0219169083151502179055505b50565b600f5481565b60606123d6826129c2565b612415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240c906151c3565b60405180910390fd5b6011612420836131a1565b601260405160200161243493929190614da7565b6040516020818303038152906040529050919050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60146020528060005260406000206000915054906101000a900460ff1681565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661253f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253690614ee3565b60405180910390fd5b80600e54146125505780600e819055505b50565b6000600854905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125f9610ae3565b73ffffffffffffffffffffffffffffffffffffffff16612617611b0a565b73ffffffffffffffffffffffffffffffffffffffff161461266d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266490615183565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d490614f43565b60405180910390fd5b6126e681613026565b50565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90614ee3565b60405180910390fd5b60005b815181101561282a576001601460008484815181106127c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508061282390615613565b9050612778565b5050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b190614ee3565b60405180910390fd5b81601054146128cb57816010819055505b80600f54146128dc5780600f819055505b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129ab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129bb57506129ba8261334e565b5b9050919050565b600060048054905082108015612a695750600073ffffffffffffffffffffffffffffffffffffffff1660048381548110612a25577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612ae3836114d3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6390615043565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b9290614dd8565b60006040518083038185875af1925050503d8060008114612bcf576040519150601f19603f3d011682016040523d82523d6000602084013e612bd4565b606091505b5050905080612c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0f90615023565b60405180910390fd5b505050565b6000612c28826129c2565b612c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5e90615063565b60405180910390fd5b6000612c72836114d3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ce157508373ffffffffffffffffffffffffffffffffffffffff16612cc984610ccf565b73ffffffffffffffffffffffffffffffffffffffff16145b80612cf25750612cf1818561255d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d1b826114d3565b73ffffffffffffffffffffffffffffffffffffffff1614612d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d68906151a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd890614fc3565b60405180910390fd5b612dec8383836133b8565b612df7600082612a70565b8160048281548110612e32577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f42906150e3565b60405180910390fd5b600080600480549050905060005b818110156130175760048181548110612f9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613006578261300390615613565b92505b8061301090615613565b9050612f59565b50600090508192505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130f48383613793565b613101600084848461391b565b613140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313790614f23565b60405180910390fd5b505050565b613150848484612cfb565b61315c8484848461391b565b61319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614f23565b60405180910390fd5b50505050565b606060008214156131e9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613349565b600082905060005b6000821461321b57808061320490615613565b915050600a826132149190615424565b91506131f1565b60008167ffffffffffffffff81111561325d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561328f5781602001600182028036833780820191505090505b5090505b60008514613342576001826132a891906154af565b9150600a856132b7919061565c565b60306132c391906153ce565b60f81b8183815181106132ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561333b9190615424565b9450613293565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158061342057508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156136bb576000601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060005b818110156136b45783601360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106134ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015414156136a357601360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060018361354c91906154af565b81548110613583577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154601360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110613605577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550601360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480613688577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590556136b4565b806136ad90615613565b905061346f565b5060009050505b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061372157508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561378d57601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150555b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137fa90615143565b60405180910390fd5b61380c816129c2565b1561384c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384390614f63565b60405180910390fd5b613858600083836133b8565b6004829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061393c8473ffffffffffffffffffffffffffffffffffffffff16613ab2565b15613aa5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613965610ae3565b8786866040518563ffffffff1660e01b81526004016139879493929190614e31565b602060405180830381600087803b1580156139a157600080fd5b505af19250505080156139d257506040513d601f19601f820116820180604052508101906139cf919061409a565b60015b613a55573d8060008114613a02576040519150601f19603f3d011682016040523d82523d6000602084013e613a07565b606091505b50600081511415613a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4490614f23565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613aaa565b600190505b949350505050565b600080823b905060008111915050919050565b828054613ad1906155e1565b90600052602060002090601f016020900481019282613af35760008555613b3a565b82601f10613b0c57803560ff1916838001178555613b3a565b82800160010185558215613b3a579182015b82811115613b39578235825591602001919060010190613b1e565b5b509050613b479190613b4b565b5090565b5b80821115613b64576000816000905550600101613b4c565b5090565b6000613b7b613b768461530f565b6152de565b90508083825260208201905082856020860282011115613b9a57600080fd5b60005b85811015613bca5781613bb08882613c12565b845260208401935060208301925050600181019050613b9d565b5050509392505050565b6000613be7613be28461533b565b6152de565b905082815260208101848484011115613bff57600080fd5b613c0a84828561559f565b509392505050565b600081359050613c218161575a565b92915050565b600081359050613c3681615771565b92915050565b60008083601f840112613c4e57600080fd5b8235905067ffffffffffffffff811115613c6757600080fd5b602083019150836020820283011115613c7f57600080fd5b9250929050565b600082601f830112613c9757600080fd5b8135613ca7848260208601613b68565b91505092915050565b60008083601f840112613cc257600080fd5b8235905067ffffffffffffffff811115613cdb57600080fd5b602083019150836020820283011115613cf357600080fd5b9250929050565b600081359050613d0981615788565b92915050565b600081359050613d1e8161579f565b92915050565b600081519050613d338161579f565b92915050565b600082601f830112613d4a57600080fd5b8135613d5a848260208601613bd4565b91505092915050565b60008083601f840112613d7557600080fd5b8235905067ffffffffffffffff811115613d8e57600080fd5b602083019150836001820283011115613da657600080fd5b9250929050565b600081359050613dbc816157b6565b92915050565b600060208284031215613dd457600080fd5b6000613de284828501613c12565b91505092915050565b600060208284031215613dfd57600080fd5b6000613e0b84828501613c27565b91505092915050565b60008060408385031215613e2757600080fd5b6000613e3585828601613c12565b9250506020613e4685828601613c12565b9150509250929050565b600080600060608486031215613e6557600080fd5b6000613e7386828701613c12565b9350506020613e8486828701613c12565b9250506040613e9586828701613dad565b9150509250925092565b60008060008060808587031215613eb557600080fd5b6000613ec387828801613c12565b9450506020613ed487828801613c12565b9350506040613ee587828801613dad565b925050606085013567ffffffffffffffff811115613f0257600080fd5b613f0e87828801613d39565b91505092959194509250565b60008060408385031215613f2d57600080fd5b6000613f3b85828601613c12565b9250506020613f4c85828601613cfa565b9150509250929050565b60008060408385031215613f6957600080fd5b6000613f7785828601613c12565b9250506020613f8885828601613dad565b9150509250929050565b600060208284031215613fa457600080fd5b600082013567ffffffffffffffff811115613fbe57600080fd5b613fca84828501613c86565b91505092915050565b60008060008060408587031215613fe957600080fd5b600085013567ffffffffffffffff81111561400357600080fd5b61400f87828801613cb0565b9450945050602085013567ffffffffffffffff81111561402e57600080fd5b61403a87828801613c3c565b925092505092959194509250565b60006020828403121561405a57600080fd5b600061406884828501613cfa565b91505092915050565b60006020828403121561408357600080fd5b600061409184828501613d0f565b91505092915050565b6000602082840312156140ac57600080fd5b60006140ba84828501613d24565b91505092915050565b600080600080604085870312156140d957600080fd5b600085013567ffffffffffffffff8111156140f357600080fd5b6140ff87828801613d63565b9450945050602085013567ffffffffffffffff81111561411e57600080fd5b61412a87828801613d63565b925092505092959194509250565b60006020828403121561414a57600080fd5b600061415884828501613dad565b91505092915050565b6000806040838503121561417457600080fd5b600061418285828601613dad565b925050602061419385828601613dad565b9150509250929050565b6141a681615569565b82525050565b6141b5816154e3565b82525050565b6141c481615507565b82525050565b60006141d582615380565b6141df8185615396565b93506141ef8185602086016155ae565b6141f881615749565b840191505092915050565b600061420e8261538b565b61421881856153b2565b93506142288185602086016155ae565b61423181615749565b840191505092915050565b60006142478261538b565b61425181856153c3565b93506142618185602086016155ae565b80840191505092915050565b6000815461427a816155e1565b61428481866153c3565b9450600182166000811461429f57600181146142b0576142e3565b60ff198316865281860193506142e3565b6142b98561536b565b60005b838110156142db578154818901526001820191506020810190506142bc565b838801955050505b50505092915050565b60006142f96010836153b2565b91507f496e76616c69642064656c6567617465000000000000000000000000000000006000830152602082019050919050565b6000614339602b836153b2565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061439f6032836153b2565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006144056026836153b2565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061446b601c836153b2565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006144ab6026836153b2565b91507f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008301527f73686172657300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614511602e836153b2565b91507f53706563696669656420737570706c79206973206c6f776572207468616e206360008301527f757272656e742062616c616e63650000000000000000000000000000000000006020830152604082019050919050565b60006145776024836153b2565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145dd6019836153b2565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061461d6012836153b2565b91507f53616c65206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b600061465d603a836153b2565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b60006146c3601d836153b2565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b6000614703602c836153b2565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614769602b836153b2565b91507f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008301527f647565207061796d656e740000000000000000000000000000000000000000006020830152604082019050919050565b60006147cf6038836153b2565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614835600f836153b2565b91507f4e6f742077686974656c697374656400000000000000000000000000000000006000830152602082019050919050565b6000614875602a836153b2565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148db6029836153b2565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614941600d836153b2565b91507f4f7264657220746f6f20626967000000000000000000000000000000000000006000830152602082019050919050565b60006149816020836153b2565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006149c1602c836153b2565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614a276020836153b2565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a676029836153b2565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614acd602f836153b2565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614b336021836153b2565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b996019836153b2565b91507f45746865722073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b6000614bd96000836153a7565b9150600082019050919050565b6000614bf36031836153b2565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614c59602c836153b2565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614cbf602c836153b2565b91507f4d7573742070726f7669646520657175616c207175616e74697469657320616e60008301527f6420726563697069656e747300000000000000000000000000000000000000006020830152604082019050919050565b6000614d25601c836153b2565b91507f57686974656c6973742073616c65206973206e6f7420616374697665000000006000830152602082019050919050565b6000614d656019836153b2565b91507f4d696e742f6f72646572206578636565647320737570706c79000000000000006000830152602082019050919050565b614da18161555f565b82525050565b6000614db3828661426d565b9150614dbf828561423c565b9150614dcb828461426d565b9150819050949350505050565b6000614de382614bcc565b9150819050919050565b6000602082019050614e0260008301846141ac565b92915050565b6000604082019050614e1d600083018561419d565b614e2a6020830184614d98565b9392505050565b6000608082019050614e4660008301876141ac565b614e5360208301866141ac565b614e606040830185614d98565b8181036060830152614e7281846141ca565b905095945050505050565b6000604082019050614e9260008301856141ac565b614e9f6020830184614d98565b9392505050565b6000602082019050614ebb60008301846141bb565b92915050565b60006020820190508181036000830152614edb8184614203565b905092915050565b60006020820190508181036000830152614efc816142ec565b9050919050565b60006020820190508181036000830152614f1c8161432c565b9050919050565b60006020820190508181036000830152614f3c81614392565b9050919050565b60006020820190508181036000830152614f5c816143f8565b9050919050565b60006020820190508181036000830152614f7c8161445e565b9050919050565b60006020820190508181036000830152614f9c8161449e565b9050919050565b60006020820190508181036000830152614fbc81614504565b9050919050565b60006020820190508181036000830152614fdc8161456a565b9050919050565b60006020820190508181036000830152614ffc816145d0565b9050919050565b6000602082019050818103600083015261501c81614610565b9050919050565b6000602082019050818103600083015261503c81614650565b9050919050565b6000602082019050818103600083015261505c816146b6565b9050919050565b6000602082019050818103600083015261507c816146f6565b9050919050565b6000602082019050818103600083015261509c8161475c565b9050919050565b600060208201905081810360008301526150bc816147c2565b9050919050565b600060208201905081810360008301526150dc81614828565b9050919050565b600060208201905081810360008301526150fc81614868565b9050919050565b6000602082019050818103600083015261511c816148ce565b9050919050565b6000602082019050818103600083015261513c81614934565b9050919050565b6000602082019050818103600083015261515c81614974565b9050919050565b6000602082019050818103600083015261517c816149b4565b9050919050565b6000602082019050818103600083015261519c81614a1a565b9050919050565b600060208201905081810360008301526151bc81614a5a565b9050919050565b600060208201905081810360008301526151dc81614ac0565b9050919050565b600060208201905081810360008301526151fc81614b26565b9050919050565b6000602082019050818103600083015261521c81614b8c565b9050919050565b6000602082019050818103600083015261523c81614be6565b9050919050565b6000602082019050818103600083015261525c81614c4c565b9050919050565b6000602082019050818103600083015261527c81614cb2565b9050919050565b6000602082019050818103600083015261529c81614d18565b9050919050565b600060208201905081810360008301526152bc81614d58565b9050919050565b60006020820190506152d86000830184614d98565b92915050565b6000604051905081810181811067ffffffffffffffff821117156153055761530461571a565b5b8060405250919050565b600067ffffffffffffffff82111561532a5761532961571a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156153565761535561571a565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006153d98261555f565b91506153e48361555f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156154195761541861568d565b5b828201905092915050565b600061542f8261555f565b915061543a8361555f565b92508261544a576154496156bc565b5b828204905092915050565b60006154608261555f565b915061546b8361555f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154a4576154a361568d565b5b828202905092915050565b60006154ba8261555f565b91506154c58361555f565b9250828210156154d8576154d761568d565b5b828203905092915050565b60006154ee8261553f565b9050919050565b60006155008261553f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006155748261557b565b9050919050565b60006155868261558d565b9050919050565b60006155988261553f565b9050919050565b82818337600083830152505050565b60005b838110156155cc5780820151818401526020810190506155b1565b838111156155db576000848401525b50505050565b600060028204905060018216806155f957607f821691505b6020821081141561560d5761560c6156eb565b5b50919050565b600061561e8261555f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156515761565061568d565b5b600182019050919050565b60006156678261555f565b91506156728361555f565b925082615682576156816156bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615763816154e3565b811461576e57600080fd5b50565b61577a816154f5565b811461578557600080fd5b50565b61579181615507565b811461579c57600080fd5b50565b6157a881615513565b81146157b357600080fd5b50565b6157bf8161555f565b81146157ca57600080fd5b5056fea26469706673582212205601e3ce0d35031ed5b817d4c694c10ba0216bea9654bfbd6cf8ec5a6a1b8c1d64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102755760003560e01c8063715018a61161014f578063b88d4fde116100c1578063dde3d3131161007a578063dde3d313146109d7578063e33b7de314610a00578063e985e9c514610a2b578063f2fde38b14610a68578063f421764814610a91578063f7d9757714610aba576102bc565b8063b88d4fde146108a3578063c3b754dc146108cc578063c7f8d01a146108f5578063c87b56dd14610920578063ce7c2ac21461095d578063cfdb63ac1461099a576102bc565b806396ea3a471161011357806396ea3a47146107a45780639852595c146107cd578063a035b1fe1461080a578063a0712d6814610835578063a22cb46514610851578063acec338a1461087a576102bc565b8063715018a6146106de578063868ff4a2146106f55780638b83209b146107115780638da5cb5b1461074e57806395d89b4114610779576102bc565b806332cb6b0c116101e85780635306deaf116101ac5780635306deaf146105be578063548db174146105e95780636352211e146106125780636790a9de1461064f5780636f8b44b01461067857806370a08231146106a1576102bc565b806332cb6b0c146104d95780633a98ef391461050457806342842e0e1461052f5780634a994eef146105585780634f6ccce714610581576102bc565b8063095ea7b31161023a578063095ea7b3146103cb57806318160ddd146103f4578063191655871461041f57806322f3e2d41461044857806323b872dd146104735780632f745c591461049c576102bc565b8062451026146102be57806301ffc9a7146102e957806306fdde03146103265780630777962714610351578063081812fc1461038e576102bc565b366102bc577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102a3610ae3565b346040516102b2929190614e7d565b60405180910390a1005b005b3480156102ca57600080fd5b506102d3610aeb565b6040516102e091906152c3565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190614071565b610af1565b60405161031d9190614ea6565b60405180910390f35b34801561033257600080fd5b5061033b610b6b565b6040516103489190614ec1565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613dc2565b610bfd565b6040516103859190614ea6565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614138565b610ccf565b6040516103c29190614ded565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190613f56565b610d54565b005b34801561040057600080fd5b50610409610e6c565b60405161041691906152c3565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190613deb565b610e79565b005b34801561045457600080fd5b5061045d6110e1565b60405161046a9190614ea6565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190613e50565b6110f4565b005b3480156104a857600080fd5b506104c360048036038101906104be9190613f56565b611154565b6040516104d091906152c3565b60405180910390f35b3480156104e557600080fd5b506104ee61122a565b6040516104fb91906152c3565b60405180910390f35b34801561051057600080fd5b50610519611230565b60405161052691906152c3565b60405180910390f35b34801561053b57600080fd5b5061055660048036038101906105519190613e50565b61123a565b005b34801561056457600080fd5b5061057f600480360381019061057a9190613f1a565b61125a565b005b34801561058d57600080fd5b506105a860048036038101906105a39190614138565b611331565b6040516105b591906152c3565b60405180910390f35b3480156105ca57600080fd5b506105d3611384565b6040516105e09190614ea6565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b9190613f92565b611397565b005b34801561061e57600080fd5b5061063960048036038101906106349190614138565b6114d3565b6040516106469190614ded565b60405180910390f35b34801561065b57600080fd5b50610676600480360381019061067191906140c3565b6115b6565b005b34801561068457600080fd5b5061069f600480360381019061069a9190614138565b61166c565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190613dc2565b611746565b6040516106d591906152c3565b60405180910390f35b3480156106ea57600080fd5b506106f3611801565b005b61070f600480360381019061070a9190614138565b611889565b005b34801561071d57600080fd5b5061073860048036038101906107339190614138565b611a9c565b6040516107459190614ded565b60405180910390f35b34801561075a57600080fd5b50610763611b0a565b6040516107709190614ded565b60405180910390f35b34801561078557600080fd5b5061078e611b33565b60405161079b9190614ec1565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190613fd3565b611bc5565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190613dc2565b611e84565b60405161080191906152c3565b60405180910390f35b34801561081657600080fd5b5061081f611ecd565b60405161082c91906152c3565b60405180910390f35b61084f600480360381019061084a9190614138565b611ed3565b005b34801561085d57600080fd5b5061087860048036038101906108739190613f1a565b61205a565b005b34801561088657600080fd5b506108a1600480360381019061089c9190614048565b6121db565b005b3480156108af57600080fd5b506108ca60048036038101906108c59190613e9f565b61229f565b005b3480156108d857600080fd5b506108f360048036038101906108ee9190614048565b612301565b005b34801561090157600080fd5b5061090a6123c5565b60405161091791906152c3565b60405180910390f35b34801561092c57600080fd5b5061094760048036038101906109429190614138565b6123cb565b6040516109549190614ec1565b60405180910390f35b34801561096957600080fd5b50610984600480360381019061097f9190613dc2565b61244a565b60405161099191906152c3565b60405180910390f35b3480156109a657600080fd5b506109c160048036038101906109bc9190613dc2565b612493565b6040516109ce9190614ea6565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f99190614138565b6124b3565b005b348015610a0c57600080fd5b50610a15612553565b604051610a2291906152c3565b60405180910390f35b348015610a3757600080fd5b50610a526004803603810190610a4d9190613e14565b61255d565b604051610a5f9190614ea6565b60405180910390f35b348015610a7457600080fd5b50610a8f6004803603810190610a8a9190613dc2565b6125f1565b005b348015610a9d57600080fd5b50610ab86004803603810190610ab39190613f92565b6126e9565b005b348015610ac657600080fd5b50610ae16004803603810190610adc9190614161565b61282e565b005b600033905090565b600e5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b645750610b63826128e0565b5b9050919050565b606060028054610b7a906155e1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba6906155e1565b8015610bf35780601f10610bc857610100808354040283529160200191610bf3565b820191906000526020600020905b815481529060010190602001808311610bd657829003601f168201915b5050505050905090565b6000610c07610ae3565b73ffffffffffffffffffffffffffffffffffffffff16610c25611b0a565b73ffffffffffffffffffffffffffffffffffffffff1614610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7290615183565b60405180910390fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610cda826129c2565b610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090615163565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d5f826114d3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc7906151e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610def610ae3565b73ffffffffffffffffffffffffffffffffffffffff161480610e1e5750610e1d81610e18610ae3565b61255d565b5b610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e54906150a3565b60405180910390fd5b610e678383612a70565b505050565b6000600480549050905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef290614f83565b60405180910390fd5b600060085447610f0b91906153ce565b90506000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600754600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610f9d9190615455565b610fa79190615424565b610fb191906154af565b90506000811415610ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fee90615083565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461104291906153ce565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060085461109391906153ce565b6008819055506110a38382612b29565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05683826040516110d4929190614e08565b60405180910390a1505050565b600d60009054906101000a900460ff1681565b6111056110ff610ae3565b82612c1d565b611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b90615223565b60405180910390fd5b61114f838383612cfb565b505050565b600061115f83612eda565b82106111a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119790614f03565b60405180910390fd5b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611217577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600c5481565b6000600754905090565b6112558383836040518060200160405280600081525061229f565b505050565b611262610ae3565b73ffffffffffffffffffffffffffffffffffffffff16611280611b0a565b73ffffffffffffffffffffffffffffffffffffffff16146112d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cd90615183565b60405180910390fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061133b610e6c565b821061137c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137390615243565b60405180910390fd5b819050919050565b600d60019054906101000a900460ff1681565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a90614ee3565b60405180910390fd5b60005b81518110156114cf576014600083838151811061146c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055806114c890615613565b9050611426565b5050565b60008060048381548110611510577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a490615103565b60405180910390fd5b80915050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990614ee3565b60405180910390fd5b838360119190611653929190613ac5565b50818160129190611665929190613ac5565b5050505050565b611674610ae3565b73ffffffffffffffffffffffffffffffffffffffff16611692611b0a565b73ffffffffffffffffffffffffffffffffffffffff16146116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df90615183565b60405180910390fd5b80600c5414611743576116f9610e6c565b81101561173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290614fa3565b60405180910390fd5b80600c819055505b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae906150e3565b60405180910390fd5b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b611809610ae3565b73ffffffffffffffffffffffffffffffffffffffff16611827611b0a565b73ffffffffffffffffffffffffffffffffffffffff161461187d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187490615183565b60405180910390fd5b6118876000613026565b565b600d60019054906101000a900460ff166118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf90615283565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b906150c3565b60405180910390fd5b600e548111156119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a090615123565b60405180910390fd5b80600f546119b79190615455565b3410156119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f090615203565b60405180910390fd5b6000611a03610e6c565b9050600c548282611a1491906153ce565b1115611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c906152a3565b60405180910390fd5b60005b82811015611a9757611a86338380611a6f90615613565b9450604051806020016040528060008152506130ea565b80611a9090615613565b9050611a58565b505050565b6000600b8281548110611ad8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611b42906155e1565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6e906155e1565b8015611bbb5780601f10611b9057610100808354040283529160200191611bbb565b820191906000526020600020905b815481529060010190602001808311611b9e57829003601f168201915b5050505050905090565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4890614ee3565b60405180910390fd5b818190508484905014611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9090615263565b60405180910390fd5b600080611ca4610e6c565b905060005b86869050811015611d1257868682818110611ced577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013583611cff91906153ce565b925080611d0b90615613565b9050611ca9565b50600c548282611d2291906153ce565b1115611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a906152a3565b60405180910390fd5b6000915060005b84849050811015611e7b5760005b878783818110611db1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135811015611e6957611e58868684818110611dfb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611e109190613dc2565b8480611e1b90615613565b95506040518060400160405280600e81526020017f53656e742077697468206c6f76650000000000000000000000000000000000008152506130ea565b80611e6290615613565b9050611d78565b5080611e7490615613565b9050611d6a565b50505050505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60105481565b600d60009054906101000a900460ff16611f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1990615003565b60405180910390fd5b600e54811115611f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5e90615123565b60405180910390fd5b80601054611f759190615455565b341015611fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fae90615203565b60405180910390fd5b6000611fc1610e6c565b9050600c548282611fd291906153ce565b1115612013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200a906152a3565b60405180910390fd5b60005b828110156120555761204433838061202d90615613565b9450604051806020016040528060008152506130ea565b8061204e90615613565b9050612016565b505050565b612062610ae3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c790614fe3565b60405180910390fd5b80600660006120dd610ae3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661218a610ae3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121cf9190614ea6565b60405180910390a35050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e90614ee3565b60405180910390fd5b801515600d60009054906101000a900460ff1615151461229c5780600d60006101000a81548160ff0219169083151502179055505b50565b6122b06122aa610ae3565b83612c1d565b6122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e690615223565b60405180910390fd5b6122fb84848484613145565b50505050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661238d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238490614ee3565b60405180910390fd5b801515600d60019054906101000a900460ff161515146123c25780600d60016101000a81548160ff0219169083151502179055505b50565b600f5481565b60606123d6826129c2565b612415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240c906151c3565b60405180910390fd5b6011612420836131a1565b601260405160200161243493929190614da7565b6040516020818303038152906040529050919050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60146020528060005260406000206000915054906101000a900460ff1681565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661253f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253690614ee3565b60405180910390fd5b80600e54146125505780600e819055505b50565b6000600854905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125f9610ae3565b73ffffffffffffffffffffffffffffffffffffffff16612617611b0a565b73ffffffffffffffffffffffffffffffffffffffff161461266d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266490615183565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d490614f43565b60405180910390fd5b6126e681613026565b50565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276c90614ee3565b60405180910390fd5b60005b815181101561282a576001601460008484815181106127c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508061282390615613565b9050612778565b5050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b190614ee3565b60405180910390fd5b81601054146128cb57816010819055505b80600f54146128dc5780600f819055505b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129ab57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806129bb57506129ba8261334e565b5b9050919050565b600060048054905082108015612a695750600073ffffffffffffffffffffffffffffffffffffffff1660048381548110612a25577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612ae3836114d3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6390615043565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612b9290614dd8565b60006040518083038185875af1925050503d8060008114612bcf576040519150601f19603f3d011682016040523d82523d6000602084013e612bd4565b606091505b5050905080612c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0f90615023565b60405180910390fd5b505050565b6000612c28826129c2565b612c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5e90615063565b60405180910390fd5b6000612c72836114d3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ce157508373ffffffffffffffffffffffffffffffffffffffff16612cc984610ccf565b73ffffffffffffffffffffffffffffffffffffffff16145b80612cf25750612cf1818561255d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d1b826114d3565b73ffffffffffffffffffffffffffffffffffffffff1614612d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d68906151a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd890614fc3565b60405180910390fd5b612dec8383836133b8565b612df7600082612a70565b8160048281548110612e32577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f42906150e3565b60405180910390fd5b600080600480549050905060005b818110156130175760048181548110612f9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613006578261300390615613565b92505b8061301090615613565b9050612f59565b50600090508192505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130f48383613793565b613101600084848461391b565b613140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313790614f23565b60405180910390fd5b505050565b613150848484612cfb565b61315c8484848461391b565b61319b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319290614f23565b60405180910390fd5b50505050565b606060008214156131e9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613349565b600082905060005b6000821461321b57808061320490615613565b915050600a826132149190615424565b91506131f1565b60008167ffffffffffffffff81111561325d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561328f5781602001600182028036833780820191505090505b5090505b60008514613342576001826132a891906154af565b9150600a856132b7919061565c565b60306132c391906153ce565b60f81b8183815181106132ff577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561333b9190615424565b9450613293565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158061342057508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156136bb576000601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060005b818110156136b45783601360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106134ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015414156136a357601360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060018361354c91906154af565b81548110613583577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154601360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110613605577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550601360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480613688577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600190038181906000526020600020016000905590556136b4565b806136ad90615613565b905061346f565b5060009050505b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061372157508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561378d57601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150555b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137fa90615143565b60405180910390fd5b61380c816129c2565b1561384c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384390614f63565b60405180910390fd5b613858600083836133b8565b6004829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061393c8473ffffffffffffffffffffffffffffffffffffffff16613ab2565b15613aa5578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613965610ae3565b8786866040518563ffffffff1660e01b81526004016139879493929190614e31565b602060405180830381600087803b1580156139a157600080fd5b505af19250505080156139d257506040513d601f19601f820116820180604052508101906139cf919061409a565b60015b613a55573d8060008114613a02576040519150601f19603f3d011682016040523d82523d6000602084013e613a07565b606091505b50600081511415613a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4490614f23565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613aaa565b600190505b949350505050565b600080823b905060008111915050919050565b828054613ad1906155e1565b90600052602060002090601f016020900481019282613af35760008555613b3a565b82601f10613b0c57803560ff1916838001178555613b3a565b82800160010185558215613b3a579182015b82811115613b39578235825591602001919060010190613b1e565b5b509050613b479190613b4b565b5090565b5b80821115613b64576000816000905550600101613b4c565b5090565b6000613b7b613b768461530f565b6152de565b90508083825260208201905082856020860282011115613b9a57600080fd5b60005b85811015613bca5781613bb08882613c12565b845260208401935060208301925050600181019050613b9d565b5050509392505050565b6000613be7613be28461533b565b6152de565b905082815260208101848484011115613bff57600080fd5b613c0a84828561559f565b509392505050565b600081359050613c218161575a565b92915050565b600081359050613c3681615771565b92915050565b60008083601f840112613c4e57600080fd5b8235905067ffffffffffffffff811115613c6757600080fd5b602083019150836020820283011115613c7f57600080fd5b9250929050565b600082601f830112613c9757600080fd5b8135613ca7848260208601613b68565b91505092915050565b60008083601f840112613cc257600080fd5b8235905067ffffffffffffffff811115613cdb57600080fd5b602083019150836020820283011115613cf357600080fd5b9250929050565b600081359050613d0981615788565b92915050565b600081359050613d1e8161579f565b92915050565b600081519050613d338161579f565b92915050565b600082601f830112613d4a57600080fd5b8135613d5a848260208601613bd4565b91505092915050565b60008083601f840112613d7557600080fd5b8235905067ffffffffffffffff811115613d8e57600080fd5b602083019150836001820283011115613da657600080fd5b9250929050565b600081359050613dbc816157b6565b92915050565b600060208284031215613dd457600080fd5b6000613de284828501613c12565b91505092915050565b600060208284031215613dfd57600080fd5b6000613e0b84828501613c27565b91505092915050565b60008060408385031215613e2757600080fd5b6000613e3585828601613c12565b9250506020613e4685828601613c12565b9150509250929050565b600080600060608486031215613e6557600080fd5b6000613e7386828701613c12565b9350506020613e8486828701613c12565b9250506040613e9586828701613dad565b9150509250925092565b60008060008060808587031215613eb557600080fd5b6000613ec387828801613c12565b9450506020613ed487828801613c12565b9350506040613ee587828801613dad565b925050606085013567ffffffffffffffff811115613f0257600080fd5b613f0e87828801613d39565b91505092959194509250565b60008060408385031215613f2d57600080fd5b6000613f3b85828601613c12565b9250506020613f4c85828601613cfa565b9150509250929050565b60008060408385031215613f6957600080fd5b6000613f7785828601613c12565b9250506020613f8885828601613dad565b9150509250929050565b600060208284031215613fa457600080fd5b600082013567ffffffffffffffff811115613fbe57600080fd5b613fca84828501613c86565b91505092915050565b60008060008060408587031215613fe957600080fd5b600085013567ffffffffffffffff81111561400357600080fd5b61400f87828801613cb0565b9450945050602085013567ffffffffffffffff81111561402e57600080fd5b61403a87828801613c3c565b925092505092959194509250565b60006020828403121561405a57600080fd5b600061406884828501613cfa565b91505092915050565b60006020828403121561408357600080fd5b600061409184828501613d0f565b91505092915050565b6000602082840312156140ac57600080fd5b60006140ba84828501613d24565b91505092915050565b600080600080604085870312156140d957600080fd5b600085013567ffffffffffffffff8111156140f357600080fd5b6140ff87828801613d63565b9450945050602085013567ffffffffffffffff81111561411e57600080fd5b61412a87828801613d63565b925092505092959194509250565b60006020828403121561414a57600080fd5b600061415884828501613dad565b91505092915050565b6000806040838503121561417457600080fd5b600061418285828601613dad565b925050602061419385828601613dad565b9150509250929050565b6141a681615569565b82525050565b6141b5816154e3565b82525050565b6141c481615507565b82525050565b60006141d582615380565b6141df8185615396565b93506141ef8185602086016155ae565b6141f881615749565b840191505092915050565b600061420e8261538b565b61421881856153b2565b93506142288185602086016155ae565b61423181615749565b840191505092915050565b60006142478261538b565b61425181856153c3565b93506142618185602086016155ae565b80840191505092915050565b6000815461427a816155e1565b61428481866153c3565b9450600182166000811461429f57600181146142b0576142e3565b60ff198316865281860193506142e3565b6142b98561536b565b60005b838110156142db578154818901526001820191506020810190506142bc565b838801955050505b50505092915050565b60006142f96010836153b2565b91507f496e76616c69642064656c6567617465000000000000000000000000000000006000830152602082019050919050565b6000614339602b836153b2565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061439f6032836153b2565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006144056026836153b2565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061446b601c836153b2565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006144ab6026836153b2565b91507f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008301527f73686172657300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614511602e836153b2565b91507f53706563696669656420737570706c79206973206c6f776572207468616e206360008301527f757272656e742062616c616e63650000000000000000000000000000000000006020830152604082019050919050565b60006145776024836153b2565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145dd6019836153b2565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061461d6012836153b2565b91507f53616c65206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b600061465d603a836153b2565b91507f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008301527f6563697069656e74206d617920686176652072657665727465640000000000006020830152604082019050919050565b60006146c3601d836153b2565b91507f416464726573733a20696e73756666696369656e742062616c616e63650000006000830152602082019050919050565b6000614703602c836153b2565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614769602b836153b2565b91507f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008301527f647565207061796d656e740000000000000000000000000000000000000000006020830152604082019050919050565b60006147cf6038836153b2565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614835600f836153b2565b91507f4e6f742077686974656c697374656400000000000000000000000000000000006000830152602082019050919050565b6000614875602a836153b2565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148db6029836153b2565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614941600d836153b2565b91507f4f7264657220746f6f20626967000000000000000000000000000000000000006000830152602082019050919050565b60006149816020836153b2565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006149c1602c836153b2565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614a276020836153b2565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a676029836153b2565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614acd602f836153b2565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614b336021836153b2565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b996019836153b2565b91507f45746865722073656e74206973206e6f7420636f7272656374000000000000006000830152602082019050919050565b6000614bd96000836153a7565b9150600082019050919050565b6000614bf36031836153b2565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614c59602c836153b2565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614cbf602c836153b2565b91507f4d7573742070726f7669646520657175616c207175616e74697469657320616e60008301527f6420726563697069656e747300000000000000000000000000000000000000006020830152604082019050919050565b6000614d25601c836153b2565b91507f57686974656c6973742073616c65206973206e6f7420616374697665000000006000830152602082019050919050565b6000614d656019836153b2565b91507f4d696e742f6f72646572206578636565647320737570706c79000000000000006000830152602082019050919050565b614da18161555f565b82525050565b6000614db3828661426d565b9150614dbf828561423c565b9150614dcb828461426d565b9150819050949350505050565b6000614de382614bcc565b9150819050919050565b6000602082019050614e0260008301846141ac565b92915050565b6000604082019050614e1d600083018561419d565b614e2a6020830184614d98565b9392505050565b6000608082019050614e4660008301876141ac565b614e5360208301866141ac565b614e606040830185614d98565b8181036060830152614e7281846141ca565b905095945050505050565b6000604082019050614e9260008301856141ac565b614e9f6020830184614d98565b9392505050565b6000602082019050614ebb60008301846141bb565b92915050565b60006020820190508181036000830152614edb8184614203565b905092915050565b60006020820190508181036000830152614efc816142ec565b9050919050565b60006020820190508181036000830152614f1c8161432c565b9050919050565b60006020820190508181036000830152614f3c81614392565b9050919050565b60006020820190508181036000830152614f5c816143f8565b9050919050565b60006020820190508181036000830152614f7c8161445e565b9050919050565b60006020820190508181036000830152614f9c8161449e565b9050919050565b60006020820190508181036000830152614fbc81614504565b9050919050565b60006020820190508181036000830152614fdc8161456a565b9050919050565b60006020820190508181036000830152614ffc816145d0565b9050919050565b6000602082019050818103600083015261501c81614610565b9050919050565b6000602082019050818103600083015261503c81614650565b9050919050565b6000602082019050818103600083015261505c816146b6565b9050919050565b6000602082019050818103600083015261507c816146f6565b9050919050565b6000602082019050818103600083015261509c8161475c565b9050919050565b600060208201905081810360008301526150bc816147c2565b9050919050565b600060208201905081810360008301526150dc81614828565b9050919050565b600060208201905081810360008301526150fc81614868565b9050919050565b6000602082019050818103600083015261511c816148ce565b9050919050565b6000602082019050818103600083015261513c81614934565b9050919050565b6000602082019050818103600083015261515c81614974565b9050919050565b6000602082019050818103600083015261517c816149b4565b9050919050565b6000602082019050818103600083015261519c81614a1a565b9050919050565b600060208201905081810360008301526151bc81614a5a565b9050919050565b600060208201905081810360008301526151dc81614ac0565b9050919050565b600060208201905081810360008301526151fc81614b26565b9050919050565b6000602082019050818103600083015261521c81614b8c565b9050919050565b6000602082019050818103600083015261523c81614be6565b9050919050565b6000602082019050818103600083015261525c81614c4c565b9050919050565b6000602082019050818103600083015261527c81614cb2565b9050919050565b6000602082019050818103600083015261529c81614d18565b9050919050565b600060208201905081810360008301526152bc81614d58565b9050919050565b60006020820190506152d86000830184614d98565b92915050565b6000604051905081810181811067ffffffffffffffff821117156153055761530461571a565b5b8060405250919050565b600067ffffffffffffffff82111561532a5761532961571a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156153565761535561571a565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006153d98261555f565b91506153e48361555f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156154195761541861568d565b5b828201905092915050565b600061542f8261555f565b915061543a8361555f565b92508261544a576154496156bc565b5b828204905092915050565b60006154608261555f565b915061546b8361555f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154a4576154a361568d565b5b828202905092915050565b60006154ba8261555f565b91506154c58361555f565b9250828210156154d8576154d761568d565b5b828203905092915050565b60006154ee8261553f565b9050919050565b60006155008261553f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006155748261557b565b9050919050565b60006155868261558d565b9050919050565b60006155988261553f565b9050919050565b82818337600083830152505050565b60005b838110156155cc5780820151818401526020810190506155b1565b838111156155db576000848401525b50505050565b600060028204905060018216806155f957607f821691505b6020821081141561560d5761560c6156eb565b5b50919050565b600061561e8261555f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156515761565061568d565b5b600182019050919050565b60006156678261555f565b91506156728361555f565b925082615682576156816156bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615763816154e3565b811461576e57600080fd5b50565b61577a816154f5565b811461578557600080fd5b50565b61579181615507565b811461579c57600080fd5b50565b6157a881615513565b81146157b357600080fd5b50565b6157bf8161555f565b81146157ca57600080fd5b5056fea26469706673582212205601e3ce0d35031ed5b817d4c694c10ba0216bea9654bfbd6cf8ec5a6a1b8c1d64736f6c63430008000033

Deployed Bytecode Sourcemap

488:5356:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2548:40:13;2564:12;:10;:12::i;:::-;2578:9;2548:40;;;;;;;:::i;:::-;;;;;;;;488:5356:3;;;689:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;569:216:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2105:91:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;455:109:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2813:206:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2398:361;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1479:101:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3631:562:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;621:30:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3624:297:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4754:247:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;586:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2664:82:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3980:155:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;570:113:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1645:207:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;655:30:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3365:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1832:218:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4120:169:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4313:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4549:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1551:85:12;;;;;;;;;;;;;:::i;:::-;;1997:546:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3355:91:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;960:78:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2253:95:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2571:613:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3176:100:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;758:33:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1533:459;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3079:274:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3693:119:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4194:286:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3548:140:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;719:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5006:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2993:96:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;923:42:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3817:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2828:86:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3412:155:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1776:177:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3189:171:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3943:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;599:89:1;652:7;673:10;666:17;;599:89;:::o;689:26:3:-;;;;:::o;569:216:6:-;672:4;705:35;690:50;;;:11;:50;;;;:90;;;;744:36;768:11;744:23;:36::i;:::-;690:90;683:97;;569:216;;;:::o;2105:91:5:-;2159:13;2186:5;2179:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2105:91;:::o;455:109:2:-;525:4;1164:12:12;:10;:12::i;:::-;1153:23;;:7;:5;:7::i;:::-;:23;;;1145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;542:10:2::1;:16;553:4;542:16;;;;;;;;;;;;;;;;;;;;;;;;;535:23;;455:109:::0;;;:::o;2813:206:5:-;2889:7;2911:16;2919:7;2911;:16::i;:::-;2903:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2990:15;:24;3006:7;2990:24;;;;;;;;;;;;;;;;;;;;;2983:31;;2813:206;;;:::o;2398:361::-;2473:13;2489:24;2505:7;2489:15;:24::i;:::-;2473:40;;2532:5;2526:11;;:2;:11;;;;2518:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;2611:5;2595:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;2620:37;2637:5;2644:12;:10;:12::i;:::-;2620:16;:37::i;:::-;2595:62;2582:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;2733:21;2742:2;2746:7;2733:8;:21::i;:::-;2398:361;;;:::o;1479:101:6:-;1540:7;1561;:14;;;;1554:21;;1479:101;:::o;3631:562:13:-;3720:1;3701:7;:16;3709:7;3701:16;;;;;;;;;;;;;;;;:20;3693:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:21;3819:14;;3795:21;:38;;;;:::i;:::-;3771:62;;3838:15;3908:9;:18;3918:7;3908:18;;;;;;;;;;;;;;;;3893:12;;3873:7;:16;3881:7;3873:16;;;;;;;;;;;;;;;;3857:13;:32;;;;:::i;:::-;3856:49;;;;:::i;:::-;:70;;;;:::i;:::-;3838:88;;3952:1;3941:7;:12;;3933:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4050:7;4029:9;:18;4039:7;4029:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;4008:9;:18;4018:7;4008:18;;;;;;;;;;;;;;;:49;;;;4096:7;4079:14;;:24;;;;:::i;:::-;4062:14;:41;;;;4110:35;4128:7;4137;4110:17;:35::i;:::-;4155:33;4171:7;4180;4155:33;;;;;;;:::i;:::-;;;;;;;;3631:562;;;:::o;621:30:3:-;;;;;;;;;;;;;:::o;3624:297:5:-;3786:41;3805:12;:10;:12::i;:::-;3819:7;3786:18;:41::i;:::-;3778:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;3888:28;3898:4;3904:2;3908:7;3888:9;:28::i;:::-;3624:297;;;:::o;4754:247:3:-;4851:15;4889:24;4907:5;4889:17;:24::i;:::-;4881:5;:32;4873:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;4973:9;:16;4983:5;4973:16;;;;;;;;;;;;;;;4990:5;4973:23;;;;;;;;;;;;;;;;;;;;;;;;4966:30;;4754:247;;;;:::o;586:29::-;;;;:::o;2664:82:13:-;2708:7;2729:12;;2722:19;;2664:82;:::o;3980:155:5:-;4091:39;4108:4;4114:2;4118:7;4091:39;;;;;;;;;;;;:16;:39::i;:::-;3980:155;;;:::o;570:113:2:-;1164:12:12;:10;:12::i;:::-;1153:23;;:7;:5;:7::i;:::-;:23;;;1145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;666:11:2::1;647:10;:16;658:4;647:16;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;570:113:::0;;:::o;1645:207:6:-;1720:7;1750:31;:29;:31::i;:::-;1742:5;:39;1734:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;1842:5;1835:12;;1645:207;;;:::o;655:30:3:-;;;;;;;;;;;;;:::o;3365:178::-;379:10:2;:22;390:10;379:22;;;;;;;;;;;;;;;;;;;;;;;;;371:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3455:6:3::1;3451:88;3471:10;:17;3467:1;:21;3451:88;;;3508:10;:25;3519:10;3530:1;3519:13;;;;;;;;;;;;;;;;;;;;;;3508:25;;;;;;;;;;;;;;;;3501:32;;;;;;;;;;;3490:3;;;;:::i;:::-;;;3451:88;;;;3365:178:::0;:::o;1832:218:5:-;1904:7;1918:13;1934:7;1942;1934:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1918:32;;1980:1;1963:19;;:5;:19;;;;1955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2040:5;2033:12;;;1832:218;;;:::o;4120:169:3:-;379:10:2;:22;390:10;379:22;;;;;;;;;;;;;;;;;;;;;;;;;371:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4240:11:3::1;;4224:13;:27;;;;;;;:::i;:::-;;4274:10;;4256:15;:28;;;;;;;:::i;:::-;;4120:169:::0;;;;:::o;4313:220::-;1164:12:12;:10;:12::i;:::-;1153:23;;:7;:5;:7::i;:::-;:23;;;1145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4392:9:3::1;4378:10;;:23;4374:155;;4430:13;:11;:13::i;:::-;4417:9;:26;;4409:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;4514:9;4501:10;:22;;;;4374:155;4313:220:::0;:::o;4549:200::-;4621:7;4660:1;4643:19;;:5;:19;;;;4635:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;4721:9;:16;4731:5;4721:16;;;;;;;;;;;;;;;:23;;;;4714:30;;4549:200;;;:::o;1551:85:12:-;1164:12;:10;:12::i;:::-;1153:23;;:7;:5;:7::i;:::-;:23;;;1145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1610:21:::1;1628:1;1610:9;:21::i;:::-;1551:85::o:0;1997:546:3:-;2068:10;;;;;;;;;;;2059:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2135:10;:22;2146:10;2135:22;;;;;;;;;;;;;;;;;;;;;;;;;2126:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2210:8;;2198;:20;;2189:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;2297:8;2287:7;;:18;;;;:::i;:::-;2274:9;:31;;2265:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;2343:14;2360:13;:11;:13::i;:::-;2343:30;;2408:10;;2396:8;2387:6;:17;;;;:::i;:::-;:31;;2378:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;2458:6;2454:83;2474:8;2470:1;:12;2454:83;;;2494:37;2505:10;2517:8;;;;;:::i;:::-;;;2494:37;;;;;;;;;;;;:9;:37::i;:::-;2484:3;;;;:::i;:::-;;;2454:83;;;;1997:546;;:::o;3355:91:13:-;3406:7;3427;3435:5;3427:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3420:21;;3355:91;;;:::o;960:78:12:-;1006:7;1027:6;;;;;;;;;;;1020:13;;960:78;:::o;2253:95:5:-;2309:13;2336:7;2329:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2253:95;:::o;2571:613:3:-;379:10:2;:22;390:10;379:22;;;;;;;;;;;;;;;;;;;;;;;;;371:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;2695:9:3::1;;:16;;2676:8;;:15;;:35;2668:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;2768:18;2795:14:::0;2812:13:::1;:11;:13::i;:::-;2795:30;;2834:6;2830:81;2850:8;;:15;;2846:1;:19;2830:81;;;2894:8;;2903:1;2894:11;;;;;;;;;;;;;;;;;;;;;2877:28;;;;;:::i;:::-;;;2867:3;;;;:::i;:::-;;;2830:81;;;;2950:10;;2933:13;2924:6;:22;;;;:::i;:::-;:36;;2915:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2996:20;;;3027:6;3023:157;3043:9;;:16;;3039:1;:20;3023:157;;;3075:6;3071:104;3091:8;;3100:1;3091:11;;;;;;;;;;;;;;;;;;;;;3087:1;:15;3071:104;;;3115:53;3126:9;;3136:1;3126:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3140:8;;;;;:::i;:::-;;;3115:53;;;;;;;;;;;;;;;;::::0;:9:::1;:53::i;:::-;3104:3;;;;:::i;:::-;;;3071:104;;;;3061:3;;;;:::i;:::-;;;3023:157;;;;427:1:2;;2571:613:3::0;;;;:::o;3176:100:13:-;3232:7;3253:9;:18;3263:7;3253:18;;;;;;;;;;;;;;;;3246:25;;3176:100;;;:::o;758:33:3:-;;;;:::o;1533:459::-;1595:8;;;;;;;;;;;1586:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;1665:8;;1653;:20;;1644:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1748:8;1740:5;;:16;;;;:::i;:::-;1727:9;:29;;1718:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1794:14;1811:13;:11;:13::i;:::-;1794:30;;1859:10;;1847:8;1838:6;:17;;;;:::i;:::-;:31;;1829:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;1909:6;1905:83;1925:8;1921:1;:12;1905:83;;;1945:37;1956:10;1968:8;;;;;:::i;:::-;;;1945:37;;;;;;;;;;;;:9;:37::i;:::-;1935:3;;;;:::i;:::-;;;1905:83;;;;1533:459;;:::o;3079:274:5:-;3188:12;:10;:12::i;:::-;3176:24;;:8;:24;;;;3168:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;3282:8;3237:18;:32;3256:12;:10;:12::i;:::-;3237:32;;;;;;;;;;;;;;;:42;3270:8;3237:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;3329:8;3300:48;;3315:12;:10;:12::i;:::-;3300:48;;;3339:8;3300:48;;;;;;:::i;:::-;;;;;;;;3079:274;;:::o;3693:119:3:-;379:10:2;:22;390:10;379:22;;;;;;;;;;;;;;;;;;;;;;;;;371:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:9:3::1;3759:21;;:8;;;;;;;;;;;:21;;;3755:52;;3798:9;3787:8;;:20;;;;;;;;;;;;;;;;;;3755:52;3693:119:::0;:::o;4194:286:5:-;4336:41;4355:12;:10;:12::i;:::-;4369:7;4336:18;:41::i;:::-;4328:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4436:39;4450:4;4456:2;4460:7;4469:5;4436:13;:39::i;:::-;4194:286;;;;:::o;3548:140:3:-;379:10:2;:22;390:10;379:22;;;;;;;;;;;;;;;;;;;;;;;;;371:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3640:11:3::1;3626:25;;:10;;;;;;;;;;;:25;;;3622:61;;3672:11;3659:10;;:24;;;;;;;;;;;;;;;;;;3622:61;3548:140:::0;:::o;719:35::-;;;;:::o;5006:261::-;5078:13;5106:16;5114:7;5106;:16::i;:::-;5098:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5210:13;5225:18;:7;:16;:18::i;:::-;5245:15;5193:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5179:83;;5006:261;;;:::o;2993:96:13:-;3047:7;3068;:16;3076:7;3068:16;;;;;;;;;;;;;;;;3061:23;;2993:96;;;:::o;923:42:3:-;;;;;;;;;;;;;;;;;;;;;;:::o;3817:121::-;379:10:2;:22;390:10;379:22;;;;;;;;;;;;;;;;;;;;;;;;;371:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3897:9:3::1;3885:8;;:21;3881:52;;3924:9;3913:8;:20;;;;3881:52;3817:121:::0;:::o;2828:86:13:-;2874:7;2895:14;;2888:21;;2828:86;:::o;3412:155:5:-;3509:4;3527:18;:25;3546:5;3527:25;;;;;;;;;;;;;;;:35;3553:8;3527:35;;;;;;;;;;;;;;;;;;;;;;;;;3520:42;;3412:155;;;;:::o;1776:177:12:-;1164:12;:10;:12::i;:::-;1153:23;;:7;:5;:7::i;:::-;:23;;;1145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1879:1:::1;1859:22;;:8;:22;;;;1851:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1929:19;1939:8;1929:9;:19::i;:::-;1776:177:::0;:::o;3189:171:3:-;379:10:2;:22;390:10;379:22;;;;;;;;;;;;;;;;;;;;;;;;;371:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3272:6:3::1;3268:88;3288:10;:17;3284:1;:21;3268:88;;;3346:4;3318:10;:25;3329:10;3340:1;3329:13;;;;;;;;;;;;;;;;;;;;;;3318:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;3307:3;;;;:::i;:::-;;;3268:88;;;;3189:171:::0;:::o;3943:172::-;379:10:2;:22;390:10;379:22;;;;;;;;;;;;;;;;;;;;;;;;;371:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4029:6:3::1;4020:5;;:15;4016:40;;4050:6;4042:5;:14;;;;4016:40;4078:8;4067:7;;:19;4063:47;;4102:8;4092:7;:18;;;;4063:47;3943:172:::0;;:::o;1109:269:5:-;1211:4;1248:25;1233:40;;;:11;:40;;;;:96;;;;1296:33;1281:48;;;:11;:48;;;;1233:96;:140;;;;1337:36;1361:11;1337:23;:36::i;:::-;1233:140;1222:151;;1109:269;;;:::o;5864:146::-;5929:4;5957:7;:14;;;;5947:7;:24;:58;;;;;6003:1;5975:30;;:7;5983;5975:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;;5947:58;5940:65;;5864:146;;;:::o;9318:160::-;9414:2;9387:15;:24;9403:7;9387:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;9465:7;9461:2;9426:47;;9435:24;9451:7;9435:15;:24::i;:::-;9426:47;;;;;;;;;;;;9318:160;;:::o;1906:296:0:-;2015:6;1990:21;:31;;1982:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2063:12;2081:9;:14;;2103:6;2081:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2062:52;;;2127:7;2119:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;1906:296;;;:::o;6153:328:5:-;6246:4;6265:16;6273:7;6265;:16::i;:::-;6257:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6335:13;6351:24;6367:7;6351:15;:24::i;:::-;6335:40;;6399:5;6388:16;;:7;:16;;;:51;;;;6432:7;6408:31;;:20;6420:7;6408:11;:20::i;:::-;:31;;;6388:51;:87;;;;6443:32;6460:5;6467:7;6443:16;:32::i;:::-;6388:87;6380:96;;;6153:328;;;;:::o;8767:451::-;8900:4;8872:32;;:24;8888:7;8872:15;:24::i;:::-;:32;;;8864:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;8977:1;8963:16;;:2;:16;;;;8955:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;9027:39;9048:4;9054:2;9058:7;9027:20;:39::i;:::-;9119:29;9136:1;9140:7;9119:8;:29::i;:::-;9172:2;9153:7;9161;9153:16;;;;;;;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9205:7;9201:2;9186:27;;9195:4;9186:27;;;;;;;;;;;;8767:451;;;:::o;1430:352::-;1502:7;1541:1;1524:19;;:5;:19;;;;1516:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1597:10;1616:11;1630:7;:14;;;;1616:28;;1654:6;1649:92;1670:6;1666:1;:10;1649:92;;;1703:7;1711:1;1703:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1694:19;;:5;:19;;;1690:46;;;1721:7;;;;:::i;:::-;;;1690:46;1678:3;;;;:::i;:::-;;;1649:92;;;;1747:13;;;1772:5;1765:12;;;;1430:352;;;:::o;1958:152:12:-;2008:16;2027:6;;;;;;;;;;;2008:25;;2047:8;2038:6;;:17;;;;;;;;;;;;;;;;;;2096:8;2065:40;;2086:8;2065:40;;;;;;;;;;;;1958:152;;:::o;7105:261:5:-;7208:18;7214:2;7218:7;7208:5;:18::i;:::-;7244:54;7275:1;7279:2;7283:7;7292:5;7244:22;:54::i;:::-;7231:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;7105:261;;;:::o;5305:273::-;5429:28;5439:4;5445:2;5449:7;5429:9;:28::i;:::-;5470:48;5493:4;5499:2;5503:7;5512:5;5470:22;:48::i;:::-;5462:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;5305:273;;;;:::o;273:594:15:-;329:13;541:1;532:5;:10;528:38;;;550:10;;;;;;;;;;;;;;;;;;;;;528:38;570:12;585:5;570:20;;595:14;614:54;629:1;621:4;:9;614:54;;638:8;;;;;:::i;:::-;;;;660:2;652:10;;;;;:::i;:::-;;;614:54;;;672:19;704:6;694:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;672:39;;716:121;732:1;723:5;:10;716:121;;751:1;741:11;;;;;:::i;:::-;;;809:2;801:5;:10;;;;:::i;:::-;788:2;:24;;;;:::i;:::-;775:39;;758:6;765;758:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;829:2;820:11;;;;;:::i;:::-;;;716:121;;;855:6;841:21;;;;;273:594;;;;:::o;775:148:4:-;860:4;893:25;878:40;;;:11;:40;;;;871:47;;775:148;;;:::o;5285:556:3:-;5402:12;5444:4;5436:12;;:4;:12;;;;:26;;;;5458:4;5452:10;;:2;:10;;;5436:26;5432:326;;;5506:11;5520:9;:15;5530:4;5520:15;;;;;;;;;;;;;;;:22;;;;5506:36;;5553:6;5548:184;5565:6;5561:1;:10;5548:184;;;5611:7;5589:9;:15;5599:4;5589:15;;;;;;;;;;;;;;;5605:1;5589:18;;;;;;;;;;;;;;;;;;;;;;;;:29;5585:141;;;5649:9;:15;5659:4;5649:15;;;;;;;;;;;;;;;5674:1;5665:6;:10;;;;:::i;:::-;5649:27;;;;;;;;;;;;;;;;;;;;;;;;5628:9;:15;5638:4;5628:15;;;;;;;;;;;;;;;5644:1;5628:18;;;;;;;;;;;;;;;;;;;;;;;:48;;;;5684:9;:15;5694:4;5684:15;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5713:5;;5585:141;5573:3;;;;:::i;:::-;;;5548:184;;;;5739:13;;;5432:326;;5776:4;5768:12;;:4;:12;;;:26;;;;5790:4;5784:10;;:2;:10;;;;5768:26;5764:73;;;5802:9;:13;5812:2;5802:13;;;;;;;;;;;;;;;5822:7;5802:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5764:73;5285:556;;;;:::o;7663:313:5:-;7751:1;7737:16;;:2;:16;;;;7729:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;7804:16;7812:7;7804;:16::i;:::-;7803:17;7795:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;7860:45;7889:1;7893:2;7897:7;7860:20;:45::i;:::-;7910:7;7923:2;7910:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7963:7;7959:2;7938:33;;7955:1;7938:33;;;;;;;;;;;;7663:313;;:::o;10012:604::-;10140:4;10155:15;:2;:13;;;:15::i;:::-;10151:461;;;10198:2;10182:36;;;10219:12;:10;:12::i;:::-;10233:4;10239:7;10248:5;10182:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;10178:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10408:1;10391:6;:13;:18;10387:185;;;10419:60;;;;;;;;;;:::i;:::-;;;;;;;;10387:185;10549:6;10543:13;10534:6;10530:2;10526:15;10519:38;10178:400;10303:41;;;10293:51;;;:6;:51;;;;10286:58;;;;;10151:461;10602:4;10595:11;;10012:604;;;;;;;:::o;689:333:0:-;749:4;933:12;985:7;973:20;965:28;;1016:1;1009:4;:8;1002:15;;;689:333;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:16:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:139::-;;1084:6;1071:20;1062:29;;1100:33;1127:5;1100:33;:::i;:::-;1052:87;;;;:::o;1145:155::-;;1237:6;1224:20;1215:29;;1253:41;1288:5;1253:41;:::i;:::-;1205:95;;;;:::o;1323:367::-;;;1456:3;1449:4;1441:6;1437:17;1433:27;1423:2;;1474:1;1471;1464:12;1423:2;1510:6;1497:20;1487:30;;1540:18;1532:6;1529:30;1526:2;;;1572:1;1569;1562:12;1526:2;1609:4;1601:6;1597:17;1585:29;;1663:3;1655:4;1647:6;1643:17;1633:8;1629:32;1626:41;1623:2;;;1680:1;1677;1670:12;1623:2;1413:277;;;;;:::o;1713:303::-;;1833:3;1826:4;1818:6;1814:17;1810:27;1800:2;;1851:1;1848;1841:12;1800:2;1891:6;1878:20;1916:94;2006:3;1998:6;1991:4;1983:6;1979:17;1916:94;:::i;:::-;1907:103;;1790:226;;;;;:::o;2039:367::-;;;2172:3;2165:4;2157:6;2153:17;2149:27;2139:2;;2190:1;2187;2180:12;2139:2;2226:6;2213:20;2203:30;;2256:18;2248:6;2245:30;2242:2;;;2288:1;2285;2278:12;2242:2;2325:4;2317:6;2313:17;2301:29;;2379:3;2371:4;2363:6;2359:17;2349:8;2345:32;2342:41;2339:2;;;2396:1;2393;2386:12;2339:2;2129:277;;;;;:::o;2412:133::-;;2493:6;2480:20;2471:29;;2509:30;2533:5;2509:30;:::i;:::-;2461:84;;;;:::o;2551:137::-;;2634:6;2621:20;2612:29;;2650:32;2676:5;2650:32;:::i;:::-;2602:86;;;;:::o;2694:141::-;;2781:6;2775:13;2766:22;;2797:32;2823:5;2797:32;:::i;:::-;2756:79;;;;:::o;2854:271::-;;2958:3;2951:4;2943:6;2939:17;2935:27;2925:2;;2976:1;2973;2966:12;2925:2;3016:6;3003:20;3041:78;3115:3;3107:6;3100:4;3092:6;3088:17;3041:78;:::i;:::-;3032:87;;2915:210;;;;;:::o;3145:352::-;;;3263:3;3256:4;3248:6;3244:17;3240:27;3230:2;;3281:1;3278;3271:12;3230:2;3317:6;3304:20;3294:30;;3347:18;3339:6;3336:30;3333:2;;;3379:1;3376;3369:12;3333:2;3416:4;3408:6;3404:17;3392:29;;3470:3;3462:4;3454:6;3450:17;3440:8;3436:32;3433:41;3430:2;;;3487:1;3484;3477:12;3430:2;3220:277;;;;;:::o;3503:139::-;;3587:6;3574:20;3565:29;;3603:33;3630:5;3603:33;:::i;:::-;3555:87;;;;:::o;3648:262::-;;3756:2;3744:9;3735:7;3731:23;3727:32;3724:2;;;3772:1;3769;3762:12;3724:2;3815:1;3840:53;3885:7;3876:6;3865:9;3861:22;3840:53;:::i;:::-;3830:63;;3786:117;3714:196;;;;:::o;3916:278::-;;4032:2;4020:9;4011:7;4007:23;4003:32;4000:2;;;4048:1;4045;4038:12;4000:2;4091:1;4116:61;4169:7;4160:6;4149:9;4145:22;4116:61;:::i;:::-;4106:71;;4062:125;3990:204;;;;:::o;4200:407::-;;;4325:2;4313:9;4304:7;4300:23;4296:32;4293:2;;;4341:1;4338;4331:12;4293:2;4384:1;4409:53;4454:7;4445:6;4434:9;4430:22;4409:53;:::i;:::-;4399:63;;4355:117;4511:2;4537:53;4582:7;4573:6;4562:9;4558:22;4537:53;:::i;:::-;4527:63;;4482:118;4283:324;;;;;:::o;4613:552::-;;;;4755:2;4743:9;4734:7;4730:23;4726:32;4723:2;;;4771:1;4768;4761:12;4723:2;4814:1;4839:53;4884:7;4875:6;4864:9;4860:22;4839:53;:::i;:::-;4829:63;;4785:117;4941:2;4967:53;5012:7;5003:6;4992:9;4988:22;4967:53;:::i;:::-;4957:63;;4912:118;5069:2;5095:53;5140:7;5131:6;5120:9;5116:22;5095:53;:::i;:::-;5085:63;;5040:118;4713:452;;;;;:::o;5171:809::-;;;;;5339:3;5327:9;5318:7;5314:23;5310:33;5307:2;;;5356:1;5353;5346:12;5307:2;5399:1;5424:53;5469:7;5460:6;5449:9;5445:22;5424:53;:::i;:::-;5414:63;;5370:117;5526:2;5552:53;5597:7;5588:6;5577:9;5573:22;5552:53;:::i;:::-;5542:63;;5497:118;5654:2;5680:53;5725:7;5716:6;5705:9;5701:22;5680:53;:::i;:::-;5670:63;;5625:118;5810:2;5799:9;5795:18;5782:32;5841:18;5833:6;5830:30;5827:2;;;5873:1;5870;5863:12;5827:2;5901:62;5955:7;5946:6;5935:9;5931:22;5901:62;:::i;:::-;5891:72;;5753:220;5297:683;;;;;;;:::o;5986:401::-;;;6108:2;6096:9;6087:7;6083:23;6079:32;6076:2;;;6124:1;6121;6114:12;6076:2;6167:1;6192:53;6237:7;6228:6;6217:9;6213:22;6192:53;:::i;:::-;6182:63;;6138:117;6294:2;6320:50;6362:7;6353:6;6342:9;6338:22;6320:50;:::i;:::-;6310:60;;6265:115;6066:321;;;;;:::o;6393:407::-;;;6518:2;6506:9;6497:7;6493:23;6489:32;6486:2;;;6534:1;6531;6524:12;6486:2;6577:1;6602:53;6647:7;6638:6;6627:9;6623:22;6602:53;:::i;:::-;6592:63;;6548:117;6704:2;6730:53;6775:7;6766:6;6755:9;6751:22;6730:53;:::i;:::-;6720:63;;6675:118;6476:324;;;;;:::o;6806:405::-;;6939:2;6927:9;6918:7;6914:23;6910:32;6907:2;;;6955:1;6952;6945:12;6907:2;7026:1;7015:9;7011:17;6998:31;7056:18;7048:6;7045:30;7042:2;;;7088:1;7085;7078:12;7042:2;7116:78;7186:7;7177:6;7166:9;7162:22;7116:78;:::i;:::-;7106:88;;6969:235;6897:314;;;;:::o;7217:733::-;;;;;7412:2;7400:9;7391:7;7387:23;7383:32;7380:2;;;7428:1;7425;7418:12;7380:2;7499:1;7488:9;7484:17;7471:31;7529:18;7521:6;7518:30;7515:2;;;7561:1;7558;7551:12;7515:2;7597:80;7669:7;7660:6;7649:9;7645:22;7597:80;:::i;:::-;7579:98;;;;7442:245;7754:2;7743:9;7739:18;7726:32;7785:18;7777:6;7774:30;7771:2;;;7817:1;7814;7807:12;7771:2;7853:80;7925:7;7916:6;7905:9;7901:22;7853:80;:::i;:::-;7835:98;;;;7697:246;7370:580;;;;;;;:::o;7956:256::-;;8061:2;8049:9;8040:7;8036:23;8032:32;8029:2;;;8077:1;8074;8067:12;8029:2;8120:1;8145:50;8187:7;8178:6;8167:9;8163:22;8145:50;:::i;:::-;8135:60;;8091:114;8019:193;;;;:::o;8218:260::-;;8325:2;8313:9;8304:7;8300:23;8296:32;8293:2;;;8341:1;8338;8331:12;8293:2;8384:1;8409:52;8453:7;8444:6;8433:9;8429:22;8409:52;:::i;:::-;8399:62;;8355:116;8283:195;;;;:::o;8484:282::-;;8602:2;8590:9;8581:7;8577:23;8573:32;8570:2;;;8618:1;8615;8608:12;8570:2;8661:1;8686:63;8741:7;8732:6;8721:9;8717:22;8686:63;:::i;:::-;8676:73;;8632:127;8560:206;;;;:::o;8772:673::-;;;;;8937:2;8925:9;8916:7;8912:23;8908:32;8905:2;;;8953:1;8950;8943:12;8905:2;9024:1;9013:9;9009:17;8996:31;9054:18;9046:6;9043:30;9040:2;;;9086:1;9083;9076:12;9040:2;9122:65;9179:7;9170:6;9159:9;9155:22;9122:65;:::i;:::-;9104:83;;;;8967:230;9264:2;9253:9;9249:18;9236:32;9295:18;9287:6;9284:30;9281:2;;;9327:1;9324;9317:12;9281:2;9363:65;9420:7;9411:6;9400:9;9396:22;9363:65;:::i;:::-;9345:83;;;;9207:231;8895:550;;;;;;;:::o;9451:262::-;;9559:2;9547:9;9538:7;9534:23;9530:32;9527:2;;;9575:1;9572;9565:12;9527:2;9618:1;9643:53;9688:7;9679:6;9668:9;9664:22;9643:53;:::i;:::-;9633:63;;9589:117;9517:196;;;;:::o;9719:407::-;;;9844:2;9832:9;9823:7;9819:23;9815:32;9812:2;;;9860:1;9857;9850:12;9812:2;9903:1;9928:53;9973:7;9964:6;9953:9;9949:22;9928:53;:::i;:::-;9918:63;;9874:117;10030:2;10056:53;10101:7;10092:6;10081:9;10077:22;10056:53;:::i;:::-;10046:63;;10001:118;9802:324;;;;;:::o;10132:147::-;10227:45;10266:5;10227:45;:::i;:::-;10222:3;10215:58;10205:74;;:::o;10285:118::-;10372:24;10390:5;10372:24;:::i;:::-;10367:3;10360:37;10350:53;;:::o;10409:109::-;10490:21;10505:5;10490:21;:::i;:::-;10485:3;10478:34;10468:50;;:::o;10524:360::-;;10638:38;10670:5;10638:38;:::i;:::-;10692:70;10755:6;10750:3;10692:70;:::i;:::-;10685:77;;10771:52;10816:6;10811:3;10804:4;10797:5;10793:16;10771:52;:::i;:::-;10848:29;10870:6;10848:29;:::i;:::-;10843:3;10839:39;10832:46;;10614:270;;;;;:::o;10890:364::-;;11006:39;11039:5;11006:39;:::i;:::-;11061:71;11125:6;11120:3;11061:71;:::i;:::-;11054:78;;11141:52;11186:6;11181:3;11174:4;11167:5;11163:16;11141:52;:::i;:::-;11218:29;11240:6;11218:29;:::i;:::-;11213:3;11209:39;11202:46;;10982:272;;;;;:::o;11260:377::-;;11394:39;11427:5;11394:39;:::i;:::-;11449:89;11531:6;11526:3;11449:89;:::i;:::-;11442:96;;11547:52;11592:6;11587:3;11580:4;11573:5;11569:16;11547:52;:::i;:::-;11624:6;11619:3;11615:16;11608:23;;11370:267;;;;;:::o;11667:845::-;;11807:5;11801:12;11836:36;11862:9;11836:36;:::i;:::-;11888:89;11970:6;11965:3;11888:89;:::i;:::-;11881:96;;12008:1;11997:9;11993:17;12024:1;12019:137;;;;12170:1;12165:341;;;;11986:520;;12019:137;12103:4;12099:9;12088;12084:25;12079:3;12072:38;12139:6;12134:3;12130:16;12123:23;;12019:137;;12165:341;12232:38;12264:5;12232:38;:::i;:::-;12292:1;12306:154;12320:6;12317:1;12314:13;12306:154;;;12394:7;12388:14;12384:1;12379:3;12375:11;12368:35;12444:1;12435:7;12431:15;12420:26;;12342:4;12339:1;12335:12;12330:17;;12306:154;;;12489:6;12484:3;12480:16;12473:23;;12172:334;;11986:520;;11774:738;;;;;;:::o;12518:314::-;;12681:67;12745:2;12740:3;12681:67;:::i;:::-;12674:74;;12778:18;12774:1;12769:3;12765:11;12758:39;12823:2;12818:3;12814:12;12807:19;;12664:168;;;:::o;12838:375::-;;13001:67;13065:2;13060:3;13001:67;:::i;:::-;12994:74;;13098:34;13094:1;13089:3;13085:11;13078:55;13164:13;13159:2;13154:3;13150:12;13143:35;13204:2;13199:3;13195:12;13188:19;;12984:229;;;:::o;13219:382::-;;13382:67;13446:2;13441:3;13382:67;:::i;:::-;13375:74;;13479:34;13475:1;13470:3;13466:11;13459:55;13545:20;13540:2;13535:3;13531:12;13524:42;13592:2;13587:3;13583:12;13576:19;;13365:236;;;:::o;13607:370::-;;13770:67;13834:2;13829:3;13770:67;:::i;:::-;13763:74;;13867:34;13863:1;13858:3;13854:11;13847:55;13933:8;13928:2;13923:3;13919:12;13912:30;13968:2;13963:3;13959:12;13952:19;;13753:224;;;:::o;13983:326::-;;14146:67;14210:2;14205:3;14146:67;:::i;:::-;14139:74;;14243:30;14239:1;14234:3;14230:11;14223:51;14300:2;14295:3;14291:12;14284:19;;14129:180;;;:::o;14315:370::-;;14478:67;14542:2;14537:3;14478:67;:::i;:::-;14471:74;;14575:34;14571:1;14566:3;14562:11;14555:55;14641:8;14636:2;14631:3;14627:12;14620:30;14676:2;14671:3;14667:12;14660:19;;14461:224;;;:::o;14691:378::-;;14854:67;14918:2;14913:3;14854:67;:::i;:::-;14847:74;;14951:34;14947:1;14942:3;14938:11;14931:55;15017:16;15012:2;15007:3;15003:12;14996:38;15060:2;15055:3;15051:12;15044:19;;14837:232;;;:::o;15075:368::-;;15238:67;15302:2;15297:3;15238:67;:::i;:::-;15231:74;;15335:34;15331:1;15326:3;15322:11;15315:55;15401:6;15396:2;15391:3;15387:12;15380:28;15434:2;15429:3;15425:12;15418:19;;15221:222;;;:::o;15449:323::-;;15612:67;15676:2;15671:3;15612:67;:::i;:::-;15605:74;;15709:27;15705:1;15700:3;15696:11;15689:48;15763:2;15758:3;15754:12;15747:19;;15595:177;;;:::o;15778:316::-;;15941:67;16005:2;16000:3;15941:67;:::i;:::-;15934:74;;16038:20;16034:1;16029:3;16025:11;16018:41;16085:2;16080:3;16076:12;16069:19;;15924:170;;;:::o;16100:390::-;;16263:67;16327:2;16322:3;16263:67;:::i;:::-;16256:74;;16360:34;16356:1;16351:3;16347:11;16340:55;16426:28;16421:2;16416:3;16412:12;16405:50;16481:2;16476:3;16472:12;16465:19;;16246:244;;;:::o;16496:327::-;;16659:67;16723:2;16718:3;16659:67;:::i;:::-;16652:74;;16756:31;16752:1;16747:3;16743:11;16736:52;16814:2;16809:3;16805:12;16798:19;;16642:181;;;:::o;16829:376::-;;16992:67;17056:2;17051:3;16992:67;:::i;:::-;16985:74;;17089:34;17085:1;17080:3;17076:11;17069:55;17155:14;17150:2;17145:3;17141:12;17134:36;17196:2;17191:3;17187:12;17180:19;;16975:230;;;:::o;17211:375::-;;17374:67;17438:2;17433:3;17374:67;:::i;:::-;17367:74;;17471:34;17467:1;17462:3;17458:11;17451:55;17537:13;17532:2;17527:3;17523:12;17516:35;17577:2;17572:3;17568:12;17561:19;;17357:229;;;:::o;17592:388::-;;17755:67;17819:2;17814:3;17755:67;:::i;:::-;17748:74;;17852:34;17848:1;17843:3;17839:11;17832:55;17918:26;17913:2;17908:3;17904:12;17897:48;17971:2;17966:3;17962:12;17955:19;;17738:242;;;:::o;17986:313::-;;18149:67;18213:2;18208:3;18149:67;:::i;:::-;18142:74;;18246:17;18242:1;18237:3;18233:11;18226:38;18290:2;18285:3;18281:12;18274:19;;18132:167;;;:::o;18305:374::-;;18468:67;18532:2;18527:3;18468:67;:::i;:::-;18461:74;;18565:34;18561:1;18556:3;18552:11;18545:55;18631:12;18626:2;18621:3;18617:12;18610:34;18670:2;18665:3;18661:12;18654:19;;18451:228;;;:::o;18685:373::-;;18848:67;18912:2;18907:3;18848:67;:::i;:::-;18841:74;;18945:34;18941:1;18936:3;18932:11;18925:55;19011:11;19006:2;19001:3;18997:12;18990:33;19049:2;19044:3;19040:12;19033:19;;18831:227;;;:::o;19064:311::-;;19227:67;19291:2;19286:3;19227:67;:::i;:::-;19220:74;;19324:15;19320:1;19315:3;19311:11;19304:36;19366:2;19361:3;19357:12;19350:19;;19210:165;;;:::o;19381:330::-;;19544:67;19608:2;19603:3;19544:67;:::i;:::-;19537:74;;19641:34;19637:1;19632:3;19628:11;19621:55;19702:2;19697:3;19693:12;19686:19;;19527:184;;;:::o;19717:376::-;;19880:67;19944:2;19939:3;19880:67;:::i;:::-;19873:74;;19977:34;19973:1;19968:3;19964:11;19957:55;20043:14;20038:2;20033:3;20029:12;20022:36;20084:2;20079:3;20075:12;20068:19;;19863:230;;;:::o;20099:330::-;;20262:67;20326:2;20321:3;20262:67;:::i;:::-;20255:74;;20359:34;20355:1;20350:3;20346:11;20339:55;20420:2;20415:3;20411:12;20404:19;;20245:184;;;:::o;20435:373::-;;20598:67;20662:2;20657:3;20598:67;:::i;:::-;20591:74;;20695:34;20691:1;20686:3;20682:11;20675:55;20761:11;20756:2;20751:3;20747:12;20740:33;20799:2;20794:3;20790:12;20783:19;;20581:227;;;:::o;20814:379::-;;20977:67;21041:2;21036:3;20977:67;:::i;:::-;20970:74;;21074:34;21070:1;21065:3;21061:11;21054:55;21140:17;21135:2;21130:3;21126:12;21119:39;21184:2;21179:3;21175:12;21168:19;;20960:233;;;:::o;21199:365::-;;21362:67;21426:2;21421:3;21362:67;:::i;:::-;21355:74;;21459:34;21455:1;21450:3;21446:11;21439:55;21525:3;21520:2;21515:3;21511:12;21504:25;21555:2;21550:3;21546:12;21539:19;;21345:219;;;:::o;21570:323::-;;21733:67;21797:2;21792:3;21733:67;:::i;:::-;21726:74;;21830:27;21826:1;21821:3;21817:11;21810:48;21884:2;21879:3;21875:12;21868:19;;21716:177;;;:::o;21899:297::-;;22079:83;22160:1;22155:3;22079:83;:::i;:::-;22072:90;;22188:1;22183:3;22179:11;22172:18;;22062:134;;;:::o;22202:381::-;;22365:67;22429:2;22424:3;22365:67;:::i;:::-;22358:74;;22462:34;22458:1;22453:3;22449:11;22442:55;22528:19;22523:2;22518:3;22514:12;22507:41;22574:2;22569:3;22565:12;22558:19;;22348:235;;;:::o;22589:376::-;;22752:67;22816:2;22811:3;22752:67;:::i;:::-;22745:74;;22849:34;22845:1;22840:3;22836:11;22829:55;22915:14;22910:2;22905:3;22901:12;22894:36;22956:2;22951:3;22947:12;22940:19;;22735:230;;;:::o;22971:376::-;;23134:67;23198:2;23193:3;23134:67;:::i;:::-;23127:74;;23231:34;23227:1;23222:3;23218:11;23211:55;23297:14;23292:2;23287:3;23283:12;23276:36;23338:2;23333:3;23329:12;23322:19;;23117:230;;;:::o;23353:326::-;;23516:67;23580:2;23575:3;23516:67;:::i;:::-;23509:74;;23613:30;23609:1;23604:3;23600:11;23593:51;23670:2;23665:3;23661:12;23654:19;;23499:180;;;:::o;23685:323::-;;23848:67;23912:2;23907:3;23848:67;:::i;:::-;23841:74;;23945:27;23941:1;23936:3;23932:11;23925:48;23999:2;23994:3;23990:12;23983:19;;23831:177;;;:::o;24014:118::-;24101:24;24119:5;24101:24;:::i;:::-;24096:3;24089:37;24079:53;;:::o;24138:583::-;;24382:92;24470:3;24461:6;24382:92;:::i;:::-;24375:99;;24491:95;24582:3;24573:6;24491:95;:::i;:::-;24484:102;;24603:92;24691:3;24682:6;24603:92;:::i;:::-;24596:99;;24712:3;24705:10;;24364:357;;;;;;:::o;24727:379::-;;24933:147;25076:3;24933:147;:::i;:::-;24926:154;;25097:3;25090:10;;24915:191;;;:::o;25112:222::-;;25243:2;25232:9;25228:18;25220:26;;25256:71;25324:1;25313:9;25309:17;25300:6;25256:71;:::i;:::-;25210:124;;;;:::o;25340:348::-;;25507:2;25496:9;25492:18;25484:26;;25520:79;25596:1;25585:9;25581:17;25572:6;25520:79;:::i;:::-;25609:72;25677:2;25666:9;25662:18;25653:6;25609:72;:::i;:::-;25474:214;;;;;:::o;25694:640::-;;25927:3;25916:9;25912:19;25904:27;;25941:71;26009:1;25998:9;25994:17;25985:6;25941:71;:::i;:::-;26022:72;26090:2;26079:9;26075:18;26066:6;26022:72;:::i;:::-;26104;26172:2;26161:9;26157:18;26148:6;26104:72;:::i;:::-;26223:9;26217:4;26213:20;26208:2;26197:9;26193:18;26186:48;26251:76;26322:4;26313:6;26251:76;:::i;:::-;26243:84;;25894:440;;;;;;;:::o;26340:332::-;;26499:2;26488:9;26484:18;26476:26;;26512:71;26580:1;26569:9;26565:17;26556:6;26512:71;:::i;:::-;26593:72;26661:2;26650:9;26646:18;26637:6;26593:72;:::i;:::-;26466:206;;;;;:::o;26678:210::-;;26803:2;26792:9;26788:18;26780:26;;26816:65;26878:1;26867:9;26863:17;26854:6;26816:65;:::i;:::-;26770:118;;;;:::o;26894:313::-;;27045:2;27034:9;27030:18;27022:26;;27094:9;27088:4;27084:20;27080:1;27069:9;27065:17;27058:47;27122:78;27195:4;27186:6;27122:78;:::i;:::-;27114:86;;27012:195;;;;:::o;27213:419::-;;27417:2;27406:9;27402:18;27394:26;;27466:9;27460:4;27456:20;27452:1;27441:9;27437:17;27430:47;27494:131;27620:4;27494:131;:::i;:::-;27486:139;;27384:248;;;:::o;27638:419::-;;27842:2;27831:9;27827:18;27819:26;;27891:9;27885:4;27881:20;27877:1;27866:9;27862:17;27855:47;27919:131;28045:4;27919:131;:::i;:::-;27911:139;;27809:248;;;:::o;28063:419::-;;28267:2;28256:9;28252:18;28244:26;;28316:9;28310:4;28306:20;28302:1;28291:9;28287:17;28280:47;28344:131;28470:4;28344:131;:::i;:::-;28336:139;;28234:248;;;:::o;28488:419::-;;28692:2;28681:9;28677:18;28669:26;;28741:9;28735:4;28731:20;28727:1;28716:9;28712:17;28705:47;28769:131;28895:4;28769:131;:::i;:::-;28761:139;;28659:248;;;:::o;28913:419::-;;29117:2;29106:9;29102:18;29094:26;;29166:9;29160:4;29156:20;29152:1;29141:9;29137:17;29130:47;29194:131;29320:4;29194:131;:::i;:::-;29186:139;;29084:248;;;:::o;29338:419::-;;29542:2;29531:9;29527:18;29519:26;;29591:9;29585:4;29581:20;29577:1;29566:9;29562:17;29555:47;29619:131;29745:4;29619:131;:::i;:::-;29611:139;;29509:248;;;:::o;29763:419::-;;29967:2;29956:9;29952:18;29944:26;;30016:9;30010:4;30006:20;30002:1;29991:9;29987:17;29980:47;30044:131;30170:4;30044:131;:::i;:::-;30036:139;;29934:248;;;:::o;30188:419::-;;30392:2;30381:9;30377:18;30369:26;;30441:9;30435:4;30431:20;30427:1;30416:9;30412:17;30405:47;30469:131;30595:4;30469:131;:::i;:::-;30461:139;;30359:248;;;:::o;30613:419::-;;30817:2;30806:9;30802:18;30794:26;;30866:9;30860:4;30856:20;30852:1;30841:9;30837:17;30830:47;30894:131;31020:4;30894:131;:::i;:::-;30886:139;;30784:248;;;:::o;31038:419::-;;31242:2;31231:9;31227:18;31219:26;;31291:9;31285:4;31281:20;31277:1;31266:9;31262:17;31255:47;31319:131;31445:4;31319:131;:::i;:::-;31311:139;;31209:248;;;:::o;31463:419::-;;31667:2;31656:9;31652:18;31644:26;;31716:9;31710:4;31706:20;31702:1;31691:9;31687:17;31680:47;31744:131;31870:4;31744:131;:::i;:::-;31736:139;;31634:248;;;:::o;31888:419::-;;32092:2;32081:9;32077:18;32069:26;;32141:9;32135:4;32131:20;32127:1;32116:9;32112:17;32105:47;32169:131;32295:4;32169:131;:::i;:::-;32161:139;;32059:248;;;:::o;32313:419::-;;32517:2;32506:9;32502:18;32494:26;;32566:9;32560:4;32556:20;32552:1;32541:9;32537:17;32530:47;32594:131;32720:4;32594:131;:::i;:::-;32586:139;;32484:248;;;:::o;32738:419::-;;32942:2;32931:9;32927:18;32919:26;;32991:9;32985:4;32981:20;32977:1;32966:9;32962:17;32955:47;33019:131;33145:4;33019:131;:::i;:::-;33011:139;;32909:248;;;:::o;33163:419::-;;33367:2;33356:9;33352:18;33344:26;;33416:9;33410:4;33406:20;33402:1;33391:9;33387:17;33380:47;33444:131;33570:4;33444:131;:::i;:::-;33436:139;;33334:248;;;:::o;33588:419::-;;33792:2;33781:9;33777:18;33769:26;;33841:9;33835:4;33831:20;33827:1;33816:9;33812:17;33805:47;33869:131;33995:4;33869:131;:::i;:::-;33861:139;;33759:248;;;:::o;34013:419::-;;34217:2;34206:9;34202:18;34194:26;;34266:9;34260:4;34256:20;34252:1;34241:9;34237:17;34230:47;34294:131;34420:4;34294:131;:::i;:::-;34286:139;;34184:248;;;:::o;34438:419::-;;34642:2;34631:9;34627:18;34619:26;;34691:9;34685:4;34681:20;34677:1;34666:9;34662:17;34655:47;34719:131;34845:4;34719:131;:::i;:::-;34711:139;;34609:248;;;:::o;34863:419::-;;35067:2;35056:9;35052:18;35044:26;;35116:9;35110:4;35106:20;35102:1;35091:9;35087:17;35080:47;35144:131;35270:4;35144:131;:::i;:::-;35136:139;;35034:248;;;:::o;35288:419::-;;35492:2;35481:9;35477:18;35469:26;;35541:9;35535:4;35531:20;35527:1;35516:9;35512:17;35505:47;35569:131;35695:4;35569:131;:::i;:::-;35561:139;;35459:248;;;:::o;35713:419::-;;35917:2;35906:9;35902:18;35894:26;;35966:9;35960:4;35956:20;35952:1;35941:9;35937:17;35930:47;35994:131;36120:4;35994:131;:::i;:::-;35986:139;;35884:248;;;:::o;36138:419::-;;36342:2;36331:9;36327:18;36319:26;;36391:9;36385:4;36381:20;36377:1;36366:9;36362:17;36355:47;36419:131;36545:4;36419:131;:::i;:::-;36411:139;;36309:248;;;:::o;36563:419::-;;36767:2;36756:9;36752:18;36744:26;;36816:9;36810:4;36806:20;36802:1;36791:9;36787:17;36780:47;36844:131;36970:4;36844:131;:::i;:::-;36836:139;;36734:248;;;:::o;36988:419::-;;37192:2;37181:9;37177:18;37169:26;;37241:9;37235:4;37231:20;37227:1;37216:9;37212:17;37205:47;37269:131;37395:4;37269:131;:::i;:::-;37261:139;;37159:248;;;:::o;37413:419::-;;37617:2;37606:9;37602:18;37594:26;;37666:9;37660:4;37656:20;37652:1;37641:9;37637:17;37630:47;37694:131;37820:4;37694:131;:::i;:::-;37686:139;;37584:248;;;:::o;37838:419::-;;38042:2;38031:9;38027:18;38019:26;;38091:9;38085:4;38081:20;38077:1;38066:9;38062:17;38055:47;38119:131;38245:4;38119:131;:::i;:::-;38111:139;;38009:248;;;:::o;38263:419::-;;38467:2;38456:9;38452:18;38444:26;;38516:9;38510:4;38506:20;38502:1;38491:9;38487:17;38480:47;38544:131;38670:4;38544:131;:::i;:::-;38536:139;;38434:248;;;:::o;38688:419::-;;38892:2;38881:9;38877:18;38869:26;;38941:9;38935:4;38931:20;38927:1;38916:9;38912:17;38905:47;38969:131;39095:4;38969:131;:::i;:::-;38961:139;;38859:248;;;:::o;39113:419::-;;39317:2;39306:9;39302:18;39294:26;;39366:9;39360:4;39356:20;39352:1;39341:9;39337:17;39330:47;39394:131;39520:4;39394:131;:::i;:::-;39386:139;;39284:248;;;:::o;39538:419::-;;39742:2;39731:9;39727:18;39719:26;;39791:9;39785:4;39781:20;39777:1;39766:9;39762:17;39755:47;39819:131;39945:4;39819:131;:::i;:::-;39811:139;;39709:248;;;:::o;39963:419::-;;40167:2;40156:9;40152:18;40144:26;;40216:9;40210:4;40206:20;40202:1;40191:9;40187:17;40180:47;40244:131;40370:4;40244:131;:::i;:::-;40236:139;;40134:248;;;:::o;40388:222::-;;40519:2;40508:9;40504:18;40496:26;;40532:71;40600:1;40589:9;40585:17;40576:6;40532:71;:::i;:::-;40486:124;;;;:::o;40616:283::-;;40682:2;40676:9;40666:19;;40724:4;40716:6;40712:17;40831:6;40819:10;40816:22;40795:18;40783:10;40780:34;40777:62;40774:2;;;40842:18;;:::i;:::-;40774:2;40882:10;40878:2;40871:22;40656:243;;;;:::o;40905:311::-;;41072:18;41064:6;41061:30;41058:2;;;41094:18;;:::i;:::-;41058:2;41144:4;41136:6;41132:17;41124:25;;41204:4;41198;41194:15;41186:23;;40987:229;;;:::o;41222:331::-;;41373:18;41365:6;41362:30;41359:2;;;41395:18;;:::i;:::-;41359:2;41480:4;41476:9;41469:4;41461:6;41457:17;41453:33;41445:41;;41541:4;41535;41531:15;41523:23;;41288:265;;;:::o;41559:141::-;;41631:3;41623:11;;41654:3;41651:1;41644:14;41688:4;41685:1;41675:18;41667:26;;41613:87;;;:::o;41706:98::-;;41791:5;41785:12;41775:22;;41764:40;;;:::o;41810:99::-;;41896:5;41890:12;41880:22;;41869:40;;;:::o;41915:168::-;;42032:6;42027:3;42020:19;42072:4;42067:3;42063:14;42048:29;;42010:73;;;;:::o;42089:147::-;;42227:3;42212:18;;42202:34;;;;:::o;42242:169::-;;42360:6;42355:3;42348:19;42400:4;42395:3;42391:14;42376:29;;42338:73;;;;:::o;42417:148::-;;42556:3;42541:18;;42531:34;;;;:::o;42571:305::-;;42630:20;42648:1;42630:20;:::i;:::-;42625:25;;42664:20;42682:1;42664:20;:::i;:::-;42659:25;;42818:1;42750:66;42746:74;42743:1;42740:81;42737:2;;;42824:18;;:::i;:::-;42737:2;42868:1;42865;42861:9;42854:16;;42615:261;;;;:::o;42882:185::-;;42939:20;42957:1;42939:20;:::i;:::-;42934:25;;42973:20;42991:1;42973:20;:::i;:::-;42968:25;;43012:1;43002:2;;43017:18;;:::i;:::-;43002:2;43059:1;43056;43052:9;43047:14;;42924:143;;;;:::o;43073:348::-;;43136:20;43154:1;43136:20;:::i;:::-;43131:25;;43170:20;43188:1;43170:20;:::i;:::-;43165:25;;43358:1;43290:66;43286:74;43283:1;43280:81;43275:1;43268:9;43261:17;43257:105;43254:2;;;43365:18;;:::i;:::-;43254:2;43413:1;43410;43406:9;43395:20;;43121:300;;;;:::o;43427:191::-;;43487:20;43505:1;43487:20;:::i;:::-;43482:25;;43521:20;43539:1;43521:20;:::i;:::-;43516:25;;43560:1;43557;43554:8;43551:2;;;43565:18;;:::i;:::-;43551:2;43610:1;43607;43603:9;43595:17;;43472:146;;;;:::o;43624:96::-;;43690:24;43708:5;43690:24;:::i;:::-;43679:35;;43669:51;;;:::o;43726:104::-;;43800:24;43818:5;43800:24;:::i;:::-;43789:35;;43779:51;;;:::o;43836:90::-;;43913:5;43906:13;43899:21;43888:32;;43878:48;;;:::o;43932:149::-;;44008:66;44001:5;43997:78;43986:89;;43976:105;;;:::o;44087:126::-;;44164:42;44157:5;44153:54;44142:65;;44132:81;;;:::o;44219:77::-;;44285:5;44274:16;;44264:32;;;:::o;44302:134::-;;44393:37;44424:5;44393:37;:::i;:::-;44380:50;;44370:66;;;:::o;44442:126::-;;44525:37;44556:5;44525:37;:::i;:::-;44512:50;;44502:66;;;:::o;44574:113::-;;44657:24;44675:5;44657:24;:::i;:::-;44644:37;;44634:53;;;:::o;44693:154::-;44777:6;44772:3;44767;44754:30;44839:1;44830:6;44825:3;44821:16;44814:27;44744:103;;;:::o;44853:307::-;44921:1;44931:113;44945:6;44942:1;44939:13;44931:113;;;45030:1;45025:3;45021:11;45015:18;45011:1;45006:3;45002:11;44995:39;44967:2;44964:1;44960:10;44955:15;;44931:113;;;45062:6;45059:1;45056:13;45053:2;;;45142:1;45133:6;45128:3;45124:16;45117:27;45053:2;44902:258;;;;:::o;45166:320::-;;45247:1;45241:4;45237:12;45227:22;;45294:1;45288:4;45284:12;45315:18;45305:2;;45371:4;45363:6;45359:17;45349:27;;45305:2;45433;45425:6;45422:14;45402:18;45399:38;45396:2;;;45452:18;;:::i;:::-;45396:2;45217:269;;;;:::o;45492:233::-;;45554:24;45572:5;45554:24;:::i;:::-;45545:33;;45600:66;45593:5;45590:77;45587:2;;;45670:18;;:::i;:::-;45587:2;45717:1;45710:5;45706:13;45699:20;;45535:190;;;:::o;45731:176::-;;45780:20;45798:1;45780:20;:::i;:::-;45775:25;;45814:20;45832:1;45814:20;:::i;:::-;45809:25;;45853:1;45843:2;;45858:18;;:::i;:::-;45843:2;45899:1;45896;45892:9;45887:14;;45765:142;;;;:::o;45913:180::-;45961:77;45958:1;45951:88;46058:4;46055:1;46048:15;46082:4;46079:1;46072:15;46099:180;46147:77;46144:1;46137:88;46244:4;46241:1;46234:15;46268:4;46265:1;46258:15;46285:180;46333:77;46330:1;46323:88;46430:4;46427:1;46420:15;46454:4;46451:1;46444:15;46471:180;46519:77;46516:1;46509:88;46616:4;46613:1;46606:15;46640:4;46637:1;46630:15;46657:102;;46749:2;46745:7;46740:2;46733:5;46729:14;46725:28;46715:38;;46705:54;;;:::o;46765:122::-;46838:24;46856:5;46838:24;:::i;:::-;46831:5;46828:35;46818:2;;46877:1;46874;46867:12;46818:2;46808:79;:::o;46893:138::-;46974:32;47000:5;46974:32;:::i;:::-;46967:5;46964:43;46954:2;;47021:1;47018;47011:12;46954:2;46944:87;:::o;47037:116::-;47107:21;47122:5;47107:21;:::i;:::-;47100:5;47097:32;47087:2;;47143:1;47140;47133:12;47087:2;47077:76;:::o;47159:120::-;47231:23;47248:5;47231:23;:::i;:::-;47224:5;47221:34;47211:2;;47269:1;47266;47259:12;47211:2;47201:78;:::o;47285:122::-;47358:24;47376:5;47358:24;:::i;:::-;47351:5;47348:35;47338:2;;47397:1;47394;47387:12;47338:2;47328:79;:::o

Swarm Source

ipfs://5601e3ce0d35031ed5b817d4c694c10ba0216bea9654bfbd6cf8ec5a6a1b8c1d
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.