ETH Price: $2,359.88 (+0.83%)

Token

Genesis Alpha (ULGAP)
 

Overview

Max Total Supply

186 ULGAP

Holders

64

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
tiete.eth
Balance
2 ULGAP
0x67BE17f0c922321dDBb6356e8666121df58C4bFE
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:
NtfULoanGenesis

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-24
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.15;

struct TDates
{
 uint raffleStartDate;
 uint raffleEndDate;
 uint presalesDate;
 uint salesDate;
}

struct TQuantities
{
 uint mint;
 uint vip;
 uint whitelist;
 uint claim;
}

//==============================================================================
interface IERC165
{
 function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
//==============================================================================
interface IERC721 is IERC165
{
 event Transfer( address indexed from, address indexed to, uint indexed tokenId);
 event Approval( address indexed owner, address indexed approved, uint indexed tokenId);
 event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

 function balanceOf( address owner) external view returns (uint balance);
 function ownerOf( uint tokenId) external view returns (address owner);
 function safeTransferFrom( address from, address to, uint tokenId) external;
 function transferFrom( address from, address to, uint tokenId) external;
 function approve( address to, uint tokenId) external;
 function getApproved( uint tokenId) external view returns (address operator);
 function setApprovalForAll(address operator, bool _approved) external;
 function isApprovedForAll( address owner, address operator) external view returns (bool);
 function safeTransferFrom( address from, address to, uint tokenId, bytes calldata data) external;
}
//==============================================================================
interface IERC721Metadata is IERC721
{
 function name() external view returns (string memory);
 function symbol() external view returns (string memory);
 function tokenURI(uint tokenId) external view returns (string memory);
}
//==============================================================================
interface IERC721Enumerable is IERC721
{
 function totalSupply() external view returns (uint);
 function tokenOfOwnerByIndex(address owner, uint index) external view returns (uint tokenId);
 function tokenByIndex(uint index) external view returns (uint);
}
//==============================================================================
interface IERC721Receiver
{
 function onERC721Received(address operator, address from, uint tokenId, bytes calldata data) external returns (bytes4);
}
//================================================================================
library Strings
{
 bytes16 private constant alphabet = "0123456789abcdef";

 function toString(uint value) internal pure returns (string memory)
 {
 if (value==0) return "0";
 
 uint temp = value;
 uint digits;
 
 while (temp!=0)
 {
 digits++;
 temp /= 10;
 }
 
 bytes memory buffer = new bytes(digits);
 
 while (value!=0)
 {
 digits -= 1;
 buffer[digits] = bytes1(uint8(48 + uint(value % 10)));
 value /= 10;
 }
 
 return string(buffer);
 }
}
//================================================================================
library Address
{
 function isContract(address account) internal view returns (bool)
 {
 uint size;
 
 assembly { size := extcodesize(account) } // solhint-disable-next-line no-inline-assembly
 return size > 0;
 }
}
//==============================================================================
abstract contract ERC165 is IERC165
{
 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool)
 {
 return (interfaceId == type(IERC165).interfaceId);
 }
}
//==============================================================================
abstract contract Context
{
 function _msgSender() internal view virtual returns (address)
 {
 return msg.sender;
 }
 //----------------------------------------------------------------
 function _msgData() internal view virtual returns (bytes calldata)
 {
 this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
 return msg.data;
 }
}
//--------------------------------------------------------------------------------
abstract contract Ownable is Context
{
 address private _owner;
 address private _admin;

 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
 event AdminChanged(address previousAdmin, address newAdmin);

 constructor ()
 {
 address msgSender = _msgSender();
 _owner = msgSender;
 _admin = 0x738C30758b22bCe4EE64d4dd2dc9f0dcCd097229;
 
 emit OwnershipTransferred(address(0), msgSender);
 }
 
 function admin() public view virtual returns (address)
 {
 return _admin;
 }
 
 function owner() public view virtual returns (address)
 {
 return _owner;
 }
 
 function setAdmin(address newAdmin) public onlyOwner
 {
 address previousAdmin = _admin;
 _admin = newAdmin;

 emit AdminChanged(previousAdmin, newAdmin);
 }

 modifier onlyOwner()
 {
 require(owner() == _msgSender(), "Not owner");
 _;
 }
 
 modifier onlyAdminOrOwner()
 {
 require(_msgSender()==owner() || _msgSender()==admin(), "Owner or Admin only");
 _;
 }

 function transferOwnership(address newOwner) public virtual onlyOwner
 {
 require(newOwner != address(0), "Bad addr");
 
 emit OwnershipTransferred(_owner, newOwner);
 
 _owner = newOwner;
 }
}
//==============================================================================
abstract contract ReentrancyGuard 
{
 uint private constant _NOT_ENTERED = 1;
 uint private constant _ENTERED = 2;

 uint private _status;

 constructor() 
 { 
 _status = _NOT_ENTERED;
 }

 modifier nonReentrant() // Prevents a contract from calling itself, directly or indirectly.
 {
 require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // On the first call to nonReentrant, _notEntered will be true
 _status = _ENTERED; // Any calls to nonReentrant after this point will fail
 _;
 _status = _NOT_ENTERED; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200)
 }
}
//==============================================================================
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, Ownable, ReentrancyGuard
{
 using Address for address;
 using Strings for uint;

 string private _name; // Token name
 string private _symbol; // Token symbol

 mapping(uint => address) internal _owners; // Mapping from token ID to owner address
 mapping(address => uint) internal _balances; // Mapping owner address to token count
 mapping(uint => address) private _tokenApprovals; // Mapping from token ID to approved address
 mapping(address => mapping(address => bool)) private _operatorApprovals; // Mapping from owner to operator approvals
 
 constructor(string memory name_, string memory symbol_)
 {
 _name = name_;
 _symbol = symbol_;
 }
 function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool)
 {
 return interfaceId == type(IERC721).interfaceId ||
 interfaceId == type(IERC721Metadata).interfaceId ||
 super.supportsInterface(interfaceId);
 }
 function balanceOf(address owner) public view virtual override returns (uint)
 {
 require(owner != address(0), "ERC721: balance query for the zero address");
 
 return _balances[owner];
 }
 function ownerOf(uint tokenId) public view virtual override returns (address)
 {
 address owner = _owners[tokenId];
 require(owner != address(0), "ERC721: owner query for nonexistent token");
 return owner;
 }
 function name() public view virtual override returns (string memory)
 {
 return _name;
 }
 function symbol() public view virtual override returns (string memory)
 {
 return _symbol;
 }
 function tokenURI(uint tokenId) public view virtual override returns (string memory)
 {
 require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

 string memory baseURI = _baseURI();
 
 return (bytes(baseURI).length>0) ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
 }
 function _baseURI() internal view virtual returns (string memory)
 {
 return "";
 }
 function approve(address to, uint tokenId) public virtual override
 {
 address owner = ERC721.ownerOf(tokenId);
 
 require(to!=owner, "ERC721: approval to current owner");
 require(_msgSender()==owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all");

 _approve(to, tokenId);
 }
 function getApproved(uint tokenId) public view virtual override returns (address)
 {
 require(_exists(tokenId), "ERC721: approved query for nonexistent token");

 return _tokenApprovals[tokenId];
 }
 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);
 }
 function isApprovedForAll(address owner, address operator) public view virtual override returns (bool)
 {
 return _operatorApprovals[owner][operator];
 }
 function transferFrom(address from, address to, uint 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);
 }
 function safeTransferFrom(address from, address to, uint tokenId) public virtual override
 {
 safeTransferFrom(from, to, tokenId, "");
 }
 function safeTransferFrom(address from, address to, uint tokenId, bytes memory _data) public virtual override
 {
 require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
 
 _safeTransfer(from, to, tokenId, _data);
 }
 function _safeTransfer(address from, address to, uint tokenId, bytes memory _data) internal virtual
 {
 _transfer(from, to, tokenId);
 
 require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
 }
 function _exists(uint tokenId) internal view virtual returns (bool)
 {
 return _owners[tokenId] != address(0);
 }
 function _isApprovedOrOwner(address spender, uint tokenId) internal view virtual returns (bool)
 {
 require(_exists(tokenId), "ERC721: operator query for nonexistent token");
 
 address owner = ERC721.ownerOf(tokenId);
 
 return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender));
 }
 function _safeMint(address to, uint tokenId) internal virtual
 {
 _safeMint(to, tokenId, "");
 }
 function _safeMint(address to, uint tokenId, bytes memory _data) internal virtual
 {
 _mint(to, tokenId);
 
 require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
 }
 function _mint(address to, uint 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);

 _balances[to] += 1;
 _owners[tokenId] = to;

 emit Transfer(address(0), to, tokenId);
 }
 function _batchMint(address to, uint[] memory tokenIds) internal virtual
 {
 require(to != address(0), "ERC721: mint to the zero address");
 
 _balances[to] += tokenIds.length;

 for (uint i=0; i < tokenIds.length; i++)
 {
 require(!_exists(tokenIds[i]), "ERC721: token already minted");

 _beforeTokenTransfer(address(0), to, tokenIds[i]);

 _owners[tokenIds[i]] = to;

 emit Transfer(address(0), to, tokenIds[i]);
 }
 }
 function _burn(uint tokenId) internal virtual
 {
 address owner = ERC721.ownerOf(tokenId);

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

 _approve(address(0), tokenId); // Clear approvals

 _balances[owner] -= 1;

 delete _owners[tokenId];

 emit Transfer(owner, address(0), tokenId);
 }
 function _transfer(address from, address to, uint tokenId) internal virtual
 {
 require(ERC721.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);

 _approve(address(0), tokenId); // Clear approvals from the previous owner

 _balances[from] -= 1;
 _balances[to] += 1;
 _owners[tokenId] = to;

 emit Transfer(from, to, tokenId);
 }
 function _approve(address to, uint tokenId) internal virtual
 {
 _tokenApprovals[tokenId] = to;
 
 emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
 }
 function _checkOnERC721Received(address from,address to,uint tokenId,bytes memory _data) private returns (bool)
 {
 if (to.isContract())
 {
 try
 
 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
 
 returns (bytes4 retval)
 {
 return retval == IERC721Receiver(to).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)) } //// solhint-disable-next-line no-inline-assembly
 }
 }
 }
 else
 {
 return true;
 }
 }
 function _beforeTokenTransfer(address from, address to, uint tokenId) internal virtual
 {
 //
 }
}
//==============================================================================
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable
{
 mapping(address => mapping(uint => uint)) private _ownedTokens; // Mapping from owner to list of owned token IDs
 mapping(uint => uint) private _ownedTokensIndex; // Mapping from token ID to index of the owner tokens list
 mapping(uint => uint) private _allTokensIndex; // Mapping from token id to position in the allTokens array

 uint[] private _allTokens; // Array with all token ids, used for enumeration

 function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool)
 {
 return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
 }
 function totalSupply() public view virtual override returns (uint)
 {
 return _allTokens.length;
 }
 function tokenOfOwnerByIndex(address owner, uint index) public view virtual override returns (uint)
 {
 require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
 
 return _ownedTokens[owner][index];
 }
 function tokenByIndex(uint index) public view virtual override returns (uint)
 {
 require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
 
 return _allTokens[index];
 }
 function _beforeTokenTransfer(address from,address to,uint tokenId) internal virtual override
 {
 super._beforeTokenTransfer(from, to, tokenId);

 if (from == address(0)) _addTokenToAllTokensEnumeration(tokenId);
 else if (from != to) _removeTokenFromOwnerEnumeration(from, tokenId);
 
 if (to == address(0)) _removeTokenFromAllTokensEnumeration(tokenId);
 else if (to != from) _addTokenToOwnerEnumeration(to, tokenId);
 }
 function _addTokenToOwnerEnumeration(address to, uint tokenId) private
 {
 uint length = ERC721.balanceOf(to);
 
 _ownedTokens[to][length] = tokenId;
 _ownedTokensIndex[tokenId] = length;
 }
 function _addTokenToAllTokensEnumeration(uint tokenId) private
 {
 _allTokensIndex[tokenId] = _allTokens.length;
 
 _allTokens.push(tokenId);
 }
 function _removeTokenFromOwnerEnumeration(address from, uint tokenId) private
 {
 // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
 // then delete the last slot (swap and pop).

 uint lastTokenIndex = ERC721.balanceOf(from) - 1;
 uint tokenIndex = _ownedTokensIndex[tokenId];

 // When the token to delete is the last token, the swap operation is unnecessary
 if (tokenIndex != lastTokenIndex) {
 uint lastTokenId = _ownedTokens[from][lastTokenIndex];

 _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
 _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
 }

 // This also deletes the contents at the last position of the array
 delete _ownedTokensIndex[tokenId];
 delete _ownedTokens[from][lastTokenIndex];
 }
 function _removeTokenFromAllTokensEnumeration(uint tokenId) private
 {
 // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
 // then delete the last slot (swap and pop).

 uint lastTokenIndex = _allTokens.length - 1;
 uint tokenIndex = _allTokensIndex[tokenId];

 // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
 // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
 // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
 uint lastTokenId = _allTokens[lastTokenIndex];

 _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
 _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

 // This also deletes the contents at the last position of the array
 delete _allTokensIndex[tokenId];
 _allTokens.pop();
 }
}
//==============================================================================
contract NtfULoanGenesis is ERC721Enumerable
{
 using Address for address;
 using Strings for uint;

 modifier callerIsUser()
 {
 require(tx.origin == msg.sender, "The caller is another contract");
 _;
 }

 event onWidthdrawal(address from, address to, uint amount);
 event Reserved(address wallet, uint amount);
 event SetRaffleDates(uint startDate, uint endDate);
 event SetPresalesDate(uint newDate, uint oldDate);
 event SetSalesDate(uint newDate, uint oldDate);
 event SetWhitelistPrice(uint newPrice);
 event SetSalesPrice(uint newPrice);
 event SetVIPPrice(uint newPrice);
 
 uint private totalTokens = 3555; 
 uint private maxMintable = 3333;
 uint private leftTokenCount = totalTokens;
 uint private mintedTokenCount = 0;
 uint private generatedTokenCount = 0;

 string private baseURI = '/';

 address private ownerWallet;

 uint[] whitelistPrices = [ 0.2 ether, 0.2 ether ];
 uint[] salesPrices = [ 0.3 ether, 0.3 ether ];
 uint[] vipPrices = [ 0.2 ether, 0.2 ether ];

 uint public whitelistPrice;
 uint public salesPrice;
 uint public vipPrice;

 uint public raffleStartDate = 1656262800;
 uint public raffleEndDate = 1656277199;
 uint public presalesDate = 1656277200;
 uint public salesDate = 1656338400;

 string private signHeader = "\x19Ethereum Signed Message:\n32";

 mapping(bytes32 => bool) private proposedHashes; // used to avoid using the same hash on CreateLoan calls

 mapping(address => uint) private walletMintedTokenIds;

 mapping(address => uint) private mintedQuantities;
 mapping(address => uint) private vipQuantities;
 mapping(address => uint) private whitelistedQuantities;
 mapping(address => uint) private claimedQuantities;

 mapping(uint => uint) private mintedTokenTimestamps;

 string private magicLettersCode = "FFFNTNTAFAANAFOANTNTFNTLONOFNFNNTNOFFAAUTOOUNTNFNNANAFTNOFNNLTOLNNNOFNNNFTTFFNFTNTNFNOLUTTTUTUTATNFL";
 mapping(uint => string) private tokenMagicLetters;

 constructor() ERC721("Genesis Alpha", "ULGAP") // temporary Symbol and title
 //constructor() ERC721("ULoan Genesis Pass", "ULGP")
 {
 ownerWallet = msg.sender;

 uint priceIdx = 0;
 if (block.chainid!=1) priceIdx = 1;

 whitelistPrice = whitelistPrices[priceIdx];
 salesPrice = salesPrices[priceIdx];
 vipPrice = vipPrices[priceIdx];
 }
 //------------------------------------------------------------------------
 function isERC721ReceivedCheck(address from,address to,uint tokenId,bytes memory _data) private returns (bool)
 {
 if (to.isContract())
 {
 try
 
 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
 
 returns (bytes4 retval)
 {
 return retval == IERC721Receiver(to).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)) } //// solhint-disable-next-line no-inline-assembly
 }
 }
 }
 else
 {
 return true;
 }
 }
 //------------------------------------------------------------------------
 function setBaseTokenURI(string memory newUri) external onlyOwner
 {
 baseURI = newUri;
 }
 //------------------------------------------------------------------------
 function baseTokenURI() external view returns (string memory)
 {
 return baseURI;
 }
 //------------------------------------------------------------------------
 function getAvailableTokens() external view returns (uint)
 {
 return leftTokenCount;
 }
 //------------------------------------------------------------------------
 function _baseURI() internal view virtual override returns (string memory)
 {
 return baseURI;
 }
 //------------------------------------------------------------------------
 function getTokenIdsByWallet(address walletAddress) external view returns(uint[] memory)
 {
 require(walletAddress!=address(0), "BlackHole wallet is not a real owner");
 
 uint count = balanceOf(walletAddress);
 uint[] memory result = new uint[](count);
 
 for (uint i=0; i<count; i++)
 {
 result[i] = tokenOfOwnerByIndex(walletAddress, i);
 }
 
 return result;
 }
 //---------------------------------------------------------------------------
 function setWhitelistPrice(uint newPrice) external onlyOwner
 {
 whitelistPrice = newPrice;

 emit SetWhitelistPrice(newPrice);
 }
 //---------------------------------------------------------------------------
 function setVIPPrice(uint newPrice) external onlyOwner
 {
 vipPrice = newPrice;

 emit SetVIPPrice(newPrice);
 }
 //---------------------------------------------------------------------------
 function getVIPPrice() external view returns(uint price)
 {
 return vipPrice;
 }
 //---------------------------------------------------------------------------
 function setSalesPrice(uint newPrice) external onlyOwner
 {
 salesPrice = newPrice;

 emit SetSalesPrice(newPrice);
 }
 //---------------------------------------------------------------------------
 function reserve(uint amount) external onlyOwner
 {
 require(leftTokenCount >= amount, "Not enough tokens left to reserve anymore");

 for (uint i=0; i < amount; i++)
 {
 generatedTokenCount++;
 
 mintedTokenTimestamps[generatedTokenCount] = block.timestamp;
 
 _safeMint(msg.sender, generatedTokenCount);

 setTokenMagicLetter(generatedTokenCount);
 }

 leftTokenCount = totalTokens - generatedTokenCount;

 emit Reserved(msg.sender, amount);
 }
 //---------------------------------------------------------------------------
 function mint(address toWallet, uint quantity) external payable // toWallet is used for compatibility with crossmint.io
 {
 require(block.timestamp>=salesDate, "Minting is closed"); // mint possible only during public sales
 require(toWallet!=address(0), "Blackhole forbidden");
 require(salesPrice!=0, "Invalid internal price");
 require(quantity>0 && quantity<=2, "Invalid NFT quantity");
 require(msg.value==salesPrice*quantity, "Send exact Amount to claim your Nft");
 require(leftTokenCount > 0, "No tokens left to be claimed");
 require(mintedTokenCount<maxMintable, "Sold-out");
 require(mintedTokenCount+quantity<=maxMintable, "Not enough NFT left to mint");

 uint qty = mintedQuantities[toWallet] + quantity;

 require(qty<=2, "Too many claimed"); 

 mintedQuantities[toWallet] += quantity;

 for (uint i=0; i < quantity; i++)
 {
 mintedTokenCount++;
 generatedTokenCount++;
 leftTokenCount--;

 mintedTokenTimestamps[generatedTokenCount] = block.timestamp;

 _mint(toWallet, generatedTokenCount);

 setTokenMagicLetter(generatedTokenCount);
 }
 }
 //---------------------------------------------------------------------------
 function whitelistMint(address toWallet, uint quantity, bytes32 proposedHash,uint8 v,bytes32 r,bytes32 s) external payable // toWallet is used for compatibility with crossmint.io
 {
 //----- Signed function checker

 bool isProposedHashedUsed = proposedHashes[proposedHash];

 require(isProposedHashedUsed==false, "Bad Hash");

 proposedHashes[proposedHash] = true;

 bytes32 messageDigest = keccak256(abi.encodePacked(signHeader, proposedHash));
 bool isFromAdmin = (ecrecover(messageDigest, v, r, s)==admin());

 require(isFromAdmin==true, "Bad call");

 //----- 

 require(block.timestamp>=presalesDate, "Pre-minting is not opened"); 
 require(block.timestamp<salesDate, "Pre-minting is closed");
 require(toWallet!=address(0), "Blackhole forbidden");
 require(quantity>0 && quantity<=2, "Invalid NFT quantity");
 require(whitelistPrice!=0, "Invalid internal price");
 require(msg.value==whitelistPrice*quantity, "Send exact Amount to claim your Nft");
 require(leftTokenCount > 0, "No tokens left to be claimed");
 require(mintedTokenCount<maxMintable, "Sold-out");
 require(mintedTokenCount+quantity<=maxMintable, "Not enough NFT left to mint");

 uint qty = whitelistedQuantities[toWallet] + quantity;

 require(qty<=2, "Too many claimed"); 

 whitelistedQuantities[toWallet] += quantity;

 for (uint i=0; i < quantity; i++)
 {
 mintedTokenCount++;
 generatedTokenCount++;
 leftTokenCount--;

 mintedTokenTimestamps[generatedTokenCount] = block.timestamp;

 _mint(toWallet, generatedTokenCount);

 setTokenMagicLetter(generatedTokenCount);
 }
 }
 //---------------------------------------------------------------------------
 function vipMint(address toWallet, uint quantity, bytes32 proposedHash,uint8 v,bytes32 r,bytes32 s) external payable // toWallet is used for compatibility with crossmint.io
 {
 //----- Signed function checker

 bool isProposedHashedUsed = proposedHashes[proposedHash];

 require(isProposedHashedUsed==false, "Bad Hash");

 proposedHashes[proposedHash] = true;

 bytes32 messageDigest = keccak256(abi.encodePacked(signHeader, proposedHash));
 bool isFromAdmin = (ecrecover(messageDigest, v, r, s)==admin());

 require(isFromAdmin==true, "Bad call");

 //-----
 
 require(quantity>0 && quantity<=3, "Invalid NFT quantity");
 require(leftTokenCount>= quantity, "No tokens left to be minted");
 require(vipPrice!=0, "Invalid internal price");
 require(msg.value==vipPrice*quantity, "Bad price amount");
 require(getGenesisPassMode()!=0, "Mint is closed");

 uint qty = vipQuantities[toWallet] + quantity;

 require(qty<=3, "You cannot mint any more"); 

 //-----

 vipQuantities[toWallet] += quantity;

 for (uint i=0; i < quantity; i++)
 {
 mintedTokenCount++;
 generatedTokenCount++;
 leftTokenCount--;

 mintedTokenTimestamps[generatedTokenCount] = block.timestamp;

 _mint(toWallet, generatedTokenCount);

 setTokenMagicLetter(generatedTokenCount);
 }
 }
 //---------------------------------------------------------------------------
 function claim(uint quantity, bytes32 proposedHash,uint8 v,bytes32 r,bytes32 s) external 
 {
 //----- Signed function checker

 bool isProposedHashedUsed = proposedHashes[proposedHash];

 require(isProposedHashedUsed==false, "Bad Hash");

 proposedHashes[proposedHash] = true;

 bytes32 messageDigest = keccak256(abi.encodePacked(signHeader, proposedHash));
 bool isFromAdmin = (ecrecover(messageDigest, v, r, s)==admin());

 require(isFromAdmin==true, "Bad call");

 //-----
 
 require(getGenesisPassMode()>1, "Claim is not active");
 require(leftTokenCount>= quantity, "No tokens left to be claimed");

 claimedQuantities[msg.sender] += quantity;

 for (uint i=0; i < quantity; i++)
 {
 generatedTokenCount++;
 leftTokenCount--;

 mintedTokenTimestamps[generatedTokenCount] = block.timestamp;

 _mint(msg.sender, generatedTokenCount);

 setTokenMagicLetter(generatedTokenCount);
 }
 }
 //---------------------------------------------------------------------------
 function hasClaimed(address wallet) external view returns(bool)
 {
 return claimedQuantities[wallet]!=0;
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 function getWalletQuantities(address wallet) external view returns(TQuantities memory)
 {
 TQuantities memory QTY = TQuantities
 (
 mintedQuantities[wallet],
 vipQuantities[wallet],
 whitelistedQuantities[wallet],
 claimedQuantities[wallet]
 );

 return QTY;
 }
 //---------------------------------------------------------------------------
 function getGenesisPassMode() public view returns(uint currentSellMode) // MODE => 0:OFF 1:RAFFLE 2:PRESALE 3:PUBLICSALE
 {
 uint mode = 0; // OFF

 if (block.timestamp>=salesDate) mode = 3; // PUBLIC SALE
 else if (block.timestamp>=presalesDate) mode = 2; // PRE-SALE
 else if (block.timestamp>=raffleStartDate && block.timestamp<=raffleEndDate)
 {
 mode = 1; // RAFFLE
 }
 return mode;
 }
 //---------------------------------------------------------------------------
 function getCurrentPrice() public view returns(uint currentPrice) // MODE => 0:OFF 1:RAFFLE 2:PRESALE 3:PUBLICSALE
 {
 uint mode = getGenesisPassMode();

 uint price = salesPrice;
 if (mode==2) price = whitelistPrice;
 else if (mode==1) price = vipPrice;

 return price;
 }
 //---------------------------------------------------------------------------
 function getMintedCount() public view returns(uint leftCount)
 {
 return mintedTokenCount;
 }
 //---------------------------------------------------------------------------
 function getMintLeft() public view returns(uint leftCount)
 {
 return maxMintable - mintedTokenCount;
 }
 //---------------------------------------------------------------------------
 function getMaxMintableCount() public view returns(uint leftCount)
 {
 return maxMintable;
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 function getDates() external view returns(TDates memory)
 {
 TDates memory datesInfo = TDates
 (
 raffleStartDate,
 raffleEndDate,
 presalesDate,
 salesDate
 );

 return datesInfo;
 }
 //---------------------------------------------------------------------------
 function setRaffleDates(uint startDate, uint endDate) external onlyOwner
 {
 require(startDate < presalesDate, "Cannot start during presales or sale period");
 require(endDate < presalesDate, "Cannot end during presales or sale period");
 require(startDate < endDate, "Invalid date");

 raffleStartDate = startDate;
 raffleEndDate = endDate;

 emit SetRaffleDates(startDate, endDate);
 }
 //---------------------------------------------------------------------------
 function setPresalesDate(uint newDate) external onlyOwner
 {
 require(newDate < salesDate, "Presales should start before public sale");

 uint oldDate = presalesDate;
 presalesDate = newDate;

 emit SetPresalesDate(newDate, oldDate);
 }
 //---------------------------------------------------------------------------
 function setSalesDate(uint newDate) external onlyOwner
 {
 require(newDate > presalesDate, "Presales should start before public sale");

 uint oldDate = salesDate;
 salesDate = newDate;

 emit SetSalesDate(newDate, oldDate);
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 function withdraw() external onlyOwner
 {
 uint balance = address(this).balance;

 payable(ownerWallet).transfer(balance);

 emit onWidthdrawal(address(this), ownerWallet, balance);
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 function getStringChar(string memory str, uint index) public pure returns (string memory ) 
 {
 bytes memory strBytes = bytes(str);
 bytes memory result = new bytes(1);

 result[0] = strBytes[index];
 
 return string(result);
 }
 //---------------------------------------------------------------------------
 function getMagicLettersByTokenIds(uint[] memory tokenIds) external view returns(string[] memory magicLetters)
 {
 string[] memory result = new string[](tokenIds.length);
 
 for (uint i=0; i<tokenIds.length; i++)
 {
 result[i] = tokenMagicLetters[ tokenIds[i] ];
 }
 
 return result;
 }
 //---------------------------------------------------------------------------
 function setTokenMagicLetter(uint tokenId) internal
 {
 string memory letter = getStringChar(magicLettersCode, tokenId % 100);

 tokenMagicLetters[tokenId] = letter;
 }
 //---------------------------------------------------------------------------
 function setTokenMagicLetters(string memory hashCode) external onlyOwner
 {
 magicLettersCode = hashCode;
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"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":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reserved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldDate","type":"uint256"}],"name":"SetPresalesDate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endDate","type":"uint256"}],"name":"SetRaffleDates","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldDate","type":"uint256"}],"name":"SetSalesDate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"SetSalesPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"SetVIPPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"SetWhitelistPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"onWidthdrawal","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32","name":"proposedHash","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"currentPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDates","outputs":[{"components":[{"internalType":"uint256","name":"raffleStartDate","type":"uint256"},{"internalType":"uint256","name":"raffleEndDate","type":"uint256"},{"internalType":"uint256","name":"presalesDate","type":"uint256"},{"internalType":"uint256","name":"salesDate","type":"uint256"}],"internalType":"struct TDates","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGenesisPassMode","outputs":[{"internalType":"uint256","name":"currentSellMode","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getMagicLettersByTokenIds","outputs":[{"internalType":"string[]","name":"magicLetters","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMintableCount","outputs":[{"internalType":"uint256","name":"leftCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintLeft","outputs":[{"internalType":"uint256","name":"leftCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintedCount","outputs":[{"internalType":"uint256","name":"leftCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getStringChar","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"}],"name":"getTokenIdsByWallet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVIPPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getWalletQuantities","outputs":[{"components":[{"internalType":"uint256","name":"mint","type":"uint256"},{"internalType":"uint256","name":"vip","type":"uint256"},{"internalType":"uint256","name":"whitelist","type":"uint256"},{"internalType":"uint256","name":"claim","type":"uint256"}],"internalType":"struct TQuantities","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"hasClaimed","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":"toWallet","type":"address"},{"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":[],"name":"presalesDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raffleEndDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raffleStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserve","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":[],"name":"salesDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salesPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","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":"newUri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDate","type":"uint256"}],"name":"setPresalesDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"}],"name":"setRaffleDates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDate","type":"uint256"}],"name":"setSalesDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setSalesPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hashCode","type":"string"}],"name":"setTokenMagicLetters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setVIPPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setWhitelistPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"","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":"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":"address","name":"toWallet","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32","name":"proposedHash","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"vipMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"vipPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toWallet","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32","name":"proposedHash","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610de3600d819055610d05600e55600f556000601081905560115560c060405260016080908152602f60f81b60a0526012906200003d9082620003fd565b50604080518082019091526702c68af0bb140000808252602082015262000069906014906002620002e6565b5060408051808201909152670429d069189e0000808252602082015262000095906015906002620002e6565b50604080518082019091526702c68af0bb1400008082526020820152620000c1906016906002620002e6565b506362b89090601a556362b8c8cf601b556362b8c8d0601c556362b9b7e0601d556040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601e9081620001289190620003fd565b506040518060a0016040528060648152602001620043ec60649139602690620001529082620003fd565b503480156200016057600080fd5b506040518060400160405280600d81526020016c47656e6573697320416c70686160981b815250604051806040016040528060058152602001640554c4741560dc1b8152506000620001b7620002e260201b60201c565b600080546001600160a01b0383166001600160a01b0319918216811783556001805490921673738c30758b22bce4ee64d4dd2dc9f0dccd09722917909155604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060016002556003620002358382620003fd565b506004620002448282620003fd565b5050601380546001600160a01b031916331790555060004660011462000268575060015b601481815481106200027e576200027e620004c9565b906000526020600020015460178190555060158181548110620002a557620002a5620004c9565b906000526020600020015460188190555060168181548110620002cc57620002cc620004c9565b60009182526020909120015460195550620004df565b3390565b8280548282559060005260206000209081019282156200032f579160200282015b828111156200032f57825182906001600160401b031690559160200191906001019062000307565b506200033d92915062000341565b5090565b5b808211156200033d576000815560010162000342565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200038357607f821691505b602082108103620003a457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003f857600081815260208120601f850160051c81016020861015620003d35750805b601f850160051c820191505b81811015620003f457828155600101620003df565b5050505b505050565b81516001600160401b0381111562000419576200041962000358565b62000431816200042a84546200036e565b84620003aa565b602080601f831160018114620004695760008415620004505750858301515b600019600386901b1c1916600185901b178555620003f4565b600085815260208120601f198616915b828110156200049a5788860151825594840194600190910190840162000479565b5085821015620004b95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b613efd80620004ef6000396000f3fe6080604052600436106103505760003560e01c8063819b25ba116101c6578063c1b11992116100f7578063eb91d37e11610095578063f511d08c1161006f578063f511d08c1461097c578063f851a4401461098f578063f91cc044146109ad578063fc1a1c36146109cd57600080fd5b8063eb91d37e14610932578063ebc9bd3b14610947578063f2fde38b1461095c57600080fd5b8063e35568cb116100d1578063e35568cb14610894578063e58e8df7146108a9578063e985e9c5146108c9578063e9943d021461091257600080fd5b8063c1b1199214610849578063c87b56dd1461085f578063d547cfb71461087f57600080fd5b80639d284ce911610164578063abc92e811161013e578063abc92e81146107e9578063b6342d5e146107ff578063b735c8fc14610814578063b88d4fde1461082957600080fd5b80639d284ce9146107a0578063a22cb465146107b6578063a4893765146107d657600080fd5b80638da5cb5b116101a05780638da5cb5b1461072d57806392641c371461074b57806395d89b411461076b5780639819ef3f1461078057600080fd5b8063819b25ba146106d757806382d1ae7c146106f75780638640cffa1461070d57600080fd5b80633ccfd60b116102a0578063704b6c021161023e57806373b2e80e1161021857806373b2e80e146106485780637cc56bc01461068057806380fee0e414610695578063819a8e9b146106aa57600080fd5b8063704b6c02146105e857806370a0823114610608578063717d57d31461062857600080fd5b806342842e0e1161027a57806342842e0e1461056857806343141df1146105885780634f6ccce7146105a85780636352211e146105c857600080fd5b80633ccfd60b1461052a5780633f82b7121461053f57806340c10f191461055557600080fd5b806318160ddd1161030d5780632f745c59116102e75780632f745c59146104b457806330176e13146104d45780633711b23f146104f4578063378fe5821461050a57600080fd5b806318160ddd1461045557806323b872dd14610474578063288c529f1461049457600080fd5b806301ffc9a71461035557806306fdde031461038a578063081812fc146103ac578063095ea7b3146103e457806316441813146104065780631660b73214610428575b600080fd5b34801561036157600080fd5b506103756103703660046133ad565b6109e3565b60405190151581526020015b60405180910390f35b34801561039657600080fd5b5061039f610a0e565b6040516103819190613422565b3480156103b857600080fd5b506103cc6103c7366004613435565b610aa0565b6040516001600160a01b039091168152602001610381565b3480156103f057600080fd5b506104046103ff366004613465565b610b3a565b005b34801561041257600080fd5b5061041b610c4f565b604051610381919061348f565b34801561043457600080fd5b506104486104433660046134ba565b610ca7565b60405161038191906134d5565b34801561046157600080fd5b50600c545b604051908152602001610381565b34801561048057600080fd5b5061040461048f366004613519565b610dab565b3480156104a057600080fd5b506104046104af366004613614565b610ddc565b3480156104c057600080fd5b506104666104cf366004613465565b610e16565b3480156104e057600080fd5b506104046104ef366004613614565b610eac565b34801561050057600080fd5b5061046660195481565b34801561051657600080fd5b50610404610525366004613435565b610ee2565b34801561053657600080fd5b50610404610f48565b34801561054b57600080fd5b50610466601c5481565b610404610563366004613465565b610ff6565b34801561057457600080fd5b50610404610583366004613519565b6112e8565b34801561059457600080fd5b506104046105a3366004613435565b611303565b3480156105b457600080fd5b506104666105c3366004613435565b611394565b3480156105d457600080fd5b506103cc6105e3366004613435565b611427565b3480156105f457600080fd5b506104046106033660046134ba565b61149e565b34801561061457600080fd5b506104666106233660046134ba565b611522565b34801561063457600080fd5b50610404610643366004613435565b6115a9565b34801561065457600080fd5b506103756106633660046134ba565b6001600160a01b0316600090815260246020526040902054151590565b34801561068c57600080fd5b50600e54610466565b3480156106a157600080fd5b50610466611608565b3480156106b657600080fd5b506106ca6106c5366004613649565b61161f565b60405161038191906136ef565b3480156106e357600080fd5b506104046106f2366004613435565b61176b565b34801561070357600080fd5b50610466601b5481565b34801561071957600080fd5b50610404610728366004613762565b6118a1565b34801561073957600080fd5b506000546001600160a01b03166103cc565b34801561075757600080fd5b5061039f6107663660046137a9565b611adc565b34801561077757600080fd5b5061039f611b51565b34801561078c57600080fd5b5061040461079b366004613435565b611b60565b3480156107ac57600080fd5b5061046660185481565b3480156107c257600080fd5b506104046107d13660046137ee565b611be9565b6104046107e436600461382a565b611cad565b3480156107f557600080fd5b50610466601d5481565b34801561080b57600080fd5b50601954610466565b34801561082057600080fd5b50610466612124565b34801561083557600080fd5b50610404610844366004613882565b61216d565b34801561085557600080fd5b50610466601a5481565b34801561086b57600080fd5b5061039f61087a366004613435565b61219f565b34801561088b57600080fd5b5061039f61227a565b3480156108a057600080fd5b50600f54610466565b3480156108b557600080fd5b506104046108c4366004613435565b612289565b3480156108d557600080fd5b506103756108e43660046138fe565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561091e57600080fd5b5061040461092d366004613931565b6122e8565b34801561093e57600080fd5b50610466612458565b34801561095357600080fd5b50601054610466565b34801561096857600080fd5b506104046109773660046134ba565b61248d565b61040461098a36600461382a565b612553565b34801561099b57600080fd5b506001546001600160a01b03166103cc565b3480156109b957600080fd5b5061041b6109c83660046134ba565b6128e1565b3480156109d957600080fd5b5061046660175481565b60006001600160e01b0319821663780e9d6360e01b1480610a085750610a0882612964565b92915050565b606060038054610a1d90613953565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4990613953565b8015610a965780601f10610a6b57610100808354040283529160200191610a96565b820191906000526020600020905b815481529060010190602001808311610a7957829003601f168201915b5050505050905090565b6000818152600560205260408120546001600160a01b0316610b1e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610b4582611427565b9050806001600160a01b0316836001600160a01b031603610bb25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b15565b336001600160a01b0382161480610bce5750610bce81336108e4565b610c405760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b15565b610c4a83836129b4565b505050565b610c7a6040518060800160405280600081526020016000815260200160008152602001600081525090565b5060408051608081018252601a548152601b546020820152601c5491810191909152601d54606082015290565b60606001600160a01b038216610d0b5760405162461bcd60e51b8152602060048201526024808201527f426c61636b486f6c652077616c6c6574206973206e6f742061207265616c206f6044820152633bb732b960e11b6064820152608401610b15565b6000610d1683611522565b905060008167ffffffffffffffff811115610d3357610d33613555565b604051908082528060200260200182016040528015610d5c578160200160208202803683370190505b50905060005b82811015610da357610d748582610e16565b828281518110610d8657610d8661398d565b602090810291909101015280610d9b816139b9565b915050610d62565b509392505050565b610db53382612a22565b610dd15760405162461bcd60e51b8152600401610b15906139d2565b610c4a838383612b19565b6000546001600160a01b03163314610e065760405162461bcd60e51b8152600401610b1590613a23565b6026610e128282613a94565b5050565b6000610e2183611522565b8210610e835760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b15565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b6000546001600160a01b03163314610ed65760405162461bcd60e51b8152600401610b1590613a23565b6012610e128282613a94565b6000546001600160a01b03163314610f0c5760405162461bcd60e51b8152600401610b1590613a23565b60198190556040518181527f69ac0b2ebdc814262d42f7b4f6395d386b989dcea783d9212db2cec28000c1db906020015b60405180910390a150565b6000546001600160a01b03163314610f725760405162461bcd60e51b8152600401610b1590613a23565b60135460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610fac573d6000803e3d6000fd5b50601354604080513081526001600160a01b03909216602083015281018290527ffca65732210654a2e0fd59899f602deb9ddfdee52677c8efb7d2f2a90d3b168c90606001610f3d565b601d5442101561103c5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc818db1bdcd959607a1b6044820152606401610b15565b6001600160a01b0382166110885760405162461bcd60e51b8152602060048201526013602482015272213630b1b5b437b632903337b93134b23232b760691b6044820152606401610b15565b6018546000036110aa5760405162461bcd60e51b8152600401610b1590613b54565b6000811180156110bb575060028111155b6110d75760405162461bcd60e51b8152600401610b1590613b84565b806018546110e59190613bb2565b34146111035760405162461bcd60e51b8152600401610b1590613bd1565b6000600f54116111255760405162461bcd60e51b8152600401610b1590613c14565b600e54601054106111635760405162461bcd60e51b815260206004820152600860248201526714dbdb190b5bdd5d60c21b6044820152606401610b15565b600e54816010546111749190613c4b565b11156111c25760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768204e4654206c65667420746f206d696e7400000000006044820152606401610b15565b6001600160a01b0382166000908152602160205260408120546111e6908390613c4b565b9050600281111561122c5760405162461bcd60e51b815260206004820152601060248201526f151bdbc81b585b9e4818db185a5b595960821b6044820152606401610b15565b6001600160a01b03831660009081526021602052604081208054849290611254908490613c4b565b90915550600090505b828110156112e25760108054906000611275836139b9565b90915550506011805490600061128a836139b9565b9091555050600f805490600061129f83613c63565b9091555050601180546000908152602560205260409020429055546112c5908590612cc4565b6112d0601154612e12565b806112da816139b9565b91505061125d565b50505050565b610c4a8383836040518060200160405280600081525061216d565b6000546001600160a01b0316331461132d5760405162461bcd60e51b8152600401610b1590613a23565b601d54811061134e5760405162461bcd60e51b8152600401610b1590613c7a565b601c80549082905560408051838152602081018390527faa1bab49307c982d5c0f9f1f3020fce3eda5bad6f33e606c33e8fb7896787a4891015b60405180910390a15050565b600061139f600c5490565b82106114025760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b15565b600c82815481106114155761141561398d565b90600052602060002001549050919050565b6000818152600560205260408120546001600160a01b031680610a085760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b15565b6000546001600160a01b031633146114c85760405162461bcd60e51b8152600401610b1590613a23565b600180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9101611388565b60006001600160a01b03821661158d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b15565b506001600160a01b031660009081526006602052604090205490565b6000546001600160a01b031633146115d35760405162461bcd60e51b8152600401610b1590613a23565b60178190556040518181527f666111fb050e78bb87dccd0cb31682328cb3a3ab33c44ac45cf3f3cbb3894fab90602001610f3d565b6000601054600e5461161a9190613cc2565b905090565b60606000825167ffffffffffffffff81111561163d5761163d613555565b60405190808252806020026020018201604052801561167057816020015b606081526020019060019003908161165b5790505b50905060005b835181101561176457602760008583815181106116955761169561398d565b6020026020010151815260200190815260200160002080546116b690613953565b80601f01602080910402602001604051908101604052809291908181526020018280546116e290613953565b801561172f5780601f106117045761010080835404028352916020019161172f565b820191906000526020600020905b81548152906001019060200180831161171257829003601f168201915b50505050508282815181106117465761174661398d565b6020026020010181905250808061175c906139b9565b915050611676565b5092915050565b6000546001600160a01b031633146117955760405162461bcd60e51b8152600401610b1590613a23565b80600f5410156117f95760405162461bcd60e51b815260206004820152602960248201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f207265736572766044820152686520616e796d6f726560b81b6064820152608401610b15565b60005b818110156118575760118054906000611814836139b9565b90915550506011805460009081526025602052604090204290555461183a903390612eca565b611845601154612e12565b8061184f816139b9565b9150506117fc565b50601154600d546118689190613cc2565b600f5560408051338152602081018390527f904dcdc411e931497b95b06ddf8f8184815dd3bedc3c7c7cd4aed3ccd30783d89101610f3d565b6000848152601f602052604090205460ff1680156118d15760405162461bcd60e51b8152600401610b1590613cd9565b6000858152601f60209081526040808320805460ff19166001179055516118fd91601e91899101613cfb565b60405160208183030381529060405280519060200120905060006119296001546001600160a01b031690565b6001600160a01b03166001838888886040516000815260200160405260405161196e949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611990573d6000803e3d6000fd5b5050604051601f1901516001600160a01b031691909114915050600181146119ca5760405162461bcd60e51b8152600401610b1590613d76565b60016119d4612124565b11611a175760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b6044820152606401610b15565b87600f541015611a395760405162461bcd60e51b8152600401610b1590613c14565b33600090815260246020526040812080548a9290611a58908490613c4b565b90915550600090505b88811015611ad15760118054906000611a79836139b9565b9091555050600f8054906000611a8e83613c63565b909155505060118054600090815260256020526040902042905554611ab4903390612cc4565b611abf601154612e12565b80611ac9816139b9565b915050611a61565b505050505050505050565b6040805160018082528183019092526060918491600091602082018180368337019050509050818481518110611b1457611b1461398d565b602001015160f81c60f81b81600081518110611b3257611b3261398d565b60200101906001600160f81b031916908160001a905350949350505050565b606060048054610a1d90613953565b6000546001600160a01b03163314611b8a5760405162461bcd60e51b8152600401610b1590613a23565b601c548111611bab5760405162461bcd60e51b8152600401610b1590613c7a565b601d80549082905560408051838152602081018390527f6202a91a291ebf72b0dcffacafbf37745d7f058dbe769c2f33091e455582f93c9101611388565b336001600160a01b03831603611c415760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b15565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000848152601f602052604090205460ff168015611cdd5760405162461bcd60e51b8152600401610b1590613cd9565b6000858152601f60209081526040808320805460ff1916600117905551611d0991601e91899101613cfb565b6040516020818303038152906040528051906020012090506000611d356001546001600160a01b031690565b6001600160a01b031660018388888860405160008152602001604052604051611d7a949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611d9c573d6000803e3d6000fd5b5050604051601f1901516001600160a01b03169190911491505060018114611dd65760405162461bcd60e51b8152600401610b1590613d76565b601c54421015611e285760405162461bcd60e51b815260206004820152601960248201527f5072652d6d696e74696e67206973206e6f74206f70656e6564000000000000006044820152606401610b15565b601d544210611e715760405162461bcd60e51b8152602060048201526015602482015274141c994b5b5a5b9d1a5b99c81a5cc818db1bdcd959605a1b6044820152606401610b15565b6001600160a01b038916611ebd5760405162461bcd60e51b8152602060048201526013602482015272213630b1b5b437b632903337b93134b23232b760691b6044820152606401610b15565b600088118015611ece575060028811155b611eea5760405162461bcd60e51b8152600401610b1590613b84565b601754600003611f0c5760405162461bcd60e51b8152600401610b1590613b54565b87601754611f1a9190613bb2565b3414611f385760405162461bcd60e51b8152600401610b1590613bd1565b6000600f5411611f5a5760405162461bcd60e51b8152600401610b1590613c14565b600e5460105410611f985760405162461bcd60e51b815260206004820152600860248201526714dbdb190b5bdd5d60c21b6044820152606401610b15565b600e5488601054611fa99190613c4b565b1115611ff75760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768204e4654206c65667420746f206d696e7400000000006044820152606401610b15565b6001600160a01b03891660009081526023602052604081205461201b908a90613c4b565b905060028111156120615760405162461bcd60e51b815260206004820152601060248201526f151bdbc81b585b9e4818db185a5b595960821b6044820152606401610b15565b6001600160a01b038a16600090815260236020526040812080548b9290612089908490613c4b565b90915550600090505b8981101561211757601080549060006120aa836139b9565b9091555050601180549060006120bf836139b9565b9091555050600f80549060006120d483613c63565b9091555050601180546000908152602560205260409020429055546120fa908c90612cc4565b612105601154612e12565b8061210f816139b9565b915050612092565b5050505050505050505050565b601d546000908190421061213a57506003919050565b601c54421061214b57506002919050565b601a54421015801561215f5750601b544211155b15612168575060015b919050565b6121773383612a22565b6121935760405162461bcd60e51b8152600401610b15906139d2565b6112e284848484612ee4565b6000818152600560205260409020546060906001600160a01b031661221e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b15565b600061222861227a565b905060008151116122485760405180602001604052806000815250612273565b8061225284612f17565b604051602001612263929190613d98565b6040516020818303038152906040525b9392505050565b606060128054610a1d90613953565b6000546001600160a01b031633146122b35760405162461bcd60e51b8152600401610b1590613a23565b60188190556040518181527f553da7c0f3995e0149e71baf19ffad3228a5f54c76ba7020cf098fbc7cfa71cc90602001610f3d565b6000546001600160a01b031633146123125760405162461bcd60e51b8152600401610b1590613a23565b601c5482106123775760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420737461727420647572696e672070726573616c6573206f722060448201526a1cd85b19481c195c9a5bd960aa1b6064820152608401610b15565b601c5481106123da5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420656e6420647572696e672070726573616c6573206f722073616044820152681b19481c195c9a5bd960ba1b6064820152608401610b15565b8082106124185760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206461746560a01b6044820152606401610b15565b601a829055601b81905560408051838152602081018390527f1de43ff6a28bea113b5479804977c2fab0d35ec37fbb3eb35d5042dcbe2ca0249101611388565b600080612463612124565b601854909150600282900361247b5750601754610a08565b81600103610a08575060195492915050565b6000546001600160a01b031633146124b75760405162461bcd60e51b8152600401610b1590613a23565b6001600160a01b0381166124f85760405162461bcd60e51b81526020600482015260086024820152672130b21030b2323960c11b6044820152606401610b15565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000848152601f602052604090205460ff1680156125835760405162461bcd60e51b8152600401610b1590613cd9565b6000858152601f60209081526040808320805460ff19166001179055516125af91601e91899101613cfb565b60405160208183030381529060405280519060200120905060006125db6001546001600160a01b031690565b6001600160a01b031660018388888860405160008152602001604052604051612620949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612642573d6000803e3d6000fd5b5050604051601f1901516001600160a01b0316919091149150506001811461267c5760405162461bcd60e51b8152600401610b1590613d76565b60008811801561268d575060038811155b6126a95760405162461bcd60e51b8152600401610b1590613b84565b87600f5410156126fb5760405162461bcd60e51b815260206004820152601b60248201527f4e6f20746f6b656e73206c65667420746f206265206d696e74656400000000006044820152606401610b15565b60195460000361271d5760405162461bcd60e51b8152600401610b1590613b54565b8760195461272b9190613bb2565b341461276c5760405162461bcd60e51b815260206004820152601060248201526f109859081c1c9a58d948185b5bdd5b9d60821b6044820152606401610b15565b612774612124565b6000036127b45760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc818db1bdcd95960921b6044820152606401610b15565b6001600160a01b0389166000908152602260205260408120546127d8908a90613c4b565b9050600381111561282b5760405162461bcd60e51b815260206004820152601860248201527f596f752063616e6e6f74206d696e7420616e79206d6f726500000000000000006044820152606401610b15565b6001600160a01b038a16600090815260226020526040812080548b9290612853908490613c4b565b90915550600090505b898110156121175760108054906000612874836139b9565b909155505060118054906000612889836139b9565b9091555050600f805490600061289e83613c63565b9091555050601180546000908152602560205260409020429055546128c4908c90612cc4565b6128cf601154612e12565b806128d9816139b9565b91505061285c565b61290c6040518060800160405280600081526020016000815260200160008152602001600081525090565b50604080516080810182526001600160a01b0390921660008181526021602090815283822054855282825260228152838220548186015282825260238152838220548585015291815260249091522054606082015290565b60006001600160e01b031982166380ac58cd60e01b148061299557506001600160e01b03198216635b5e139f60e01b145b80610a0857506301ffc9a760e01b6001600160e01b0319831614610a08565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129e982611427565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600560205260408120546001600160a01b0316612a9b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b15565b6000612aa683611427565b9050806001600160a01b0316846001600160a01b03161480612ae15750836001600160a01b0316612ad684610aa0565b6001600160a01b0316145b80612b1157506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612b2c82611427565b6001600160a01b031614612b945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b15565b6001600160a01b038216612bf65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b15565b612c01838383613018565b612c0c6000826129b4565b6001600160a01b0383166000908152600660205260408120805460019290612c35908490613cc2565b90915550506001600160a01b0382166000908152600660205260408120805460019290612c63908490613c4b565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038216612d1a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b15565b6000818152600560205260409020546001600160a01b031615612d7f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b15565b612d8b60008383613018565b6001600160a01b0382166000908152600660205260408120805460019290612db4908490613c4b565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612eaf60268054612e2490613953565b80601f0160208091040260200160405190810160405280929190818152602001828054612e5090613953565b8015612e9d5780601f10612e7257610100808354040283529160200191612e9d565b820191906000526020600020905b815481529060010190602001808311612e8057829003601f168201915b50505050506064846107669190613ddd565b6000838152602760205260409020909150610c4a8282613a94565b610e128282604051806020016040528060008152506130d0565b612eef848484612b19565b612efb84848484613103565b6112e25760405162461bcd60e51b8152600401610b1590613df1565b606081600003612f3e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612f685780612f52816139b9565b9150612f619050600a83613e43565b9150612f42565b60008167ffffffffffffffff811115612f8357612f83613555565b6040519080825280601f01601f191660200182016040528015612fad576020820181803683370190505b5090505b8415612b1157612fc2600183613cc2565b9150612fcf600a86613ddd565b612fda906030613c4b565b60f81b818381518110612fef57612fef61398d565b60200101906001600160f81b031916908160001a905350613011600a86613e43565b9450612fb1565b6001600160a01b0383166130735761306e81600c80546000838152600b60205260408120829055600182018355919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70155565b613096565b816001600160a01b0316836001600160a01b031614613096576130968382613204565b6001600160a01b0382166130ad57610c4a816132a1565b826001600160a01b0316826001600160a01b031614610c4a57610c4a8282613350565b6130da8383612cc4565b6130e76000848484613103565b610c4a5760405162461bcd60e51b8152600401610b1590613df1565b60006001600160a01b0384163b156131f957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613147903390899088908890600401613e57565b6020604051808303816000875af1925050508015613182575060408051601f3d908101601f1916820190925261317f91810190613e94565b60015b6131df573d8080156131b0576040519150601f19603f3d011682016040523d82523d6000602084013e6131b5565b606091505b5080516000036131d75760405162461bcd60e51b8152600401610b1590613df1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612b11565b506001949350505050565b6000600161321184611522565b61321b9190613cc2565b6000838152600a602052604090205490915080821461326e576001600160a01b03841660009081526009602090815260408083208584528252808320548484528184208190558352600a90915290208190555b506000918252600a602090815260408084208490556001600160a01b039094168352600981528383209183525290812055565b600c546000906132b390600190613cc2565b6000838152600b6020526040812054600c80549394509092849081106132db576132db61398d565b9060005260206000200154905080600c83815481106132fc576132fc61398d565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600c80548061333457613334613eb1565b6001900381819060005260206000200160009055905550505050565b600061335b83611522565b6001600160a01b0390931660009081526009602090815260408083208684528252808320859055938252600a9052919091209190915550565b6001600160e01b0319811681146133aa57600080fd5b50565b6000602082840312156133bf57600080fd5b813561227381613394565b60005b838110156133e55781810151838201526020016133cd565b838111156112e25750506000910152565b6000815180845261340e8160208601602086016133ca565b601f01601f19169290920160200192915050565b60208152600061227360208301846133f6565b60006020828403121561344757600080fd5b5035919050565b80356001600160a01b038116811461216857600080fd5b6000806040838503121561347857600080fd5b6134818361344e565b946020939093013593505050565b8151815260208083015190820152604080830151908201526060808301519082015260808101610a08565b6000602082840312156134cc57600080fd5b6122738261344e565b6020808252825182820181905260009190848201906040850190845b8181101561350d578351835292840192918401916001016134f1565b50909695505050505050565b60008060006060848603121561352e57600080fd5b6135378461344e565b92506135456020850161344e565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561359457613594613555565b604052919050565b600067ffffffffffffffff8311156135b6576135b6613555565b6135c9601f8401601f191660200161356b565b90508281528383830111156135dd57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261360557600080fd5b6122738383356020850161359c565b60006020828403121561362657600080fd5b813567ffffffffffffffff81111561363d57600080fd5b612b11848285016135f4565b6000602080838503121561365c57600080fd5b823567ffffffffffffffff8082111561367457600080fd5b818501915085601f83011261368857600080fd5b81358181111561369a5761369a613555565b8060051b91506136ab84830161356b565b81815291830184019184810190888411156136c557600080fd5b938501935b838510156136e3578435825293850193908501906136ca565b98975050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561374457603f198886030184526137328583516133f6565b94509285019290850190600101613716565b5092979650505050505050565b803560ff8116811461216857600080fd5b600080600080600060a0868803121561377a57600080fd5b853594506020860135935061379160408701613751565b94979396509394606081013594506080013592915050565b600080604083850312156137bc57600080fd5b823567ffffffffffffffff8111156137d357600080fd5b6137df858286016135f4565b95602094909401359450505050565b6000806040838503121561380157600080fd5b61380a8361344e565b91506020830135801515811461381f57600080fd5b809150509250929050565b60008060008060008060c0878903121561384357600080fd5b61384c8761344e565b9550602087013594506040870135935061386860608801613751565b92506080870135915060a087013590509295509295509295565b6000806000806080858703121561389857600080fd5b6138a18561344e565b93506138af6020860161344e565b925060408501359150606085013567ffffffffffffffff8111156138d257600080fd5b8501601f810187136138e357600080fd5b6138f28782356020840161359c565b91505092959194509250565b6000806040838503121561391157600080fd5b61391a8361344e565b91506139286020840161344e565b90509250929050565b6000806040838503121561394457600080fd5b50508035926020909101359150565b600181811c9082168061396757607f821691505b60208210810361398757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016139cb576139cb6139a3565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b601f821115610c4a57600081815260208120601f850160051c81016020861015613a6d5750805b601f850160051c820191505b81811015613a8c57828155600101613a79565b505050505050565b815167ffffffffffffffff811115613aae57613aae613555565b613ac281613abc8454613953565b84613a46565b602080601f831160018114613af75760008415613adf5750858301515b600019600386901b1c1916600185901b178555613a8c565b600085815260208120601f198616915b82811015613b2657888601518255948401946001909101908401613b07565b5085821015613b445787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825260169082015275496e76616c696420696e7465726e616c20707269636560501b604082015260600190565b602080825260149082015273496e76616c6964204e4654207175616e7469747960601b604082015260600190565b6000816000190483118215151615613bcc57613bcc6139a3565b500290565b60208082526023908201527f53656e6420657861637420416d6f756e7420746f20636c61696d20796f75722060408201526213999d60ea1b606082015260800190565b6020808252601c908201527f4e6f20746f6b656e73206c65667420746f20626520636c61696d656400000000604082015260600190565b60008219821115613c5e57613c5e6139a3565b500190565b600081613c7257613c726139a3565b506000190190565b60208082526028908201527f50726573616c65732073686f756c64207374617274206265666f7265207075626040820152676c69632073616c6560c01b606082015260800190565b600082821015613cd457613cd46139a3565b500390565b602080825260089082015267084c2c84090c2e6d60c31b604082015260600190565b6000808454613d0981613953565b60018281168015613d215760018114613d3657613d65565b60ff1984168752821515830287019450613d65565b8860005260208060002060005b85811015613d5c5781548a820152908401908201613d43565b50505082870194505b505050938152602001949350505050565b6020808252600890820152671098590818d85b1b60c21b604082015260600190565b60008351613daa8184602088016133ca565b835190830190613dbe8183602088016133ca565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613dec57613dec613dc7565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082613e5257613e52613dc7565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613e8a908301846133f6565b9695505050505050565b600060208284031215613ea657600080fd5b815161227381613394565b634e487b7160e01b600052603160045260246000fdfea264697066735822122047c53eacf427404a31b8ad0e8db3fcd7765009e3b57af8542d1eb62be157137064736f6c634300080f00334646464e544e54414641414e41464f414e544e54464e544c4f4e4f464e464e4e544e4f4646414155544f4f554e544e464e4e414e4146544e4f464e4e4c544f4c4e4e4e4f464e4e4e46545446464e46544e544e464e4f4c555454545554555441544e464c

Deployed Bytecode

0x6080604052600436106103505760003560e01c8063819b25ba116101c6578063c1b11992116100f7578063eb91d37e11610095578063f511d08c1161006f578063f511d08c1461097c578063f851a4401461098f578063f91cc044146109ad578063fc1a1c36146109cd57600080fd5b8063eb91d37e14610932578063ebc9bd3b14610947578063f2fde38b1461095c57600080fd5b8063e35568cb116100d1578063e35568cb14610894578063e58e8df7146108a9578063e985e9c5146108c9578063e9943d021461091257600080fd5b8063c1b1199214610849578063c87b56dd1461085f578063d547cfb71461087f57600080fd5b80639d284ce911610164578063abc92e811161013e578063abc92e81146107e9578063b6342d5e146107ff578063b735c8fc14610814578063b88d4fde1461082957600080fd5b80639d284ce9146107a0578063a22cb465146107b6578063a4893765146107d657600080fd5b80638da5cb5b116101a05780638da5cb5b1461072d57806392641c371461074b57806395d89b411461076b5780639819ef3f1461078057600080fd5b8063819b25ba146106d757806382d1ae7c146106f75780638640cffa1461070d57600080fd5b80633ccfd60b116102a0578063704b6c021161023e57806373b2e80e1161021857806373b2e80e146106485780637cc56bc01461068057806380fee0e414610695578063819a8e9b146106aa57600080fd5b8063704b6c02146105e857806370a0823114610608578063717d57d31461062857600080fd5b806342842e0e1161027a57806342842e0e1461056857806343141df1146105885780634f6ccce7146105a85780636352211e146105c857600080fd5b80633ccfd60b1461052a5780633f82b7121461053f57806340c10f191461055557600080fd5b806318160ddd1161030d5780632f745c59116102e75780632f745c59146104b457806330176e13146104d45780633711b23f146104f4578063378fe5821461050a57600080fd5b806318160ddd1461045557806323b872dd14610474578063288c529f1461049457600080fd5b806301ffc9a71461035557806306fdde031461038a578063081812fc146103ac578063095ea7b3146103e457806316441813146104065780631660b73214610428575b600080fd5b34801561036157600080fd5b506103756103703660046133ad565b6109e3565b60405190151581526020015b60405180910390f35b34801561039657600080fd5b5061039f610a0e565b6040516103819190613422565b3480156103b857600080fd5b506103cc6103c7366004613435565b610aa0565b6040516001600160a01b039091168152602001610381565b3480156103f057600080fd5b506104046103ff366004613465565b610b3a565b005b34801561041257600080fd5b5061041b610c4f565b604051610381919061348f565b34801561043457600080fd5b506104486104433660046134ba565b610ca7565b60405161038191906134d5565b34801561046157600080fd5b50600c545b604051908152602001610381565b34801561048057600080fd5b5061040461048f366004613519565b610dab565b3480156104a057600080fd5b506104046104af366004613614565b610ddc565b3480156104c057600080fd5b506104666104cf366004613465565b610e16565b3480156104e057600080fd5b506104046104ef366004613614565b610eac565b34801561050057600080fd5b5061046660195481565b34801561051657600080fd5b50610404610525366004613435565b610ee2565b34801561053657600080fd5b50610404610f48565b34801561054b57600080fd5b50610466601c5481565b610404610563366004613465565b610ff6565b34801561057457600080fd5b50610404610583366004613519565b6112e8565b34801561059457600080fd5b506104046105a3366004613435565b611303565b3480156105b457600080fd5b506104666105c3366004613435565b611394565b3480156105d457600080fd5b506103cc6105e3366004613435565b611427565b3480156105f457600080fd5b506104046106033660046134ba565b61149e565b34801561061457600080fd5b506104666106233660046134ba565b611522565b34801561063457600080fd5b50610404610643366004613435565b6115a9565b34801561065457600080fd5b506103756106633660046134ba565b6001600160a01b0316600090815260246020526040902054151590565b34801561068c57600080fd5b50600e54610466565b3480156106a157600080fd5b50610466611608565b3480156106b657600080fd5b506106ca6106c5366004613649565b61161f565b60405161038191906136ef565b3480156106e357600080fd5b506104046106f2366004613435565b61176b565b34801561070357600080fd5b50610466601b5481565b34801561071957600080fd5b50610404610728366004613762565b6118a1565b34801561073957600080fd5b506000546001600160a01b03166103cc565b34801561075757600080fd5b5061039f6107663660046137a9565b611adc565b34801561077757600080fd5b5061039f611b51565b34801561078c57600080fd5b5061040461079b366004613435565b611b60565b3480156107ac57600080fd5b5061046660185481565b3480156107c257600080fd5b506104046107d13660046137ee565b611be9565b6104046107e436600461382a565b611cad565b3480156107f557600080fd5b50610466601d5481565b34801561080b57600080fd5b50601954610466565b34801561082057600080fd5b50610466612124565b34801561083557600080fd5b50610404610844366004613882565b61216d565b34801561085557600080fd5b50610466601a5481565b34801561086b57600080fd5b5061039f61087a366004613435565b61219f565b34801561088b57600080fd5b5061039f61227a565b3480156108a057600080fd5b50600f54610466565b3480156108b557600080fd5b506104046108c4366004613435565b612289565b3480156108d557600080fd5b506103756108e43660046138fe565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561091e57600080fd5b5061040461092d366004613931565b6122e8565b34801561093e57600080fd5b50610466612458565b34801561095357600080fd5b50601054610466565b34801561096857600080fd5b506104046109773660046134ba565b61248d565b61040461098a36600461382a565b612553565b34801561099b57600080fd5b506001546001600160a01b03166103cc565b3480156109b957600080fd5b5061041b6109c83660046134ba565b6128e1565b3480156109d957600080fd5b5061046660175481565b60006001600160e01b0319821663780e9d6360e01b1480610a085750610a0882612964565b92915050565b606060038054610a1d90613953565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4990613953565b8015610a965780601f10610a6b57610100808354040283529160200191610a96565b820191906000526020600020905b815481529060010190602001808311610a7957829003601f168201915b5050505050905090565b6000818152600560205260408120546001600160a01b0316610b1e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610b4582611427565b9050806001600160a01b0316836001600160a01b031603610bb25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b15565b336001600160a01b0382161480610bce5750610bce81336108e4565b610c405760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b15565b610c4a83836129b4565b505050565b610c7a6040518060800160405280600081526020016000815260200160008152602001600081525090565b5060408051608081018252601a548152601b546020820152601c5491810191909152601d54606082015290565b60606001600160a01b038216610d0b5760405162461bcd60e51b8152602060048201526024808201527f426c61636b486f6c652077616c6c6574206973206e6f742061207265616c206f6044820152633bb732b960e11b6064820152608401610b15565b6000610d1683611522565b905060008167ffffffffffffffff811115610d3357610d33613555565b604051908082528060200260200182016040528015610d5c578160200160208202803683370190505b50905060005b82811015610da357610d748582610e16565b828281518110610d8657610d8661398d565b602090810291909101015280610d9b816139b9565b915050610d62565b509392505050565b610db53382612a22565b610dd15760405162461bcd60e51b8152600401610b15906139d2565b610c4a838383612b19565b6000546001600160a01b03163314610e065760405162461bcd60e51b8152600401610b1590613a23565b6026610e128282613a94565b5050565b6000610e2183611522565b8210610e835760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b15565b506001600160a01b03919091166000908152600960209081526040808320938352929052205490565b6000546001600160a01b03163314610ed65760405162461bcd60e51b8152600401610b1590613a23565b6012610e128282613a94565b6000546001600160a01b03163314610f0c5760405162461bcd60e51b8152600401610b1590613a23565b60198190556040518181527f69ac0b2ebdc814262d42f7b4f6395d386b989dcea783d9212db2cec28000c1db906020015b60405180910390a150565b6000546001600160a01b03163314610f725760405162461bcd60e51b8152600401610b1590613a23565b60135460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610fac573d6000803e3d6000fd5b50601354604080513081526001600160a01b03909216602083015281018290527ffca65732210654a2e0fd59899f602deb9ddfdee52677c8efb7d2f2a90d3b168c90606001610f3d565b601d5442101561103c5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc818db1bdcd959607a1b6044820152606401610b15565b6001600160a01b0382166110885760405162461bcd60e51b8152602060048201526013602482015272213630b1b5b437b632903337b93134b23232b760691b6044820152606401610b15565b6018546000036110aa5760405162461bcd60e51b8152600401610b1590613b54565b6000811180156110bb575060028111155b6110d75760405162461bcd60e51b8152600401610b1590613b84565b806018546110e59190613bb2565b34146111035760405162461bcd60e51b8152600401610b1590613bd1565b6000600f54116111255760405162461bcd60e51b8152600401610b1590613c14565b600e54601054106111635760405162461bcd60e51b815260206004820152600860248201526714dbdb190b5bdd5d60c21b6044820152606401610b15565b600e54816010546111749190613c4b565b11156111c25760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768204e4654206c65667420746f206d696e7400000000006044820152606401610b15565b6001600160a01b0382166000908152602160205260408120546111e6908390613c4b565b9050600281111561122c5760405162461bcd60e51b815260206004820152601060248201526f151bdbc81b585b9e4818db185a5b595960821b6044820152606401610b15565b6001600160a01b03831660009081526021602052604081208054849290611254908490613c4b565b90915550600090505b828110156112e25760108054906000611275836139b9565b90915550506011805490600061128a836139b9565b9091555050600f805490600061129f83613c63565b9091555050601180546000908152602560205260409020429055546112c5908590612cc4565b6112d0601154612e12565b806112da816139b9565b91505061125d565b50505050565b610c4a8383836040518060200160405280600081525061216d565b6000546001600160a01b0316331461132d5760405162461bcd60e51b8152600401610b1590613a23565b601d54811061134e5760405162461bcd60e51b8152600401610b1590613c7a565b601c80549082905560408051838152602081018390527faa1bab49307c982d5c0f9f1f3020fce3eda5bad6f33e606c33e8fb7896787a4891015b60405180910390a15050565b600061139f600c5490565b82106114025760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b15565b600c82815481106114155761141561398d565b90600052602060002001549050919050565b6000818152600560205260408120546001600160a01b031680610a085760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b15565b6000546001600160a01b031633146114c85760405162461bcd60e51b8152600401610b1590613a23565b600180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9101611388565b60006001600160a01b03821661158d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b15565b506001600160a01b031660009081526006602052604090205490565b6000546001600160a01b031633146115d35760405162461bcd60e51b8152600401610b1590613a23565b60178190556040518181527f666111fb050e78bb87dccd0cb31682328cb3a3ab33c44ac45cf3f3cbb3894fab90602001610f3d565b6000601054600e5461161a9190613cc2565b905090565b60606000825167ffffffffffffffff81111561163d5761163d613555565b60405190808252806020026020018201604052801561167057816020015b606081526020019060019003908161165b5790505b50905060005b835181101561176457602760008583815181106116955761169561398d565b6020026020010151815260200190815260200160002080546116b690613953565b80601f01602080910402602001604051908101604052809291908181526020018280546116e290613953565b801561172f5780601f106117045761010080835404028352916020019161172f565b820191906000526020600020905b81548152906001019060200180831161171257829003601f168201915b50505050508282815181106117465761174661398d565b6020026020010181905250808061175c906139b9565b915050611676565b5092915050565b6000546001600160a01b031633146117955760405162461bcd60e51b8152600401610b1590613a23565b80600f5410156117f95760405162461bcd60e51b815260206004820152602960248201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f207265736572766044820152686520616e796d6f726560b81b6064820152608401610b15565b60005b818110156118575760118054906000611814836139b9565b90915550506011805460009081526025602052604090204290555461183a903390612eca565b611845601154612e12565b8061184f816139b9565b9150506117fc565b50601154600d546118689190613cc2565b600f5560408051338152602081018390527f904dcdc411e931497b95b06ddf8f8184815dd3bedc3c7c7cd4aed3ccd30783d89101610f3d565b6000848152601f602052604090205460ff1680156118d15760405162461bcd60e51b8152600401610b1590613cd9565b6000858152601f60209081526040808320805460ff19166001179055516118fd91601e91899101613cfb565b60405160208183030381529060405280519060200120905060006119296001546001600160a01b031690565b6001600160a01b03166001838888886040516000815260200160405260405161196e949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611990573d6000803e3d6000fd5b5050604051601f1901516001600160a01b031691909114915050600181146119ca5760405162461bcd60e51b8152600401610b1590613d76565b60016119d4612124565b11611a175760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b6044820152606401610b15565b87600f541015611a395760405162461bcd60e51b8152600401610b1590613c14565b33600090815260246020526040812080548a9290611a58908490613c4b565b90915550600090505b88811015611ad15760118054906000611a79836139b9565b9091555050600f8054906000611a8e83613c63565b909155505060118054600090815260256020526040902042905554611ab4903390612cc4565b611abf601154612e12565b80611ac9816139b9565b915050611a61565b505050505050505050565b6040805160018082528183019092526060918491600091602082018180368337019050509050818481518110611b1457611b1461398d565b602001015160f81c60f81b81600081518110611b3257611b3261398d565b60200101906001600160f81b031916908160001a905350949350505050565b606060048054610a1d90613953565b6000546001600160a01b03163314611b8a5760405162461bcd60e51b8152600401610b1590613a23565b601c548111611bab5760405162461bcd60e51b8152600401610b1590613c7a565b601d80549082905560408051838152602081018390527f6202a91a291ebf72b0dcffacafbf37745d7f058dbe769c2f33091e455582f93c9101611388565b336001600160a01b03831603611c415760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b15565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000848152601f602052604090205460ff168015611cdd5760405162461bcd60e51b8152600401610b1590613cd9565b6000858152601f60209081526040808320805460ff1916600117905551611d0991601e91899101613cfb565b6040516020818303038152906040528051906020012090506000611d356001546001600160a01b031690565b6001600160a01b031660018388888860405160008152602001604052604051611d7a949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611d9c573d6000803e3d6000fd5b5050604051601f1901516001600160a01b03169190911491505060018114611dd65760405162461bcd60e51b8152600401610b1590613d76565b601c54421015611e285760405162461bcd60e51b815260206004820152601960248201527f5072652d6d696e74696e67206973206e6f74206f70656e6564000000000000006044820152606401610b15565b601d544210611e715760405162461bcd60e51b8152602060048201526015602482015274141c994b5b5a5b9d1a5b99c81a5cc818db1bdcd959605a1b6044820152606401610b15565b6001600160a01b038916611ebd5760405162461bcd60e51b8152602060048201526013602482015272213630b1b5b437b632903337b93134b23232b760691b6044820152606401610b15565b600088118015611ece575060028811155b611eea5760405162461bcd60e51b8152600401610b1590613b84565b601754600003611f0c5760405162461bcd60e51b8152600401610b1590613b54565b87601754611f1a9190613bb2565b3414611f385760405162461bcd60e51b8152600401610b1590613bd1565b6000600f5411611f5a5760405162461bcd60e51b8152600401610b1590613c14565b600e5460105410611f985760405162461bcd60e51b815260206004820152600860248201526714dbdb190b5bdd5d60c21b6044820152606401610b15565b600e5488601054611fa99190613c4b565b1115611ff75760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768204e4654206c65667420746f206d696e7400000000006044820152606401610b15565b6001600160a01b03891660009081526023602052604081205461201b908a90613c4b565b905060028111156120615760405162461bcd60e51b815260206004820152601060248201526f151bdbc81b585b9e4818db185a5b595960821b6044820152606401610b15565b6001600160a01b038a16600090815260236020526040812080548b9290612089908490613c4b565b90915550600090505b8981101561211757601080549060006120aa836139b9565b9091555050601180549060006120bf836139b9565b9091555050600f80549060006120d483613c63565b9091555050601180546000908152602560205260409020429055546120fa908c90612cc4565b612105601154612e12565b8061210f816139b9565b915050612092565b5050505050505050505050565b601d546000908190421061213a57506003919050565b601c54421061214b57506002919050565b601a54421015801561215f5750601b544211155b15612168575060015b919050565b6121773383612a22565b6121935760405162461bcd60e51b8152600401610b15906139d2565b6112e284848484612ee4565b6000818152600560205260409020546060906001600160a01b031661221e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b15565b600061222861227a565b905060008151116122485760405180602001604052806000815250612273565b8061225284612f17565b604051602001612263929190613d98565b6040516020818303038152906040525b9392505050565b606060128054610a1d90613953565b6000546001600160a01b031633146122b35760405162461bcd60e51b8152600401610b1590613a23565b60188190556040518181527f553da7c0f3995e0149e71baf19ffad3228a5f54c76ba7020cf098fbc7cfa71cc90602001610f3d565b6000546001600160a01b031633146123125760405162461bcd60e51b8152600401610b1590613a23565b601c5482106123775760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f7420737461727420647572696e672070726573616c6573206f722060448201526a1cd85b19481c195c9a5bd960aa1b6064820152608401610b15565b601c5481106123da5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420656e6420647572696e672070726573616c6573206f722073616044820152681b19481c195c9a5bd960ba1b6064820152608401610b15565b8082106124185760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964206461746560a01b6044820152606401610b15565b601a829055601b81905560408051838152602081018390527f1de43ff6a28bea113b5479804977c2fab0d35ec37fbb3eb35d5042dcbe2ca0249101611388565b600080612463612124565b601854909150600282900361247b5750601754610a08565b81600103610a08575060195492915050565b6000546001600160a01b031633146124b75760405162461bcd60e51b8152600401610b1590613a23565b6001600160a01b0381166124f85760405162461bcd60e51b81526020600482015260086024820152672130b21030b2323960c11b6044820152606401610b15565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000848152601f602052604090205460ff1680156125835760405162461bcd60e51b8152600401610b1590613cd9565b6000858152601f60209081526040808320805460ff19166001179055516125af91601e91899101613cfb565b60405160208183030381529060405280519060200120905060006125db6001546001600160a01b031690565b6001600160a01b031660018388888860405160008152602001604052604051612620949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612642573d6000803e3d6000fd5b5050604051601f1901516001600160a01b0316919091149150506001811461267c5760405162461bcd60e51b8152600401610b1590613d76565b60008811801561268d575060038811155b6126a95760405162461bcd60e51b8152600401610b1590613b84565b87600f5410156126fb5760405162461bcd60e51b815260206004820152601b60248201527f4e6f20746f6b656e73206c65667420746f206265206d696e74656400000000006044820152606401610b15565b60195460000361271d5760405162461bcd60e51b8152600401610b1590613b54565b8760195461272b9190613bb2565b341461276c5760405162461bcd60e51b815260206004820152601060248201526f109859081c1c9a58d948185b5bdd5b9d60821b6044820152606401610b15565b612774612124565b6000036127b45760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d081a5cc818db1bdcd95960921b6044820152606401610b15565b6001600160a01b0389166000908152602260205260408120546127d8908a90613c4b565b9050600381111561282b5760405162461bcd60e51b815260206004820152601860248201527f596f752063616e6e6f74206d696e7420616e79206d6f726500000000000000006044820152606401610b15565b6001600160a01b038a16600090815260226020526040812080548b9290612853908490613c4b565b90915550600090505b898110156121175760108054906000612874836139b9565b909155505060118054906000612889836139b9565b9091555050600f805490600061289e83613c63565b9091555050601180546000908152602560205260409020429055546128c4908c90612cc4565b6128cf601154612e12565b806128d9816139b9565b91505061285c565b61290c6040518060800160405280600081526020016000815260200160008152602001600081525090565b50604080516080810182526001600160a01b0390921660008181526021602090815283822054855282825260228152838220548186015282825260238152838220548585015291815260249091522054606082015290565b60006001600160e01b031982166380ac58cd60e01b148061299557506001600160e01b03198216635b5e139f60e01b145b80610a0857506301ffc9a760e01b6001600160e01b0319831614610a08565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129e982611427565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600560205260408120546001600160a01b0316612a9b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b15565b6000612aa683611427565b9050806001600160a01b0316846001600160a01b03161480612ae15750836001600160a01b0316612ad684610aa0565b6001600160a01b0316145b80612b1157506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612b2c82611427565b6001600160a01b031614612b945760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b15565b6001600160a01b038216612bf65760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b15565b612c01838383613018565b612c0c6000826129b4565b6001600160a01b0383166000908152600660205260408120805460019290612c35908490613cc2565b90915550506001600160a01b0382166000908152600660205260408120805460019290612c63908490613c4b565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038216612d1a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b15565b6000818152600560205260409020546001600160a01b031615612d7f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b15565b612d8b60008383613018565b6001600160a01b0382166000908152600660205260408120805460019290612db4908490613c4b565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612eaf60268054612e2490613953565b80601f0160208091040260200160405190810160405280929190818152602001828054612e5090613953565b8015612e9d5780601f10612e7257610100808354040283529160200191612e9d565b820191906000526020600020905b815481529060010190602001808311612e8057829003601f168201915b50505050506064846107669190613ddd565b6000838152602760205260409020909150610c4a8282613a94565b610e128282604051806020016040528060008152506130d0565b612eef848484612b19565b612efb84848484613103565b6112e25760405162461bcd60e51b8152600401610b1590613df1565b606081600003612f3e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612f685780612f52816139b9565b9150612f619050600a83613e43565b9150612f42565b60008167ffffffffffffffff811115612f8357612f83613555565b6040519080825280601f01601f191660200182016040528015612fad576020820181803683370190505b5090505b8415612b1157612fc2600183613cc2565b9150612fcf600a86613ddd565b612fda906030613c4b565b60f81b818381518110612fef57612fef61398d565b60200101906001600160f81b031916908160001a905350613011600a86613e43565b9450612fb1565b6001600160a01b0383166130735761306e81600c80546000838152600b60205260408120829055600182018355919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70155565b613096565b816001600160a01b0316836001600160a01b031614613096576130968382613204565b6001600160a01b0382166130ad57610c4a816132a1565b826001600160a01b0316826001600160a01b031614610c4a57610c4a8282613350565b6130da8383612cc4565b6130e76000848484613103565b610c4a5760405162461bcd60e51b8152600401610b1590613df1565b60006001600160a01b0384163b156131f957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613147903390899088908890600401613e57565b6020604051808303816000875af1925050508015613182575060408051601f3d908101601f1916820190925261317f91810190613e94565b60015b6131df573d8080156131b0576040519150601f19603f3d011682016040523d82523d6000602084013e6131b5565b606091505b5080516000036131d75760405162461bcd60e51b8152600401610b1590613df1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612b11565b506001949350505050565b6000600161321184611522565b61321b9190613cc2565b6000838152600a602052604090205490915080821461326e576001600160a01b03841660009081526009602090815260408083208584528252808320548484528184208190558352600a90915290208190555b506000918252600a602090815260408084208490556001600160a01b039094168352600981528383209183525290812055565b600c546000906132b390600190613cc2565b6000838152600b6020526040812054600c80549394509092849081106132db576132db61398d565b9060005260206000200154905080600c83815481106132fc576132fc61398d565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600c80548061333457613334613eb1565b6001900381819060005260206000200160009055905550505050565b600061335b83611522565b6001600160a01b0390931660009081526009602090815260408083208684528252808320859055938252600a9052919091209190915550565b6001600160e01b0319811681146133aa57600080fd5b50565b6000602082840312156133bf57600080fd5b813561227381613394565b60005b838110156133e55781810151838201526020016133cd565b838111156112e25750506000910152565b6000815180845261340e8160208601602086016133ca565b601f01601f19169290920160200192915050565b60208152600061227360208301846133f6565b60006020828403121561344757600080fd5b5035919050565b80356001600160a01b038116811461216857600080fd5b6000806040838503121561347857600080fd5b6134818361344e565b946020939093013593505050565b8151815260208083015190820152604080830151908201526060808301519082015260808101610a08565b6000602082840312156134cc57600080fd5b6122738261344e565b6020808252825182820181905260009190848201906040850190845b8181101561350d578351835292840192918401916001016134f1565b50909695505050505050565b60008060006060848603121561352e57600080fd5b6135378461344e565b92506135456020850161344e565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561359457613594613555565b604052919050565b600067ffffffffffffffff8311156135b6576135b6613555565b6135c9601f8401601f191660200161356b565b90508281528383830111156135dd57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261360557600080fd5b6122738383356020850161359c565b60006020828403121561362657600080fd5b813567ffffffffffffffff81111561363d57600080fd5b612b11848285016135f4565b6000602080838503121561365c57600080fd5b823567ffffffffffffffff8082111561367457600080fd5b818501915085601f83011261368857600080fd5b81358181111561369a5761369a613555565b8060051b91506136ab84830161356b565b81815291830184019184810190888411156136c557600080fd5b938501935b838510156136e3578435825293850193908501906136ca565b98975050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561374457603f198886030184526137328583516133f6565b94509285019290850190600101613716565b5092979650505050505050565b803560ff8116811461216857600080fd5b600080600080600060a0868803121561377a57600080fd5b853594506020860135935061379160408701613751565b94979396509394606081013594506080013592915050565b600080604083850312156137bc57600080fd5b823567ffffffffffffffff8111156137d357600080fd5b6137df858286016135f4565b95602094909401359450505050565b6000806040838503121561380157600080fd5b61380a8361344e565b91506020830135801515811461381f57600080fd5b809150509250929050565b60008060008060008060c0878903121561384357600080fd5b61384c8761344e565b9550602087013594506040870135935061386860608801613751565b92506080870135915060a087013590509295509295509295565b6000806000806080858703121561389857600080fd5b6138a18561344e565b93506138af6020860161344e565b925060408501359150606085013567ffffffffffffffff8111156138d257600080fd5b8501601f810187136138e357600080fd5b6138f28782356020840161359c565b91505092959194509250565b6000806040838503121561391157600080fd5b61391a8361344e565b91506139286020840161344e565b90509250929050565b6000806040838503121561394457600080fd5b50508035926020909101359150565b600181811c9082168061396757607f821691505b60208210810361398757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016139cb576139cb6139a3565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b601f821115610c4a57600081815260208120601f850160051c81016020861015613a6d5750805b601f850160051c820191505b81811015613a8c57828155600101613a79565b505050505050565b815167ffffffffffffffff811115613aae57613aae613555565b613ac281613abc8454613953565b84613a46565b602080601f831160018114613af75760008415613adf5750858301515b600019600386901b1c1916600185901b178555613a8c565b600085815260208120601f198616915b82811015613b2657888601518255948401946001909101908401613b07565b5085821015613b445787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825260169082015275496e76616c696420696e7465726e616c20707269636560501b604082015260600190565b602080825260149082015273496e76616c6964204e4654207175616e7469747960601b604082015260600190565b6000816000190483118215151615613bcc57613bcc6139a3565b500290565b60208082526023908201527f53656e6420657861637420416d6f756e7420746f20636c61696d20796f75722060408201526213999d60ea1b606082015260800190565b6020808252601c908201527f4e6f20746f6b656e73206c65667420746f20626520636c61696d656400000000604082015260600190565b60008219821115613c5e57613c5e6139a3565b500190565b600081613c7257613c726139a3565b506000190190565b60208082526028908201527f50726573616c65732073686f756c64207374617274206265666f7265207075626040820152676c69632073616c6560c01b606082015260800190565b600082821015613cd457613cd46139a3565b500390565b602080825260089082015267084c2c84090c2e6d60c31b604082015260600190565b6000808454613d0981613953565b60018281168015613d215760018114613d3657613d65565b60ff1984168752821515830287019450613d65565b8860005260208060002060005b85811015613d5c5781548a820152908401908201613d43565b50505082870194505b505050938152602001949350505050565b6020808252600890820152671098590818d85b1b60c21b604082015260600190565b60008351613daa8184602088016133ca565b835190830190613dbe8183602088016133ca565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613dec57613dec613dc7565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082613e5257613e52613dc7565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613e8a908301846133f6565b9695505050505050565b600060208284031215613ea657600080fd5b815161227381613394565b634e487b7160e01b600052603160045260246000fdfea264697066735822122047c53eacf427404a31b8ad0e8db3fcd7765009e3b57af8542d1eb62be157137064736f6c634300080f0033

Deployed Bytecode Sourcemap

17468:16465:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13963:216;;;;;;;;;;-1:-1:-1;13963:216:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;13963:216:0;;;;;;;;7584:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8531:203::-;;;;;;;;;;-1:-1:-1;8531:203:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;8531:203:0;1528::1;8182:346:0;;;;;;;;;;-1:-1:-1;8182:346:0;;;;;:::i;:::-;;:::i;:::-;;30469:194;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21257:377::-;;;;;;;;;;-1:-1:-1;21257:377:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14182:102::-;;;;;;;;;;-1:-1:-1;14262:10:0;:17;14182:102;;;3656:25:1;;;3644:2;3629:18;14182:102:0;3510:177:1;9175:289:0;;;;;;;;;;-1:-1:-1;9175:289:0;;;;;:::i;:::-;;:::i;33419:111::-;;;;;;;;;;-1:-1:-1;33419:111:0;;;;;:::i;:::-;;:::i;14287:238::-;;;;;;;;;;-1:-1:-1;14287:238:0;;;;;:::i;:::-;;:::i;20566:93::-;;;;;;;;;;-1:-1:-1;20566:93:0;;;;;:::i;:::-;;:::i;18540:20::-;;;;;;;;;;;;;;;;21935:117;;;;;;;;;;-1:-1:-1;21935:117:0;;;;;:::i;:::-;;:::i;32031:191::-;;;;;;;;;;;;;:::i;18652:37::-;;;;;;;;;;;;;;;;23054:1086;;;;;;:::i;:::-;;:::i;9467:140::-;;;;;;;;;;-1:-1:-1;9467:140:0;;;;;:::i;:::-;;:::i;31226:244::-;;;;;;;;;;-1:-1:-1;31226:244:0;;;;;:::i;:::-;;:::i;14528:215::-;;;;;;;;;;-1:-1:-1;14528:215:0;;;;;:::i;:::-;;:::i;7367:214::-;;;;;;;;;;-1:-1:-1;7367:214:0;;;;;:::i;:::-;;:::i;4767:163::-;;;;;;;;;;-1:-1:-1;4767:163:0;;;;;:::i;:::-;;:::i;7171:193::-;;;;;;;;;;-1:-1:-1;7171:193:0;;;;;:::i;:::-;;:::i;21717:135::-;;;;;;;;;;-1:-1:-1;21717:135:0;;;;;:::i;:::-;;:::i;28284:110::-;;;;;;;;;;-1:-1:-1;28284:110:0;;;;;:::i;:::-;-1:-1:-1;;;;;28361:25:0;28342:4;28361:25;;;:17;:25;;;;;;:28;;;28284:110;30130:96;;;;;;;;;;-1:-1:-1;30210:11:0;;30130:96;;29940:107;;;;;;;;;;;;;:::i;32784:296::-;;;;;;;;;;-1:-1:-1;32784:296:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22507:464::-;;;;;;;;;;-1:-1:-1;22507:464:0;;;;;:::i;:::-;;:::i;18610:38::-;;;;;;;;;;;;;;;;27282:919;;;;;;;;;;-1:-1:-1;27282:919:0;;;;;:::i;:::-;;:::i;4682:79::-;;;;;;;;;;-1:-1:-1;4728:7:0;4750:6;-1:-1:-1;;;;;4750:6:0;4682:79;;32465:236;;;;;;;;;;-1:-1:-1;32465:236:0;;;;;:::i;:::-;;:::i;7679:96::-;;;;;;;;;;;;;:::i;31553:235::-;;;;;;;;;;-1:-1:-1;31553:235:0;;;;;:::i;:::-;;:::i;18514:22::-;;;;;;;;;;;;;;;;8737:276;;;;;;;;;;-1:-1:-1;8737:276:0;;;;;:::i;:::-;;:::i;24223:1596::-;;;;;;:::i;:::-;;:::i;18693:34::-;;;;;;;;;;;;;;;;22135:83;;;;;;;;;;-1:-1:-1;22205:8:0;;22135:83;;28912:401;;;;;;;;;;;;;:::i;9610:270::-;;;;;;;;;;-1:-1:-1;9610:270:0;;;;;:::i;:::-;;:::i;18566:40::-;;;;;;;;;;;;;;;;7778:312;;;;;;;;;;-1:-1:-1;7778:312:0;;;;;:::i;:::-;;:::i;20739:87::-;;;;;;;;;;;;;:::i;20906:91::-;;;;;;;;;;-1:-1:-1;20978:14:0;;20906:91;;22301:123;;;;;;;;;;-1:-1:-1;22301:123:0;;;;;:::i;:::-;;:::i;9016:156::-;;;;;;;;;;-1:-1:-1;9016:156:0;;;;;:::i;:::-;-1:-1:-1;;;;;9132:25:0;;;9113:4;9132:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9016:156;30746:397;;;;;;;;;;-1:-1:-1;30746:397:0;;;;;:::i;:::-;;:::i;29396:282::-;;;;;;;;;;;;;:::i;29761:96::-;;;;;;;;;;-1:-1:-1;29836:16:0;;29761:96;;5150:198;;;;;;;;;;-1:-1:-1;5150:198:0;;;;;:::i;:::-;;:::i;25902:1297::-;;;;;;:::i;:::-;;:::i;4597:79::-;;;;;;;;;;-1:-1:-1;4665:6:0;;-1:-1:-1;;;;;4665:6:0;4597:79;;28557:272;;;;;;;;;;-1:-1:-1;28557:272:0;;;;;:::i;:::-;;:::i;18484:26::-;;;;;;;;;;;;;;;;13963:216;14065:4;-1:-1:-1;;;;;;14084:50:0;;-1:-1:-1;;;14084:50:0;;:90;;;14138:36;14162:11;14138:23;:36::i;:::-;14077:97;13963:216;-1:-1:-1;;13963:216:0:o;7584:92::-;7638:13;7666:5;7659:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7584:92;:::o;8531:203::-;8604:7;10224:16;;;:7;:16;;;;;;-1:-1:-1;;;;;10224:16:0;8619:73;;;;-1:-1:-1;;;8619:73:0;;11099:2:1;8619:73:0;;;11081:21:1;11138:2;11118:18;;;11111:30;11177:34;11157:18;;;11150:62;-1:-1:-1;;;11228:18:1;;;11221:42;11280:19;;8619:73:0;;;;;;;;;-1:-1:-1;8705:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;8705:24:0;;8531:203::o;8182:346::-;8255:13;8271:23;8286:7;8271:14;:23::i;:::-;8255:39;;8313:5;-1:-1:-1;;;;;8309:9:0;:2;-1:-1:-1;;;;;8309:9:0;;8301:55;;;;-1:-1:-1;;;8301:55:0;;11512:2:1;8301:55:0;;;11494:21:1;11551:2;11531:18;;;11524:30;11590:34;11570:18;;;11563:62;-1:-1:-1;;;11641:18:1;;;11634:31;11682:19;;8301:55:0;11310:397:1;8301:55:0;3757:10;-1:-1:-1;;;;;8368:19:0;;;;:67;;-1:-1:-1;8391:44:0;8415:5;3757:10;9016:156;:::i;8391:44::-;8360:136;;;;-1:-1:-1;;;8360:136:0;;11914:2:1;8360:136:0;;;11896:21:1;11953:2;11933:18;;;11926:30;11992:34;11972:18;;;11965:62;12063:26;12043:18;;;12036:54;12107:19;;8360:136:0;11712:420:1;8360:136:0;8502:21;8511:2;8515:7;8502:8;:21::i;:::-;8251:277;8182:346;;:::o;30469:194::-;30511:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30511:13:0;-1:-1:-1;30558:78:0;;;;;;;;30571:15;;30558:78;;30590:13;;30558:78;;;;30607:12;;30558:78;;;;;;;30623:9;;30558:78;;;;;30469:194::o;21257:377::-;21331:13;-1:-1:-1;;;;;21360:25:0;;21352:74;;;;-1:-1:-1;;;21352:74:0;;12339:2:1;21352:74:0;;;12321:21:1;12378:2;12358:18;;;12351:30;12417:34;12397:18;;;12390:62;-1:-1:-1;;;12468:18:1;;;12461:34;12512:19;;21352:74:0;12137:400:1;21352:74:0;21433:10;21446:24;21456:13;21446:9;:24::i;:::-;21433:37;;21474:20;21508:5;21497:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21497:17:0;;21474:40;;21526:6;21521:89;21538:5;21536:1;:7;21521:89;;;21568:37;21588:13;21603:1;21568:19;:37::i;:::-;21556:6;21563:1;21556:9;;;;;;;;:::i;:::-;;;;;;;;;;:49;21545:3;;;;:::i;:::-;;;;21521:89;;;-1:-1:-1;21623:6:0;21257:377;-1:-1:-1;;;21257:377:0:o;9175:289::-;9330:41;3757:10;9363:7;9330:18;:41::i;:::-;9322:103;;;;-1:-1:-1;;;9322:103:0;;;;;;;:::i;:::-;9431:28;9441:4;9447:2;9451:7;9431:9;:28::i;33419:111::-;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;33498:16:::1;:27;33517:8:::0;33498:16;:27:::1;:::i;:::-;;33419:111:::0;:::o;14287:238::-;14381:4;14409:23;14426:5;14409:16;:23::i;:::-;14401:5;:31;14393:87;;;;-1:-1:-1;;;14393:87:0;;16107:2:1;14393:87:0;;;16089:21:1;16146:2;16126:18;;;16119:30;16185:34;16165:18;;;16158:62;-1:-1:-1;;;16236:18:1;;;16229:41;16287:19;;14393:87:0;15905:407:1;14393:87:0;-1:-1:-1;;;;;;14494:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;14287:238::o;20566:93::-;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;20638:7:::1;:16;20648:6:::0;20638:7;:16:::1;:::i;21935:117::-:0;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;21996:8:::1;:19:::0;;;22026:21:::1;::::0;3656:25:1;;;22026:21:0::1;::::0;3644:2:1;3629:18;22026:21:0::1;;;;;;;;21935:117:::0;:::o;32031:191::-;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;32126:11:::1;::::0;32118:38:::1;::::0;32091:21:::1;::::0;-1:-1:-1;;;;;32126:11:0::1;::::0;32118:38;::::1;;;::::0;32091:21;;32076:12:::1;32118:38:::0;32076:12;32118:38;32091:21;32126:11;32118:38;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;32196:11:0::1;::::0;32167:50:::1;::::0;;32189:4:::1;16557:34:1::0;;-1:-1:-1;;;;;32196:11:0;;::::1;16622:2:1::0;16607:18;;16600:43;16659:18;;16652:34;;;32167:50:0::1;::::0;16507:2:1;16492:18;32167:50:0::1;16317:375:1::0;23054:1086:0;23205:9;;23188:15;:26;;23180:56;;;;-1:-1:-1;;;23180:56:0;;16899:2:1;23180:56:0;;;16881:21:1;16938:2;16918:18;;;16911:30;-1:-1:-1;;;16957:18:1;;;16950:47;17014:18;;23180:56:0;16697:341:1;23180:56:0;-1:-1:-1;;;;;23290:20:0;;23282:52;;;;-1:-1:-1;;;23282:52:0;;17245:2:1;23282:52:0;;;17227:21:1;17284:2;17264:18;;;17257:30;-1:-1:-1;;;17303:18:1;;;17296:49;17362:18;;23282:52:0;17043:343:1;23282:52:0;23346:10;;23358:1;23346:13;23338:48;;;;-1:-1:-1;;;23338:48:0;;;;;;;:::i;:::-;23407:1;23398:8;:10;:25;;;;;23422:1;23412:8;:11;;23398:25;23390:58;;;;-1:-1:-1;;;23390:58:0;;;;;;;:::i;:::-;23482:8;23471:10;;:19;;;;:::i;:::-;23460:9;:30;23452:78;;;;-1:-1:-1;;;23452:78:0;;;;;;;:::i;:::-;23559:1;23542:14;;:18;23534:59;;;;-1:-1:-1;;;23534:59:0;;;;;;;:::i;:::-;23622:11;;23605:16;;:28;23597:49;;;;-1:-1:-1;;;23597:49:0;;19227:2:1;23597:49:0;;;19209:21:1;19266:1;19246:18;;;19239:29;-1:-1:-1;;;19284:18:1;;;19277:38;19332:18;;23597:49:0;19025:331:1;23597:49:0;23685:11;;23675:8;23658:16;;:25;;;;:::i;:::-;:38;;23650:78;;;;-1:-1:-1;;;23650:78:0;;19696:2:1;23650:78:0;;;19678:21:1;19735:2;19715:18;;;19708:30;19774:29;19754:18;;;19747:57;19821:18;;23650:78:0;19494:351:1;23650:78:0;-1:-1:-1;;;;;23745:26:0;;23734:8;23745:26;;;:16;:26;;;;;;:37;;23774:8;;23745:37;:::i;:::-;23734:48;;23801:1;23796:3;:6;;23788:35;;;;-1:-1:-1;;;23788:35:0;;20052:2:1;23788:35:0;;;20034:21:1;20091:2;20071:18;;;20064:30;-1:-1:-1;;;20110:18:1;;;20103:46;20166:18;;23788:35:0;19850:340:1;23788:35:0;-1:-1:-1;;;;;23830:26:0;;;;;;:16;:26;;;;;:38;;23860:8;;23830:26;:38;;23860:8;;23830:38;:::i;:::-;;;;-1:-1:-1;23879:6:0;;-1:-1:-1;23874:262:0;23893:8;23889:1;:12;23874:262;;;23914:16;:18;;;:16;:18;;;:::i;:::-;;;;-1:-1:-1;;23936:19:0;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;23961:14:0;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;;24005:19:0;;;23983:42;;;;:21;:42;;;;;24028:15;23983:60;;24065:19;24049:36;;24055:8;;24049:5;:36::i;:::-;24091:40;24111:19;;24091;:40::i;:::-;23903:3;;;;:::i;:::-;;;;23874:262;;;;23176:964;23054:1086;;:::o;9467:140::-;9563:39;9580:4;9586:2;9590:7;9563:39;;;;;;;;;;;;:16;:39::i;31226:244::-;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;31308:9:::1;;31298:7;:19;31290:72;;;;-1:-1:-1::0;;;31290:72:0::1;;;;;;;:::i;:::-;31383:12;::::0;;31399:22;;;;31432:33:::1;::::0;;20919:25:1;;;20975:2;20960:18;;20953:34;;;31432:33:0::1;::::0;20892:18:1;31432:33:0::1;;;;;;;;31286:184;31226:244:::0;:::o;14528:215::-;14600:4;14628:30;14262:10;:17;;14182:102;14628:30;14620:5;:38;14612:95;;;;-1:-1:-1;;;14612:95:0;;21200:2:1;14612:95:0;;;21182:21:1;21239:2;21219:18;;;21212:30;21278:34;21258:18;;;21251:62;-1:-1:-1;;;21329:18:1;;;21322:42;21381:19;;14612:95:0;20998:408:1;14612:95:0;14721:10;14732:5;14721:17;;;;;;;;:::i;:::-;;;;;;;;;14714:24;;14528:215;;;:::o;7367:214::-;7436:7;7467:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7467:16:0;;7487:73;;;;-1:-1:-1;;;7487:73:0;;21613:2:1;7487:73:0;;;21595:21:1;21652:2;21632:18;;;21625:30;21691:34;21671:18;;;21664:62;-1:-1:-1;;;21742:18:1;;;21735:39;21791:19;;7487:73:0;21411:405:1;4767:163:0;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;4850:6:::1;::::0;;-1:-1:-1;;;;;4860:17:0;;::::1;-1:-1:-1::0;;;;;;4860:17:0;::::1;::::0;::::1;::::0;;;4888:37:::1;::::0;;4850:6;;;::::1;22033:34:1::0;;;22098:2;22083:18;;22076:43;;;;4888:37:0::1;::::0;21968:18:1;4888:37:0::1;21821:304:1::0;7171:193:0;7243:4;-1:-1:-1;;;;;7263:19:0;;7255:74;;;;-1:-1:-1;;;7255:74:0;;22332:2:1;7255:74:0;;;22314:21:1;22371:2;22351:18;;;22344:30;22410:34;22390:18;;;22383:62;-1:-1:-1;;;22461:18:1;;;22454:40;22511:19;;7255:74:0;22130:406:1;7255:74:0;-1:-1:-1;;;;;;7343:16:0;;;;;:9;:16;;;;;;;7171:193::o;21717:135::-;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;21784:14:::1;:25:::0;;;21820:27:::1;::::0;3656:25:1;;;21820:27:0::1;::::0;3644:2:1;3629:18;21820:27:0::1;3510:177:1::0;29940:107:0;29983:14;30026:16;;30012:11;;:30;;;;:::i;:::-;30005:37;;29940:107;:::o;32784:296::-;32865:28;32901:22;32939:8;:15;32926:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32901:54;;32967:6;32962:94;32979:8;:15;32977:1;:17;32962:94;;;33019:17;:32;33038:8;33047:1;33038:11;;;;;;;;:::i;:::-;;;;;;;33019:32;;;;;;;;;;;33007:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;33014:1;33007:9;;;;;;;;:::i;:::-;;;;;;:44;;;;32996:3;;;;;:::i;:::-;;;;32962:94;;;-1:-1:-1;33069:6:0;32784:296;-1:-1:-1;;32784:296:0:o;22507:464::-;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;22588:6:::1;22570:14;;:24;;22562:78;;;::::0;-1:-1:-1;;;22562:78:0;;22873:2:1;22562:78:0::1;::::0;::::1;22855:21:1::0;22912:2;22892:18;;;22885:30;22951:34;22931:18;;;22924:62;-1:-1:-1;;;23002:18:1;;;22995:39;23051:19;;22562:78:0::1;22671:405:1::0;22562:78:0::1;22651:6;22646:226;22665:6;22661:1;:10;22646:226;;;22684:19;:21:::0;;;:19:::1;:21;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;22734:19:0::1;::::0;;22712:42:::1;::::0;;;:21:::1;:42;::::0;;;;22757:15:::1;22712:60:::0;;22801:19;22779:42:::1;::::0;22789:10:::1;::::0;22779:9:::1;:42::i;:::-;22827:40;22847:19;;22827;:40::i;:::-;22673:3:::0;::::1;::::0;::::1;:::i;:::-;;;;22646:226;;;;22908:19;;22894:11;;:33;;;;:::i;:::-;22877:14;:50:::0;22938:28:::1;::::0;;22947:10:::1;23255:51:1::0;;23337:2;23322:18;;23315:34;;;22938:28:0::1;::::0;23228:18:1;22938:28:0::1;23081:274:1::0;27282:919:0;27414:25;27442:28;;;:14;:28;;;;;;;;27484:27;;27476:48;;;;-1:-1:-1;;;27476:48:0;;;;;;;:::i;:::-;27530:28;;;;:14;:28;;;;;;;;:35;;-1:-1:-1;;27530:35:0;27561:4;27530:35;;;27605:42;;;27622:10;;27545:12;;27605:42;;:::i;:::-;;;;;;;;;;;;;27595:53;;;;;;27571:77;;27652:16;27707:7;4665:6;;-1:-1:-1;;;;;4665:6:0;;4597:79;27707:7;-1:-1:-1;;;;;27672:42:0;:33;27682:13;27697:1;27700;27703;27672:33;;;;;;;;;;;;;;;;;24835:25:1;;;24908:4;24896:17;;;;24891:2;24876:18;;24869:45;24945:2;24930:18;;24923:34;24988:2;24973:18;;24966:34;24822:3;24807:19;;24608:398;27672:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27672:33:0;;-1:-1:-1;;27672:33:0;;-1:-1:-1;;;;;27672:42:0;;;;;;-1:-1:-1;;27742:4:0;27729:17;;27721:38;;;;-1:-1:-1;;;27721:38:0;;;;;;;:::i;:::-;27807:1;27786:20;:18;:20::i;:::-;:22;27778:54;;;;-1:-1:-1;;;27778:54:0;;25549:2:1;27778:54:0;;;25531:21:1;25588:2;25568:18;;;25561:30;-1:-1:-1;;;25607:18:1;;;25600:49;25666:18;;27778:54:0;25347:343:1;27778:54:0;27861:8;27844:14;;:25;;27836:66;;;;-1:-1:-1;;;27836:66:0;;;;;;;:::i;:::-;27926:10;27908:29;;;;:17;:29;;;;;:41;;27941:8;;27908:29;:41;;27941:8;;27908:41;:::i;:::-;;;;-1:-1:-1;27960:6:0;;-1:-1:-1;27955:242:0;27974:8;27970:1;:12;27955:242;;;27995:19;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;28020:14:0;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;;28064:19:0;;;28042:42;;;;:21;:42;;;;;28087:15;28042:60;;28126:19;28108:38;;28114:10;;28108:5;:38::i;:::-;28152:40;28172:19;;28152;:40::i;:::-;27984:3;;;;:::i;:::-;;;;27955:242;;;;27374:827;;;27282:919;;;;;:::o;32465:236::-;32623:12;;;32633:1;32623:12;;;;;;;;;32540:13;;32593:3;;32563:21;;32623:12;;;;;;;;;;-1:-1:-1;32623:12:0;32601:34;;32653:8;32662:5;32653:15;;;;;;;;:::i;:::-;;;;;;;;;32641:6;32648:1;32641:9;;;;;;;;:::i;:::-;;;;:27;-1:-1:-1;;;;;32641:27:0;;;;;;;;-1:-1:-1;32689:6:0;32465:236;-1:-1:-1;;;;32465:236:0:o;7679:96::-;7735:13;7763:7;7756:14;;;;;:::i;31553:235::-;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;31632:12:::1;;31622:7;:22;31614:75;;;;-1:-1:-1::0;;;31614:75:0::1;;;;;;;:::i;:::-;31710:9;::::0;;31723:19;;;;31753:30:::1;::::0;;20919:25:1;;;20975:2;20960:18;;20953:34;;;31753:30:0::1;::::0;20892:18:1;31753:30:0::1;20745:248:1::0;8737:276:0;3757:10;-1:-1:-1;;;;;8835:24:0;;;8827:62;;;;-1:-1:-1;;;8827:62:0;;25897:2:1;8827:62:0;;;25879:21:1;25936:2;25916:18;;;25909:30;25975:27;25955:18;;;25948:55;26020:18;;8827:62:0;25695:349:1;8827:62:0;3757:10;8895:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;8895:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;8895:53:0;;;;;;;;;;8960:48;;540:41:1;;;8895:42:0;;3757:10;8960:48;;513:18:1;8960:48:0;;;;;;;8737:276;;:::o;24223:1596::-;24444:25;24472:28;;;:14;:28;;;;;;;;24514:27;;24506:48;;;;-1:-1:-1;;;24506:48:0;;;;;;;:::i;:::-;24560:28;;;;:14;:28;;;;;;;;:35;;-1:-1:-1;;24560:35:0;24591:4;24560:35;;;24635:42;;;24652:10;;24575:12;;24635:42;;:::i;:::-;;;;;;;;;;;;;24625:53;;;;;;24601:77;;24682:16;24737:7;4665:6;;-1:-1:-1;;;;;4665:6:0;;4597:79;24737:7;-1:-1:-1;;;;;24702:42:0;:33;24712:13;24727:1;24730;24733;24702:33;;;;;;;;;;;;;;;;;24835:25:1;;;24908:4;24896:17;;;;24891:2;24876:18;;24869:45;24945:2;24930:18;;24923:34;24988:2;24973:18;;24966:34;24822:3;24807:19;;24608:398;24702:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24702:33:0;;-1:-1:-1;;24702:33:0;;-1:-1:-1;;;;;24702:42:0;;;;;;-1:-1:-1;;24772:4:0;24759:17;;24751:38;;;;-1:-1:-1;;;24751:38:0;;;;;;;:::i;:::-;24833:12;;24816:15;:29;;24808:67;;;;-1:-1:-1;;;24808:67:0;;26251:2:1;24808:67:0;;;26233:21:1;26290:2;26270:18;;;26263:30;26329:27;26309:18;;;26302:55;26374:18;;24808:67:0;26049:349:1;24808:67:0;24904:9;;24888:15;:25;24880:59;;;;-1:-1:-1;;;24880:59:0;;26605:2:1;24880:59:0;;;26587:21:1;26644:2;26624:18;;;26617:30;-1:-1:-1;;;26663:18:1;;;26656:51;26724:18;;24880:59:0;26403:345:1;24880:59:0;-1:-1:-1;;;;;24951:20:0;;24943:52;;;;-1:-1:-1;;;24943:52:0;;17245:2:1;24943:52:0;;;17227:21:1;17284:2;17264:18;;;17257:30;-1:-1:-1;;;17303:18:1;;;17296:49;17362:18;;24943:52:0;17043:343:1;24943:52:0;25016:1;25007:8;:10;:25;;;;;25031:1;25021:8;:11;;25007:25;24999:58;;;;-1:-1:-1;;;24999:58:0;;;;;;;:::i;:::-;25069:14;;25085:1;25069:17;25061:52;;;;-1:-1:-1;;;25061:52:0;;;;;;;:::i;:::-;25151:8;25136:14;;:23;;;;:::i;:::-;25125:9;:34;25117:82;;;;-1:-1:-1;;;25117:82:0;;;;;;;:::i;:::-;25228:1;25211:14;;:18;25203:59;;;;-1:-1:-1;;;25203:59:0;;;;;;;:::i;:::-;25291:11;;25274:16;;:28;25266:49;;;;-1:-1:-1;;;25266:49:0;;19227:2:1;25266:49:0;;;19209:21:1;19266:1;19246:18;;;19239:29;-1:-1:-1;;;19284:18:1;;;19277:38;19332:18;;25266:49:0;19025:331:1;25266:49:0;25354:11;;25344:8;25327:16;;:25;;;;:::i;:::-;:38;;25319:78;;;;-1:-1:-1;;;25319:78:0;;19696:2:1;25319:78:0;;;19678:21:1;19735:2;19715:18;;;19708:30;19774:29;19754:18;;;19747:57;19821:18;;25319:78:0;19494:351:1;25319:78:0;-1:-1:-1;;;;;25414:31:0;;25403:8;25414:31;;;:21;:31;;;;;;:42;;25448:8;;25414:42;:::i;:::-;25403:53;;25475:1;25470:3;:6;;25462:35;;;;-1:-1:-1;;;25462:35:0;;20052:2:1;25462:35:0;;;20034:21:1;20091:2;20071:18;;;20064:30;-1:-1:-1;;;20110:18:1;;;20103:46;20166:18;;25462:35:0;19850:340:1;25462:35:0;-1:-1:-1;;;;;25504:31:0;;;;;;:21;:31;;;;;:43;;25539:8;;25504:31;:43;;25539:8;;25504:43;:::i;:::-;;;;-1:-1:-1;25558:6:0;;-1:-1:-1;25553:262:0;25572:8;25568:1;:12;25553:262;;;25593:16;:18;;;:16;:18;;;:::i;:::-;;;;-1:-1:-1;;25615:19:0;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;25640:14:0;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;;25684:19:0;;;25662:42;;;;:21;:42;;;;;25707:15;25662:60;;25744:19;25728:36;;25734:8;;25728:5;:36::i;:::-;25770:40;25790:19;;25770;:40::i;:::-;25582:3;;;;:::i;:::-;;;;25553:262;;;;24404:1415;;;;24223:1596;;;;;;:::o;28912:401::-;29086:9;;28962:20;;;;29069:15;:26;29065:229;;-1:-1:-1;29104:1:0;29304:4;28912:401;-1:-1:-1;28912:401:0:o;29065:229::-;29150:12;;29133:15;:29;29129:165;;-1:-1:-1;29171:1:0;29304:4;28912:401;-1:-1:-1;28912:401:0:o;29129:165::-;29214:15;;29197;:32;;:66;;;;;29250:13;;29233:15;:30;;29197:66;29193:101;;;-1:-1:-1;29278:1:0;29193:101;29304:4;28912:401;-1:-1:-1;28912:401:0:o;9610:270::-;9734:41;3757:10;9767:7;9734:18;:41::i;:::-;9726:103;;;;-1:-1:-1;;;9726:103:0;;;;;;;:::i;:::-;9836:39;9850:4;9856:2;9860:7;9869:5;9836:13;:39::i;7778:312::-;10205:4;10224:16;;;:7;:16;;;;;;7848:13;;-1:-1:-1;;;;;10224:16:0;7869:76;;;;-1:-1:-1;;;7869:76:0;;26955:2:1;7869:76:0;;;26937:21:1;26994:2;26974:18;;;26967:30;27033:34;27013:18;;;27006:62;-1:-1:-1;;;27084:18:1;;;27077:45;27139:19;;7869:76:0;26753:411:1;7869:76:0;7951:21;7975:10;:8;:10::i;:::-;7951:34;;8022:1;8006:7;8000:21;:23;7999:86;;;;;;;;;;;;;;;;;8051:7;8060:18;:7;:16;:18::i;:::-;8034:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7999:86;7992:93;7778:312;-1:-1:-1;;;7778:312:0:o;20739:87::-;20786:13;20814:7;20807:14;;;;;:::i;22301:123::-;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;22364:10:::1;:21:::0;;;22396:23:::1;::::0;3656:25:1;;;22396:23:0::1;::::0;3644:2:1;3629:18;22396:23:0::1;3510:177:1::0;30746:397:0;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;30845:12:::1;;30833:9;:24;30825:80;;;::::0;-1:-1:-1;;;30825:80:0;;27846:2:1;30825:80:0::1;::::0;::::1;27828:21:1::0;27885:2;27865:18;;;27858:30;27924:34;27904:18;;;27897:62;-1:-1:-1;;;27975:18:1;;;27968:41;28026:19;;30825:80:0::1;27644:407:1::0;30825:80:0::1;30927:12;;30917:7;:22;30909:76;;;::::0;-1:-1:-1;;;30909:76:0;;28258:2:1;30909:76:0::1;::::0;::::1;28240:21:1::0;28297:2;28277:18;;;28270:30;28336:34;28316:18;;;28309:62;-1:-1:-1;;;28387:18:1;;;28380:39;28436:19;;30909:76:0::1;28056:405:1::0;30909:76:0::1;31009:7;30997:9;:19;30989:44;;;::::0;-1:-1:-1;;;30989:44:0;;28668:2:1;30989:44:0::1;::::0;::::1;28650:21:1::0;28707:2;28687:18;;;28680:30;-1:-1:-1;;;28726:18:1;;;28719:42;28778:18;;30989:44:0::1;28466:336:1::0;30989:44:0::1;31039:15;:27:::0;;;31070:13:::1;:23:::0;;;31104:34:::1;::::0;;20919:25:1;;;20975:2;20960:18;;20953:34;;;31104::0::1;::::0;20892:18:1;31104:34:0::1;20745:248:1::0;29396:282:0;29443:17;29517:9;29529:20;:18;:20::i;:::-;29568:10;;29517:32;;-1:-1:-1;29592:1:0;29586:7;;;29582:73;;-1:-1:-1;29603:14:0;;29582:73;;;29630:4;29636:1;29630:7;29626:29;;-1:-1:-1;29647:8:0;;29668:5;29396:282;-1:-1:-1;;29396:282:0:o;5150:198::-;4728:7;4750:6;-1:-1:-1;;;;;4750:6:0;3757:10;4970:23;4962:45;;;;-1:-1:-1;;;4962:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5234:22:0;::::1;5226:43;;;::::0;-1:-1:-1;;;5226:43:0;;29009:2:1;5226:43:0::1;::::0;::::1;28991:21:1::0;29048:1;29028:18;;;29021:29;-1:-1:-1;;;29066:18:1;;;29059:38;29114:18;;5226:43:0::1;28807:331:1::0;5226:43:0::1;5302:6;::::0;;5281:38:::1;::::0;-1:-1:-1;;;;;5281:38:0;;::::1;::::0;5302:6;::::1;::::0;5281:38:::1;::::0;::::1;5326:6;:17:::0;;-1:-1:-1;;;;;;5326:17:0::1;-1:-1:-1::0;;;;;5326:17:0;;;::::1;::::0;;;::::1;::::0;;5150:198::o;25902:1297::-;26117:25;26145:28;;;:14;:28;;;;;;;;26187:27;;26179:48;;;;-1:-1:-1;;;26179:48:0;;;;;;;:::i;:::-;26233:28;;;;:14;:28;;;;;;;;:35;;-1:-1:-1;;26233:35:0;26264:4;26233:35;;;26308:42;;;26325:10;;26248:12;;26308:42;;:::i;:::-;;;;;;;;;;;;;26298:53;;;;;;26274:77;;26355:16;26410:7;4665:6;;-1:-1:-1;;;;;4665:6:0;;4597:79;26410:7;-1:-1:-1;;;;;26375:42:0;:33;26385:13;26400:1;26403;26406;26375:33;;;;;;;;;;;;;;;;;24835:25:1;;;24908:4;24896:17;;;;24891:2;24876:18;;24869:45;24945:2;24930:18;;24923:34;24988:2;24973:18;;24966:34;24822:3;24807:19;;24608:398;26375:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26375:33:0;;-1:-1:-1;;26375:33:0;;-1:-1:-1;;;;;26375:42:0;;;;;;-1:-1:-1;;26445:4:0;26432:17;;26424:38;;;;-1:-1:-1;;;26424:38:0;;;;;;;:::i;:::-;26498:1;26489:8;:10;:25;;;;;26513:1;26503:8;:11;;26489:25;26481:58;;;;-1:-1:-1;;;26481:58:0;;;;;;;:::i;:::-;26568:8;26551:14;;:25;;26543:65;;;;-1:-1:-1;;;26543:65:0;;29345:2:1;26543:65:0;;;29327:21:1;29384:2;29364:18;;;29357:30;29423:29;29403:18;;;29396:57;29470:18;;26543:65:0;29143:351:1;26543:65:0;26620:8;;26630:1;26620:11;26612:46;;;;-1:-1:-1;;;26612:46:0;;;;;;;:::i;:::-;26690:8;26681;;:17;;;;:::i;:::-;26670:9;:28;26662:57;;;;-1:-1:-1;;;26662:57:0;;29701:2:1;26662:57:0;;;29683:21:1;29740:2;29720:18;;;29713:30;-1:-1:-1;;;29759:18:1;;;29752:46;29815:18;;26662:57:0;29499:340:1;26662:57:0;26731:20;:18;:20::i;:::-;26753:1;26731:23;26723:50;;;;-1:-1:-1;;;26723:50:0;;30046:2:1;26723:50:0;;;30028:21:1;30085:2;30065:18;;;30058:30;-1:-1:-1;;;30104:18:1;;;30097:44;30158:18;;26723:50:0;29844:338:1;26723:50:0;-1:-1:-1;;;;;26790:23:0;;26779:8;26790:23;;;:13;:23;;;;;;:34;;26816:8;;26790:34;:::i;:::-;26779:45;;26843:1;26838:3;:6;;26830:43;;;;-1:-1:-1;;;26830:43:0;;30389:2:1;26830:43:0;;;30371:21:1;30428:2;30408:18;;;30401:30;30467:26;30447:18;;;30440:54;30511:18;;26830:43:0;30187:348:1;26830:43:0;-1:-1:-1;;;;;26892:23:0;;;;;;:13;:23;;;;;:35;;26919:8;;26892:23;:35;;26919:8;;26892:35;:::i;:::-;;;;-1:-1:-1;26938:6:0;;-1:-1:-1;26933:262:0;26952:8;26948:1;:12;26933:262;;;26973:16;:18;;;:16;:18;;;:::i;:::-;;;;-1:-1:-1;;26995:19:0;:21;;;:19;:21;;;:::i;:::-;;;;-1:-1:-1;;27020:14:0;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;;27064:19:0;;;27042:42;;;;:21;:42;;;;;27087:15;27042:60;;27124:19;27108:36;;27114:8;;27108:5;:36::i;:::-;27150:40;27170:19;;27150;:40::i;:::-;26962:3;;;;:::i;:::-;;;;26933:262;;28557:272;28624:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28624:18:0;-1:-1:-1;28675:133:0;;;;;;;;-1:-1:-1;;;;;28693:24:0;;;28650:22;28693:24;;;:16;:24;;;;;;;;28675:133;;28721:21;;;:13;:21;;;;;;28675:133;;;;28746:29;;;:21;:29;;;;;;28675:133;;;;28779:25;;;:17;:25;;;;;28675:133;;;;;28557:272::o;6906:262::-;7008:4;-1:-1:-1;;;;;;7027:40:0;;-1:-1:-1;;;7027:40:0;;:94;;-1:-1:-1;;;;;;;7073:48:0;;-1:-1:-1;;;7073:48:0;7027:94;:136;;;-1:-1:-1;;;;;;;;;;3518:40:0;;;7127:36;3413:151;12506:159;12573:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;12573:29:0;-1:-1:-1;;;;;12573:29:0;;;;;;;;:24;;12623:23;12573:24;12623:14;:23::i;:::-;-1:-1:-1;;;;;12614:46:0;;;;;;;;;;;12506:159;;:::o;10262:336::-;10352:4;10224:16;;;:7;:16;;;;;;-1:-1:-1;;;;;10224:16:0;10364:73;;;;-1:-1:-1;;;10364:73:0;;30742:2:1;10364:73:0;;;30724:21:1;30781:2;30761:18;;;30754:30;30820:34;30800:18;;;30793:62;-1:-1:-1;;;30871:18:1;;;30864:42;30923:19;;10364:73:0;30540:408:1;10364:73:0;10444:13;10460:23;10475:7;10460:14;:23::i;:::-;10444:39;;10509:5;-1:-1:-1;;;;;10498:16:0;:7;-1:-1:-1;;;;;10498:16:0;;:51;;;;10542:7;-1:-1:-1;;;;;10518:31:0;:20;10530:7;10518:11;:20::i;:::-;-1:-1:-1;;;;;10518:31:0;;10498:51;:94;;;-1:-1:-1;;;;;;9132:25:0;;;9113:4;9132:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;10553:39;10490:103;10262:336;-1:-1:-1;;;;10262:336:0:o;12030:473::-;12145:4;-1:-1:-1;;;;;12120:29:0;:23;12135:7;12120:14;:23::i;:::-;-1:-1:-1;;;;;12120:29:0;;12112:83;;;;-1:-1:-1;;;12112:83:0;;31155:2:1;12112:83:0;;;31137:21:1;31194:2;31174:18;;;31167:30;31233:34;31213:18;;;31206:62;-1:-1:-1;;;31284:18:1;;;31277:39;31333:19;;12112:83:0;30953:405:1;12112:83:0;-1:-1:-1;;;;;12207:16:0;;12199:65;;;;-1:-1:-1;;;12199:65:0;;31565:2:1;12199:65:0;;;31547:21:1;31604:2;31584:18;;;31577:30;31643:34;31623:18;;;31616:62;-1:-1:-1;;;31694:18:1;;;31687:34;31738:19;;12199:65:0;31363:400:1;12199:65:0;12270:39;12291:4;12297:2;12301:7;12270:20;:39::i;:::-;12315:29;12332:1;12336:7;12315:8;:29::i;:::-;-1:-1:-1;;;;;12393:15:0;;;;;;:9;:15;;;;;:20;;12412:1;;12393:15;:20;;12412:1;;12393:20;:::i;:::-;;;;-1:-1:-1;;;;;;;12417:13:0;;;;;;:9;:13;;;;;:18;;12434:1;;12417:13;:18;;12434:1;;12417:18;:::i;:::-;;;;-1:-1:-1;;12439:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;12439:21:0;-1:-1:-1;;;;;12439:21:0;;;;;;;;;12471:27;;12439:16;;12471:27;;;;;;;12030:473;;;:::o;10941:336::-;-1:-1:-1;;;;;11013:16:0;;11005:61;;;;-1:-1:-1;;;11005:61:0;;31970:2:1;11005:61:0;;;31952:21:1;;;31989:18;;;31982:30;32048:34;32028:18;;;32021:62;32100:18;;11005:61:0;31768:356:1;11005:61:0;10205:4;10224:16;;;:7;:16;;;;;;-1:-1:-1;;;;;10224:16:0;:30;11070:58;;;;-1:-1:-1;;;11070:58:0;;32331:2:1;11070:58:0;;;32313:21:1;32370:2;32350:18;;;32343:30;32409;32389:18;;;32382:58;32457:18;;11070:58:0;32129:352:1;11070:58:0;11134:45;11163:1;11167:2;11171:7;11134:20;:45::i;:::-;-1:-1:-1;;;;;11185:13:0;;;;;;:9;:13;;;;;:18;;11202:1;;11185:13;:18;;11202:1;;11185:18;:::i;:::-;;;;-1:-1:-1;;11207:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11207:21:0;-1:-1:-1;;;;;11207:21:0;;;;;;;;11239:33;;11207:16;;;11239:33;;11207:16;;11239:33;10941:336;;:::o;33163:173::-;33221:20;33244:46;33258:16;33244:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33286:3;33276:7;:13;;;;:::i;33244:46::-;33296:26;;;;:17;:26;;;;;33221:69;;-1:-1:-1;33296:35:0;33221:69;33296:26;:35;:::i;10601:99::-;10669:26;10679:2;10683:7;10669:26;;;;;;;;;;;;:9;:26::i;9883:257::-;9989:28;9999:4;10005:2;10009:7;9989:9;:28::i;:::-;10032:48;10055:4;10061:2;10065:7;10074:5;10032:22;:48::i;:::-;10024:111;;;;-1:-1:-1;;;10024:111:0;;;;;;;:::i;2587:388::-;2640:13;2665:5;2672:1;2665:8;2661:24;;-1:-1:-1;;2675:10:0;;;;;;;;;;;;-1:-1:-1;;;2675:10:0;;;;;2587:388::o;2661:24::-;2704:5;2692:9;2731:49;2738:7;;2731:49;;2753:8;;;;:::i;:::-;;-1:-1:-1;2765:10:0;;-1:-1:-1;2773:2:0;2765:10;;:::i;:::-;;;2731:49;;;2786:19;2818:6;2808:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2808:17:0;;2786:39;;2832:111;2839:8;;2832:111;;2855:11;2865:1;2855:11;;:::i;:::-;;-1:-1:-1;2910:10:0;2918:2;2910:5;:10;:::i;:::-;2900:21;;:2;:21;:::i;:::-;2887:36;;2870:6;2877;2870:14;;;;;;;;:::i;:::-;;;;:53;-1:-1:-1;;;;;2870:53:0;;;;;;;;-1:-1:-1;2927:11:0;2936:2;2927:11;;:::i;:::-;;;2832:111;;14746:431;-1:-1:-1;;;;;14901:18:0;;14897:136;;14921:40;14953:7;15475:10;:17;;15448:24;;;;:15;:24;;;;;:44;;;15499:24;;;;;;;;;;;;15379:149;14921:40;14897:136;;;14982:2;-1:-1:-1;;;;;14974:10:0;:4;-1:-1:-1;;;;;14974:10:0;;14970:63;;14986:47;15019:4;15025:7;14986:32;:47::i;:::-;-1:-1:-1;;;;;15044:16:0;;15040:132;;15062:45;15099:7;15062:36;:45::i;15040:132::-;15126:4;-1:-1:-1;;;;;15120:10:0;:2;-1:-1:-1;;;;;15120:10:0;;15116:56;;15132:40;15160:2;15164:7;15132:27;:40::i;10703:235::-;10791:18;10797:2;10801:7;10791:5;:18::i;:::-;10824:54;10855:1;10859:2;10863:7;10872:5;10824:22;:54::i;:::-;10816:117;;;;-1:-1:-1;;;10816:117:0;;;;;;;:::i;12668:620::-;12774:4;-1:-1:-1;;;;;12790:13:0;;3192:20;3272:8;12786:498;;12822:72;;-1:-1:-1;;;12822:72:0;;-1:-1:-1;;;;;12822:36:0;;;;;:72;;3757:10;;12873:4;;12879:7;;12888:5;;12822:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12822:72:0;;;;;;;;-1:-1:-1;;12822:72:0;;;;;;;;;;;;:::i;:::-;;;12813:437;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13038:6;:13;13053:1;13038:16;13034:212;;13062:60;;-1:-1:-1;;;13062:60:0;;;;;;;:::i;13034:212::-;13182:6;13176:13;13167:6;13163:2;13159:15;13152:38;12813:437;-1:-1:-1;;;;;;12937:55:0;-1:-1:-1;;;12937:55:0;;-1:-1:-1;12930:62:0;;12786:498;-1:-1:-1;13275:4:0;12668:620;;;;;;:::o;15531:872::-;15775:19;15822:1;15797:22;15814:4;15797:16;:22::i;:::-;:26;;;;:::i;:::-;15827:15;15845:26;;;:17;:26;;;;;;15775:48;;-1:-1:-1;15964:28:0;;;15960:285;;-1:-1:-1;;;;;16017:18:0;;15998:16;16017:18;;;:12;:18;;;;;;;;:34;;;;;;;;;16057:30;;;;;;:44;;;16163:30;;:17;:30;;;;;:43;;;15960:285;-1:-1:-1;16327:26:0;;;;:17;:26;;;;;;;;16320:33;;;-1:-1:-1;;;;;16364:18:0;;;;;:12;:18;;;;;:34;;;;;;;16357:41;15531:872::o;16406:975::-;16659:10;:17;16637:19;;16659:21;;16679:1;;16659:21;:::i;:::-;16684:15;16702:24;;;:15;:24;;;;;;17044:10;:26;;16637:43;;-1:-1:-1;16702:24:0;;16637:43;;17044:26;;;;;;:::i;:::-;;;;;;;;;17025:45;;17101:11;17076:10;17087;17076:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;17174:28;;;:15;:28;;;;;;;:41;;;17332:24;;;;;17325:31;17360:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;16476:905;;;16406:975;:::o;15180:196::-;15257:11;15271:20;15288:2;15271:16;:20::i;:::-;-1:-1:-1;;;;;15298:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;15336:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;15180:196:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1914:254;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2437:240::-;2245:12;;2233:25;;2307:4;2296:16;;;2290:23;2274:14;;;2267:47;2363:4;2352:16;;;2346:23;2330:14;;;2323:47;2419:4;2408:16;;;2402:23;2386:14;;;2379:47;2615:3;2600:19;;2628:43;2173:259;2682:186;2741:6;2794:2;2782:9;2773:7;2769:23;2765:32;2762:52;;;2810:1;2807;2800:12;2762:52;2833:29;2852:9;2833:29;:::i;2873:632::-;3044:2;3096:21;;;3166:13;;3069:18;;;3188:22;;;3015:4;;3044:2;3267:15;;;;3241:2;3226:18;;;3015:4;3310:169;3324:6;3321:1;3318:13;3310:169;;;3385:13;;3373:26;;3454:15;;;;3419:12;;;;3346:1;3339:9;3310:169;;;-1:-1:-1;3496:3:1;;2873:632;-1:-1:-1;;;;;;2873:632:1:o;3692:328::-;3769:6;3777;3785;3838:2;3826:9;3817:7;3813:23;3809:32;3806:52;;;3854:1;3851;3844:12;3806:52;3877:29;3896:9;3877:29;:::i;:::-;3867:39;;3925:38;3959:2;3948:9;3944:18;3925:38;:::i;:::-;3915:48;;4010:2;3999:9;3995:18;3982:32;3972:42;;3692:328;;;;;:::o;4025:127::-;4086:10;4081:3;4077:20;4074:1;4067:31;4117:4;4114:1;4107:15;4141:4;4138:1;4131:15;4157:275;4228:2;4222:9;4293:2;4274:13;;-1:-1:-1;;4270:27:1;4258:40;;4328:18;4313:34;;4349:22;;;4310:62;4307:88;;;4375:18;;:::i;:::-;4411:2;4404:22;4157:275;;-1:-1:-1;4157:275:1:o;4437:407::-;4502:5;4536:18;4528:6;4525:30;4522:56;;;4558:18;;:::i;:::-;4596:57;4641:2;4620:15;;-1:-1:-1;;4616:29:1;4647:4;4612:40;4596:57;:::i;:::-;4587:66;;4676:6;4669:5;4662:21;4716:3;4707:6;4702:3;4698:16;4695:25;4692:45;;;4733:1;4730;4723:12;4692:45;4782:6;4777:3;4770:4;4763:5;4759:16;4746:43;4836:1;4829:4;4820:6;4813:5;4809:18;4805:29;4798:40;4437:407;;;;;:::o;4849:222::-;4892:5;4945:3;4938:4;4930:6;4926:17;4922:27;4912:55;;4963:1;4960;4953:12;4912:55;4985:80;5061:3;5052:6;5039:20;5032:4;5024:6;5020:17;4985:80;:::i;5076:322::-;5145:6;5198:2;5186:9;5177:7;5173:23;5169:32;5166:52;;;5214:1;5211;5204:12;5166:52;5254:9;5241:23;5287:18;5279:6;5276:30;5273:50;;;5319:1;5316;5309:12;5273:50;5342;5384:7;5375:6;5364:9;5360:22;5342:50;:::i;5403:946::-;5487:6;5518:2;5561;5549:9;5540:7;5536:23;5532:32;5529:52;;;5577:1;5574;5567:12;5529:52;5617:9;5604:23;5646:18;5687:2;5679:6;5676:14;5673:34;;;5703:1;5700;5693:12;5673:34;5741:6;5730:9;5726:22;5716:32;;5786:7;5779:4;5775:2;5771:13;5767:27;5757:55;;5808:1;5805;5798:12;5757:55;5844:2;5831:16;5866:2;5862;5859:10;5856:36;;;5872:18;;:::i;:::-;5918:2;5915:1;5911:10;5901:20;;5941:28;5965:2;5961;5957:11;5941:28;:::i;:::-;6003:15;;;6073:11;;;6069:20;;;6034:12;;;;6101:19;;;6098:39;;;6133:1;6130;6123:12;6098:39;6157:11;;;;6177:142;6193:6;6188:3;6185:15;6177:142;;;6259:17;;6247:30;;6210:12;;;;6297;;;;6177:142;;;6338:5;5403:946;-1:-1:-1;;;;;;;;5403:946:1:o;6354:803::-;6516:4;6545:2;6585;6574:9;6570:18;6615:2;6604:9;6597:21;6638:6;6673;6667:13;6704:6;6696;6689:22;6742:2;6731:9;6727:18;6720:25;;6804:2;6794:6;6791:1;6787:14;6776:9;6772:30;6768:39;6754:53;;6842:2;6834:6;6830:15;6863:1;6873:255;6887:6;6884:1;6881:13;6873:255;;;6980:2;6976:7;6964:9;6956:6;6952:22;6948:36;6943:3;6936:49;7008:40;7041:6;7032;7026:13;7008:40;:::i;:::-;6998:50;-1:-1:-1;7106:12:1;;;;7071:15;;;;6909:1;6902:9;6873:255;;;-1:-1:-1;7145:6:1;;6354:803;-1:-1:-1;;;;;;;6354:803:1:o;7162:156::-;7228:20;;7288:4;7277:16;;7267:27;;7257:55;;7308:1;7305;7298:12;7323:456;7416:6;7424;7432;7440;7448;7501:3;7489:9;7480:7;7476:23;7472:33;7469:53;;;7518:1;7515;7508:12;7469:53;7554:9;7541:23;7531:33;;7611:2;7600:9;7596:18;7583:32;7573:42;;7634:36;7666:2;7655:9;7651:18;7634:36;:::i;:::-;7323:456;;;;-1:-1:-1;7624:46:1;;7717:2;7702:18;;7689:32;;-1:-1:-1;7768:3:1;7753:19;7740:33;;7323:456;-1:-1:-1;;7323:456:1:o;7784:390::-;7862:6;7870;7923:2;7911:9;7902:7;7898:23;7894:32;7891:52;;;7939:1;7936;7929:12;7891:52;7979:9;7966:23;8012:18;8004:6;8001:30;7998:50;;;8044:1;8041;8034:12;7998:50;8067;8109:7;8100:6;8089:9;8085:22;8067:50;:::i;:::-;8057:60;8164:2;8149:18;;;;8136:32;;-1:-1:-1;;;;7784:390:1:o;8179:347::-;8244:6;8252;8305:2;8293:9;8284:7;8280:23;8276:32;8273:52;;;8321:1;8318;8311:12;8273:52;8344:29;8363:9;8344:29;:::i;:::-;8334:39;;8423:2;8412:9;8408:18;8395:32;8470:5;8463:13;8456:21;8449:5;8446:32;8436:60;;8492:1;8489;8482:12;8436:60;8515:5;8505:15;;;8179:347;;;;;:::o;8531:531::-;8633:6;8641;8649;8657;8665;8673;8726:3;8714:9;8705:7;8701:23;8697:33;8694:53;;;8743:1;8740;8733:12;8694:53;8766:29;8785:9;8766:29;:::i;:::-;8756:39;;8842:2;8831:9;8827:18;8814:32;8804:42;;8893:2;8882:9;8878:18;8865:32;8855:42;;8916:36;8948:2;8937:9;8933:18;8916:36;:::i;:::-;8906:46;;8999:3;8988:9;8984:19;8971:33;8961:43;;9051:3;9040:9;9036:19;9023:33;9013:43;;8531:531;;;;;;;;:::o;9067:667::-;9162:6;9170;9178;9186;9239:3;9227:9;9218:7;9214:23;9210:33;9207:53;;;9256:1;9253;9246:12;9207:53;9279:29;9298:9;9279:29;:::i;:::-;9269:39;;9327:38;9361:2;9350:9;9346:18;9327:38;:::i;:::-;9317:48;;9412:2;9401:9;9397:18;9384:32;9374:42;;9467:2;9456:9;9452:18;9439:32;9494:18;9486:6;9483:30;9480:50;;;9526:1;9523;9516:12;9480:50;9549:22;;9602:4;9594:13;;9590:27;-1:-1:-1;9580:55:1;;9631:1;9628;9621:12;9580:55;9654:74;9720:7;9715:2;9702:16;9697:2;9693;9689:11;9654:74;:::i;:::-;9644:84;;;9067:667;;;;;;;:::o;9739:260::-;9807:6;9815;9868:2;9856:9;9847:7;9843:23;9839:32;9836:52;;;9884:1;9881;9874:12;9836:52;9907:29;9926:9;9907:29;:::i;:::-;9897:39;;9955:38;9989:2;9978:9;9974:18;9955:38;:::i;:::-;9945:48;;9739:260;;;;;:::o;10004:248::-;10072:6;10080;10133:2;10121:9;10112:7;10108:23;10104:32;10101:52;;;10149:1;10146;10139:12;10101:52;-1:-1:-1;;10172:23:1;;;10242:2;10227:18;;;10214:32;;-1:-1:-1;10004:248:1:o;10512:380::-;10591:1;10587:12;;;;10634;;;10655:61;;10709:4;10701:6;10697:17;10687:27;;10655:61;10762:2;10754:6;10751:14;10731:18;10728:38;10725:161;;10808:10;10803:3;10799:20;10796:1;10789:31;10843:4;10840:1;10833:15;10871:4;10868:1;10861:15;10725:161;;10512:380;;;:::o;12542:127::-;12603:10;12598:3;12594:20;12591:1;12584:31;12634:4;12631:1;12624:15;12658:4;12655:1;12648:15;12674:127;12735:10;12730:3;12726:20;12723:1;12716:31;12766:4;12763:1;12756:15;12790:4;12787:1;12780:15;12806:135;12845:3;12866:17;;;12863:43;;12886:18;;:::i;:::-;-1:-1:-1;12933:1:1;12922:13;;12806:135::o;12946:413::-;13148:2;13130:21;;;13187:2;13167:18;;;13160:30;13226:34;13221:2;13206:18;;13199:62;-1:-1:-1;;;13292:2:1;13277:18;;13270:47;13349:3;13334:19;;12946:413::o;13364:332::-;13566:2;13548:21;;;13605:1;13585:18;;;13578:29;-1:-1:-1;;;13638:2:1;13623:18;;13616:39;13687:2;13672:18;;13364:332::o;13827:545::-;13929:2;13924:3;13921:11;13918:448;;;13965:1;13990:5;13986:2;13979:17;14035:4;14031:2;14021:19;14105:2;14093:10;14089:19;14086:1;14082:27;14076:4;14072:38;14141:4;14129:10;14126:20;14123:47;;;-1:-1:-1;14164:4:1;14123:47;14219:2;14214:3;14210:12;14207:1;14203:20;14197:4;14193:31;14183:41;;14274:82;14292:2;14285:5;14282:13;14274:82;;;14337:17;;;14318:1;14307:13;14274:82;;;14278:3;;;13827:545;;;:::o;14548:1352::-;14674:3;14668:10;14701:18;14693:6;14690:30;14687:56;;;14723:18;;:::i;:::-;14752:97;14842:6;14802:38;14834:4;14828:11;14802:38;:::i;:::-;14796:4;14752:97;:::i;:::-;14904:4;;14968:2;14957:14;;14985:1;14980:663;;;;15687:1;15704:6;15701:89;;;-1:-1:-1;15756:19:1;;;15750:26;15701:89;-1:-1:-1;;14505:1:1;14501:11;;;14497:24;14493:29;14483:40;14529:1;14525:11;;;14480:57;15803:81;;14950:944;;14980:663;13774:1;13767:14;;;13811:4;13798:18;;-1:-1:-1;;15016:20:1;;;15134:236;15148:7;15145:1;15142:14;15134:236;;;15237:19;;;15231:26;15216:42;;15329:27;;;;15297:1;15285:14;;;;15164:19;;15134:236;;;15138:3;15398:6;15389:7;15386:19;15383:201;;;15459:19;;;15453:26;-1:-1:-1;;15542:1:1;15538:14;;;15554:3;15534:24;15530:37;15526:42;15511:58;15496:74;;15383:201;-1:-1:-1;;;;;15630:1:1;15614:14;;;15610:22;15597:36;;-1:-1:-1;14548:1352:1:o;17391:346::-;17593:2;17575:21;;;17632:2;17612:18;;;17605:30;-1:-1:-1;;;17666:2:1;17651:18;;17644:52;17728:2;17713:18;;17391:346::o;17742:344::-;17944:2;17926:21;;;17983:2;17963:18;;;17956:30;-1:-1:-1;;;18017:2:1;18002:18;;17995:50;18077:2;18062:18;;17742:344::o;18091:168::-;18131:7;18197:1;18193;18189:6;18185:14;18182:1;18179:21;18174:1;18167:9;18160:17;18156:45;18153:71;;;18204:18;;:::i;:::-;-1:-1:-1;18244:9:1;;18091:168::o;18264:399::-;18466:2;18448:21;;;18505:2;18485:18;;;18478:30;18544:34;18539:2;18524:18;;18517:62;-1:-1:-1;;;18610:2:1;18595:18;;18588:33;18653:3;18638:19;;18264:399::o;18668:352::-;18870:2;18852:21;;;18909:2;18889:18;;;18882:30;18948;18943:2;18928:18;;18921:58;19011:2;18996:18;;18668:352::o;19361:128::-;19401:3;19432:1;19428:6;19425:1;19422:13;19419:39;;;19438:18;;:::i;:::-;-1:-1:-1;19474:9:1;;19361:128::o;20195:136::-;20234:3;20262:5;20252:39;;20271:18;;:::i;:::-;-1:-1:-1;;;20307:18:1;;20195:136::o;20336:404::-;20538:2;20520:21;;;20577:2;20557:18;;;20550:30;20616:34;20611:2;20596:18;;20589:62;-1:-1:-1;;;20682:2:1;20667:18;;20660:38;20730:3;20715:19;;20336:404::o;22541:125::-;22581:4;22609:1;22606;22603:8;22600:34;;;22614:18;;:::i;:::-;-1:-1:-1;22651:9:1;;22541:125::o;23360:331::-;23562:2;23544:21;;;23601:1;23581:18;;;23574:29;-1:-1:-1;;;23634:2:1;23619:18;;23612:38;23682:2;23667:18;;23360:331::o;23696:907::-;23852:3;23881:1;23914:6;23908:13;23944:36;23970:9;23944:36;:::i;:::-;23999:1;24016:18;;;24043:133;;;;24190:1;24185:356;;;;24009:532;;24043:133;-1:-1:-1;;24076:24:1;;24064:37;;24149:14;;24142:22;24130:35;;24121:45;;;-1:-1:-1;24043:133:1;;24185:356;24216:6;24213:1;24206:17;24246:4;24291:2;24288:1;24278:16;24316:1;24330:165;24344:6;24341:1;24338:13;24330:165;;;24422:14;;24409:11;;;24402:35;24465:16;;;;24359:10;;24330:165;;;24334:3;;;24524:6;24519:3;24515:16;24508:23;;24009:532;-1:-1:-1;;;24550:19:1;;;24594:2;24585:12;;23696:907;-1:-1:-1;;;;23696:907:1:o;25011:331::-;25213:2;25195:21;;;25252:1;25232:18;;;25225:29;-1:-1:-1;;;25285:2:1;25270:18;;25263:38;25333:2;25318:18;;25011:331::o;27169:470::-;27348:3;27386:6;27380:13;27402:53;27448:6;27443:3;27436:4;27428:6;27424:17;27402:53;:::i;:::-;27518:13;;27477:16;;;;27540:57;27518:13;27477:16;27574:4;27562:17;;27540:57;:::i;:::-;27613:20;;27169:470;-1:-1:-1;;;;27169:470:1:o;32486:127::-;32547:10;32542:3;32538:20;32535:1;32528:31;32578:4;32575:1;32568:15;32602:4;32599:1;32592:15;32618:112;32650:1;32676;32666:35;;32681:18;;:::i;:::-;-1:-1:-1;32715:9:1;;32618:112::o;32735:414::-;32937:2;32919:21;;;32976:2;32956:18;;;32949:30;33015:34;33010:2;32995:18;;32988:62;-1:-1:-1;;;33081:2:1;33066:18;;33059:48;33139:3;33124:19;;32735:414::o;33154:120::-;33194:1;33220;33210:35;;33225:18;;:::i;:::-;-1:-1:-1;33259:9:1;;33154:120::o;33279:489::-;-1:-1:-1;;;;;33548:15:1;;;33530:34;;33600:15;;33595:2;33580:18;;33573:43;33647:2;33632:18;;33625:34;;;33695:3;33690:2;33675:18;;33668:31;;;33473:4;;33716:46;;33742:19;;33734:6;33716:46;:::i;:::-;33708:54;33279:489;-1:-1:-1;;;;;;33279:489:1:o;33773:249::-;33842:6;33895:2;33883:9;33874:7;33870:23;33866:32;33863:52;;;33911:1;33908;33901:12;33863:52;33943:9;33937:16;33962:30;33986:5;33962:30;:::i;34027:127::-;34088:10;34083:3;34079:20;34076:1;34069:31;34119:4;34116:1;34109:15;34143:4;34140:1;34133:15

Swarm Source

ipfs://47c53eacf427404a31b8ad0e8db3fcd7765009e3b57af8542d1eb62be1571370
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.